Collision Checker
fcl_collision_checker.cc
Go to the documentation of this file.
4 
5 namespace collision {
6 namespace solvers {
7 namespace solverFCL {
9  simulation_time_start_idx_ = simulation_time_end_idx_ = -1;
10  simulation_dynamic_ = 0;
11  invalidateStaticObstaclesManager();
12  invalidateParentMap();
13  windowQueryDone = false;
14 }
15 
16 void FCLCollisionChecker::invalidateParentMap(void) {
17  parent_map_valid = false;
18 }
19 
20 void FCLCollisionChecker::setUpParentMap(void) const {
21  if (!parent_map_valid) {
22  parent_map.clear();
23  std::vector<CollisionObjectConstPtr> obst = m_cc.getObstacles();
24 
25  for (auto &obj : obst) {
26  obj->addParentMap(parent_map);
27  }
28  parent_map_valid = true;
29  }
30 }
31 
33  SolverEntity_FCL *obj_entity;
35  get_object_fcl_entity_type(co, obj_entity);
36  // const TimeVariantCollisionObject* tvobj;
37 
38  invalidateParentMap();
39  invalidateStaticObstaclesManager();
40 
41  switch (enttype) {
43 
44  addCollisionObject_fcl(
45  static_cast<const FCLCollisionObject *>(obj_entity));
46  return;
47  break;
49 
50  addCollisionObject_fcl(
51  static_cast<const FCLCollisionObjectGroup *>(obj_entity));
52  return;
53  break;
55 
56  addCollisionObject_fcl(
57  static_cast<const TimeVariantCollisionObject *>(co.get()));
58  return;
59  break;
60  default:
61  throw;
62  return;
63  break;
64  }
65 }
66 
67 int FCLCollisionChecker::addCollisionObject_fcl(
68  const FCLCollisionObjectGroup *co) {
69  // TODO: thread-safety: store all object instances locally?
70  if (!co) return -1;
71  std::vector<fcl::CollisionObject<FCL_PRECISION> *> vect;
72  const IFCLCollisionObjectGroup *parent_interface = co->getParentInterface();
73  if (!parent_interface) return -1;
74  parent_interface->getCollisionObjects(vect);
75  static_obstacles_.registerObjects(vect);
76  return 0;
77 }
78 
79 int FCLCollisionChecker::addCollisionObject_fcl(const FCLCollisionObject *co) {
80  // TODO: thread-safety: store all object instances locally?
81  if (!co) return -1;
82  std::shared_ptr<fcl::CollisionObject<FCL_PRECISION>> col_obj =
84  static_obstacles_.registerObject(col_obj.get());
85  return 0;
86 }
87 
88 void FCLCollisionChecker::addCollisionObject_fcl(
89  const TimeVariantCollisionObject *tvobj) {
90  // collision_objects_.push_back(tvobj->shared_from_this());
91 
92  tv_objects_.push_back(tvobj->shared_from_this());
93  if (!simulation_dynamic_) {
94  simulation_time_start_idx_ = tvobj->time_start_idx();
95  simulation_time_end_idx_ = tvobj->time_end_idx();
96  simulation_dynamic_ = 1;
97  } else {
98  if (simulation_time_start_idx_ > tvobj->time_start_idx())
99  simulation_time_start_idx_ = tvobj->time_start_idx();
100  if (simulation_time_end_idx_ < tvobj->time_end_idx())
101  simulation_time_end_idx_ = tvobj->time_end_idx();
102  }
103  // TODO: thread-safety: store all object instances locally?
104 }
105 
106 void FCLCollisionChecker::invalidateStaticObstaclesManager() {
107  static_obstacles_manager_valid = false;
108 }
109 
110 void FCLCollisionChecker::setUpStaticObstaclesManager() const {
111  if (!static_obstacles_manager_valid) {
112  static_obstacles_manager_valid = true;
113  static_obstacles_.setup();
114  }
115 }
116 
117 int FCLCollisionChecker::set_up_dynamic_obstacles(
118  int simulation_cur_time_idx_) const {
119  if (!simulation_dynamic_ ||
120  simulation_cur_time_idx_ < simulation_time_start_idx_ ||
121  simulation_cur_time_idx_ > simulation_time_end_idx_)
122  return -1;
123  dynamic_obstacles_.clear();
124  for (auto &c : tv_objects_) {
125  const TimeVariantCollisionObject *tvobj =
126  static_cast<const TimeVariantCollisionObject *>(c.get());
127  if (!tvobj) {
128  throw;
129  }
130 
132  tvobj->getObstacleAtTime(simulation_cur_time_idx_);
133  if (obj) {
134  SolverEntity_FCL *obj_entity;
135  FCL_COLLISION_ENTITY_TYPE enttype =
136  get_object_fcl_entity_type(obj, obj_entity);
137  if (enttype == COLLISION_ENTITY_TYPE_FCL_OBJECT) {
138  const FCLCollisionObject *fclco =
139  static_cast<const FCLCollisionObject *>(obj_entity);
140  // TODO: only update the manager
141  register_dynamic_obstacle(fclco);
142  } else if (enttype == COLLISION_ENTITY_TYPE_FCL_OBJECTGROUP) {
143  const FCLCollisionObjectGroup *fclco_gr =
144  static_cast<const FCLCollisionObjectGroup *>(obj_entity);
145  register_dynamic_obstacle(fclco_gr);
146  }
147  }
148  }
149  dynamic_obstacles_.setup();
150  return 0;
151 }
152 
153 int FCLCollisionChecker::register_dynamic_obstacle(
154  const FCLCollisionObjectGroup *obj) const {
155  if (!obj) return -1;
156 
157  std::vector<fcl::CollisionObject<FCL_PRECISION> *> vect;
158  const IFCLCollisionObjectGroup *parent_interface = obj->getParentInterface();
159  if (!parent_interface) return -1;
160  parent_interface->getCollisionObjects(vect);
161  dynamic_obstacles_.registerObjects(vect);
162  return 0;
163 }
164 
165 int FCLCollisionChecker::register_dynamic_obstacle(
166  const FCLCollisionObject *obj) const {
167  if (!obj) return -1;
168  dynamic_obstacles_.registerObject(obj->getCollisionObject_fcl().get());
169  return 0;
170 }
171 
173  CollisionObjectConstPtr co, int *collision_time,
174  std::vector<CollisionObjectConstPtr> *obstacles, int max_obstacles,
175  bool ungroup_shape_groups, bool ungroup_TV_obstacles) const {
176  const FCLCollisionObject *fclco;
177  const FCLCollisionObjectGroup *fclgr;
178  const TimeVariantCollisionObject *tvobj;
179 
180  setUpStaticObstaclesManager();
181  SolverEntity_FCL *obj_entity;
182  FCL_COLLISION_ENTITY_TYPE enttype =
183  get_object_fcl_entity_type(co, obj_entity);
184 
185  int col_time = -1;
186  bool res = false;
187  switch (enttype) {
189  fclco = static_cast<const FCLCollisionObject *>(obj_entity);
190  if (obstacles) {
192  *obstacles, this->parent_map, max_obstacles);
193  reqData.setUngroupShapeGroups(ungroup_shape_groups);
194  reqData.setUngroupTvObstacles(ungroup_TV_obstacles);
195  res = collide_fcl(fclco, col_time, reqData);
196  } else {
197  res = collide_fcl(fclco, col_time);
198  }
199 
200  if (collision_time) {
201  *collision_time = col_time;
202  }
203  return res;
204  break;
206  fclgr = static_cast<const FCLCollisionObjectGroup *>(obj_entity);
207 
208  if (obstacles) {
210  *obstacles, this->parent_map, max_obstacles);
211  reqData.setUngroupShapeGroups(ungroup_shape_groups);
212  reqData.setUngroupTvObstacles(ungroup_TV_obstacles);
213  res = collide_fcl(fclgr, col_time, reqData);
214  } else {
215  res = collide_fcl(fclgr, col_time);
216  }
217  if (collision_time) {
218  *collision_time = col_time;
219  }
220  return res;
221  break;
223  tvobj = static_cast<const TimeVariantCollisionObject *>(co.get());
224  if (obstacles) {
226  *obstacles, this->parent_map, max_obstacles);
227  reqData.setUngroupShapeGroups(ungroup_shape_groups);
228  reqData.setUngroupTvObstacles(ungroup_TV_obstacles);
229  res = collide_fcl(tvobj, col_time, reqData);
230  } else {
231  res = collide_fcl(tvobj, col_time);
232  }
233  if (collision_time) {
234  *collision_time = col_time;
235  }
236  return res;
237  break;
238  default:
239  throw;
240  return true;
241  break;
242  }
243 }
244 
245 // Returns a CollisionChecker of certain kind with all static objects within the
246 // window and all time-variant obstacles. Ungroups all shape groups. The
247 // function is not thread-safe
248 
250  ICollisionChecker &ret) const {
251  static std::vector<const CollisionObject *> windowQueryRes;
252 
253  const FCLCollisionObject *fclco = get_fcl_object_ptr(&aabb);
254  if (!fclco) {
255  throw;
256  return;
257  }
258 
259  // add all static obstacles within the window
260 
262  fclco->getCollisionObject_fcl().get();
263 
264  if (!windowQueryDone) {
265  windowQueryRes.reserve(m_cc.numberOfObstacles());
266  }
267  windowQueryRes.clear();
268 
269  CollisionRequestDataWindowQuery reqData(fcl_obj, windowQueryRes,
270  this->parent_map);
271 
272  setUpStaticObstaclesManager();
273 
274  fcl::CollisionRequest<FCL_PRECISION> collisionRequest(
275  1, false, FCL_SOLVER_TYPE); // Disable finding of contact points
276  collisionRequest.enable_cost = false;
277 
278  CollisionDataWindowQuery<FCL_PRECISION> self_data_static_obstacles(reqData);
279  self_data_static_obstacles.request = collisionRequest;
280 
281  static_obstacles_.collide(fcl_obj, &self_data_static_obstacles,
282  defaultCollisionFunctionWindowQuery<FCL_PRECISION>);
283 
284  for (auto &x : windowQueryRes) {
285  ret.addCollisionObject(x->shared_from_this());
286  }
287  // add all TV obstacles
288 
289  for (auto &c : tv_objects_) {
290  ret.addCollisionObject(c);
291  }
292  windowQueryDone = true;
293 }
294 
295 bool FCLCollisionChecker::collide_fcl(
296  const FCLCollisionObject *col_obj_ptr, int &time_of_collision,
297  CollisionRequestDataMultipleObstacles &reqData) const {
298  if (!col_obj_ptr) {
299  throw;
300  return true;
301  }
303  col_obj_ptr->getCollisionObject_fcl().get();
304  return this->collide_fcl_helper_simulate_static_subject(
305  col_obj, time_of_collision,
306  CollisionRequestType::collisionRequestListOfObstacles, &reqData);
307 }
308 
309 bool FCLCollisionChecker::collide_fcl(
310  const FCLCollisionObjectGroup *col_obj_group, int &time_of_collision,
311  CollisionRequestDataMultipleObstacles &reqData) const {
312  if (!col_obj_group) {
313  throw;
314  return true;
315  }
316  fcl::BroadPhaseCollisionManager<FCL_PRECISION> *mngr;
317  col_obj_group->getManager_fcl(mngr);
318  return this->collide_fcl_helper_simulate_static_subject(
319  mngr, time_of_collision,
320  CollisionRequestType::collisionRequestListOfObstacles, &reqData);
321 }
322 
323 bool FCLCollisionChecker::collide_fcl(const FCLCollisionObject *col_obj_ptr,
324  int &time_of_collision) const {
325  if (!col_obj_ptr) {
326  throw;
327  return true;
328  }
330  col_obj_ptr->getCollisionObject_fcl().get();
331  return this->collide_fcl_helper_simulate_static_subject(
332  col_obj, time_of_collision, CollisionRequestType::collisionRequestBoolean,
333  0);
334 }
335 
336 bool FCLCollisionChecker::collide_fcl(
337  const FCLCollisionObjectGroup *col_obj_group,
338  int &time_of_collision) const {
339  if (!col_obj_group) {
340  throw;
341  return true;
342  }
343  fcl::BroadPhaseCollisionManager<FCL_PRECISION> *mngr;
344  col_obj_group->getManager_fcl(mngr);
345  return this->collide_fcl_helper_simulate_static_subject(
346  mngr, time_of_collision, CollisionRequestType::collisionRequestBoolean,
347  0);
348 }
349 
350 bool FCLCollisionChecker::collide_fcl(const TimeVariantCollisionObject *tvobj,
351  int &time_of_collision) const {
352  if (!tvobj) {
353  throw;
354  return true;
355  }
356 
357  return collide_fcl_helper_sim_TV_subject(
358  *tvobj, time_of_collision, CollisionRequestType::collisionRequestBoolean,
359  0);
360 }
361 
362 bool FCLCollisionChecker::collide_fcl(
363  const TimeVariantCollisionObject *tvobj, int &time_of_collision,
364  CollisionRequestDataMultipleObstacles &reqData) const {
365  if (!tvobj) {
366  throw;
367  return true;
368  }
369  return collide_fcl_helper_sim_TV_subject(
370  *tvobj, time_of_collision,
371  CollisionRequestType::collisionRequestListOfObstacles, &reqData);
372 }
373 
374 // simulate collision with a TV obstacle
375 bool FCLCollisionChecker::collide_fcl_helper_sim_TV_subject(
376  const TimeVariantCollisionObject &tvobj, int &time_of_collision,
377  CollisionRequestType reqType, CollisionRequestData *reqData) const {
378  bool result = false;
379  int sim_start_idx = 0;
380  int sim_end_idx = 0;
381  //
382  if (simulation_dynamic_) {
383  sim_start_idx =
384  std::min(simulation_time_start_idx_, tvobj.time_start_idx());
385  sim_end_idx = std::max(simulation_time_end_idx_, tvobj.time_end_idx());
386  } else {
387  sim_start_idx = tvobj.time_start_idx();
388  sim_end_idx = tvobj.time_end_idx();
389  }
390  bool cur_res = false;
391  int cur_collision_time = -1;
392 
393  for (int sim_cur_idx = sim_start_idx; sim_cur_idx <= sim_end_idx;
394  sim_cur_idx++) {
395  CollisionObjectConstPtr col_obj_ptr = tvobj.getObstacleAtTime(sim_cur_idx);
396  if (col_obj_ptr) {
397  SolverEntity_FCL *obj_entity;
398  FCL_COLLISION_ENTITY_TYPE colent_type =
399  get_object_fcl_entity_type(col_obj_ptr, obj_entity);
400  if (colent_type == COLLISION_ENTITY_TYPE_FCL_OBJECT) {
401  const FCLCollisionObject *fclco =
402  static_cast<const FCLCollisionObject *>(obj_entity);
404 
405  col_obj = (fclco)->getCollisionObject_fcl().get();
406  if (col_obj) {
407  if (collide_fcl_helper_static_obstaclesEx(
408  col_obj, result, reqType,
409  reqData)) { // the child function signalled early stopping
410  if (result) {
411  time_of_collision = sim_cur_idx;
412  return result;
413  }
414  }
415  if (result) { // if it is a first collision, remember time of
416  // collision
417  if (cur_collision_time == -1) {
418  cur_collision_time = sim_cur_idx;
419  }
420  cur_res = true;
421  }
422 
423  if (collide_fcl_helper_dynamic_obstaclesEx(
424  col_obj, sim_cur_idx, result, reqType,
425  reqData)) { // the child function signalled early stopping
426  if (result) {
427  time_of_collision = sim_cur_idx;
428  return result;
429  }
430  }
431  if (result) {
432  if (cur_collision_time == -1) {
433  cur_collision_time = sim_cur_idx;
434  }
435  cur_res = true;
436  }
437  }
438 
439  } else if (colent_type == COLLISION_ENTITY_TYPE_FCL_OBJECTGROUP) {
440  const FCLCollisionObjectGroup *fclco_gr =
441  static_cast<const FCLCollisionObjectGroup *>(obj_entity);
442 
443  fcl::BroadPhaseCollisionManager<FCL_PRECISION> *mngr = 0;
444 
445  fclco_gr->getManager_fcl(mngr);
446  if (mngr) {
447  if (collide_fcl_helper_static_obstaclesEx(mngr, result, reqType,
448  reqData)) {
449  if (result) {
450  time_of_collision = sim_cur_idx;
451  return result;
452  }
453  }
454  if (result) {
455  if (cur_collision_time == -1) {
456  cur_collision_time = sim_cur_idx;
457  }
458  cur_res = true;
459  }
460  if (collide_fcl_helper_dynamic_obstaclesEx(mngr, sim_cur_idx, result,
461  reqType, reqData)) {
462  if (result) {
463  time_of_collision = sim_cur_idx;
464  return result;
465  }
466  }
467  if (result) {
468  if (cur_collision_time == -1) {
469  cur_collision_time = sim_cur_idx;
470  }
471  cur_res = true;
472  }
473  }
474  } else {
475  throw;
476  return true;
477  }
478  }
479  }
480  time_of_collision = cur_collision_time;
481  return cur_res;
482 }
483 
484 template <class T>
485 bool FCLCollisionChecker::collide_fcl_helper_simulate_static_subject(
486  T col_entity, int &time_of_collision, CollisionRequestType reqType,
487  CollisionRequestData *reqData) const {
488  bool cur_result = false;
489  bool result = false;
490  int cur_time_of_coll = -1;
491  if (collide_fcl_helper_static_obstaclesEx(col_entity, result, reqType,
492  reqData)) {
493  if (result) {
494  time_of_collision = 0;
495  return result;
496  }
497  }
498  if (result) {
499  if (cur_time_of_coll == -1) cur_time_of_coll = 0;
500  cur_result = true;
501  }
502 
503  if (simulation_dynamic_) {
504  for (int cur_time_idx = simulation_time_start_idx_;
505  cur_time_idx <= simulation_time_end_idx_; cur_time_idx++) {
506  if ((collide_fcl_helper_dynamic_obstaclesEx(col_entity, cur_time_idx,
507  result, reqType, reqData))) {
508  if (result) {
509  time_of_collision = cur_time_idx;
510  return result;
511  }
512  }
513  if (result) {
514  if (cur_time_of_coll == -1) cur_time_of_coll = 0;
515  cur_result = true;
516  }
517  }
518  }
519  time_of_collision = cur_time_of_coll;
520 
521  return cur_result;
522 }
523 
524 template <class T>
525 bool FCLCollisionChecker::collide_fcl_helper_dynamic_obstaclesEx(
526  T col_entity, int sim_cur_time_idx, bool &result,
527  CollisionRequestType reqType, CollisionRequestData *reqData) const {
528  // TODO: test parent map feature
529 
530  if (reqType == CollisionRequestType::collisionRequestListOfObstacles) {
531  setUpParentMap();
532  result = false;
533  if (!reqData) {
534  throw;
535  return true;
536  }
537  if (!(static_cast<CollisionRequestDataMultipleObstacles *>(reqData)
538  ->getMaxObstacles())) {
539  return true;
540  }
541  if (!set_up_dynamic_obstacles(sim_cur_time_idx)) {
542  static_cast<CollisionRequestDataMultipleObstacles *>(reqData)
543  ->setSubjectEntitySize(col_entity);
544  static_cast<CollisionRequestDataMultipleObstacles *>(reqData)
545  ->setTargetMngrSize(dynamic_obstacles_.size());
546  static_cast<CollisionRequestDataMultipleObstacles *>(reqData)
547  ->setObstacleCallbackOrder();
548  CollisionDataListOfObstacles<FCL_PRECISION> self_data_dyn_obstacles(
549  *(static_cast<CollisionRequestDataMultipleObstacles *>(reqData)));
550  fcl::CollisionRequest<FCL_PRECISION> collisionRequest(
551  1, false, FCL_SOLVER_TYPE); // Disable finding of contact points
552  collisionRequest.enable_cost = false;
553  self_data_dyn_obstacles.request = collisionRequest;
554  dynamic_obstacles_.collide(
555  col_entity, &self_data_dyn_obstacles,
556  defaultCollisionFunctionListOfObstacles<FCL_PRECISION>);
557  result = self_data_dyn_obstacles.get_result();
558  return self_data_dyn_obstacles.self_reqData.getAllObstAdded();
559  }
560  return false;
561 
562  } else if (reqType == CollisionRequestType::collisionRequestBoolean) {
563  result = collide_fcl_helper_dynamic_obstacles(col_entity, sim_cur_time_idx);
564  return true;
565  } else {
566  throw;
567  return true;
568  }
569 }
570 
571 template <class T>
572 bool FCLCollisionChecker::collide_fcl_helper_dynamic_obstacles(
573  T col_entity, int sim_cur_time_idx) const {
574  bool result = false;
575  fcl::CollisionRequest<FCL_PRECISION> collisionRequest(
576  1, false, FCL_SOLVER_TYPE); // Disable finding of contact points
577  collisionRequest.enable_cost = false;
578  if (!set_up_dynamic_obstacles(sim_cur_time_idx)) {
579  CollisionData<FCL_PRECISION> self_data_dyn_obstacles;
580  self_data_dyn_obstacles.request = collisionRequest;
581  dynamic_obstacles_.collide(col_entity, &self_data_dyn_obstacles,
582  defaultCollisionFunction<FCL_PRECISION>);
583  result = self_data_dyn_obstacles.result.isCollision();
584  }
585  return result;
586 }
587 
588 template <class T>
589 bool FCLCollisionChecker::collide_fcl_helper_static_obstaclesEx(
590  T col_entity, bool &result, CollisionRequestType reqType,
591  CollisionRequestData *reqData) const {
592  if (reqType == CollisionRequestType::collisionRequestListOfObstacles) {
593  setUpParentMap();
594  result = false;
595  if (!reqData) {
596  throw;
597  return true;
598  }
599  if (!(static_cast<CollisionRequestDataMultipleObstacles *>(reqData)
600  ->getMaxObstacles())) {
601  return true;
602  }
603  static_cast<CollisionRequestDataMultipleObstacles *>(reqData)
604  ->setSubjectEntitySize(col_entity);
605  static_cast<CollisionRequestDataMultipleObstacles *>(reqData)
606  ->setTargetMngrSize(static_obstacles_.size());
607  static_cast<CollisionRequestDataMultipleObstacles *>(reqData)
608  ->setObstacleCallbackOrder();
609  CollisionDataListOfObstacles<FCL_PRECISION> self_data_static_obstacles(
610  *(static_cast<CollisionRequestDataMultipleObstacles *>(reqData)));
611  fcl::CollisionRequest<FCL_PRECISION> collisionRequest(
612  1, false, FCL_SOLVER_TYPE); // Disable finding of contact points
613  collisionRequest.enable_cost = false;
614  self_data_static_obstacles.self_reqData;
615  self_data_static_obstacles.request = collisionRequest;
616  static_obstacles_.collide(
617  col_entity, &self_data_static_obstacles,
618  defaultCollisionFunctionListOfObstacles<FCL_PRECISION>);
619  result = self_data_static_obstacles.get_result();
620 
621  return self_data_static_obstacles.self_reqData.getAllObstAdded();
622 
623  } else if (reqType == CollisionRequestType::collisionRequestBoolean) {
624  result = collide_fcl_helper_static_obstacles(col_entity);
625  return true;
626  } else {
627  throw;
628  return true;
629  }
630 }
631 
632 template <class T>
633 bool FCLCollisionChecker::collide_fcl_helper_static_obstacles(
634  T col_entity) const {
635  bool result = false;
636  CollisionData<FCL_PRECISION> self_data_static_obstacles;
637  fcl::CollisionRequest<FCL_PRECISION> collisionRequest(
638  1, false, FCL_SOLVER_TYPE); // Disable finding of contact points
639  collisionRequest.enable_cost = false;
640  self_data_static_obstacles.request = collisionRequest;
641  static_obstacles_.collide(col_entity, &self_data_static_obstacles,
642  defaultCollisionFunction<FCL_PRECISION>);
643  result = self_data_static_obstacles.result.isCollision();
644  return result;
645 }
646 
647 template bool FCLCollisionChecker::collide_fcl_helper_simulate_static_subject(
648  fcl::CollisionObject<FCL_PRECISION> *col_entity, int &time_of_collision,
649  CollisionRequestType reqType, CollisionRequestData *reqData) const;
650 template bool FCLCollisionChecker::collide_fcl_helper_simulate_static_subject(
651  fcl::BroadPhaseCollisionManager<FCL_PRECISION> *col_entity,
652  int &time_of_collision, CollisionRequestType reqType,
653  CollisionRequestData *reqData) const;
654 
655 } // namespace solverFCL
656 } // namespace solvers
657 } // namespace collision
TimeVariantCollisionObject can contain a different CollisionObject or ShapeGroup at each time step...
const IFCLCollisionObjectGroup * getParentInterface(void) const
fcl::CollisionResult< S > result
Collision result.
bool collideHelper(CollisionObjectConstPtr co, int *collision_time, std::vector< CollisionObjectConstPtr > *obstacles, int max_obstacles=-1, bool ungroup_shape_groups=false, bool ungroup_TV_obstacles=false) const
virtual int numberOfObstacles() const =0
void windowQuery_helper(const RectangleAABB &aabb, ICollisionChecker &ret) const
virtual void addCollisionObject(CollisionObjectConstPtr co)=0
virtual int getCollisionObjects(std::vector< fcl::CollisionObject< FCL_PRECISION > *> &) const =0
EIGEN_MAKE_ALIGNED_OPERATOR_NEW FCLCollisionChecker(ICollisionChecker &cc)
std::shared_ptr< const CollisionObject > CollisionObjectConstPtr
const FCLCollisionObject * get_fcl_object_ptr(const CollisionObject *obj)
Definition: fcl_helpers.h:40
virtual std::vector< CollisionObjectConstPtr > getObstacles() const =0
FCL_COLLISION_ENTITY_TYPE get_object_fcl_entity_type(const CollisionObject *obj2)
Definition: fcl_helpers.h:11
std::shared_ptr< fcl::CollisionObject< FCL_PRECISION > > getCollisionObject_fcl(void) const
fcl::CollisionRequest< S > request
Collision request.
#define FCL_SOLVER_TYPE
Definition: fcl_decl.h:11
Axis-aligned rectangle.
External interface to a CollisionChecker (with or without an acceleration structure) ...
CollisionObjectConstPtr getObstacleAtTime(int time_idx) const
Collision data stores the collision request and the result given by collision algorithm.
int getManager_fcl(fcl::BroadPhaseCollisionManager< FCL_PRECISION > *&) const