bullet_discrete_simple_manager.cpp
Go to the documentation of this file.
1 
44 
46 {
49 
52  : name_(std::move(name)), config_info_(std::move(config_info)), coll_config_(config_info_)
53 {
54  dispatcher_ = std::make_unique<btCollisionDispatcher>(&coll_config_);
55 
56  dispatcher_->registerCollisionCreateFunc(
57  BOX_SHAPE_PROXYTYPE,
58  BOX_SHAPE_PROXYTYPE,
59  coll_config_.getCollisionAlgorithmCreateFunc(CONVEX_SHAPE_PROXYTYPE, CONVEX_SHAPE_PROXYTYPE));
60 
61  dispatcher_->setDispatcherFlags(dispatcher_->getDispatcherFlags() &
62  ~btCollisionDispatcher::CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD);
63 
65 }
66 
67 std::string BulletDiscreteSimpleManager::getName() const { return name_; }
68 
70 {
71  auto manager = std::make_unique<BulletDiscreteSimpleManager>(name_, config_info_.clone());
72 
73  auto margin = static_cast<btScalar>(contact_test_data_.collision_margin_data.getMaxCollisionMargin());
74 
75  for (const auto& cow : link2cow_)
76  {
77  COW::Ptr new_cow = cow.second->clone();
78 
79  assert(new_cow->getCollisionShape());
80  assert(new_cow->getCollisionShape()->getShapeType() != CUSTOM_CONVEX_SHAPE_TYPE);
81 
82  new_cow->setWorldTransform(cow.second->getWorldTransform());
83  new_cow->setContactProcessingThreshold(margin);
84 
85  manager->addCollisionObject(new_cow);
86  }
87 
88  manager->setActiveCollisionObjects(active_);
89  manager->setCollisionMarginData(contact_test_data_.collision_margin_data);
90  manager->setContactAllowedValidator(contact_test_data_.validator);
91 
92  return manager;
93 }
94 
96  const int& mask_id,
97  const CollisionShapesConst& shapes,
98  const tesseract_common::VectorIsometry3d& shape_poses,
99  bool enabled)
100 {
101  if (link2cow_.find(name) != link2cow_.end())
103 
104  COW::Ptr new_cow = createCollisionObject(name, mask_id, shapes, shape_poses, enabled);
105  if (new_cow != nullptr)
106  {
107  auto margin = static_cast<btScalar>(contact_test_data_.collision_margin_data.getMaxCollisionMargin());
108  new_cow->setContactProcessingThreshold(margin);
109  addCollisionObject(new_cow);
110  return true;
111  }
112 
113  return false;
114 }
115 
117 {
118  auto cow = link2cow_.find(name);
119  return (link2cow_.find(name) != link2cow_.end()) ? cow->second->getCollisionGeometries() :
121 }
122 
125 {
126  auto cow = link2cow_.find(name);
127  return (link2cow_.find(name) != link2cow_.end()) ? cow->second->getCollisionGeometriesTransforms() :
129 }
130 
131 bool BulletDiscreteSimpleManager::hasCollisionObject(const std::string& name) const
132 {
133  return (link2cow_.find(name) != link2cow_.end());
134 }
135 
137 {
138  auto it = link2cow_.find(name);
139  if (it != link2cow_.end())
140  {
141  cows_.erase(std::find(cows_.begin(), cows_.end(), it->second));
142  collision_objects_.erase(std::find(collision_objects_.begin(), collision_objects_.end(), name));
143  link2cow_.erase(name);
144  return true;
145  }
146 
147  return false;
148 }
149 
151 {
152  auto it = link2cow_.find(name);
153  if (it != link2cow_.end())
154  {
155  it->second->m_enabled = true;
156  return true;
157  }
158  return false;
159 }
160 
162 {
163  auto it = link2cow_.find(name);
164  if (it != link2cow_.end())
165  {
166  it->second->m_enabled = false;
167  return true;
168  }
169  return false;
170 }
171 
172 bool BulletDiscreteSimpleManager::isCollisionObjectEnabled(const std::string& name) const
173 {
174  auto it = link2cow_.find(name);
175  if (it != link2cow_.end())
176  return it->second->m_enabled;
177 
178  return false;
179 }
180 
181 void BulletDiscreteSimpleManager::setCollisionObjectsTransform(const std::string& name, const Eigen::Isometry3d& pose)
182 {
183  // TODO: Find a way to remove this check. Need to store information in Tesseract EnvState indicating transforms with
184  // geometry
185  auto it = link2cow_.find(name);
186  if (it != link2cow_.end())
187  it->second->setWorldTransform(convertEigenToBt(pose));
188 }
189 
190 void BulletDiscreteSimpleManager::setCollisionObjectsTransform(const std::vector<std::string>& names,
192 {
193  assert(names.size() == poses.size());
194  for (auto i = 0U; i < names.size(); ++i)
195  setCollisionObjectsTransform(names[i], poses[i]);
196 }
197 
199 {
200  for (const auto& transform : transforms)
202 }
203 
204 const std::vector<std::string>& BulletDiscreteSimpleManager::getCollisionObjects() const { return collision_objects_; }
205 
206 void BulletDiscreteSimpleManager::setActiveCollisionObjects(const std::vector<std::string>& names)
207 {
208  active_ = names;
210  cows_.clear();
211  cows_.reserve(link2cow_.size());
212 
213  for (auto& co : link2cow_)
214  {
215  COW::Ptr& cow = co.second;
216 
218 
219  // Update collision object vector
220  if (cow->m_collisionFilterGroup == btBroadphaseProxy::KinematicFilter)
221  cows_.insert(cows_.begin(), cow);
222  else
223  cows_.push_back(cow);
224  }
225 }
226 
227 const std::vector<std::string>& BulletDiscreteSimpleManager::getActiveCollisionObjects() const { return active_; }
228 
230 {
231  contact_test_data_.collision_margin_data = std::move(collision_margin_data);
233 }
234 
236 {
238 }
239 
241  CollisionMarginPairOverrideType override_type)
242 {
243  contact_test_data_.collision_margin_data.apply(pair_margin_data, override_type);
245 }
246 
247 void BulletDiscreteSimpleManager::setDefaultCollisionMargin(double default_collision_margin)
248 {
251 }
252 
254  const std::string& name2,
255  double collision_margin)
256 {
257  contact_test_data_.collision_margin_data.setCollisionMargin(name1, name2, collision_margin);
259 }
260 
262 {
265 }
266 
268  std::shared_ptr<const tesseract_common::ContactAllowedValidator> validator)
269 {
270  contact_test_data_.validator = std::move(validator);
271 }
272 std::shared_ptr<const tesseract_common::ContactAllowedValidator>
274 {
276 }
278 {
279  contact_test_data_.res = &collisions;
280  contact_test_data_.req = request;
281  contact_test_data_.done = false;
282 
283  for (auto cow1_iter = cows_.begin(); cow1_iter != (cows_.end() - 1); cow1_iter++)
284  {
285  const COW::Ptr& cow1 = *cow1_iter;
286 
287  if (cow1->m_collisionFilterGroup != btBroadphaseProxy::KinematicFilter)
288  break;
289 
290  if (!cow1->m_enabled)
291  continue;
292 
293  btVector3 min_aabb[2], max_aabb[2]; // NOLINT
294  cow1->getAABB(min_aabb[0], max_aabb[0]);
295 
296  btCollisionObjectWrapper obA(nullptr, cow1->getCollisionShape(), cow1.get(), cow1->getWorldTransform(), -1, -1);
297 
298  DiscreteCollisionCollector cc(contact_test_data_, cow1, cow1->getContactProcessingThreshold());
299  for (auto cow2_iter = cow1_iter + 1; cow2_iter != cows_.end(); cow2_iter++)
300  {
301  assert(!contact_test_data_.done);
302 
303  const COW::Ptr& cow2 = *cow2_iter;
304  cow2->getAABB(min_aabb[1], max_aabb[1]);
305 
306  bool aabb_check = (min_aabb[0][0] <= max_aabb[1][0] && max_aabb[0][0] >= min_aabb[1][0]) &&
307  (min_aabb[0][1] <= max_aabb[1][1] && max_aabb[0][1] >= min_aabb[1][1]) &&
308  (min_aabb[0][2] <= max_aabb[1][2] && max_aabb[0][2] >= min_aabb[1][2]);
309 
310  if (aabb_check)
311  {
312  bool needs_collision = needsCollisionCheck(*cow1, *cow2, contact_test_data_.validator, false);
313 
314  if (needs_collision)
315  {
316  btCollisionObjectWrapper obB(
317  nullptr, cow2->getCollisionShape(), cow2.get(), cow2->getWorldTransform(), -1, -1);
318 
319  btCollisionAlgorithm* algorithm =
320  dispatcher_->findAlgorithm(&obA, &obB, nullptr, BT_CLOSEST_POINT_ALGORITHMS);
321  assert(algorithm != nullptr);
322  if (algorithm != nullptr)
323  {
324  TesseractBridgedManifoldResult contactPointResult(&obA, &obB, cc);
325  contactPointResult.m_closestPointDistanceThreshold = cc.m_closestDistanceThreshold;
326 
327  // discrete collision detection query
328  algorithm->processCollision(&obA, &obB, dispatch_info_, &contactPointResult);
329 
330  algorithm->~btCollisionAlgorithm();
331  dispatcher_->freeCollisionAlgorithm(algorithm);
332  }
333  }
334  }
335 
337  break;
338  }
339 
341  break;
342  }
343 }
344 
346 {
347  cow->setUserPointer(&contact_test_data_);
348  link2cow_[cow->getName()] = cow;
349  collision_objects_.push_back(cow->getName());
350 
351  if (cow->m_collisionFilterGroup == btBroadphaseProxy::KinematicFilter)
352  cows_.insert(cows_.begin(), cow);
353  else
354  cows_.push_back(cow);
355 }
356 
358 {
359  auto margin = static_cast<btScalar>(contact_test_data_.collision_margin_data.getMaxCollisionMargin());
360  for (auto& co : link2cow_)
361  co.second->setContactProcessingThreshold(margin);
362 }
363 
364 } // namespace tesseract_collision::tesseract_collision_bullet
tesseract_common::VectorIsometry3d
AlignedVector< Eigen::Isometry3d > VectorIsometry3d
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::removeCollisionObject
bool removeCollisionObject(const std::string &name) override final
Remove an object from the checker.
Definition: bullet_discrete_simple_manager.cpp:136
tesseract_common::CollisionMarginData::setCollisionMargin
void setCollisionMargin(const std::string &obj1, const std::string &obj2, double collision_margin)
tesseract_collision::tesseract_collision_bullet::EMPTY_COLLISION_SHAPES_TRANSFORMS
static const tesseract_common::VectorIsometry3d EMPTY_COLLISION_SHAPES_TRANSFORMS
Definition: bullet_cast_bvh_manager.cpp:50
tesseract_common::CollisionMarginData::getMaxCollisionMargin
double getMaxCollisionMargin() const
tesseract_collision::tesseract_collision_bullet
Definition: bullet_cast_bvh_manager.h:48
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::getCollisionMarginData
const CollisionMarginData & getCollisionMarginData() const override final
Get the contact distance threshold.
Definition: bullet_discrete_simple_manager.cpp:235
tesseract_collision::tesseract_collision_bullet::TesseractCollisionConfigurationInfo
Definition: tesseract_collision_configuration.h:52
contact_allowed_validator.h
tesseract_collision::ContactTestData::done
bool done
Indicate if search is finished.
Definition: types.h:355
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::dispatcher_
std::unique_ptr< btCollisionDispatcher > dispatcher_
The bullet collision dispatcher used for getting object to object collison algorithm.
Definition: bullet_discrete_simple_manager.h:141
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::getActiveCollisionObjects
const std::vector< std::string > & getActiveCollisionObjects() const override final
Get which collision objects can move.
Definition: bullet_discrete_simple_manager.cpp:227
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::BulletDiscreteSimpleManager
BulletDiscreteSimpleManager(std::string name="BulletDiscreteSimpleManager", TesseractCollisionConfigurationInfo config_info=TesseractCollisionConfigurationInfo())
Definition: bullet_discrete_simple_manager.cpp:50
bullet_discrete_simple_manager.h
Tesseract ROS Bullet discrete simple collision manager.
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::getCollisionObjectGeometriesTransforms
const tesseract_common::VectorIsometry3d & getCollisionObjectGeometriesTransforms(const std::string &name) const override final
Get a collision objects collision geometries transforms.
Definition: bullet_discrete_simple_manager.cpp:124
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::onCollisionMarginDataChanged
void onCollisionMarginDataChanged()
This function will update internal data when margin data has changed.
Definition: bullet_discrete_simple_manager.cpp:357
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::getCollisionObjects
const std::vector< std::string > & getCollisionObjects() const override final
Get all collision objects.
Definition: bullet_discrete_simple_manager.cpp:204
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::getName
std::string getName() const override final
Get the name of the contact manager.
Definition: bullet_discrete_simple_manager.cpp:67
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::collision_objects_
std::vector< std::string > collision_objects_
A list of the collision objects.
Definition: bullet_discrete_simple_manager.h:139
tesseract_common::TransformMap
AlignedMap< std::string, Eigen::Isometry3d > TransformMap
tesseract_collision::tesseract_collision_bullet::TesseractCollisionConfigurationInfo::clone
TesseractCollisionConfigurationInfo clone() const
Clone the collision configuration information.
Definition: tesseract_collision_configuration.cpp:63
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::incrementCollisionMargin
void incrementCollisionMargin(double increment) override final
Increment the collision margin data by some value.
Definition: bullet_discrete_simple_manager.cpp:261
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::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: bullet_discrete_simple_manager.cpp:240
tesseract_collision::ContactTestData::active
const std::vector< std::string > * active
A vector of active links.
Definition: types.h:340
tesseract_collision::tesseract_collision_bullet::EMPTY_COLLISION_SHAPES_CONST
static const CollisionShapesConst EMPTY_COLLISION_SHAPES_CONST
Definition: bullet_cast_bvh_manager.cpp:49
tesseract_collision::ContactTestData::validator
std::shared_ptr< const tesseract_common::ContactAllowedValidator > validator
The allowed collision function used to check if two links should be excluded from collision checking.
Definition: types.h:346
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::setDefaultCollisionMargin
void setDefaultCollisionMargin(double default_collision_margin) override final
Set the default collision margin.
Definition: bullet_discrete_simple_manager.cpp:247
tesseract_collision::tesseract_collision_bullet::createCollisionObject
COW::Ptr createCollisionObject(const std::string &name, const int &type_id, const CollisionShapesConst &shapes, const tesseract_common::VectorIsometry3d &shape_poses, bool enabled=true)
Definition: bullet_utils.cpp:1161
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::contactTest
void contactTest(ContactResultMap &collisions, const ContactRequest &request) override final
Perform a contact test for all objects based.
Definition: bullet_discrete_simple_manager.cpp:277
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::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: bullet_discrete_simple_manager.cpp:95
transform
template Halfspace< double > transform(const Halfspace< double > &a, const Transform3< double > &tf)
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::setCollisionObjectsTransform
void setCollisionObjectsTransform(const std::string &name, const Eigen::Isometry3d &pose) override final
Set a single collision object's transforms.
Definition: bullet_discrete_simple_manager.cpp:181
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::setCollisionMarginData
void setCollisionMarginData(CollisionMarginData collision_margin_data) override final
Set the contact distance threshold.
Definition: bullet_discrete_simple_manager.cpp:229
tesseract_common::CollisionMarginData
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::active_
std::vector< std::string > active_
A list of the active collision objects.
Definition: bullet_discrete_simple_manager.h:137
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::cows_
std::vector< COW::Ptr > cows_
A vector of collision objects (active followed by static)
Definition: bullet_discrete_simple_manager.h:151
tesseract_collision::ContactTestData::collision_margin_data
CollisionMarginData collision_margin_data
The current contact_distance threshold.
Definition: types.h:343
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::clone
DiscreteContactManager::UPtr clone() const override final
Clone the manager.
Definition: bullet_discrete_simple_manager.cpp:69
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::disableCollisionObject
bool disableCollisionObject(const std::string &name) override final
Disable an object.
Definition: bullet_discrete_simple_manager.cpp:161
tesseract_collision::tesseract_collision_bullet::needsCollisionCheck
bool needsCollisionCheck(const COW &cow1, const COW &cow2, const std::shared_ptr< const tesseract_common::ContactAllowedValidator > &validator, bool verbose=false)
This is used to check if a collision check is required between the provided two collision objects.
Definition: bullet_utils.cpp:700
name
std::string name
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::getCollisionObjectGeometries
const CollisionShapesConst & getCollisionObjectGeometries(const std::string &name) const override final
Get a collision objects collision geometries.
Definition: bullet_discrete_simple_manager.cpp:116
tesseract_collision::ContactResultMap
This structure hold contact results for link pairs.
Definition: types.h:155
tesseract_common::CollisionMarginPairOverrideType
CollisionMarginPairOverrideType
tesseract_collision::tesseract_collision_bullet::CollisionObjectWrapper::Ptr
std::shared_ptr< CollisionObjectWrapper > Ptr
Definition: bullet_utils.h:96
tesseract_collision::tesseract_collision_fcl::KinematicFilter
@ KinematicFilter
Definition: fcl_utils.h:69
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::isCollisionObjectEnabled
bool isCollisionObjectEnabled(const std::string &name) const override final
Check if collision object is enabled.
Definition: bullet_discrete_simple_manager.cpp:172
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_bullet::BulletDiscreteSimpleManager::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: bullet_discrete_simple_manager.cpp:273
tesseract_collision::ContactTestData::res
ContactResultMap * res
Distance query results information.
Definition: types.h:352
tesseract_common::CollisionMarginData::incrementMargins
void incrementMargins(double increment)
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::link2cow_
Link2Cow link2cow_
A map of all (static and active) collision objects being managed.
Definition: bullet_discrete_simple_manager.h:149
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::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: bullet_discrete_simple_manager.cpp:253
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::contact_test_data_
ContactTestData contact_test_data_
This is used when contactTest is called. It is also added as a user point to the collsion objects so ...
Definition: bullet_discrete_simple_manager.h:157
tesseract_common::CollisionMarginPairData
tesseract_collision::tesseract_collision_bullet::DiscreteCollisionCollector
Definition: bullet_utils.h:384
tesseract_collision::tesseract_collision_bullet::TesseractBridgedManifoldResult
This is copied directly out of BulletWorld.
Definition: bullet_utils.h:251
tesseract_collision::ContactTestData::req
ContactRequest req
The type of contact request data.
Definition: types.h:349
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::setActiveCollisionObjects
void setActiveCollisionObjects(const std::vector< std::string > &names) override final
Set which collision objects can move.
Definition: bullet_discrete_simple_manager.cpp:206
tesseract_common::CollisionMarginData::setDefaultCollisionMargin
void setDefaultCollisionMargin(double default_collision_margin)
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::hasCollisionObject
bool hasCollisionObject(const std::string &name) const override final
Find if a collision object already exists.
Definition: bullet_discrete_simple_manager.cpp:131
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::coll_config_
TesseractCollisionConfiguration coll_config_
The bullet collision configuration.
Definition: bullet_discrete_simple_manager.h:147
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::name_
std::string name_
Definition: bullet_discrete_simple_manager.h:135
tesseract_collision::DiscreteContactManager::UPtr
std::unique_ptr< DiscreteContactManager > UPtr
Definition: discrete_contact_manager.h:50
tesseract_collision::tesseract_collision_bullet::convertEigenToBt
btVector3 convertEigenToBt(const Eigen::Vector3d &v)
Definition: bullet_utils.cpp:62
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::enableCollisionObject
bool enableCollisionObject(const std::string &name) override final
Enable an object.
Definition: bullet_discrete_simple_manager.cpp:150
tesseract_collision::tesseract_collision_bullet::updateCollisionObjectFilters
void updateCollisionObjectFilters(const std::vector< std::string > &active, const COW::Ptr &cow)
Update a collision objects filters.
Definition: bullet_utils.cpp:442
tesseract_collision::ContactRequest
The ContactRequest struct.
Definition: types.h:300
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::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: bullet_discrete_simple_manager.cpp:267
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::config_info_
TesseractCollisionConfigurationInfo config_info_
The bullet collision configuration information.
Definition: bullet_discrete_simple_manager.h:145
tesseract_collision::CollisionMarginData
tesseract_common::CollisionMarginData CollisionMarginData
Definition: types.h:52
tesseract_collision::tesseract_collision_bullet::BulletDiscreteSimpleManager::dispatch_info_
btDispatcherInfo dispatch_info_
The bullet collision dispatcher configuration information.
Definition: bullet_discrete_simple_manager.h:143


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