9 simulation_time_start_idx_ = simulation_time_end_idx_ = -1;
10 simulation_dynamic_ = 0;
11 invalidateStaticObstaclesManager();
12 invalidateParentMap();
13 windowQueryDone =
false;
16 void FCLCollisionChecker::invalidateParentMap(
void) {
17 parent_map_valid =
false;
20 void FCLCollisionChecker::setUpParentMap(
void)
const {
21 if (!parent_map_valid) {
23 std::vector<CollisionObjectConstPtr> obst = m_cc.
getObstacles();
25 for (
auto &obj : obst) {
26 obj->addParentMap(parent_map);
28 parent_map_valid =
true;
38 invalidateParentMap();
39 invalidateStaticObstaclesManager();
44 addCollisionObject_fcl(
45 static_cast<const FCLCollisionObject *>(obj_entity));
50 addCollisionObject_fcl(
51 static_cast<const FCLCollisionObjectGroup *>(obj_entity));
56 addCollisionObject_fcl(
57 static_cast<const TimeVariantCollisionObject *>(co.get()));
67 int FCLCollisionChecker::addCollisionObject_fcl(
71 std::vector<fcl::CollisionObject<FCL_PRECISION> *> vect;
73 if (!parent_interface)
return -1;
75 static_obstacles_.registerObjects(vect);
82 std::shared_ptr<fcl::CollisionObject<FCL_PRECISION>> col_obj =
84 static_obstacles_.registerObject(col_obj.get());
88 void FCLCollisionChecker::addCollisionObject_fcl(
92 tv_objects_.push_back(tvobj->shared_from_this());
93 if (!simulation_dynamic_) {
96 simulation_dynamic_ = 1;
100 if (simulation_time_end_idx_ < tvobj->time_end_idx())
106 void FCLCollisionChecker::invalidateStaticObstaclesManager() {
107 static_obstacles_manager_valid =
false;
110 void FCLCollisionChecker::setUpStaticObstaclesManager()
const {
111 if (!static_obstacles_manager_valid) {
112 static_obstacles_manager_valid =
true;
113 static_obstacles_.setup();
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_)
123 dynamic_obstacles_.clear();
124 for (
auto &c : tv_objects_) {
141 register_dynamic_obstacle(fclco);
145 register_dynamic_obstacle(fclco_gr);
149 dynamic_obstacles_.setup();
153 int FCLCollisionChecker::register_dynamic_obstacle(
157 std::vector<fcl::CollisionObject<FCL_PRECISION> *> vect;
159 if (!parent_interface)
return -1;
161 dynamic_obstacles_.registerObjects(vect);
165 int FCLCollisionChecker::register_dynamic_obstacle(
174 std::vector<CollisionObjectConstPtr> *obstacles,
int max_obstacles,
175 bool ungroup_shape_groups,
bool ungroup_TV_obstacles)
const {
180 setUpStaticObstaclesManager();
192 *obstacles, this->parent_map, max_obstacles);
195 res = collide_fcl(fclco, col_time, reqData);
197 res = collide_fcl(fclco, col_time);
200 if (collision_time) {
201 *collision_time = col_time;
210 *obstacles, this->parent_map, max_obstacles);
213 res = collide_fcl(fclgr, col_time, reqData);
215 res = collide_fcl(fclgr, col_time);
217 if (collision_time) {
218 *collision_time = col_time;
226 *obstacles, this->parent_map, max_obstacles);
229 res = collide_fcl(tvobj, col_time, reqData);
231 res = collide_fcl(tvobj, col_time);
233 if (collision_time) {
234 *collision_time = col_time;
251 static std::vector<const CollisionObject *> windowQueryRes;
264 if (!windowQueryDone) {
267 windowQueryRes.clear();
272 setUpStaticObstaclesManager();
274 fcl::CollisionRequest<FCL_PRECISION> collisionRequest(
276 collisionRequest.enable_cost =
false;
279 self_data_static_obstacles.
request = collisionRequest;
281 static_obstacles_.collide(fcl_obj, &self_data_static_obstacles,
282 defaultCollisionFunctionWindowQuery<FCL_PRECISION>);
284 for (
auto &x : windowQueryRes) {
289 for (
auto &c : tv_objects_) {
292 windowQueryDone =
true;
295 bool FCLCollisionChecker::collide_fcl(
304 return this->collide_fcl_helper_simulate_static_subject(
305 col_obj, time_of_collision,
306 CollisionRequestType::collisionRequestListOfObstacles, &reqData);
309 bool FCLCollisionChecker::collide_fcl(
312 if (!col_obj_group) {
316 fcl::BroadPhaseCollisionManager<FCL_PRECISION> *mngr;
318 return this->collide_fcl_helper_simulate_static_subject(
319 mngr, time_of_collision,
320 CollisionRequestType::collisionRequestListOfObstacles, &reqData);
324 int &time_of_collision)
const {
331 return this->collide_fcl_helper_simulate_static_subject(
332 col_obj, time_of_collision, CollisionRequestType::collisionRequestBoolean,
336 bool FCLCollisionChecker::collide_fcl(
338 int &time_of_collision)
const {
339 if (!col_obj_group) {
343 fcl::BroadPhaseCollisionManager<FCL_PRECISION> *mngr;
345 return this->collide_fcl_helper_simulate_static_subject(
346 mngr, time_of_collision, CollisionRequestType::collisionRequestBoolean,
351 int &time_of_collision)
const {
357 return collide_fcl_helper_sim_TV_subject(
358 *tvobj, time_of_collision, CollisionRequestType::collisionRequestBoolean,
362 bool FCLCollisionChecker::collide_fcl(
369 return collide_fcl_helper_sim_TV_subject(
370 *tvobj, time_of_collision,
371 CollisionRequestType::collisionRequestListOfObstacles, &reqData);
375 bool FCLCollisionChecker::collide_fcl_helper_sim_TV_subject(
379 int sim_start_idx = 0;
382 if (simulation_dynamic_) {
385 sim_end_idx = std::max(simulation_time_end_idx_, tvobj.
time_end_idx());
390 bool cur_res =
false;
391 int cur_collision_time = -1;
393 for (
int sim_cur_idx = sim_start_idx; sim_cur_idx <= sim_end_idx;
405 col_obj = (fclco)->getCollisionObject_fcl().get();
407 if (collide_fcl_helper_static_obstaclesEx(
408 col_obj, result, reqType,
411 time_of_collision = sim_cur_idx;
417 if (cur_collision_time == -1) {
418 cur_collision_time = sim_cur_idx;
423 if (collide_fcl_helper_dynamic_obstaclesEx(
424 col_obj, sim_cur_idx, result, reqType,
427 time_of_collision = sim_cur_idx;
432 if (cur_collision_time == -1) {
433 cur_collision_time = sim_cur_idx;
443 fcl::BroadPhaseCollisionManager<FCL_PRECISION> *mngr = 0;
447 if (collide_fcl_helper_static_obstaclesEx(mngr, result, reqType,
450 time_of_collision = sim_cur_idx;
455 if (cur_collision_time == -1) {
456 cur_collision_time = sim_cur_idx;
460 if (collide_fcl_helper_dynamic_obstaclesEx(mngr, sim_cur_idx, result,
463 time_of_collision = sim_cur_idx;
468 if (cur_collision_time == -1) {
469 cur_collision_time = sim_cur_idx;
480 time_of_collision = cur_collision_time;
485 bool FCLCollisionChecker::collide_fcl_helper_simulate_static_subject(
486 T col_entity,
int &time_of_collision, CollisionRequestType reqType,
488 bool cur_result =
false;
490 int cur_time_of_coll = -1;
491 if (collide_fcl_helper_static_obstaclesEx(col_entity, result, reqType,
494 time_of_collision = 0;
499 if (cur_time_of_coll == -1) cur_time_of_coll = 0;
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))) {
509 time_of_collision = cur_time_idx;
514 if (cur_time_of_coll == -1) cur_time_of_coll = 0;
519 time_of_collision = cur_time_of_coll;
525 bool FCLCollisionChecker::collide_fcl_helper_dynamic_obstaclesEx(
526 T col_entity,
int sim_cur_time_idx,
bool &result,
530 if (reqType == CollisionRequestType::collisionRequestListOfObstacles) {
537 if (!(static_cast<CollisionRequestDataMultipleObstacles *>(reqData)
538 ->getMaxObstacles())) {
541 if (!set_up_dynamic_obstacles(sim_cur_time_idx)) {
543 ->setSubjectEntitySize(col_entity);
545 ->setTargetMngrSize(dynamic_obstacles_.size());
547 ->setObstacleCallbackOrder();
549 *(static_cast<CollisionRequestDataMultipleObstacles *>(reqData)));
550 fcl::CollisionRequest<FCL_PRECISION> collisionRequest(
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();
562 }
else if (reqType == CollisionRequestType::collisionRequestBoolean) {
563 result = collide_fcl_helper_dynamic_obstacles(col_entity, sim_cur_time_idx);
572 bool FCLCollisionChecker::collide_fcl_helper_dynamic_obstacles(
573 T col_entity,
int sim_cur_time_idx)
const {
575 fcl::CollisionRequest<FCL_PRECISION> collisionRequest(
577 collisionRequest.enable_cost =
false;
578 if (!set_up_dynamic_obstacles(sim_cur_time_idx)) {
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();
589 bool FCLCollisionChecker::collide_fcl_helper_static_obstaclesEx(
590 T col_entity,
bool &result, CollisionRequestType reqType,
592 if (reqType == CollisionRequestType::collisionRequestListOfObstacles) {
599 if (!(static_cast<CollisionRequestDataMultipleObstacles *>(reqData)
600 ->getMaxObstacles())) {
604 ->setSubjectEntitySize(col_entity);
606 ->setTargetMngrSize(static_obstacles_.size());
608 ->setObstacleCallbackOrder();
610 *(static_cast<CollisionRequestDataMultipleObstacles *>(reqData)));
611 fcl::CollisionRequest<FCL_PRECISION> collisionRequest(
613 collisionRequest.enable_cost =
false;
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();
621 return self_data_static_obstacles.
self_reqData.getAllObstAdded();
623 }
else if (reqType == CollisionRequestType::collisionRequestBoolean) {
624 result = collide_fcl_helper_static_obstacles(col_entity);
633 bool FCLCollisionChecker::collide_fcl_helper_static_obstacles(
634 T col_entity)
const {
637 fcl::CollisionRequest<FCL_PRECISION> collisionRequest(
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();
647 template bool FCLCollisionChecker::collide_fcl_helper_simulate_static_subject(
650 template bool FCLCollisionChecker::collide_fcl_helper_simulate_static_subject(
651 fcl::BroadPhaseCollisionManager<FCL_PRECISION> *col_entity,
652 int &time_of_collision, CollisionRequestType reqType,
TimeVariantCollisionObject can contain a different CollisionObject or ShapeGroup at each time step...
CollisionRequestDataMultipleObstacles & self_reqData
const IFCLCollisionObjectGroup * getParentInterface(void) const
fcl::CollisionResult< S > result
Collision result.
FCL_COLLISION_ENTITY_TYPE
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
int time_start_idx() const
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)
virtual std::vector< CollisionObjectConstPtr > getObstacles() const =0
void addCollisionObject(CollisionObjectConstPtr co)
FCL_COLLISION_ENTITY_TYPE get_object_fcl_entity_type(const CollisionObject *obj2)
std::shared_ptr< fcl::CollisionObject< FCL_PRECISION > > getCollisionObject_fcl(void) const
fcl::CollisionRequest< S > request
Collision request.
void setUngroupShapeGroups(bool val)
External interface to a CollisionChecker (with or without an acceleration structure) ...
CollisionObjectConstPtr getObstacleAtTime(int time_idx) const
void setUngroupTvObstacles(bool val)
Collision data stores the collision request and the result given by collision algorithm.
int getManager_fcl(fcl::BroadPhaseCollisionManager< FCL_PRECISION > *&) const