Collision Checker
collision_solver_fcl.cc
Go to the documentation of this file.
2 
7 
8 namespace collision {
9 
10 namespace solvers {
11 namespace solverFCL {
12 
13 std::size_t collide_obj_obj(const CollisionObject &obj1,
14  const CollisionObject &obj2, CollisionResult &res,
15  const CollisionRequest &req) {
16  const FCLCollisionObject *obj1_fcl = get_fcl_object_ptr(&obj1);
17  const FCLCollisionObject *obj2_fcl = get_fcl_object_ptr(&obj2);
18  if (!obj1_fcl || !obj2_fcl) return -1;
19 
21  *obj1_fcl, *obj2_fcl));
22  return 0;
23 }
24 std::size_t collide_shape_group_obj(const CollisionObject &obj1,
25  const CollisionObject &obj2,
26  CollisionResult &res,
27  const CollisionRequest &req) {
28  const FCLCollisionObjectGroup *obj1_fcl = get_fcl_object_group_ptr(&obj1);
29  const FCLCollisionObject *obj2_fcl = get_fcl_object_ptr(&obj2);
30  if (!obj1_fcl || !obj2_fcl) return -1;
32  *obj1_fcl, *obj2_fcl));
33  return 0;
34 }
35 std::size_t collide_obj_shape_group(const CollisionObject &obj1,
36  const CollisionObject &obj2,
37  CollisionResult &res,
38  const CollisionRequest &req) {
39  return collide_shape_group_obj(obj2, obj1, res, req);
40 }
42  const CollisionObject &obj2,
43  CollisionResult &res,
44  const CollisionRequest &req) {
45  const FCLCollisionObjectGroup *obj1_fcl = get_fcl_object_group_ptr(&obj1);
46  const FCLCollisionObjectGroup *obj2_fcl = get_fcl_object_group_ptr(&obj2);
47 
48  if (!obj1_fcl || !obj2_fcl) return -1;
50  *obj1_fcl, *obj2_fcl));
51  return 0;
52 }
53 
54 std::size_t collide_tvobst_obj(const CollisionObject &obj1,
55  const CollisionObject &obj2,
56  CollisionResult &res,
57  const CollisionRequest &req) {
58  static solvers::FCLSolver solver;
59  static CollisionFunctionMatrix matr_fcl(&solver);
60  const TimeVariantCollisionObject &tvobst(
61  static_cast<const TimeVariantCollisionObject &>(obj1));
62  int time_idx_start = tvobst.time_start_idx();
63  int time_idx_end = tvobst.time_end_idx();
64  for (int cc1 = time_idx_start; cc1 <= time_idx_end; cc1++) {
65  CollisionObjectConstPtr cur_obj = tvobst.getObstacleAtTime(cc1);
66 
67  if (!cur_obj.get()) {
68  continue;
69  }
70 
71  if (cur_obj->getCollisionObjectClass() ==
73  return -1;
74  }
75 
77  cur_obj->getCollisionObjectType(), obj2.getCollisionObjectType());
78  if (!func) {
79  return -1;
80  }
81  func(*cur_obj, obj2, res, req);
82  if (res.collides()) return 0;
83  }
84  return 0;
85 }
86 
87 std::size_t collide_obj_tvobst(const CollisionObject &obj1,
88  const CollisionObject &obj2,
89  CollisionResult &res,
90  const CollisionRequest &req) {
91  return collide_tvobst_obj(obj2, obj1, res, req);
92 }
93 
94 std::size_t collide_tvobst_tvobst(const CollisionObject &obj1,
95  const CollisionObject &obj2,
96  CollisionResult &res,
97  const CollisionRequest &req) {
98  static solvers::FCLSolver solver;
99  static CollisionFunctionMatrix matr_fcl(&solver);
100  const TimeVariantCollisionObject &tvobst1(
101  static_cast<const TimeVariantCollisionObject &>(obj1));
102  const TimeVariantCollisionObject &tvobst2(
103  static_cast<const TimeVariantCollisionObject &>(obj2));
104  int time_idx_start =
105  std::min(tvobst1.time_start_idx(), tvobst2.time_start_idx());
106  int time_idx_end = std::max(tvobst1.time_end_idx(), tvobst2.time_end_idx());
107 
108  for (int cc1 = time_idx_start; cc1 <= time_idx_end; cc1++) {
109  CollisionObjectConstPtr obst_1 = tvobst1.getObstacleAtTime(cc1);
110  CollisionObjectConstPtr obst_2 = tvobst2.getObstacleAtTime(cc1);
111 
112  if (!obst_1.get() || !obst_2.get()) {
113  continue;
114  }
115  if (obst_1->getCollisionObjectClass() == OBJ_CLASS_TVOBSTACLE ||
116  obst_2->getCollisionObjectClass() == OBJ_CLASS_TVOBSTACLE) {
117  return -1;
118  }
119 
121  obst_1->getCollisionObjectType(), obst_2->getCollisionObjectType());
122  if (!func) {
123  return -1;
124  }
125  func(*obst_1, *obst_2, res, req);
126  if (res.collides()) return 0;
127  }
128  return 0;
129 }
130 
131 } // namespace solverFCL
132 
134  const solvers::FCLSolver *solver) {
135  memset(m_collide_bool_function, 0,
137  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_AABB_BOX] =
139  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_OBB_BOX] =
141  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_SPHERE] =
143  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_TRIANGLE] =
145  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_POINT] =
147  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_POLYGON] =
149  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_SHAPEGROUP] =
151  m_collide_bool_function[OBJ_TYPE_AABB_BOX][OBJ_TYPE_TVOBSTACLE] =
153 
154  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_AABB_BOX] =
156  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_OBB_BOX] =
158  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_SPHERE] =
160  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_TRIANGLE] =
162  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_POINT] =
164  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_POLYGON] =
166  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_SHAPEGROUP] =
168  m_collide_bool_function[OBJ_TYPE_OBB_BOX][OBJ_TYPE_TVOBSTACLE] =
170 
171  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_AABB_BOX] =
173  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_OBB_BOX] =
175  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_SPHERE] =
177  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_TRIANGLE] =
179  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_POINT] =
181  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_POLYGON] =
183  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_SHAPEGROUP] =
185  m_collide_bool_function[OBJ_TYPE_SPHERE][OBJ_TYPE_TVOBSTACLE] =
187 
188  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_AABB_BOX] =
190  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_OBB_BOX] =
192  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_SPHERE] =
194  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_TRIANGLE] =
196  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_POINT] =
198  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_POLYGON] =
200  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_SHAPEGROUP] =
202  m_collide_bool_function[OBJ_TYPE_TRIANGLE][OBJ_TYPE_TVOBSTACLE] =
204 
205  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_AABB_BOX] =
207  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_OBB_BOX] =
209  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_SPHERE] =
211  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_TRIANGLE] =
213  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_POINT] =
215  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_POLYGON] =
217  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_SHAPEGROUP] =
219  m_collide_bool_function[OBJ_TYPE_POINT][OBJ_TYPE_TVOBSTACLE] =
221 
222  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_AABB_BOX] =
224  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_OBB_BOX] =
226  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_SPHERE] =
228  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_TRIANGLE] =
230  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_POINT] =
232  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_POLYGON] =
234  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_SHAPEGROUP] =
236  m_collide_bool_function[OBJ_TYPE_POLYGON][OBJ_TYPE_TVOBSTACLE] =
238 
239  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_AABB_BOX] =
241  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_OBB_BOX] =
243  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_SPHERE] =
245  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_TRIANGLE] =
247  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_POINT] =
249  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_POLYGON] =
251  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_SHAPEGROUP] =
253  m_collide_bool_function[OBJ_TYPE_SHAPEGROUP][OBJ_TYPE_TVOBSTACLE] =
255 
256  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_AABB_BOX] =
258  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_OBB_BOX] =
260  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_SPHERE] =
262  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_TRIANGLE] =
264  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_POINT] =
266  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_POLYGON] =
268  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_SHAPEGROUP] =
270  m_collide_bool_function[OBJ_TYPE_TVOBSTACLE][OBJ_TYPE_TVOBSTACLE] =
272 }
273 
274 } // namespace solvers
275 
276 } // namespace collision
collide_bool_func_t getSolverBoolFunction(CollisionObjectType obj1_type, CollisionObjectType obj2_type) const
std::size_t collide_tvobst_tvobst(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
TimeVariantCollisionObject can contain a different CollisionObject or ShapeGroup at each time step...
std::size_t collide_shape_group_shape_group(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t(* collide_bool_func_t)(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::shared_ptr< const CollisionObject > CollisionObjectConstPtr
const FCLCollisionObject * get_fcl_object_ptr(const CollisionObject *obj)
Definition: fcl_helpers.h:40
Universal structure specifying collision request properties.
std::size_t collide_obj_obj(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_obj_shape_group(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
bool fcl_generic_collisionDetection(const FCLCollisionObject &obj_first, const FCLCollisionObject &obj_second)
virtual CollisionObjectType getCollisionObjectType() const
std::size_t collide_shape_group_obj(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
std::size_t collide_obj_tvobst(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
CollisionFunctionMatrix(const solvers::FCLSolver *solver)
CollisionObjectConstPtr getObstacleAtTime(int time_idx) const
Base class for CollisionObjects and some of their groups.
std::size_t collide_tvobst_obj(const CollisionObject &obj1, const CollisionObject &obj2, CollisionResult &res, const CollisionRequest &req)
Structure holding result for a collision request.
const FCLCollisionObjectGroup * get_fcl_object_group_ptr(const CollisionObject *obj)
Definition: fcl_helpers.h:27
constexpr int COL_OBJECT_TYPES_COUNT