fcl_discrete_managers.cpp
Go to the documentation of this file.
1 
44 
46 {
49 
50 FCLDiscreteBVHManager::FCLDiscreteBVHManager(std::string name) : name_(std::move(name))
51 {
52  static_manager_ = std::make_unique<fcl::DynamicAABBTreeCollisionManagerd>();
53  dynamic_manager_ = std::make_unique<fcl::DynamicAABBTreeCollisionManagerd>();
55 }
56 
57 std::string FCLDiscreteBVHManager::getName() const { return name_; }
58 
60 {
61  auto manager = std::make_unique<FCLDiscreteBVHManager>();
62 
63  for (const auto& cow : link2cow_)
64  manager->addCollisionObject(cow.second->clone());
65 
66  manager->setActiveCollisionObjects(active_);
67  manager->setCollisionMarginData(collision_margin_data_);
68  manager->setContactAllowedValidator(validator_);
69 
70  return manager;
71 }
72 
73 bool FCLDiscreteBVHManager::addCollisionObject(const std::string& name,
74  const int& mask_id,
75  const CollisionShapesConst& shapes,
76  const tesseract_common::VectorIsometry3d& shape_poses,
77  bool enabled)
78 {
79  if (link2cow_.find(name) != link2cow_.end())
81 
82  COW::Ptr new_cow = createFCLCollisionObject(name, mask_id, shapes, shape_poses, enabled);
83  if (new_cow != nullptr)
84  {
85  addCollisionObject(new_cow);
86  return true;
87  }
88 
89  return false;
90 }
91 
93 {
94  auto cow = link2cow_.find(name);
95  return (link2cow_.find(name) != link2cow_.end()) ? cow->second->getCollisionGeometries() :
97 }
98 
101 {
102  auto cow = link2cow_.find(name);
103  return (link2cow_.find(name) != link2cow_.end()) ? cow->second->getCollisionGeometriesTransforms() :
105 }
106 
107 bool FCLDiscreteBVHManager::hasCollisionObject(const std::string& name) const
108 {
109  return (link2cow_.find(name) != link2cow_.end());
110 }
111 
112 bool FCLDiscreteBVHManager::removeCollisionObject(const std::string& name)
113 {
114  auto it = link2cow_.find(name);
115  if (it != link2cow_.end())
116  {
117  std::vector<CollisionObjectPtr>& objects = it->second->getCollisionObjects();
118  fcl_co_count_ -= objects.size();
119 
120  std::vector<fcl::CollisionObject<double>*> static_objs;
121  static_manager_->getObjects(static_objs);
122 
123  std::vector<fcl::CollisionObject<double>*> dynamic_objs;
124  dynamic_manager_->getObjects(dynamic_objs);
125 
126  // Must check if object exists in the manager before calling unregister.
127  // If it does not exist and unregister is called it is undefined behavior
128  for (auto& co : objects)
129  {
130  auto static_it = std::find(static_objs.begin(), static_objs.end(), co.get());
131  if (static_it != static_objs.end())
132  static_manager_->unregisterObject(co.get());
133 
134  auto dynamic_it = std::find(dynamic_objs.begin(), dynamic_objs.end(), co.get());
135  if (dynamic_it != dynamic_objs.end())
136  dynamic_manager_->unregisterObject(co.get());
137  }
138 
139  collision_objects_.erase(std::find(collision_objects_.begin(), collision_objects_.end(), name));
140  link2cow_.erase(name);
141  return true;
142  }
143  return false;
144 }
145 
146 bool FCLDiscreteBVHManager::enableCollisionObject(const std::string& name)
147 {
148  auto it = link2cow_.find(name);
149  if (it != link2cow_.end())
150  {
151  it->second->m_enabled = true;
152  return true;
153  }
154  return false;
155 }
156 
158 {
159  auto it = link2cow_.find(name);
160  if (it != link2cow_.end())
161  {
162  it->second->m_enabled = false;
163  return true;
164  }
165  return false;
166 }
167 
168 bool FCLDiscreteBVHManager::isCollisionObjectEnabled(const std::string& name) const
169 {
170  auto it = link2cow_.find(name);
171  if (it != link2cow_.end())
172  return it->second->m_enabled;
173 
174  return false;
175 }
176 
177 void FCLDiscreteBVHManager::setCollisionObjectsTransform(const std::string& name, const Eigen::Isometry3d& pose)
178 {
179  auto it = link2cow_.find(name);
180  if (it != link2cow_.end())
181  {
182  const Eigen::Isometry3d& cur_tf = it->second->getCollisionObjectsTransform();
183  // Note: If the transform has not changed do not updated to prevent unnecessary re-balancing of the BVH tree
184  if (!cur_tf.translation().isApprox(pose.translation(), 1e-8) || !cur_tf.rotation().isApprox(pose.rotation(), 1e-8))
185  {
186  it->second->setCollisionObjectsTransform(pose);
187  if (it->second->m_collisionFilterGroup == CollisionFilterGroups::StaticFilter)
188  {
189  // Note: Calling update causes a re-balance of the AABB tree, which is expensive
190  static_manager_->update(it->second->getCollisionObjectsRaw());
191  }
192  else
193  {
194  // Note: Calling update causes a re-balance of the AABB tree, which is expensive
195  dynamic_manager_->update(it->second->getCollisionObjectsRaw());
196  }
197  }
198  }
199 }
200 
201 void FCLDiscreteBVHManager::setCollisionObjectsTransform(const std::vector<std::string>& names,
203 {
204  assert(names.size() == poses.size());
205  static_update_.clear();
206  dynamic_update_.clear();
207  for (auto i = 0U; i < names.size(); ++i)
208  {
209  auto it = link2cow_.find(names[i]);
210  if (it != link2cow_.end())
211  {
212  const Eigen::Isometry3d& cur_tf = it->second->getCollisionObjectsTransform();
213  // Note: If the transform has not changed do not updated to prevent unnecessary re-balancing of the BVH tree
214  if (!cur_tf.translation().isApprox(poses[i].translation(), 1e-8) ||
215  !cur_tf.rotation().isApprox(poses[i].rotation(), 1e-8))
216  {
217  it->second->setCollisionObjectsTransform(poses[i]);
218  std::vector<CollisionObjectRawPtr>& co = it->second->getCollisionObjectsRaw();
219  if (it->second->m_collisionFilterGroup == CollisionFilterGroups::StaticFilter)
220  {
221  static_update_.insert(static_update_.end(), co.begin(), co.end());
222  }
223  else
224  {
225  dynamic_update_.insert(dynamic_update_.end(), co.begin(), co.end());
226  }
227  }
228  }
229  }
230 
231  // This is because FCL supports batch update which only re-balances the tree once
232  if (!static_update_.empty())
234 
235  if (!dynamic_update_.empty())
237 }
238 
240 {
241  static_update_.clear();
242  dynamic_update_.clear();
243  for (const auto& transform : transforms)
244  {
245  auto it = link2cow_.find(transform.first);
246  if (it != link2cow_.end())
247  {
248  const Eigen::Isometry3d& cur_tf = it->second->getCollisionObjectsTransform();
249  // Note: If the transform has not changed do not updated to prevent unnecessary re-balancing of the BVH tree
250  if (!cur_tf.translation().isApprox(transform.second.translation(), 1e-8) ||
251  !cur_tf.rotation().isApprox(transform.second.rotation(), 1e-8))
252  {
253  it->second->setCollisionObjectsTransform(transform.second);
254  std::vector<CollisionObjectRawPtr>& co = it->second->getCollisionObjectsRaw();
255  if (it->second->m_collisionFilterGroup == CollisionFilterGroups::StaticFilter)
256  {
257  static_update_.insert(static_update_.end(), co.begin(), co.end());
258  }
259  else
260  {
261  dynamic_update_.insert(dynamic_update_.end(), co.begin(), co.end());
262  }
263  }
264  }
265  }
266 
267  // This is because FCL supports batch update which only re-balances the tree once
268  if (!static_update_.empty())
270 
271  if (!dynamic_update_.empty())
273 }
274 
275 const std::vector<std::string>& FCLDiscreteBVHManager::getCollisionObjects() const { return collision_objects_; }
276 
277 void FCLDiscreteBVHManager::setActiveCollisionObjects(const std::vector<std::string>& names)
278 {
279  active_ = names;
280 
281  for (auto& co : link2cow_)
283 
284  // This causes a refit on the bvh tree.
285  dynamic_manager_->update();
286  static_manager_->update();
287 }
288 
289 const std::vector<std::string>& FCLDiscreteBVHManager::getActiveCollisionObjects() const { return active_; }
290 
292 {
293  collision_margin_data_ = std::move(collision_margin_data);
295 }
296 
298 
300  CollisionMarginPairOverrideType override_type)
301 {
302  collision_margin_data_.apply(pair_margin_data, override_type);
304 }
305 
306 void FCLDiscreteBVHManager::setDefaultCollisionMargin(double default_collision_margin)
307 {
308  collision_margin_data_.setDefaultCollisionMargin(default_collision_margin);
310 }
311 
312 void FCLDiscreteBVHManager::setCollisionMarginPair(const std::string& name1,
313  const std::string& name2,
314  double collision_margin)
315 {
316  collision_margin_data_.setCollisionMargin(name1, name2, collision_margin);
318 }
319 
321 {
324 }
325 
327  std::shared_ptr<const tesseract_common::ContactAllowedValidator> validator)
328 {
329  validator_ = std::move(validator);
330 }
331 std::shared_ptr<const tesseract_common::ContactAllowedValidator>
333 {
334  return validator_;
335 }
336 
338 {
339  ContactTestData cdata(active_, collision_margin_data_, validator_, request, collisions);
341  {
342  // TODO: Should the order be flipped?
343  if (!static_manager_->empty())
344  static_manager_->collide(dynamic_manager_.get(), &cdata, &distanceCallback);
345 
346  // It looks like the self check is as fast as selfDistanceContactTest even though it is N^2
347  if (!cdata.done && !dynamic_manager_->empty())
348  dynamic_manager_->collide(&cdata, &distanceCallback);
349  }
350  else
351  {
352  // TODO: Should the order be flipped?
353  if (!static_manager_->empty())
354  static_manager_->collide(dynamic_manager_.get(), &cdata, &collisionCallback);
355 
356  // It looks like the self check is as fast as selfDistanceContactTest even though it is N^2
357  if (!cdata.done && !dynamic_manager_->empty())
358  dynamic_manager_->collide(&cdata, &collisionCallback);
359  }
360 }
361 
363 {
364  std::size_t cnt = cow->getCollisionObjectsRaw().size();
365  fcl_co_count_ += cnt;
366  static_update_.reserve(fcl_co_count_);
368  link2cow_[cow->getName()] = cow;
369  collision_objects_.push_back(cow->getName());
370 
371  std::vector<CollisionObjectPtr>& objects = cow->getCollisionObjects();
372  if (cow->m_collisionFilterGroup == CollisionFilterGroups::StaticFilter)
373  {
374  // If static add to static manager
375  for (auto& co : objects)
376  static_manager_->registerObject(co.get());
377  }
378  else
379  {
380  for (auto& co : objects)
381  dynamic_manager_->registerObject(co.get());
382  }
383 
384  // If active links is not empty update filters to replace the active links list
385  if (!active_.empty())
387 
388  // This causes a refit on the bvh tree.
389  dynamic_manager_->update();
390  static_manager_->update();
391 }
392 
394 {
395  static_update_.clear();
396  dynamic_update_.clear();
397 
398  for (auto& cow : link2cow_)
399  {
400  cow.second->setContactDistanceThreshold(collision_margin_data_.getMaxCollisionMargin() / 2.0);
401  std::vector<CollisionObjectRawPtr>& co = cow.second->getCollisionObjectsRaw();
402  if (cow.second->m_collisionFilterGroup == CollisionFilterGroups::StaticFilter)
403  {
404  static_update_.insert(static_update_.end(), co.begin(), co.end());
405  }
406  else
407  {
408  dynamic_update_.insert(dynamic_update_.end(), co.begin(), co.end());
409  }
410  }
411 
412  if (!static_update_.empty())
414 
415  if (!dynamic_update_.empty())
417 }
418 } // namespace tesseract_collision::tesseract_collision_fcl
tesseract_common::VectorIsometry3d
AlignedVector< Eigen::Isometry3d > VectorIsometry3d
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::getCollisionObjectGeometriesTransforms
const tesseract_common::VectorIsometry3d & getCollisionObjectGeometriesTransforms(const std::string &name) const override final
Get a collision objects collision geometries transforms.
Definition: fcl_discrete_managers.cpp:100
tesseract_common::CollisionMarginData::setCollisionMargin
void setCollisionMargin(const std::string &obj1, const std::string &obj2, double collision_margin)
tesseract_common::CollisionMarginData::getMaxCollisionMargin
double getMaxCollisionMargin() const
tesseract_collision::ContactTestData
This data is intended only to be used internal to the collision checkers as a container and should no...
Definition: types.h:328
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::enableCollisionObject
bool enableCollisionObject(const std::string &name) override final
Enable an object.
Definition: fcl_discrete_managers.cpp:146
fcl_discrete_managers.h
Tesseract ROS FCL contact checker implementation.
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::setCollisionMarginPair
void setCollisionMarginPair(const std::string &name1, const std::string &name2, double collision_margin) override final
Set the margin for a given contact pair.
Definition: fcl_discrete_managers.cpp:312
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::getName
std::string getName() const override final
Get the name of the contact manager.
Definition: fcl_discrete_managers.cpp:57
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::incrementCollisionMargin
void incrementCollisionMargin(double increment) override final
Increment the collision margin data by some value.
Definition: fcl_discrete_managers.cpp:320
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::setCollisionMarginPairData
void setCollisionMarginPairData(const CollisionMarginPairData &pair_margin_data, CollisionMarginPairOverrideType override_type=CollisionMarginPairOverrideType::REPLACE) override final
Set the contact distance thresholds for which collision should be considered on a per pair basis.
Definition: fcl_discrete_managers.cpp:299
contact_allowed_validator.h
tesseract_collision::ContactTestData::done
bool done
Indicate if search is finished.
Definition: types.h:355
tesseract_collision::tesseract_collision_fcl::EMPTY_COLLISION_SHAPES_CONST
static const CollisionShapesConst EMPTY_COLLISION_SHAPES_CONST
Definition: fcl_discrete_managers.cpp:47
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::collision_objects_
std::vector< std::string > collision_objects_
A list of the collision objects.
Definition: fcl_discrete_managers.h:144
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::dynamic_manager_
std::unique_ptr< fcl::BroadPhaseCollisionManagerd > dynamic_manager_
Broad-phase Collision Manager for active collision objects.
Definition: fcl_discrete_managers.h:140
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::setCollisionObjectsTransform
void setCollisionObjectsTransform(const std::string &name, const Eigen::Isometry3d &pose) override final
Set a single collision object's transforms.
Definition: fcl_discrete_managers.cpp:177
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::collision_margin_data_
CollisionMarginData collision_margin_data_
The contact distance threshold.
Definition: fcl_discrete_managers.h:145
tesseract_common::TransformMap
AlignedMap< std::string, Eigen::Isometry3d > TransformMap
tesseract_collision::tesseract_collision_fcl::StaticFilter
@ StaticFilter
Definition: fcl_utils.h:68
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::contactTest
void contactTest(ContactResultMap &collisions, const ContactRequest &request) override final
Perform a contact test for all objects based.
Definition: fcl_discrete_managers.cpp:337
transform
template Halfspace< double > transform(const Halfspace< double > &a, const Transform3< double > &tf)
tesseract_collision::tesseract_collision_fcl::collisionCallback
bool collisionCallback(fcl::CollisionObjectd *o1, fcl::CollisionObjectd *o2, void *data)
Definition: fcl_utils.cpp:219
tesseract_common::CollisionMarginData
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::fcl_co_count_
std::size_t fcl_co_count_
The number fcl collision objects.
Definition: fcl_discrete_managers.h:148
tesseract_collision::tesseract_collision_fcl::updateCollisionObjectFilters
void updateCollisionObjectFilters(const std::vector< std::string > &active, const COW::Ptr &cow, const std::unique_ptr< fcl::BroadPhaseCollisionManagerd > &static_manager, const std::unique_ptr< fcl::BroadPhaseCollisionManagerd > &dynamic_manager)
Update collision objects filters.
Definition: fcl_utils.h:222
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::hasCollisionObject
bool hasCollisionObject(const std::string &name) const override final
Find if a collision object already exists.
Definition: fcl_discrete_managers.cpp:107
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::clone
DiscreteContactManager::UPtr clone() const override final
Clone the manager.
Definition: fcl_discrete_managers.cpp:59
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::setDefaultCollisionMargin
void setDefaultCollisionMargin(double default_collision_margin) override final
Set the default collision margin.
Definition: fcl_discrete_managers.cpp:306
name
std::string name
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::onCollisionMarginDataChanged
void onCollisionMarginDataChanged()
This function will update internal data when margin data has changed.
Definition: fcl_discrete_managers.cpp:393
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::removeCollisionObject
bool removeCollisionObject(const std::string &name) override final
Remove an object from the checker.
Definition: fcl_discrete_managers.cpp:112
tesseract_collision::ContactResultMap
This structure hold contact results for link pairs.
Definition: types.h:155
tesseract_common::CollisionMarginPairOverrideType
CollisionMarginPairOverrideType
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::disableCollisionObject
bool disableCollisionObject(const std::string &name) override final
Disable an object.
Definition: fcl_discrete_managers.cpp:157
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::name_
std::string name_
Definition: fcl_discrete_managers.h:134
tesseract_collision::tesseract_collision_fcl::distanceCallback
bool distanceCallback(fcl::CollisionObjectd *o1, fcl::CollisionObjectd *o2, void *data)
Definition: fcl_utils.cpp:287
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::getCollisionMarginData
const CollisionMarginData & getCollisionMarginData() const override final
Get the contact distance threshold.
Definition: fcl_discrete_managers.cpp:297
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::setCollisionMarginData
void setCollisionMarginData(CollisionMarginData collision_margin_data) override final
Set the contact distance threshold.
Definition: fcl_discrete_managers.cpp:291
tesseract_collision::tesseract_collision_fcl::createFCLCollisionObject
COW::Ptr createFCLCollisionObject(const std::string &name, const int &type_id, const CollisionShapesConst &shapes, const tesseract_common::VectorIsometry3d &shape_poses, bool enabled)
Definition: fcl_utils.h:195
tesseract_collision::tesseract_collision_fcl::EMPTY_COLLISION_SHAPES_TRANSFORMS
static const tesseract_common::VectorIsometry3d EMPTY_COLLISION_SHAPES_TRANSFORMS
Definition: fcl_discrete_managers.cpp:48
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::dynamic_update_
std::vector< CollisionObjectRawPtr > dynamic_update_
This is used to store dynamic collision objects to update.
Definition: fcl_discrete_managers.h:154
tesseract_collision::tesseract_collision_fcl
Definition: fcl_collision_geometry_cache.h:42
tesseract_collision::CollisionShapesConst
std::vector< CollisionShapeConstPtr > CollisionShapesConst
Definition: types.h:51
tesseract_common::CollisionMarginData::apply
void apply(const CollisionMarginPairData &pair_margin_data, CollisionMarginPairOverrideType override_type)
tesseract_collision::tesseract_collision_fcl::CollisionObjectWrapper::Ptr
std::shared_ptr< CollisionObjectWrapper > Ptr
Definition: fcl_utils.h:82
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::static_manager_
std::unique_ptr< fcl::BroadPhaseCollisionManagerd > static_manager_
Broad-phase Collision Manager for active collision objects.
Definition: fcl_discrete_managers.h:137
tesseract_common::CollisionMarginData::incrementMargins
void incrementMargins(double increment)
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::getCollisionObjectGeometries
const CollisionShapesConst & getCollisionObjectGeometries(const std::string &name) const override final
Get a collision objects collision geometries.
Definition: fcl_discrete_managers.cpp:92
tesseract_common::CollisionMarginPairData
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::active_
std::vector< std::string > active_
A list of the active collision objects.
Definition: fcl_discrete_managers.h:143
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::addCollisionObject
bool addCollisionObject(const std::string &name, const int &mask_id, const CollisionShapesConst &shapes, const tesseract_common::VectorIsometry3d &shape_poses, bool enabled=true) override final
Add a object to the checker.
Definition: fcl_discrete_managers.cpp:73
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::setActiveCollisionObjects
void setActiveCollisionObjects(const std::vector< std::string > &names) override final
Set which collision objects can move.
Definition: fcl_discrete_managers.cpp:277
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::static_update_
std::vector< CollisionObjectRawPtr > static_update_
This is used to store static collision objects to update.
Definition: fcl_discrete_managers.h:151
tesseract_common::CollisionMarginData::setDefaultCollisionMargin
void setDefaultCollisionMargin(double default_collision_margin)
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::getActiveCollisionObjects
const std::vector< std::string > & getActiveCollisionObjects() const override final
Get which collision objects can move.
Definition: fcl_discrete_managers.cpp:289
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::link2cow_
Link2COW link2cow_
A map of all (static and active) collision objects being managed.
Definition: fcl_discrete_managers.h:142
tesseract_collision::DiscreteContactManager::UPtr
std::unique_ptr< DiscreteContactManager > UPtr
Definition: discrete_contact_manager.h:50
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::validator_
std::shared_ptr< const tesseract_common::ContactAllowedValidator > validator_
The is allowed collision function.
Definition: fcl_discrete_managers.h:146
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::getCollisionObjects
const std::vector< std::string > & getCollisionObjects() const override final
Get all collision objects.
Definition: fcl_discrete_managers.cpp:275
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::FCLDiscreteBVHManager
FCLDiscreteBVHManager(std::string name="FCLDiscreteBVHManager")
Definition: fcl_discrete_managers.cpp:50
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::getContactAllowedValidator
std::shared_ptr< const tesseract_common::ContactAllowedValidator > getContactAllowedValidator() const override final
Get the active function for determining if two links are allowed to be in collision.
Definition: fcl_discrete_managers.cpp:332
tesseract_collision::ContactRequest
The ContactRequest struct.
Definition: types.h:300
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::isCollisionObjectEnabled
bool isCollisionObjectEnabled(const std::string &name) const override final
Check if collision object is enabled.
Definition: fcl_discrete_managers.cpp:168
tesseract_collision::CollisionMarginData
tesseract_common::CollisionMarginData CollisionMarginData
Definition: types.h:52
tesseract_collision::tesseract_collision_fcl::FCLDiscreteBVHManager::setContactAllowedValidator
void setContactAllowedValidator(std::shared_ptr< const tesseract_common::ContactAllowedValidator > validator) override final
Set the active function for determining if two links are allowed to be in collision.
Definition: fcl_discrete_managers.cpp:326


tesseract_collision
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:52