@@ -315,17 +315,13 @@ bool CollisionCallback::collide(coal::CollisionObject* o1, coal::CollisionObject
315315 coal::CollisionResult col_result;
316316 coal::CollisionRequest col_request;
317317 col_request.num_max_contacts = num_contacts;
318- col_request.enable_contact = cdata->req .calculate_penetration ;
318+ col_request.enable_contact = ( cdata->req .calculate_distance || cdata-> req . calculate_penetration ) ;
319319 col_request.gjk_variant = coal::GJKVariant::NesterovAcceleration;
320- col_request.gjk_convergence_criterion = coal::GJKConvergenceCriterion::DualityGap;
321- col_request.gjk_convergence_criterion_type = coal::GJKConvergenceCriterionType::Absolute;
322320 col_request.gjk_initial_guess = coal::BoundingVolumeGuess;
323- // col_request.gjk_tolerance = 1e-5;
324- // col_request.epa_tolerance = 1e-5;
325- // col_request.break_distance // Leave at default?
326- // col_request.collision_distance_threshold // Leave at default (close to 0)
327- // col_request.distance_upper_bound = // Collision margin + buffer?
328321 col_request.security_margin = cdata->collision_margin_data .getCollisionMargin (cd1->getName (), cd2->getName ());
322+ // Stop GJK if distance is larger than the security margin, i.e. no collision (plus a small margin for numerical
323+ // stability)
324+ col_request.distance_upper_bound = col_request.security_margin + 1e-6 ;
329325 coal::collide (o1, o2, col_request, col_result);
330326
331327 if (col_result.isCollision ())
@@ -334,6 +330,8 @@ bool CollisionCallback::collide(coal::CollisionObject* o1, coal::CollisionObject
334330
335331 const Eigen::Isometry3d& tf1 = cd1->getCollisionObjectsTransform ();
336332 const Eigen::Isometry3d& tf2 = cd2->getCollisionObjectsTransform ();
333+ Eigen::Isometry3d tf1_inv = tf1.inverse ();
334+ Eigen::Isometry3d tf2_inv = tf2.inverse ();
337335
338336 for (size_t i = 0 ; i < col_result.numContacts (); ++i)
339337 {
@@ -347,8 +345,8 @@ bool CollisionCallback::collide(coal::CollisionObject* o1, coal::CollisionObject
347345 contact.subshape_id [1 ] = static_cast <int >(coal_contact.b2 );
348346 contact.nearest_points [0 ] = coal_contact.nearest_points [0 ];
349347 contact.nearest_points [1 ] = coal_contact.nearest_points [1 ];
350- contact.nearest_points_local [0 ] = tf1. inverse () * contact.nearest_points [0 ];
351- contact.nearest_points_local [1 ] = tf2. inverse () * contact.nearest_points [1 ];
348+ contact.nearest_points_local [0 ] = tf1_inv * contact.nearest_points [0 ];
349+ contact.nearest_points_local [1 ] = tf2_inv * contact.nearest_points [1 ];
352350 contact.transform [0 ] = tf1;
353351 contact.transform [1 ] = tf2;
354352 contact.type_id [0 ] = cd1->getTypeID ();
@@ -385,12 +383,7 @@ bool DistanceCallback::collide(coal::CollisionObject* o1, coal::CollisionObject*
385383 coal::DistanceRequest dist_request (true );
386384 dist_request.enable_signed_distance = cdata->req .calculate_penetration ;
387385 dist_request.gjk_variant = coal::GJKVariant::NesterovAcceleration;
388- dist_request.gjk_convergence_criterion = coal::GJKConvergenceCriterion::DualityGap;
389- dist_request.gjk_convergence_criterion_type = coal::GJKConvergenceCriterionType::Absolute;
390386 dist_request.gjk_initial_guess = coal::BoundingVolumeGuess;
391- // dist_request.gjk_tolerance = 1e-5;
392- // dist_request.epa_tolerance = 1e-5;
393- // dist_request.collision_distance_threshold // Leave at default (close to 0)
394387 const double d = coal::distance (o1, o2, dist_request, dist_result);
395388
396389 if (d < cdata->collision_margin_data .getMaxCollisionMargin ())
@@ -415,7 +408,6 @@ bool DistanceCallback::collide(coal::CollisionObject* o1, coal::CollisionObject*
415408 contact.type_id [1 ] = cd2->getTypeID ();
416409 contact.distance = dist_result.min_distance ;
417410 contact.normal = (dist_result.min_distance * (contact.nearest_points [1 ] - contact.nearest_points [0 ])).normalized ();
418- // contact.normal = dist_result.normal;
419411
420412 TESSERACT_THREAD_LOCAL tesseract_common::LinkNamesPair link_pair;
421413 tesseract_common::makeOrderedLinkPair (link_pair, cd1->getName (), cd2->getName ());
0 commit comments