Collision Checker
collision_checker.cc
Go to the documentation of this file.
2 
6 #if ENABLE_SERIALIZER
8 #endif
9 
10 namespace collision {
11 
13  CollisionCheckerPtr new_cc =
15  for (auto el : collision_objects_) {
16  new_cc->addCollisionObject(el);
17  }
18  return new_cc;
19 }
20 
26  collision_objects_.push_back(co);
27  fcl_cc_.addCollisionObject(co);
28 }
29 
43  int res = -1;
44  collide(co, &res);
45  return res;
46 }
47 
60 #if (ENABLE_COLLISION_TESTS)
61 bool CollisionChecker::collide(CollisionObjectConstPtr co, int *collision_time,
62  bool enable_test) const {
63  if (enable_test) {
65  cc_test.run_test_collide(co, this);
66  }
67 #else
69  int *collision_time) const {
70 
71 #endif
72 
73  // STACK_TIMER tim(TIMER_collide);
74  return fcl_cc_.collideHelper(co, collision_time, 0);
75 
76  bool collides = false;
77 }
78 
100 #if (ENABLE_COLLISION_TESTS)
102  CollisionObjectConstPtr &obstacle,
103  bool ungroup_shape_groups,
104  bool ungroup_TV_obstacles,
105  bool enable_test) const {
106  if (enable_test) {
107  std::cout << "testing";
109  cc_test.run_test_collide_obstacle(co, this);
110  }
111 #else
113  CollisionObjectConstPtr &obstacle,
114  bool ungroup_shape_groups,
115  bool ungroup_TV_obstacles) const {
116 
117 #endif
118 
119  std::vector<CollisionObjectConstPtr> obstacles;
120  bool res = fcl_cc_.collideHelper(co, 0, &obstacles, 1, ungroup_shape_groups,
121  ungroup_TV_obstacles);
122  if (res) {
123  if (obstacles.size() > 0) {
124  obstacle = obstacles[0];
125  }
126  }
127  return res;
128 }
129 
159 bool CollisionChecker::rayTrace(const Eigen::Vector2d &point1,
160  const Eigen::Vector2d &point2,
161  std::vector<LineSegment> &intersect,
162  bool remove_overlaps) {
163  double eps = 0.000001;
164  double sqrlen =
165  (pow(point1[0] - point2[0], 2) + pow(point1[1] - point2[1], 2));
166  // if ray length is greater than epsilon, filter the colliding obstacles
167  if (sqrlen >= eps) {
168  Eigen::Vector2d center = (point2 + point1) / 2;
169  Eigen::Vector2d local_x_axis = center - point1;
170 
171  double rad_x = sqrt(sqrlen) / 2; // radius of the ray OBB
172  local_x_axis /= rad_x;
173  Eigen::Vector2d local_y_axis(-local_x_axis[1], local_x_axis[0]);
174  Eigen::Matrix2d local_axes;
175  local_axes.col(0) = local_x_axis;
176  local_axes.col(1) = local_y_axis;
178  new collision::RectangleOBB(rad_x, eps, local_axes, center));
179  std::vector<CollisionObjectConstPtr> obstacles;
180 
181  if (collide(robb, obstacles, 1, 1)) {
182  return collision::raytrace::rayTracePrimitive(obstacles, point1, point2,
183  intersect, remove_overlaps);
184  } else
185  return false;
186 
187  } else {
189  collision_objects_, point1, point2, intersect, remove_overlaps);
190  }
191 }
192 
193 void CollisionChecker::toString(std::ostringstream &stream) const {
194  stream << "CollisionChecker "
195  << "objects: ";
196 
197  for (auto &obj : collision_objects_) {
198  obj->toString(stream);
199  }
200  stream << "\\CollisionChecker " << std::endl;
201 }
202 
224 #if (ENABLE_COLLISION_TESTS)
226  std::vector<CollisionObjectConstPtr> &obstacles,
227  bool ungroup_shape_groups,
228  bool ungroup_TV_obstacles,
229  bool enable_test) const {
230  if (enable_test) {
232  cc_test.run_test_collide_obstacles(co, this);
233  }
234 #else
236  std::vector<CollisionObjectConstPtr> &obstacles,
237  bool ungroup_shape_groups,
238  bool ungroup_TV_obstacles) const {
239 #endif
240 
241  return fcl_cc_.collideHelper(co, 0, &obstacles, -1, ungroup_shape_groups,
242  ungroup_TV_obstacles);
243 
244  bool collides = false;
245  for (auto &c : collision_objects_)
246  if (c->collide(*co)) {
247  obstacles.push_back(c);
248  collides = true;
249  }
250  return collides;
251 }
252 
265  const RectangleAABB &aabb) const {
267  std::make_shared<PrimitiveCollisionChecker>();
268 
269  fcl_cc_.windowQuery_helper(aabb, *(cc_ret.get()));
270 
271  return cc_ret;
272 }
273 
286  const RectangleAABB &aabb) const {
287  // STACK_TIMER tim(TIMER_windowQuery);
288 
289  CollisionCheckerPtr cc_ret = std::make_shared<CollisionChecker>();
290  fcl_cc_.windowQuery_helper(aabb, *(cc_ret.get()));
291 
292  return cc_ret;
293 }
294 
303  // STACK_TIMER tim(TIMER_timeSlice);
305  for (auto &c : collision_objects_) {
306  CollisionObjectConstPtr tmp = c->timeSlice(time_idx, c);
307  if (tmp != nullptr) {
308  cc_ret->addCollisionObject(tmp);
309  }
310  }
311  return cc_ret;
312 }
313 
320  return collision_objects_.size();
321 }
322 
328 std::vector<CollisionObjectConstPtr> CollisionChecker::getObstacles() const {
329  return collision_objects_;
330 }
331 
332 void CollisionChecker::print(std::ostringstream &stream) const {
333  stream << "CollisionChecker number of CollisionObjects: "
334  << collision_objects_.size() << std::endl;
335  for (unsigned int i = 0; i < collision_objects_.size(); i++) {
336  collision_objects_[i]->print(stream);
337  }
338 }
339 
340 #if ENABLE_SERIALIZER
341 
342 int CollisionChecker::serialize(std::ostream &output_stream) const {
343  return serialize::serialize(std::static_pointer_cast<const CollisionChecker>(
344  this->shared_from_this()),
345  output_stream);
346 }
347 
349  std::istream &input_stream) {
351  if (!serialize::deserialize(ret, input_stream)) {
352  return ret;
353  } else
354  return CollisionCheckerConstPtr(0);
355 }
356 
357 namespace serialize {
358 ICollisionCheckerExport *exportObject(const collision::CollisionChecker &);
359 }
360 
361 serialize::ICollisionCheckerExport *CollisionChecker::exportThis(void) const {
362  return serialize::exportObject(*this);
363 }
364 #endif
365 
366 } // namespace collision
std::shared_ptr< const CollisionChecker > CollisionCheckerConstPtr
Oriented rectangle.
Definition: rectangle_obb.h:19
std::shared_ptr< PrimitiveCollisionChecker > PrimitiveCollisionCheckerPtr
void print(std::ostringstream &stream) const
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
std::vector< CollisionObjectConstPtr > getObstacles(void) const
Returns a Vector with all contained CollisionObjects of any type.
int numberOfObstacles(void) const
Returns number of contained CollisionObjects of any type.
void windowQuery_helper(const RectangleAABB &aabb, ICollisionChecker &ret) const
EIGEN_MAKE_ALIGNED_OPERATOR_NEW CollisionChecker()
CollisionChecker can contain collision objects and their groups (such as ShapeGroup and TimeVariantCo...
void addCollisionObject(CollisionObjectConstPtr co)
Adds a collision object into the CollisionChecker group structure.
bool rayTrace(const Eigen::Vector2d &point1, const Eigen::Vector2d &point2, std::vector< LineSegment > &intersect, bool remove_overlaps=true)
adds a collision object to the CC
std::shared_ptr< const RectangleOBB > RectangleOBBConstPtr
CollisionCheckerPtr clone_shared(void) const
std::shared_ptr< const CollisionObject > CollisionObjectConstPtr
std::shared_ptr< CollisionChecker > CollisionCheckerPtr
bool run_test_collide(CollisionObjectConstPtr co, const collision::CollisionChecker *cc)
bool run_test_collide_obstacle(CollisionObjectConstPtr co, const collision::CollisionChecker *cc)
bool rayTracePrimitive(std::vector< collision::CollisionObjectConstPtr > collision_objects, const Eigen::Vector2d &point1, const Eigen::Vector2d &point2, std::vector< LineSegment > &intersect, bool remove_overlaps)
bool collide(CollisionObjectConstPtr co, int *collision_time=0) const
Returns true if any of the objects contained in the CollisionChecker collide with the given object...
int deserialize(test::BroadphaseFailureCCObj &bf_object, std::istream &input_stream, const char *format=SERIALIZER_DEFAULT_FORMAT)
int collisionTime(CollisionObjectConstPtr co) const
Returns timestep at which any of the objects contained in the CollisionChecker collides with the give...
Axis-aligned rectangle.
CollisionCheckerPtr timeSlice(int time_idx) const
Returns new CollisionChecker with objects that exist at a given timestep.
CollisionCheckerPtr windowQuery(const RectangleAABB &aabb) const
Returns new CollisionChecker with all static objects within the window and all time-variant obstacles...
int serialize(const test::BroadphaseFailureCCObj &bf_object, std::ostream &output_stream, const char *format=SERIALIZER_DEFAULT_FORMAT)
bool run_test_collide_obstacles(CollisionObjectConstPtr co, const collision::CollisionChecker *cc)
void toString(std::ostringstream &stream) const
PrimitiveCollisionCheckerPtr windowQueryPrimitive(const RectangleAABB &aabb) const
Returns new PrimitiveCollisionChecker with all static objects within the window and all time-variant ...