@@ -89,7 +89,7 @@ void ComputeIK::setTargetPose(const Eigen::Isometry3d& pose, const std::string&
8989struct IKSolution
9090{
9191 std::vector<double > joint_positions;
92- collision_detection::Contact contact ;
92+ collision_detection::CollisionResult::ContactMap contacts ;
9393 bool collision_free;
9494 bool satisfies_constraints;
9595};
@@ -141,7 +141,7 @@ bool isTargetPoseCollidingInEEF(const planning_scene::PlanningSceneConstPtr& sce
141141}
142142
143143std::string listCollisionPairs (const collision_detection::CollisionResult::ContactMap& contacts,
144- const std::string& separator) {
144+ const std::string& separator = " , " ) {
145145 std::string result;
146146 for (const auto & contact : contacts) {
147147 if (!result.empty ())
@@ -345,8 +345,8 @@ void ComputeIK::compute() {
345345 generateCollisionMarkers (sandbox_state, appender, links_to_visualize);
346346 std::copy (eef_markers.begin (), eef_markers.end (), std::back_inserter (solution.markers ()));
347347 solution.markAsFailure ();
348- // TODO: visualize collisions
349- solution.setComment (s. comment () + " eef in collision: " + listCollisionPairs ( collisions.contacts , " , " ) );
348+ solution. setComment (s. comment () + " eef in collision: " + listCollisionPairs ( collisions. contacts ));
349+ utils::addCollisionMarkers ( solution.markers (), scene-> getPlanningFrame (), collisions.contacts );
350350 auto colliding_scene{ scene->diff () };
351351 colliding_scene->setCurrentState (sandbox_state);
352352 spawn (InterfaceState (colliding_scene), std::move (solution));
@@ -395,9 +395,7 @@ void ComputeIK::compute() {
395395 req.group_name = jmg->getName ();
396396 scene->checkCollision (req, res, *state);
397397 solution.collision_free = ignore_collisions || !res.collision ;
398- if (!res.contacts .empty ()) {
399- solution.contact = res.contacts .begin ()->second .front ();
400- }
398+ solution.contacts = std::move (res.contacts );
401399
402400 return solution.satisfies_constraints && solution.collision_free ;
403401 };
@@ -433,10 +431,8 @@ void ComputeIK::compute() {
433431 // compute cost as distance to compare_pose
434432 solution.setCost (s.cost () + jmg->distance (ik_solutions[i].joint_positions .data (), compare_pose.data ()));
435433 else if (!ik_solutions[i].collision_free ) { // solution was in collision
436- std::stringstream ss;
437- ss << " Collision between '" << ik_solutions[i].contact .body_name_1 << " ' and '"
438- << ik_solutions[i].contact .body_name_2 << " '" ;
439- solution.markAsFailure (ss.str ());
434+ solution.markAsFailure (" Collision between " + listCollisionPairs (ik_solutions[i].contacts ));
435+ utils::addCollisionMarkers (solution.markers (), scene->getPlanningFrame (), ik_solutions[i].contacts );
440436 } else if (!ik_solutions[i].satisfies_constraints ) { // solution was violating constraints
441437 solution.markAsFailure (" Constraints violated" );
442438 }
0 commit comments