2 #if ENABLE_COLLISION_TESTS 18 #include <sys/types.h> 30 const CollisionChecker *cc) {
32 bool res_collision_checker = cc->collide(co, 0,
false);
34 std::vector<collision::CollisionObjectConstPtr> obstacles =
37 bool res_bruteforce =
false;
39 for (
auto &obstacle : obstacles) {
40 if (obstacle->collide(*(co.get()), CollisionRequest(
COL_FCL))) {
41 res_bruteforce =
true;
45 if (res_collision_checker != res_bruteforce) {
53 const CollisionChecker *cc) {
58 bool res_cc = cc->collide(co, obst_cc,
false,
false,
false);
61 bool res_primitive =
false;
62 for (
auto &c : cc->collision_objects_) {
63 if (c->collide(*co, CollisionRequest(
COL_FCL))) {
70 if (res_cc != res_primitive) {
77 bool ShapeGroupTest::cmp(
const std::pair<int, int> &pair1,
78 const std::pair<int, int> &pair2) {
79 if (pair1.first != pair2.first) {
80 return pair1.first < pair2.first;
82 return pair1.second > pair2.second;
88 return (a.get() < b.get());
92 const CollisionChecker *cc,
93 std::vector<int> *failure_export)
96 if (!co.get())
return false;
100 std::vector<collision::CollisionObjectConstPtr> children = cc->getObstacles();
103 for (
auto &el : children) {
104 bool res_fcl = el->collide(*(co.get()), CollisionRequest(
COL_FCL));
107 bool res_def = el->collide(*(co.get()), CollisionRequest(
COL_DEFAULT));
110 bool res_local = (res_def == res_fcl);
111 res = res_local && res;
113 if (failure_export) failure_export->push_back(counter);
121 bool CollisionCheckerTest::test_collide_obstacles(
123 std::vector<CollisionObjectConstPtr> &missed_obstacles,
124 std::vector<CollisionObjectConstPtr> &missed_obstacles_primit) {
125 #if ENABLE_SERIALIZER_TESTS 127 std::cout <<
"serialization CC_OBJ failed";
130 std::vector<int> failure_export;
131 #if ENABLE_COLLISION_TESTS_NARROWPHASE 132 if (!test_narrowphase(co, cc, &failure_export)) {
133 std::vector<int> failure_export2;
134 test_narrowphase(co, cc, &failure_export2);
139 std::vector<CollisionObjectConstPtr> obstacles_cc;
141 bool res_cc = cc->collide(co, obstacles_cc,
false,
false,
false);
156 std::vector<CollisionObjectConstPtr> obstacles_primit;
157 bool res_primitive =
false;
158 for (
auto &c : cc->collision_objects_) {
159 if (c->collide(*co, CollisionRequest(
COL_FCL))) {
160 obstacles_primit.push_back(c);
161 res_primitive =
true;
165 std::unordered_map<const CollisionObject *, bool> obstacles_cc_map;
166 for (
auto &c : obstacles_cc) {
167 obstacles_cc_map.emplace(c.get(),
true);
170 std::unordered_map<const CollisionObject *, bool> obstacles_primit_map;
171 for (
auto &c : obstacles_primit) {
172 obstacles_primit_map.emplace(c.get(),
true);
175 if ((res_cc ==
false) && (res_primitive ==
false)) {
176 if ((obstacles_cc.size() == 0) && (obstacles_primit.size() == 0)) {
180 for (
auto &c : obstacles_primit) {
181 if (obstacles_cc_map.find(c.get()) == obstacles_cc_map.end()) {
182 missed_obstacles.push_back(c);
185 for (
auto &c : obstacles_cc) {
186 if (obstacles_primit_map.find(c.get()) == obstacles_primit_map.end()) {
187 missed_obstacles_primit.push_back(c);
191 if (res_cc == res_primitive) {
192 if ((obstacles_cc.size() == obstacles_primit.size())) {
193 std::sort(obstacles_cc.begin(), obstacles_cc.end(), cmp);
194 std::sort(obstacles_primit.begin(), obstacles_primit.end(), cmp);
196 if (obstacles_cc == obstacles_primit) {
202 std::sort(obstacles_cc.begin(), obstacles_cc.end(), cmp);
203 std::sort(obstacles_primit.begin(), obstacles_primit.end(), cmp);
215 const ShapeGroup *sg) {
219 if (!sg_fcl || !co_fcl)
return false;
222 *sg_fcl, *co_fcl,
false);
224 std::vector<collision::ShapeConstPtr> obstacles = sg->shapes_;
226 bool res_bruteforce =
false;
228 for (
auto &obstacle : obstacles) {
229 if (obstacle->collide(*(co.get()), CollisionRequest(
COL_FCL))) {
230 res_bruteforce =
true;
234 if (res_bruteforce != res_sg) {
237 return res_bruteforce == res_sg;
239 bool ShapeGroupTest::test_collide(
const ShapeGroup *sg1,
240 const ShapeGroup *sg2) {
244 if (!sg1_fcl || !sg2_fcl)
return false;
247 *sg1_fcl, *sg2_fcl,
false);
249 std::vector<collision::ShapeConstPtr> obstacles1 = sg1->unpack();
250 std::vector<collision::ShapeConstPtr> obstacles2 = sg2->unpack();
252 bool res_bruteforce =
false;
254 std::vector<std::pair<int, int>> overlap_res = sg1->overlap(*sg2);
256 for (
auto &res1 : overlap_res) {
257 if (obstacles1[res1.first]->collide(*obstacles2[res1.second])) {
261 for (
auto obstacle1 : obstacles1) {
262 for (
auto obstacle2 : obstacles2) {
263 if (obstacle1->collide(*obstacle2, CollisionRequest(
COL_FCL))) {
264 res_bruteforce =
true;
269 return res_bruteforce == res_sg;
272 bool ShapeGroupTest::test_narrowphase(
273 const ShapeGroup *sg1,
const ShapeGroup *sg2,
274 std::vector<std::pair<int, int>> *failure_pair_export)
277 std::vector<collision::ShapeConstPtr> obstacles1 = sg1->shapes_;
279 std::vector<int> failure_export;
281 for (
auto &obstacle : obstacles1) {
282 failure_export.clear();
283 res = test_narrowphase(obstacle, sg2, &failure_export) && res;
284 for (
auto el : failure_export) {
285 if (failure_pair_export) failure_pair_export->emplace_back(counter1, el);
293 const ShapeGroup *sg,
294 std::vector<int> *failure_export)
298 if (!co_fcl)
return false;
300 std::vector<collision::ShapeConstPtr> shapes = sg->shapes_;
303 for (
auto &shape : shapes) {
308 std::vector<TriangleConstPtr> triangles = shape_polyg->
getTriangleMesh();
309 for (
auto &tri : triangles) {
312 bool res_local = ShapeGroupTest::test_narrowphase(co, &triangles_sg, 0);
313 res = res_local && res;
315 if (failure_export) failure_export->push_back(counter);
322 shape->collide(*(co.get()), CollisionRequest(
COL_FCL)) ==
323 shape->collide(*(co.get()), CollisionRequest(
COL_DEFAULT));
324 res = res_local && res;
326 if (failure_export) failure_export->push_back(counter);
335 const CollisionChecker *cc) {
336 bool res = test_collide(co, cc);
345 bool res = test_collide_obstacle(co, cc);
355 std::cout <<
"serialization CC obj failed";
357 std::vector<CollisionObjectConstPtr> missed_obstacles;
358 std::vector<CollisionObjectConstPtr> missed_obstacles_primit;
360 test_collide_obstacles(co, cc, missed_obstacles, missed_obstacles_primit);
363 CollisionChecker cc2;
364 for (
auto &obst : missed_obstacles) {
367 bool naive_collide = obst->collide(*co, CollisionRequest(
COL_DEFAULT));
368 bool non_naive_collide = obst->collide(*co, CollisionRequest(
COL_FCL));
369 cc2.addCollisionObject(obst);
371 for (
auto &obst : missed_obstacles_primit) {
374 bool naive_collide = obst->collide(*co, CollisionRequest(
COL_DEFAULT));
375 bool non_naive_collide = obst->collide(*co, CollisionRequest(
COL_FCL));
376 std::cout <<
"narrowphase internal failure";
379 std::vector<CollisionObjectConstPtr> new_obstacles;
380 if (tolerance_result) {
382 cc->collide(co, new_obstacles,
false,
false,
false);
386 for (
auto &obst : missed_obstacles) {
387 for (
auto &obst2 : new_obstacles) {
389 std::cout <<
"found";
398 bool &tolerance_result,
double &
distance,
399 bool narrowphase =
false) {
412 tolerance_result = res.getTolerancePassed();
415 tolerance_result =
false;
421 const ShapeGroup *sg1,
const ShapeGroup *sg2,
422 std::vector<std::pair<int, int>> *missed_col_naive_out) {
423 std::vector<std::pair<int, int>> res = sg1->overlap(*sg2);
424 std::vector<collision::ShapeConstPtr> obstacles1 = sg1->unpack();
425 std::vector<collision::ShapeConstPtr> obstacles2 = sg2->unpack();
427 std::vector<std::pair<int, int>> overlap_res = sg1->overlap(*sg2);
428 std::vector<std::pair<int, int>> overlap_res2;
430 for (
int cc1 = 0; cc1 < obstacles1.size(); cc1++) {
431 for (
int cc2 = 0; cc2 < obstacles2.size(); cc2++) {
432 if (obstacles1[cc1]->collide(*obstacles2[cc2],
434 overlap_res2.emplace_back(cc1, cc2);
453 std::sort(overlap_res.begin(), overlap_res.end(), cmp);
454 std::sort(overlap_res2.begin(), overlap_res2.end(), cmp);
455 std::vector<std::pair<int, int>> missed_col;
457 bool local_failure1 = !(overlap_res == overlap_res2);
458 if (local_failure1) {
459 local_failure1 =
false;
460 std::map<std::pair<int, int>,
bool> overlap_res_hash;
461 for (
auto res1 : overlap_res) {
462 overlap_res_hash.emplace(res1,
true);
464 for (
auto res2 : overlap_res2) {
465 if (overlap_res_hash.find(res2) == overlap_res_hash.end()) {
466 missed_col.push_back(res2);
469 for (
auto miss : missed_col) {
470 bool tolerance_result =
false;
473 ToleranceCheck(obstacles1[miss.first], obstacles2[miss.second],
474 tolerance_result, distance);
476 if (!tolerance_result) {
477 local_failure1 =
true;
483 if (overlap_res.size() + missed_col.size() >
486 std::map<std::pair<int, int>,
bool> overlap_res2_hash;
487 for (
auto res2 : overlap_res2) {
488 overlap_res2_hash.emplace(res2,
true);
490 std::vector<std::pair<int, int>> missed_col_naive;
491 for (
auto res : overlap_res) {
492 if (overlap_res2_hash.find(res) == overlap_res2_hash.end()) {
493 missed_col_naive.push_back(res);
497 for (
auto miss : missed_col_naive) {
498 bool tolerance_result =
false;
499 bool tolerance_result2 =
false;
502 ToleranceCheck(obstacles1[miss.first], obstacles2[miss.second],
503 tolerance_result, distance);
504 if (!tolerance_result) {
505 local_failure1 =
true;
510 if (missed_col_naive_out) {
511 *missed_col_naive_out = missed_col_naive;
517 if (local_failure1)
return false;
519 std::map<std::pair<int, int>,
bool> overlap_res_hash;
520 for (
auto res2 : overlap_res) {
521 overlap_res_hash.emplace(res2,
true);
524 std::vector<std::set<int>> overlap_map_result = sg1->overlapMap(*sg2);
525 bool true_failure =
true;
526 bool local_failure2 =
false;
527 for (
int cc1 = 0; cc1 < overlap_map_result.size(); cc1++) {
528 std::set<int> iter1 = overlap_map_result[cc1];
529 for (
auto cc2 : iter1) {
530 if (overlap_res_hash.find(std::pair<int, int>(cc1, cc2)) ==
531 overlap_res_hash.end()) {
532 local_failure2 =
true;
536 if (local_failure2)
break;
538 if (local_failure2)
return false;
541 bool local_failure3 =
false;
542 for (
auto res1 : overlap_res) {
543 if (overlap_map_result[res1.first].find(res1.second) ==
544 overlap_map_result[res1.first].end()) {
546 local_failure3 =
true;
550 if (local_failure3)
return false;
551 true_failure = local_failure1 || local_failure2 || local_failure3;
553 return !true_failure;
557 const ShapeGroup *sg) {
558 bool res = test_collide(co, sg);
559 #if ENABLE_SERIALIZER_TESTS 561 std::cout <<
"serializer OBJ OBJ failed";
565 bool local_failure1 =
false;
566 for (
auto el : sg->unpack()) {
567 bool tolerance_result =
false;
569 int tol_res = ToleranceCheck(el, co, tolerance_result, distance);
570 if (!tolerance_result) {
571 local_failure1 =
true;
575 if (local_failure1) {
576 res = test_collide(co, sg);
584 const ShapeGroup *sg2) {
585 bool res = test_collide(sg1, sg2);
587 bool res2 = test_overlap_map(sg1, sg2);
588 test::BroadphaseFailureObjObj bf;
589 bf.obj1 = sg1->shared_from_this();
590 bf.obj2 = sg2->shared_from_this();
591 #if ENABLE_SERIALIZER_TESTS 593 std::cout <<
"serializer OBJ OBJ failed";
600 res = test_collide(sg1, sg2);
601 res2 = test_overlap_map(sg1, sg2);
608 const ShapeGroup *sg2) {
609 std::vector<std::pair<int, int>> failure_pair_export;
610 bool res = test_narrowphase(sg1, sg2, &failure_pair_export);
618 const ShapeGroup *sg) {
619 std::vector<int> failure_export;
620 bool res = test_narrowphase(co, sg, &failure_export);
636 int type1 = obj1->getCollisionObjectType();
637 int type2 = obj2->getCollisionObjectType();
639 std::swap(type1, type2);
641 std::string descriptor =
"narrowphase_failure_obj_obj";
642 descriptor += std::to_string(type1) + std::string(
"_") +
643 std::to_string(type2) + std::string(
".dump");
644 std::string filename =
646 if (filename != std::string(
"")) {
647 test::BroadphaseFailureObjObj failure_export;
648 failure_export.obj1 = obj1;
649 failure_export.obj2 = obj2;
650 std::ofstream ofs(filename, std::ofstream::out);
663 int type1 = obj1->type();
664 int type2 = obj2->type();
667 std::swap(type1, type2);
669 std::string descriptor =
"narrowphase_failure_";
670 descriptor += std::to_string(type1) + std::string(
"_") +
671 std::to_string(type2) + std::string(
".dump");
672 std::string filename =
674 if (filename != std::string(
"")) {
675 test::BroadphaseFailureObjObj failure_export;
676 failure_export.obj1 = obj1;
677 failure_export.obj2 = obj2;
678 std::ofstream ofs(filename, std::ofstream::out);
685 bool tolerance_result;
687 int tol_res = ToleranceCheck(obj1, obj2, tolerance_result, distance,
true);
688 if (!tolerance_result) {
689 std::string descriptor =
"narrowphase_failure_tolerance_checked";
690 descriptor += std::to_string(type1) + std::string(
"_") +
691 std::to_string(type2) + std::string(
".dump");
692 std::string filename =
694 if (filename != std::string(
"")) {
695 test::BroadphaseFailureObjObj failure_export;
696 failure_export.obj1 = obj1;
697 failure_export.obj2 = obj2;
698 std::ofstream ofs(filename, std::ofstream::out);
710 const ShapeGroup *sg1,
const ShapeGroup *sg2,
711 const std::vector<std::pair<int, int>> &failure_pair_export) {
713 std::vector<collision::ShapeConstPtr> obstacles1 = sg1->unpack();
714 std::vector<collision::ShapeConstPtr> obstacles2 = sg2->unpack();
715 for (
auto el : failure_pair_export) {
725 const std::vector<int> &failure_export) {
727 std::vector<collision::ShapeConstPtr> obstacles1 = sg->unpack();
728 for (
auto el : failure_export) {
738 const CollisionChecker *cc,
739 const std::vector<int> &failure_export) {
741 std::vector<collision::CollisionObjectConstPtr> obstacles1 =
743 for (
auto el : failure_export) {
752 const ShapeGroup *sg1,
const ShapeGroup *sg2,
753 const std::vector<std::pair<int, int>> &failure_pair_export) {
755 std::ostringstream outstrstream;
756 outstrstream <<
"[Narrowphase failure]" << std::endl;
759 outstrstream <<
"[/Narrowphase failure]" << std::endl;
760 TestFailureLoggerNarrowphase logger;
761 logger.log_failure(outstrstream.str());
766 const std::vector<int> &failure_export) {
767 if (co->getCollisionObjectClass() ==
771 std::ostringstream outstrstream;
772 outstrstream <<
"[Narrowphase failure]" << std::endl;
775 outstrstream <<
"[/Narrowphase failure]" << std::endl;
776 TestFailureLoggerNarrowphase logger;
777 logger.log_failure(outstrstream.str());
783 std::ostringstream outstrstream;
784 outstrstream <<
"[Parentmap failure]" << std::endl;
785 co->toString(outstrstream);
786 outstrstream <<
"[/Parentmap failure]" << std::endl;
787 TestFailureLoggerParentMap logger;
788 logger.log_failure(outstrstream.str());
792 int dirExists(
const char *path) {
795 if (stat(path, &info) != 0)
797 else if (info.st_mode & S_IFDIR)
804 std::string directory) {
805 std::string full_name_test = directory;
806 if (!dirExists(full_name_test.c_str())) {
807 return std::string(
"");
809 for (
int cc1 = 0; cc1 < max_files; cc1++) {
810 full_name_test = directory + std::string(
"/") + prefix + std::string(
"_") +
811 std::to_string(cc1) + std::string(
".dump");
812 std::ifstream f(full_name_test.c_str());
814 return full_name_test;
817 return std::string(
"");
820 const CollisionObject *obj2) {
821 test::BroadphaseFailureObjObj bf;
822 bf.obj1 = obj1->shared_from_this();
823 bf.obj2 = obj2->shared_from_this();
824 std::stringstream strstr1;
825 std::stringstream strstr2;
829 str1 = strstr1.str();
830 BroadphaseFailureObjObj bf_load;
832 if (bf_load.obj1.get() && bf_load.obj2.get()) {
834 str2 = strstr2.str();
835 bool passed = str1 == str2;
845 const CollisionObject *obj) {
846 test::BroadphaseFailureCCObj bf;
848 std::static_pointer_cast<
const CollisionChecker>(cc->shared_from_this());
849 bf.obj = obj->shared_from_this();
850 std::stringstream strstr1;
851 std::stringstream strstr2;
855 str1 = strstr1.str();
856 BroadphaseFailureCCObj bf_load;
858 if (bf_load.cc.get() && bf_load.obj.get()) {
860 str2 = strstr2.str();
861 bool passed = str1 == str2;
871 int serialize_broadphase_failure(
const CollisionChecker *cc,
872 const CollisionObject *obj) {
873 test::BroadphaseFailureCCObj bf;
875 std::static_pointer_cast<
const CollisionChecker>(cc->shared_from_this());
876 bf.obj = obj->shared_from_this();
877 std::string filename =
get_free_file(
"broadphase_failure_cc_obj", 10000,
878 BROADPHASE_DUMP_DIRECTORY);
879 if (filename ==
"")
return -1;
880 std::ofstream ofs(filename, std::ofstream::out);
885 int serialize_broadphase_failure(
const CollisionObject *obj1,
886 const CollisionObject *obj2) {
887 test::BroadphaseFailureObjObj bf;
888 bf.obj1 = obj1->shared_from_this();
889 bf.obj2 = obj2->shared_from_this();
890 std::string filename =
get_free_file(
"broadphase_failure_obj_obj", 10000,
891 BROADPHASE_DUMP_DIRECTORY);
892 if (filename ==
"")
return -1;
893 std::ofstream ofs(filename, std::ofstream::out);
900 serialize_broadphase_failure(sg1, sg2);
901 std::ostringstream outstrstream;
902 outstrstream <<
"[Broadphase failure]" << std::endl;
903 sg1->toString(outstrstream);
904 sg2->toString(outstrstream);
905 outstrstream <<
"[/Broadphase failure]" << std::endl;
906 TestFailureLoggerBroadphase logger;
907 logger.log_failure(outstrstream.str());
911 const CollisionChecker *cc) {
913 double distance = std::numeric_limits<FCL_PRECISION>::max();
914 bool true_Failure =
false;
916 for (
auto &obj : cc->getObstacles()) {
919 bool tvgroup_tolerance_passed =
true;
920 int time_start_idx = 0, time_end_idx = 0;
921 const TimeVariantCollisionObject *obj_tv = 0;
922 const TimeVariantCollisionObject *co_tv = 0;
924 co_tv =
static_cast<const TimeVariantCollisionObject *
>(co.get());
927 obj_tv =
static_cast<const TimeVariantCollisionObject *
>(obj.get());
929 if (obj_tv && co_tv) {
931 std::min(obj_tv->time_start_idx(), co_tv->time_start_idx());
932 time_end_idx = std::max(obj_tv->time_end_idx(), co_tv->time_end_idx());
935 time_start_idx = obj_tv->time_start_idx();
936 time_end_idx = obj_tv->time_end_idx();
938 time_start_idx = co_tv->time_start_idx();
939 time_end_idx = co_tv->time_end_idx();
943 for (
int time_idx = time_start_idx; time_idx < time_end_idx; time_idx++) {
946 obj1 = obj_tv->getObstacleAtTime(time_idx);
951 obj2 = co_tv->getObstacleAtTime(time_idx);
954 if (!obj1.get() || !obj2.get()) {
958 bool tol_res =
false;
960 ToleranceCheck(obj1, obj2, tol_res, dist);
962 tvgroup_tolerance_passed =
false;
966 if (tvgroup_tolerance_passed) {
972 bool tol_res =
false;
974 ToleranceCheck(obj, co, tol_res, dist);
987 const CollisionChecker *cc) {
988 serialize_broadphase_failure(cc, co.get());
989 std::ostringstream outstrstream;
990 outstrstream <<
"[Broadphase failure]" << std::endl;
991 co->toString(outstrstream);
992 cc->toString(outstrstream);
993 TestFailureLoggerBroadphase logger;
995 logger.log_failure(outstrstream.str());
1000 std::ostringstream outstrstream;
1001 outstrstream <<
"[Broadphase failure]" << std::endl;
1002 co->toString(outstrstream);
1003 sg->toString(outstrstream);
1004 outstrstream <<
"[/Broadphase failure]" << std::endl;
1005 TestFailureLoggerBroadphase logger;
1006 logger.log_failure(outstrstream.str());
std::shared_ptr< const Shape > ShapeConstPtr
std::vector< TriangleConstPtr > getTriangleMesh() const
int serialize_narrowphase_failure_helper_obj(CollisionObjectConstPtr obj1, CollisionObjectConstPtr obj2)
int log_narrowphase_failure(const ShapeGroup *sg1, const ShapeGroup *sg2, const std::vector< std::pair< int, int >> &failure_pair_export)
std::shared_ptr< const RectangleAABB > RectangleAABBConstPtr
int serialize_broadphase_failure_test(const CollisionChecker *cc, const CollisionObject *obj)
ShapeGroup can contain simple shapes.
std::size_t distance(const CollisionObject &obj1, const CollisionObject &obj2, DistanceResult &res, const DistanceRequest &req)
std::string get_free_file(std::string prefix, int max_files, std::string directory)
std::shared_ptr< const CollisionObject > CollisionObjectConstPtr
const FCLCollisionObject * get_fcl_object_ptr(const CollisionObject *obj)
int serialize_narrowphase_failure(ShapeConstPtr co, const ShapeGroup *sg, const std::vector< int > &failure_export)
bool run_test_collide(CollisionObjectConstPtr co, const ShapeGroup *sg)
int serialize_narrowphase_failure_helper(ShapeConstPtr obj1, ShapeConstPtr obj2)
bool run_test_collide(CollisionObjectConstPtr co, const collision::CollisionChecker *cc)
bool run_test_collide_obstacle(CollisionObjectConstPtr co, const collision::CollisionChecker *cc)
int deserialize(test::BroadphaseFailureCCObj &bf_object, std::istream &input_stream, const char *format=SERIALIZER_DEFAULT_FORMAT)
bool test_tolerance_check(CollisionObjectConstPtr co, const CollisionChecker *cc)
bool test_overlap_map(const ShapeGroup *sg1, const ShapeGroup *sg2, std::vector< std::pair< int, int >> *missed_col_naive_out=0)
bool fcl_generic_collisionDetection(const FCLCollisionObject &obj_first, const FCLCollisionObject &obj_second)
int log_broadphase_failure(CollisionObjectConstPtr co, const ShapeGroup *sg)
int serialize(const test::BroadphaseFailureCCObj &bf_object, std::ostream &output_stream, const char *format=SERIALIZER_DEFAULT_FORMAT)
bool run_test_collide_obstacles(CollisionObjectConstPtr co, const collision::CollisionChecker *cc)
void addToGroup(ShapeConstPtr shape)
Adds a simple shape to the ShapeGroup.
int log_parentmap_failure(CollisionObjectConstPtr co)
bool run_test_narrowphase(CollisionObjectConstPtr co, const ShapeGroup *sg)
Polygon contains Triangles and Vertices.
const FCLCollisionObjectGroup * get_fcl_object_group_ptr(const CollisionObject *obj)