1 #ifndef COLLISION_FCL_FCL_COLLISION_REQUESTS_H_ 2 #define COLLISION_FCL_FCL_COLLISION_REQUESTS_H_ 6 #include <fcl/broadphase/broadphase_dynamic_AABB_tree.h> 7 #include <fcl/math/constants.h> 8 #include <fcl/narrowphase/collision.h> 9 #include <fcl/narrowphase/collision_object.h> 17 class CollisionChecker;
31 std::vector<CollisionObjectConstPtr> &ret_obstacles,
33 std::list<CollisionObjectConstPtr>> &parent_map,
35 : m_obstacles(ret_obstacles),
36 m_parent_map(parent_map),
37 m_max_obstacles(max_obstacles){
52 m_subject_group_size = -1;
56 fcl::BroadPhaseCollisionManager<FCL_PRECISION> *mngr) {
57 m_subject_group_size = mngr->size();
63 m_obstacle_callback_first = m_target_mngr_size < m_subject_group_size;
67 return !m_obstacle_callback_first;
79 std::vector<CollisionObjectConstPtr> &m_obstacles;
80 int m_subject_group_size;
81 int m_target_mngr_size;
83 std::list<CollisionObjectConstPtr>> &m_parent_map;
84 std::unordered_map<const CollisionObject *, bool> m_added_map;
85 std::unordered_map<const CollisionObject *, bool> m_added_map_parent;
86 std::set<std::pair<fcl::CollisionObject<FCL_PRECISION> *,
89 bool m_obstacle_callback_first =
false;
90 bool m_ungroup_tvobst =
false;
91 bool m_ungroup_sg =
false;
92 bool m_finished =
false;
100 std::vector<const CollisionObject *> &result,
102 std::list<CollisionObjectConstPtr>> &parent_map)
103 : m_subject_object(subject_object),
105 m_parent_map(parent_map){};
110 return m_subject_object;
115 std::vector<const CollisionObject *> &m_result;
117 std::list<CollisionObjectConstPtr>> &m_parent_map;
118 std::unordered_map<const CollisionObject *, bool> m_added_map;
125 : m_cont_1(cont_1), m_cont_2(cont_2){};
127 void addRequestResultPair(
int o1,
int o2);
129 void addRequestResultList(std::list<int> list1, std::list<int> list2);
131 std::set<std::pair<int, int>> getRequestResultPairs()
const;
134 m_Debug_Pairs = pairs_in;
139 pairs_out = m_Debug_Pairs;
146 std::set<std::pair<fcl::CollisionObject<FCL_PRECISION> *,
154 std::vector<std::pair<int, int>> m_Debug_Pairs;
156 std::set<std::pair<int, int>> m_ResultPairs;
162 template <
typename S>
176 template <
typename S>
186 template <
typename S>
191 : self_reqData(reqData) {}
194 template <
typename S>
199 : self_reqData(reqData) {}
201 template <
typename S>
206 : self_reqData(reqData) {}
209 template <
typename S>
214 const auto &request = cdata->
request;
216 if (cdata->done)
return true;
219 cdata->self_reqData.getSubjectObject();
224 cdata->self_reqData.addRequestResultObstacle(
226 }
else if (o2 == subj_obj) {
227 cdata->self_reqData.addRequestResultObstacle(
256 template <
typename S>
260 const auto &request = cdata->
request;
261 auto &result = cdata->result;
263 if (cdata->done)
return true;
265 collide(o1, o2, request, result);
267 if (!request.enable_cost && (result.isCollision()) &&
268 (result.numContacts() >= request.num_max_contacts))
274 template <
typename S>
280 fcl::CollisionRequest<S> *request = &(cdata->
request);
281 fcl::CollisionResult<S> *result = &(cdata->
result);
283 if (cdata->
done)
return true;
285 const auto &pair_obj =
290 auto search = checked_pairs.find(pair_obj);
291 if (search != checked_pairs.end())
return false;
293 fcl::collide(o1, o2, *request, *result);
295 checked_pairs.emplace(pair_obj);
297 if (cdata->
result.isCollision()) {
302 if (obj1_entity && obj2_entity) {
303 std::list<int> cont1_obj1_list;
304 std::list<int> cont1_obj2_list;
305 std::list<int> cont2_obj1_list;
306 std::list<int> cont2_obj2_list;
309 cdata->
self_reqData.get_cont_1()->queryContainedObjectIndexList(
310 obj1_entity, cont1_obj1_list);
312 cdata->
self_reqData.get_cont_1()->queryContainedObjectIndexList(
313 obj2_entity, cont1_obj2_list);
316 cdata->
self_reqData.get_cont_2()->queryContainedObjectIndexList(
317 obj1_entity, cont2_obj1_list);
319 cdata->
self_reqData.get_cont_2()->queryContainedObjectIndexList(
320 obj2_entity, cont2_obj2_list);
322 if (!res_cont1_obj1 && !res_cont2_obj1)
324 cdata->
self_reqData.addRequestResultList(cont1_obj1_list,
328 if (!res_cont1_obj2 && !res_cont2_obj2)
330 cdata->
self_reqData.addRequestResultList(cont1_obj2_list,
333 if (!res_cont1_obj1 &&
336 cdata->
self_reqData.addRequestResultList(cont1_obj1_list,
340 if (!res_cont1_obj2 &&
343 cdata->
self_reqData.addRequestResultList(cont1_obj2_list,
352 template <
typename S>
357 const auto &request = cdata->
request;
359 if (cdata->done)
return true;
366 if (cdata->self_reqData.getObstacleCallbackOrder()) {
374 const auto &pair_obj =
378 if (!(cdata->self_reqData.testPair(pair_obj)))
return false;
380 collide(obst, subj, request, cdata->
result);
382 if (cdata->result.isCollision()) {
383 cdata->set_result(
true);
385 cdata->result.clear();
391 if (cdata->self_reqData.addRequestResultObstacle(obst_entity)) {
392 cdata->self_reqData.setAllObst_added();
395 if (cdata->self_reqData.addRequestResultObstacle(subj_entity)) {
396 cdata->self_reqData.setAllObst_added();
int get_debug_pairs(std::vector< std::pair< int, int >> &pairs_out) const
std::shared_ptr< const CollisionChecker > CollisionCheckerConstPtr
bool defaultCollisionFunctionListOfObstacles(fcl::CollisionObject< S > *o1, fcl::CollisionObject< S > *o2, void *cdata_)
CollisionRequestDataMultipleObstacles & self_reqData
void setTargetMngrSize(int size)
bool getAllObstAdded(void) const
CollisionDataListOfObstacles(CollisionRequestDataMultipleObstacles &reqData)
fcl::CollisionResult< S > result
Collision result.
void setMaxObstacles(int max_obstacles)
int getMaxObstacles() const
CollisionRequestDataOverlap & self_reqData
bool done
Whether the collision iteration can stop.
bool getObstacleCallbackOrder(void) const
void setSubjectEntitySize(fcl::BroadPhaseCollisionManager< FCL_PRECISION > *mngr)
void setSubjectEntitySize(fcl::CollisionObject< FCL_PRECISION > *obj)
int set_debug_pairs(std::vector< std::pair< int, int >> pairs_in)
void set_result(bool res)
std::shared_ptr< const CollisionObject > CollisionObjectConstPtr
fcl::CollisionObject< FCL_PRECISION > * getSubjectObject(void) const
std::shared_ptr< CollisionChecker > CollisionCheckerPtr
CollisionDataOverlap(CollisionRequestDataOverlap &reqData)
bool defaultCollisionFunctionOverlap(fcl::CollisionObject< S > *o1, fcl::CollisionObject< S > *o2, void *cdata_)
bool defaultCollisionFunctionWindowQuery(fcl::CollisionObject< S > *o1, fcl::CollisionObject< S > *o2, void *cdata_)
CollisionDataWindowQuery(CollisionRequestDataWindowQuery &reqData)
fcl::CollisionRequest< S > request
Collision request.
CollisionRequestDataWindowQuery & self_reqData
CollisionRequestDataOverlap(const ICollisionContainer *cont_1, const ICollisionContainer *cont_2)
void setUngroupShapeGroups(bool val)
std::set< std::pair< fcl::CollisionObject< FCL_PRECISION > *, fcl::CollisionObject< FCL_PRECISION > * > > checkedPairs
bool defaultCollisionFunction(fcl::CollisionObject< S > *o1, fcl::CollisionObject< S > *o2, void *cdata_)
void setAllObst_added(void)
const ICollisionContainer * get_cont_1(void) const
void setUngroupTvObstacles(bool val)
const ICollisionContainer * get_cont_2(void) const
CollisionObject * getParentPointerFromFclObj(fcl::CollisionObject< FCL_PRECISION > *fcl_obj)
CollisionRequestDataMultipleObstacles(std::vector< CollisionObjectConstPtr > &ret_obstacles, const std::unordered_map< const CollisionObject *, std::list< CollisionObjectConstPtr >> &parent_map, int max_obstacles)
void setObstacleCallbackOrder(void)
Base class for CollisionObjects and some of their groups.
Collision data stores the collision request and the result given by collision algorithm.
CollisionRequestDataWindowQuery(fcl::CollisionObject< FCL_PRECISION > *subject_object, std::vector< const CollisionObject *> &result, const std::unordered_map< const collision::CollisionObject *, std::list< CollisionObjectConstPtr >> &parent_map)