51 : name_(std::move(
name)), config_info_(std::move(config_info)), coll_config_(config_info_)
58 coll_config_.getCollisionAlgorithmCreateFunc(CONVEX_SHAPE_PROXYTYPE, CONVEX_SHAPE_PROXYTYPE));
61 ~btCollisionDispatcher::CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD);
75 COW::Ptr new_cow = cow.second->clone();
77 assert(new_cow->getCollisionShape());
78 assert(new_cow->getCollisionShape()->getShapeType() != CUSTOM_CONVEX_SHAPE_TYPE);
80 new_cow->setWorldTransform(cow.second->getWorldTransform());
81 new_cow->setContactProcessingThreshold(margin);
83 manager->addCollisionObject(new_cow);
86 manager->setActiveCollisionObjects(
active_);
103 if (new_cow !=
nullptr)
106 new_cow->setContactProcessingThreshold(margin);
139 cows_.erase(std::find_if(
cows_.begin(),
cows_.end(), [&
name](
const auto& p) { return p->getName() == name; }));
154 it->second->m_enabled =
true;
167 it->second->m_enabled =
false;
179 return it->second->m_enabled;
192 it->second->setWorldTransform(tf);
200 assert(names.size() == poses.size());
201 for (
auto i = 0U; i < names.size(); ++i)
212 const Eigen::Isometry3d& pose1,
213 const Eigen::Isometry3d& pose2)
226 cow->setWorldTransform(tf1);
232 if (btBroadphaseProxy::isConvex(cow->getCollisionShape()->getShapeType()))
234 assert(
dynamic_cast<CastHullShape*
>(cow->getCollisionShape()) !=
nullptr);
235 static_cast<CastHullShape*
>(cow->getCollisionShape())->updateCastTransform(tf1.inverseTimes(tf2));
237 else if (btBroadphaseProxy::isCompound(cow->getCollisionShape()->getShapeType()))
239 assert(
dynamic_cast<btCompoundShape*
>(cow->getCollisionShape()) !=
nullptr);
240 auto* compound =
static_cast<btCompoundShape*
>(cow->getCollisionShape());
241 for (
int i = 0; i < compound->getNumChildShapes(); ++i)
243 if (btBroadphaseProxy::isConvex(compound->getChildShape(i)->getShapeType()))
245 assert(
dynamic_cast<CastHullShape*
>(compound->getChildShape(i)) !=
nullptr);
246 const btTransform& local_tf = compound->getChildTransform(i);
248 btTransform delta_tf = (tf1 * local_tf).inverseTimes(tf2 * local_tf);
249 static_cast<CastHullShape*
>(compound->getChildShape(i))->updateCastTransform(delta_tf);
250 compound->updateChildTransform(i, local_tf,
false);
252 else if (btBroadphaseProxy::isCompound(compound->getChildShape(i)->getShapeType()))
254 assert(
dynamic_cast<btCompoundShape*
>(compound->getChildShape(i)) !=
nullptr);
255 auto* second_compound =
static_cast<btCompoundShape*
>(compound->getChildShape(i));
257 for (
int j = 0; j < second_compound->getNumChildShapes(); ++j)
259 assert(!btBroadphaseProxy::isCompound(second_compound->getChildShape(j)->getShapeType()));
260 assert(
dynamic_cast<CastHullShape*
>(second_compound->getChildShape(j)) !=
nullptr);
261 const btTransform& local_tf = second_compound->getChildTransform(j);
263 btTransform delta_tf = (tf1 * local_tf).inverseTimes(tf2 * local_tf);
264 static_cast<CastHullShape*
>(second_compound->getChildShape(j))->updateCastTransform(delta_tf);
265 second_compound->updateChildTransform(j, local_tf,
false);
267 second_compound->recalculateLocalAabb();
270 compound->recalculateLocalAabb();
274 throw std::runtime_error(
"I can only collision check convex shapes and compound shapes made of convex shapes");
284 assert(names.size() == pose1.size());
285 assert(names.size() == pose2.size());
286 for (
auto i = 0U; i < names.size(); ++i)
293 assert(pose1.size() == pose2.size());
294 auto it1 = pose1.begin();
295 auto it2 = pose2.begin();
296 while (it1 != pose1.end())
298 assert(pose1.find(it1->first) != pose2.end());
300 std::advance(it1, 1);
301 std::advance(it2, 1);
336 cows_.push_back(cow);
368 const std::string& name2,
369 double collision_margin)
382 std::shared_ptr<const tesseract_common::ContactAllowedValidator> validator)
386 std::shared_ptr<const tesseract_common::ContactAllowedValidator>
397 for (
auto cow1_iter =
cows_.begin(); cow1_iter != (
cows_.end() - 1); cow1_iter++)
404 if (!cow1->m_enabled)
407 btVector3 min_aabb[2], max_aabb[2];
408 cow1->getAABB(min_aabb[0], max_aabb[0]);
410 btCollisionObjectWrapper obA(
nullptr, cow1->getCollisionShape(), cow1.get(), cow1->getWorldTransform(), -1, -1);
413 for (
auto cow2_iter = cow1_iter + 1; cow2_iter !=
cows_.end(); cow2_iter++)
418 cow2->getAABB(min_aabb[1], max_aabb[1]);
420 bool aabb_check = (min_aabb[0][0] <= max_aabb[1][0] && max_aabb[0][0] >= min_aabb[1][0]) &&
421 (min_aabb[0][1] <= max_aabb[1][1] && max_aabb[0][1] >= min_aabb[1][1]) &&
422 (min_aabb[0][2] <= max_aabb[1][2] && max_aabb[0][2] >= min_aabb[1][2]);
430 btCollisionObjectWrapper obB(
431 nullptr, cow2->getCollisionShape(), cow2.get(), cow2->getWorldTransform(), -1, -1);
433 btCollisionAlgorithm* algorithm =
434 dispatcher_->findAlgorithm(&obA, &obB,
nullptr, BT_CLOSEST_POINT_ALGORITHMS);
435 assert(algorithm !=
nullptr);
436 if (algorithm !=
nullptr)
439 contactPointResult.m_closestPointDistanceThreshold = cc.m_closestDistanceThreshold;
442 algorithm->processCollision(&obA, &obB,
dispatch_info_, &contactPointResult);
444 algorithm->~btCollisionAlgorithm();
475 cows_.push_back(cow);
482 co.second->setContactProcessingThreshold(margin);
485 co.second->setContactProcessingThreshold(margin);