15 using namespace accelerators;
18 if (traj_length_ < 2)
return 0;
20 for (
int traj_ind = 0; traj_ind < num_traj_; traj_ind++) {
21 auto read_iterator = rectangles_.begin() + traj_ind * traj_length_;
22 auto write_iterator = read_iterator;
23 for (
int timestep = 0; timestep < traj_length_ - 1; timestep++) {
24 auto obb_cur = *read_iterator;
25 auto obb_next = *(read_iterator + 1);
27 if (timestep == traj_length_ - 2) {
28 *(write_iterator + 1) = *write_iterator =
40 namespace trajectory_queries {
44 int& min_time_step,
int& max_time_step) {
45 min_time_step = traj_in[0]->time_start_idx();
46 max_time_step = traj_in[0]->time_end_idx();
48 for (
auto el : traj_in) {
49 min_time_step = std::min(min_time_step, el->time_start_idx());
50 max_time_step = std::max(max_time_step, el->time_end_idx());
57 int& min_time_step_traj,
int& max_time_step_traj,
int& min_time_step_obst,
58 int& max_time_step_obst) {
61 min_time_step_traj = std::max(min_time_step_traj, min_time_step_obst);
62 max_time_step_traj = std::min(max_time_step_traj, max_time_step_obst);
70 for (
auto el : trajectory_list) {
73 el->getObstacleAtTimePtr(time_step));
77 shapes_out.push_back(obj_cur);
81 (static_cast<collision::ShapeGroup*>(obj_cur))->unpack()) {
82 shapes_out.push_back(const_cast<collision::Shape*>(shape.get()));
94 T& obstacles_container,
98 if (obsts_in.size() + 2 != result.size())
return -1;
100 std::fill(result.begin(), result.end(), -1);
101 int min_time_step = -1, max_time_step = -1;
105 for (
int cur_time_step = min_time_step; cur_time_step <= max_time_step;
107 for (
int cur_obst = 0; cur_obst < obsts_in.size(); cur_obst++) {
108 if (!done[cur_obst]) {
109 auto cur_obj = obsts_in[cur_obst]->getObstacleAtTimePtr(cur_time_step);
110 if (cur_obj && obstacles_container.checkCollision(cur_obj, req))
113 done[cur_obst] =
true;
114 result[cur_obst] = cur_time_step;
119 result[obsts_in.size()] = (obstacles_container.numcands());
120 result[obsts_in.size() + 1] = (obstacles_container.numchecks());
136 if (orientation == 0) {
160 int cur_time_step,
int& numcands_global,
int& numchecks_global,
164 for (
int cur_obst = 0; cur_obst < obsts_in.size(); cur_obst++) {
168 if (!done[cur_obst]) {
169 auto cur_obj = obsts_in[cur_obst]->getObstacleAtTimePtr(cur_time_step);
170 if (cur_obj && obstacles_grid.checkCollision(cur_obj, creq)) {
171 done[cur_obst] =
true;
172 result[cur_obst] = cur_time_step;
176 numcands_global += obstacles_grid.numcands();
177 numchecks_global += obstacles_grid.numchecks();
187 int numcands_global = 0;
188 int numchecks_global = 0;
190 int min_time_step_traj = -1, max_time_step_traj = -1;
191 int min_time_step_obst = -1, max_time_step_obst = -1;
193 max_time_step_traj, min_time_step_obst,
197 std::fill(result.begin(), result.end(), -1);
200 for (
int cur_time_step = min_time_step_traj;
201 cur_time_step <= max_time_step_traj; cur_time_step++) {
202 col_objs_tvobst.clear();
207 if (col_objs_tvobst.size() == 0)
continue;
214 if (orientation == 0) {
224 numcands_global, numchecks_global, result, traj_in);
237 numcands_global, numchecks_global, result, traj_in);
240 result[traj_in.size()] = numcands_global;
241 result[traj_in.size() + 1] = numchecks_global;
246 template <
typename T>
255 int numcands_global = 0;
256 int numchecks_global = 0;
258 int min_time_step_traj = -1, max_time_step_traj = -1;
259 int min_time_step_obst = -1, max_time_step_obst = -1;
261 max_time_step_traj, min_time_step_obst,
265 std::fill(result.begin(), result.end(), -1);
269 for (
int cur_time_step = min_time_step_traj;
270 cur_time_step <= max_time_step_traj; cur_time_step++) {
271 col_objs_tvobst.clear();
277 T obstacles_grid(col_objs_tvobst, sett);
284 for (
int cur_obst = 0; cur_obst < obsts_in.size(); cur_obst++) {
285 if (!done[cur_obst]) {
286 auto cur_obj = obsts_in[cur_obst]->getObstacleAtTimePtr(cur_time_step);
287 if (cur_obj && obstacles_grid.checkCollision(cur_obj, creq)) {
288 done[cur_obst] =
true;
289 result[cur_obst] = cur_time_step;
293 numcands_global += obstacles_grid.numcands();
294 numchecks_global += obstacles_grid.numchecks();
297 result[obsts_in.size()] = numcands_global;
298 result[obsts_in.size() + 1] = numchecks_global;
310 return trajectories_collision_dynamic_helper<ContainerBox2D>(
324 return trajectories_collision_dynamic_helper<ContainerFCL>(
355 int min_time_step = -1, max_time_step = -1;
359 std::fill(result.begin(), result.end(), -1);
369 std::vector<collision::BoostPolygon*> polygons_vec;
371 for (
auto poly : obj.
unpack()) {
372 auto poly_obj = poly.get();
374 polygons_vec.push_back(static_cast<collision::BoostPolygon*>(
376 ->getCollisionObject_boost()
379 throw std::invalid_argument(
380 "the shape group for enclosure checks can contain only " 381 "collision::Polygon objects");
387 for (
int cur_time_step = min_time_step; cur_time_step <= max_time_step;
389 for (
int cur_obst = 0; cur_obst < traj_in.size(); cur_obst++) {
390 if (!done[cur_obst]) {
391 auto cur_obj = traj_in[cur_obst]->getObstacleAtTimePtr(cur_time_step);
395 switch (cur_obj->getCollisionObjectType()) {
401 static_cast<const collision::RectangleOBB*>(cur_obj));
409 static_cast<const collision::RectangleAABB*>(cur_obj));
413 throw std::invalid_argument(
414 "the trajectory for polygon enclosure checks can consist " 415 "only of OBB or AABB boxes");
426 done[cur_obst] =
true;
427 result[cur_obst] = cur_time_step;
433 result[traj_in.size()] = obstacles_grid.
numcands();
434 result[traj_in.size() + 1] = obstacles_grid.
numchecks();
457 namespace trajectory_queries {
458 using namespace detail::trajectory_queries;
469 if (!result)
return -1;
470 switch (request.broadphase_class) {
473 trajectories_in, dynamic_obstacles, request, *result);
477 trajectories_in, dynamic_obstacles, request, *result);
481 trajectories_in, dynamic_obstacles, request, *result);
498 if (!result)
return -1;
500 switch (request.broadphase_class) {
503 trajectories_in, static_obstacles, request, *result);
507 trajectories_in, static_obstacles, request, *result);
511 trajectories_in, static_obstacles, request, *result);
527 if (!result)
return -1;
529 switch (request.broadphase_class) {
532 trajectories_in, polygons, request, *result);
555 auto new_obj_ptr = obj_new.get();
560 if (time_end_idx_ - time_start_idx_ <= 0)
return 0;
561 for (
int i = time_start_idx_; i <= time_end_idx_; i++) {
564 if (i == time_end_idx_) {
572 if (!first || !second) {
582 new_obj->appendObstacle(element_new);
589 namespace deprecated {
std::vector< T, boost::alignment::aligned_allocator< T, 16 > > aligned_vector
int boost_ccd_obb_sum_collision(const ShapeGroup &sg, const RectangleOBB &pos1, const RectangleOBB &pos2, bool &res)
int getBestGridOrientationAndBounds(const ShapeGroup *sg_ptr, AABB &bounds, int &orientation)
TimeVariantCollisionObject can contain a different CollisionObject or ShapeGroup at each time step...
int boost_ccd_convex_hull_polygon_enclosure(const ShapeGroup &sg, const RectangleOBB &pos1, const RectangleOBB &pos2, bool &res)
int trajectories_collision_dynamic_helper(bool enable_verification, aligned_vector< int > &result, const aligned_vector< const collision::TimeVariantCollisionObject *> &obsts_in, const aligned_vector< const collision::TimeVariantCollisionObject *> &obsts_scenario, const ContainerSettings &sett)
std::size_t ccd_trajectory_test_polygon_enclosure_obb_sum(const ShapeGroup &sg, const RectangleOBB &pos1, const RectangleOBB &pos2, bool &res)
Checks if the over-approximative OBB box (OBB sum hull) for the two given OBB boxes boxes is enclosed...
int trajectories_enclosure_polygons_static_grid(const aligned_vector< const collision::TimeVariantCollisionObject *> &traj_in, const collision::ShapeGroup &obj, const TrajectoryRequestCollisionTime &treq, aligned_vector< int > &result)
int trajectories_collision_time_dynamic_obstacles(const aligned_vector< const collision::TimeVariantCollisionObject *> &trajectories_in, const aligned_vector< const collision::TimeVariantCollisionObject *> &dynamic_obstacles, TrajectoryQueryResult &res, const TrajectoryRequest &treq)
int trajectories_collision_staticobst_grid(const aligned_vector< const collision::TimeVariantCollisionObject *> &traj_in, const collision::ShapeGroup &obj, const TrajectoryRequestCollisionTime &treq, aligned_vector< int > &result)
virtual CollisionObjectClass getCollisionObjectClass() const
std::vector< ShapeConstPtr > unpack() const
Returns Vector of all shapes contained inside the ShapeGroup.
OBB merge_obbs(const OBB &obb1, const OBB &obb2)
void retrieve_shapes_from_trajectories(int time_step, const aligned_vector< const collision::TimeVariantCollisionObject *> &trajectory_list, aligned_vector< collision::CollisionObject *> &shapes_out)
std::size_t ccd_trajectory_test_polygon_enclosure_chull(const ShapeGroup &sg, const RectangleOBB &pos1, const RectangleOBB &pos2, bool &res)
Checks if the convex hull of the Boolean union of two given OBB boxes is enclosed within the ShapeGro...
ShapeGroup can contain simple shapes.
int time_start_idx() const
RectangleOBBConstPtr ccd_merge_entities(const RectangleOBB *first, const RectangleOBB *second)
int boost_ccd_convex_hull_collision(const ShapeGroup &sg, const RectangleOBB &pos1, const RectangleOBB &pos2, bool &res)
Checks if the convex hull of the Boolean union of two given OBB boxes collides with any of the ShapeG...
AABB getAABB(const CollisionObject *obj)
std::shared_ptr< const CollisionObject > CollisionObjectConstPtr
int trajectory_preprocess_obb_sum(const TimeVariantCollisionObject *obj_old, TimeVariantCollisionObjectPtr &obj_new)
Preprocesses a TimeVariantCollisionObject for continuous collision detection using OBB sum hull for t...
int boost_polygon_enclosure_grid(T &grid, std::vector< BoostPolygon *> polygons, AABB &aabb, const BoostPolygon *obj_poly, bool &res)
std::size_t ccd_trajectory_test_collision_chull(const ShapeGroup &sg, const RectangleOBB &pos1, const RectangleOBB &pos2, bool &res)
Checks if the convex hull of the Boolean union of two given OBB boxes collides with any of the ShapeG...
int trajectories_enclosure_time_polygons_static(const aligned_vector< const collision::TimeVariantCollisionObject *> &trajectories_in, const collision::ShapeGroup &polygons, TrajectoryQueryResult &res, const TrajectoryRequest &treq)
const BoostCollisionObject * get_boost_object_ptr(const CollisionObject *obj)
int trajectories_collision_dynamic_grid_helper(bool enable_verification, aligned_vector< bool > &done, T &obstacles_grid, int cur_time_step, int &numcands_global, int &numchecks_global, aligned_vector< int > &result, const aligned_vector< const collision::TimeVariantCollisionObject *> &obsts_in)
int trajectories_collision_time_static_obstacles(const aligned_vector< const collision::TimeVariantCollisionObject *> &trajectories_in, const collision::ShapeGroup &static_obstacles, TrajectoryQueryResult &res, const TrajectoryRequest &treq)
int trajectories_collision_staticobst_box2d(const aligned_vector< const collision::TimeVariantCollisionObject *> &traj_in, const collision::ShapeGroup &obj, const TrajectoryRequestCollisionTime &treq, aligned_vector< int > &result)
int orientation(Point p, Point q, Point r)
int preprocess_inplace(void)
int boost_ccd_obb_sum_polygon_enclosure(const ShapeGroup &sg, const RectangleOBB &pos1, const RectangleOBB &pos2, bool &res)
CollisionObjectConstPtr getObstacleAtTime(int time_idx) const
int trajectories_collision_dynamic_fcl(const aligned_vector< const collision::TimeVariantCollisionObject *> &traj_in, const aligned_vector< const collision::TimeVariantCollisionObject *> &obsts_scenario, const TrajectoryRequestCollisionTime &treq, aligned_vector< int > &result)
std::size_t ccd_trajectory_test_collision_obb_sum(const ShapeGroup &sg, const RectangleOBB &pos1, const RectangleOBB &pos2, bool &res)
Checks if the over-approximative OBB box (OBB sum hull) for the two given OBB boxes collides with any...
int trajectories_collision_staticobst_helper(T &obstacles_container, const aligned_vector< const collision::TimeVariantCollisionObject *> &obsts_in, ContainerCollisionRequest req, aligned_vector< int > &result)
Base class for CollisionObjects and some of their groups.
int trajectories_collision_staticobst_fcl(const aligned_vector< const collision::TimeVariantCollisionObject *> &traj_in, const collision::ShapeGroup &obj, const TrajectoryRequestCollisionTime &treq, aligned_vector< int > &result)
int trajectories_collision_dynamic_box2d(const aligned_vector< const collision::TimeVariantCollisionObject *> &traj_in, const aligned_vector< const collision::TimeVariantCollisionObject *> &obsts_scenario, const TrajectoryRequestCollisionTime &treq, aligned_vector< int > &result)
void get_time_step_bounds(const aligned_vector< const collision::TimeVariantCollisionObject *> &traj_in, const aligned_vector< const collision::TimeVariantCollisionObject *> &obsts_in, int &min_time_step_traj, int &max_time_step_traj, int &min_time_step_obst, int &max_time_step_obst)
BoostPolygon allows to use boost.Geometry functions for Polygon objects.
std::shared_ptr< TimeVariantCollisionObject > TimeVariantCollisionObjectPtr
int trajectories_collision_dynamic_grid(const aligned_vector< const collision::TimeVariantCollisionObject *> &traj_in, const aligned_vector< const collision::TimeVariantCollisionObject *> &obsts_scenario, const TrajectoryRequestCollisionTime &treq, aligned_vector< int > &result)