38#ifndef COAL_TRAVERSAL_NODE_SETUP_H 39#define COAL_TRAVERSAL_NODE_SETUP_H 52#ifdef COAL_HAS_OCTOMAP 60#ifdef COAL_HAS_OCTOMAP 63inline bool initialize(OcTreeCollisionTraversalNode& node,
const OcTree& model1,
65 const Transform3s& tf2,
const OcTreeSolver* otsolver,
67 node.result = &result;
69 node.model1 = &model1;
70 node.model2 = &model2;
72 node.otsolver = otsolver;
82inline bool initialize(OcTreeDistanceTraversalNode& node,
const OcTree& model1,
84 const Transform3s& tf2,
const OcTreeSolver* otsolver,
88 node.request = request;
89 node.result = &result;
91 node.model1 = &model1;
92 node.model2 = &model2;
94 node.otsolver = otsolver;
105bool initialize(ShapeOcTreeCollisionTraversalNode<S>& node,
const S& model1,
107 const Transform3s& tf2,
const OcTreeSolver* otsolver,
109 node.result = &result;
111 node.model1 = &model1;
112 node.model2 = &model2;
114 node.otsolver = otsolver;
125bool initialize(OcTreeShapeCollisionTraversalNode<S>& node,
127 const Transform3s& tf2,
const OcTreeSolver* otsolver,
129 node.result = &result;
131 node.model1 = &model1;
132 node.model2 = &model2;
134 node.otsolver = otsolver;
145bool initialize(ShapeOcTreeDistanceTraversalNode<S>& node,
const S& model1,
147 const Transform3s& tf2,
const OcTreeSolver* otsolver,
149 node.request = request;
150 node.result = &result;
152 node.model1 = &model1;
153 node.model2 = &model2;
155 node.otsolver = otsolver;
166bool initialize(OcTreeShapeDistanceTraversalNode<S>& node,
const OcTree& model1,
170 node.request = request;
171 node.result = &result;
173 node.model1 = &model1;
174 node.model2 = &model2;
176 node.otsolver = otsolver;
186template <
typename BV>
187bool initialize(MeshOcTreeCollisionTraversalNode<BV>& node,
191 node.result = &result;
193 node.model1 = &model1;
194 node.model2 = &model2;
196 node.otsolver = otsolver;
206template <
typename BV>
207bool initialize(OcTreeMeshCollisionTraversalNode<BV>& node,
211 node.result = &result;
213 node.model1 = &model1;
214 node.model2 = &model2;
216 node.otsolver = otsolver;
226template <
typename BV>
227bool initialize(OcTreeHeightFieldCollisionTraversalNode<BV>& node,
231 node.result = &result;
233 node.model1 = &model1;
234 node.model2 = &model2;
236 node.otsolver = otsolver;
246template <
typename BV>
247bool initialize(HeightFieldOcTreeCollisionTraversalNode<BV>& node,
251 node.result = &result;
253 node.model1 = &model1;
254 node.model2 = &model2;
256 node.otsolver = otsolver;
266template <
typename BV>
267bool initialize(MeshOcTreeDistanceTraversalNode<BV>& node,
272 node.request = request;
273 node.result = &result;
275 node.model1 = &model1;
276 node.model2 = &model2;
278 node.otsolver = otsolver;
288template <
typename BV>
289bool initialize(OcTreeMeshDistanceTraversalNode<BV>& node,
const OcTree& model1,
291 const Transform3s& tf2,
const OcTreeSolver* otsolver,
293 node.request = request;
294 node.result = &result;
296 node.model1 = &model1;
297 node.model2 = &model2;
299 node.otsolver = otsolver;
311template <
typename S1,
typename S2>
312bool initialize(ShapeCollisionTraversalNode<S1, S2>& node,
const S1& shape1,
316 node.model1 = &shape1;
318 node.model2 = &shape2;
320 node.nsolver = nsolver;
322 node.result = &result;
329template <
typename BV,
typename S>
330bool initialize(MeshShapeCollisionTraversalNode<BV, S>& node,
334 bool refit_bottomup =
false) {
337 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
338 std::invalid_argument)
340 if (!tf1.isIdentity() &&
341 model1.vertices.get())
343 std::vector<Vec3s> vertices_transformed(model1.num_vertices);
344 const std::vector<Vec3s>& model1_vertices_ = *(model1.vertices);
345 for (
unsigned int i = 0; i < model1.num_vertices; ++i) {
346 const Vec3s& p = model1_vertices_[i];
347 Vec3s new_v = tf1.transform(p);
348 vertices_transformed[i] = new_v;
351 model1.beginReplaceModel();
352 model1.replaceSubModel(vertices_transformed);
353 model1.endReplaceModel(use_refit, refit_bottomup);
358 node.model1 = &model1;
360 node.model2 = &model2;
362 node.nsolver = nsolver;
366 node.vertices = model1.vertices.get() ? model1.vertices->data() : NULL;
368 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
370 node.result = &result;
377template <
typename BV,
typename S>
378bool initialize(MeshShapeCollisionTraversalNode<BV, S, 0>& node,
384 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
385 std::invalid_argument)
387 node.model1 = &model1;
389 node.model2 = &model2;
391 node.nsolver = nsolver;
395 node.vertices = model1.vertices.get() ? model1.vertices->data() : NULL;
397 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
399 node.result = &result;
406template <
typename BV,
typename S>
407bool initialize(HeightFieldShapeCollisionTraversalNode<BV, S>& node,
411 bool refit_bottomup =
false);
415template <
typename BV,
typename S>
416bool initialize(HeightFieldShapeCollisionTraversalNode<BV, S, 0>& node,
420 node.model1 = &model1;
422 node.model2 = &model2;
424 node.nsolver = nsolver;
428 node.result = &result;
435template <
typename S,
typename BV,
template <
typename>
class OrientedNode>
436static inline bool setupShapeMeshCollisionOrientedNode(
437 OrientedNode<S>& node,
const S& model1,
const Transform3s& tf1,
438 const BVHModel<BV>& model2,
const Transform3s& tf2,
439 const GJKSolver* nsolver, CollisionResult& result) {
442 "model2 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
443 std::invalid_argument)
445 node.model1 = &model1;
447 node.model2 = &model2;
449 node.nsolver = nsolver;
453 node.vertices = model2.vertices.get() ? model2.vertices->data() : NULL;
455 model2.tri_indices.get() ? model2.tri_indices->data() : NULL;
457 node.result = &result;
466template <
typename BV>
468 MeshCollisionTraversalNode<BV, RelativeTransformationIsIdentity>& node,
471 bool refit_bottomup =
false) {
474 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
475 std::invalid_argument)
478 "model2 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
479 std::invalid_argument)
481 if (!tf1.isIdentity() && model1.vertices.get()) {
482 std::vector<Vec3s> vertices_transformed1(model1.num_vertices);
483 const std::vector<Vec3s>& model1_vertices_ = *(model1.vertices);
484 for (
unsigned int i = 0; i < model1.num_vertices; ++i) {
485 const Vec3s& p = model1_vertices_[i];
486 Vec3s new_v = tf1.transform(p);
487 vertices_transformed1[i] = new_v;
490 model1.beginReplaceModel();
491 model1.replaceSubModel(vertices_transformed1);
492 model1.endReplaceModel(use_refit, refit_bottomup);
497 if (!tf2.isIdentity() && model2.vertices.get()) {
498 std::vector<Vec3s> vertices_transformed2(model2.num_vertices);
499 const std::vector<Vec3s>& model2_vertices_ = *(model2.vertices);
500 for (
unsigned int i = 0; i < model2.num_vertices; ++i) {
501 const Vec3s& p = model2_vertices_[i];
502 Vec3s new_v = tf2.transform(p);
503 vertices_transformed2[i] = new_v;
506 model2.beginReplaceModel();
507 model2.replaceSubModel(vertices_transformed2);
508 model2.endReplaceModel(use_refit, refit_bottomup);
513 node.model1 = &model1;
515 node.model2 = &model2;
518 node.vertices1 = model1.vertices.get() ? model1.vertices->data() : NULL;
519 node.vertices2 = model2.vertices.get() ? model2.vertices->data() : NULL;
522 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
524 model2.tri_indices.get() ? model2.tri_indices->data() : NULL;
526 node.result = &result;
531template <
typename BV>
532bool initialize(MeshCollisionTraversalNode<BV, 0>& node,
538 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
539 std::invalid_argument)
542 "model2 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
543 std::invalid_argument)
545 node.vertices1 = model1.vertices ? model1.vertices->data() : NULL;
546 node.vertices2 = model2.vertices ? model2.vertices->data() : NULL;
549 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
551 model2.tri_indices.get() ? model2.tri_indices->data() : NULL;
553 node.model1 = &model1;
555 node.model2 = &model2;
558 node.result = &result;
560 node.RT.R.noalias() = tf1.getRotation().transpose() * tf2.getRotation();
561 node.RT.T.noalias() = tf1.getRotation().transpose() *
562 (tf2.getTranslation() - tf1.getTranslation());
568template <
typename S1,
typename S2>
569bool initialize(ShapeDistanceTraversalNode<S1, S2>& node,
const S1& shape1,
573 node.request = request;
574 node.result = &result;
576 node.model1 = &shape1;
578 node.model2 = &shape2;
580 node.nsolver = nsolver;
587template <
typename BV>
589 MeshDistanceTraversalNode<BV, RelativeTransformationIsIdentity>& node,
592 bool use_refit =
false,
bool refit_bottomup =
false) {
595 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
596 std::invalid_argument)
599 "model2 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
600 std::invalid_argument)
602 if (!tf1.isIdentity() && model1.vertices.get()) {
603 std::vector<Vec3s> vertices_transformed1(model1.num_vertices);
604 const std::vector<Vec3s>& model1_vertices_ = *(model1.vertices);
605 for (
unsigned int i = 0; i < model1.num_vertices; ++i) {
606 const Vec3s& p = model1_vertices_[i];
607 Vec3s new_v = tf1.transform(p);
608 vertices_transformed1[i] = new_v;
611 model1.beginReplaceModel();
612 model1.replaceSubModel(vertices_transformed1);
613 model1.endReplaceModel(use_refit, refit_bottomup);
618 if (!tf2.isIdentity() && model2.vertices.get()) {
619 std::vector<Vec3s> vertices_transformed2(model2.num_vertices);
620 const std::vector<Vec3s>& model2_vertices_ = *(model2.vertices);
621 for (
unsigned int i = 0; i < model2.num_vertices; ++i) {
622 const Vec3s& p = model2_vertices_[i];
623 Vec3s new_v = tf2.transform(p);
624 vertices_transformed2[i] = new_v;
627 model2.beginReplaceModel();
628 model2.replaceSubModel(vertices_transformed2);
629 model2.endReplaceModel(use_refit, refit_bottomup);
634 node.request = request;
635 node.result = &result;
637 node.model1 = &model1;
639 node.model2 = &model2;
642 node.vertices1 = model1.vertices.get() ? model1.vertices->data() : NULL;
643 node.vertices2 = model2.vertices.get() ? model2.vertices->data() : NULL;
646 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
648 model2.tri_indices.get() ? model2.tri_indices->data() : NULL;
654template <
typename BV>
655bool initialize(MeshDistanceTraversalNode<BV, 0>& node,
661 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
662 std::invalid_argument)
665 "model2 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
666 std::invalid_argument)
668 node.request = request;
669 node.result = &result;
671 node.model1 = &model1;
673 node.model2 = &model2;
676 node.vertices1 = model1.vertices.get() ? model1.vertices->data() : NULL;
677 node.vertices2 = model2.vertices.get() ? model2.vertices->data() : NULL;
680 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
682 model2.tri_indices.get() ? model2.tri_indices->data() : NULL;
688 tf2.getTranslation(), node.RT.R, node.RT.T);
697template <
typename BV,
typename S>
698bool initialize(MeshShapeDistanceTraversalNode<BV, S>& node,
702 bool use_refit =
false,
bool refit_bottomup =
false) {
705 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
706 std::invalid_argument)
708 if (!tf1.isIdentity() && model1.vertices.get()) {
709 const std::vector<Vec3s>& model1_vertices_ = *(model1.vertices);
710 std::vector<Vec3s> vertices_transformed1(model1.num_vertices);
711 for (
unsigned int i = 0; i < model1.num_vertices; ++i) {
712 const Vec3s& p = model1_vertices_[i];
713 Vec3s new_v = tf1.transform(p);
714 vertices_transformed1[i] = new_v;
717 model1.beginReplaceModel();
718 model1.replaceSubModel(vertices_transformed1);
719 model1.endReplaceModel(use_refit, refit_bottomup);
724 node.request = request;
725 node.result = &result;
727 node.model1 = &model1;
729 node.model2 = &model2;
731 node.nsolver = nsolver;
733 node.vertices = model1.vertices.get() ? model1.vertices->data() : NULL;
735 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
745template <
typename BV,
typename S,
template <
typename>
class OrientedNode>
746static inline bool setupMeshShapeDistanceOrientedNode(
747 OrientedNode<S>& node,
const BVHModel<BV>& model1,
const Transform3s& tf1,
748 const S& model2,
const Transform3s& tf2,
const GJKSolver* nsolver,
749 const DistanceRequest& request, DistanceResult& result) {
752 "model1 should be of type BVHModelType::BVH_MODEL_TRIANGLES.",
753 std::invalid_argument)
755 node.request = request;
756 node.result = &result;
758 node.model1 = &model1;
760 node.model2 = &model2;
762 node.nsolver = nsolver;
766 node.vertices = model1.vertices.get() ? model1.vertices->data() : NULL;
768 model1.tri_indices.get() ? model1.tri_indices->data() : NULL;
778bool initialize(MeshShapeDistanceTraversalNodeRSS<S>& node,
783 return details::setupMeshShapeDistanceOrientedNode(
784 node, model1, tf1, model2, tf2, nsolver, request, result);
790bool initialize(MeshShapeDistanceTraversalNodekIOS<S>& node,
795 return details::setupMeshShapeDistanceOrientedNode(
796 node, model1, tf1, model2, tf2, nsolver, request, result);
802bool initialize(MeshShapeDistanceTraversalNodeOBBRSS<S>& node,
807 return details::setupMeshShapeDistanceOrientedNode(
808 node, model1, tf1, model2, tf2, nsolver, request, result);
A class describing the bounding hierarchy of a mesh model or a point cloud model (which is viewed as ...
Definition BVH_model.h:314
Data structure depicting a height field given by the base grid dimensions and the elevation along the...
Definition hfield.h:202
Octree is one type of collision geometry which can encode uncertainty information in the sensor data.
Definition octree.h:53
#define COAL_COMPILER_DIAGNOSTIC_PUSH
Definition fwd.hh:120
#define COAL_COMPILER_DIAGNOSTIC_IGNORED_MAYBE_UNINITIALIZED
Definition fwd.hh:123
#define COAL_COMPILER_DIAGNOSTIC_POP
Definition fwd.hh:121
#define COAL_THROW_PRETTY(message, exception)
Definition fwd.hh:64
Main namespace.
Definition broadphase_bruteforce.h:44
void computeBV(const S &s, const Transform3s &tf, BV &bv)
calculate a bounding volume for a shape in a specific configuration
Definition geometric_shapes_utility.h:73
@ BVH_MODEL_TRIANGLES
unknown model type
Definition BVH_internal.h:81
void relativeTransform(const Eigen::MatrixBase< Derived > &R1, const Eigen::MatrixBase< OtherDerived > &t1, const Eigen::MatrixBase< Derived > &R2, const Eigen::MatrixBase< OtherDerived > &t2, const Eigen::MatrixBase< Derived > &R, const Eigen::MatrixBase< OtherDerived > &t)
Definition tools.h:90
Eigen::Matrix< CoalScalar, 3, 1 > Vec3s
Definition data_types.h:77
collision result
Definition collision_data.h:390
request to the distance computation
Definition collision_data.h:985
distance result
Definition collision_data.h:1051
collision and distance solver based on the GJK and EPA algorithms. Originally, GJK and EPA were imple...
Definition narrowphase.h:57