Collision Checker
distance_queries.cc
Go to the documentation of this file.
3 
5 
6 namespace collision {
7 namespace detail {
8 std::size_t inline distance_default(const CollisionObject &obj1,
9  const CollisionObject &obj2,
10  DistanceResult &res,
11  const DistanceRequest &req) {
12  SolverEntity_FCL *obj1_entity;
13  FCL_COLLISION_ENTITY_TYPE obj2_entity_type =
14  get_object_fcl_entity_type(&obj1, obj1_entity);
15 
16  if (obj2_entity_type == COLLISION_ENTITY_TYPE_FCL_OBJECT) {
17  double distance = 0;
18  int ret =
19  (static_cast<FCLCollisionObject *>(obj1_entity))
20  ->calculateDistance(obj2, distance, req.computation_tolerance);
21  if (!ret) {
22  res.setMinDistance(distance);
23  }
24  return ret;
25 
26  } else if (obj2_entity_type == COLLISION_ENTITY_TYPE_FCL_OBJECTGROUP) {
27  double distance = 0;
28  int ret =
29  (static_cast<FCLCollisionObjectGroup *>(obj1_entity))
30  ->calculateDistance(obj2, distance, req.computation_tolerance);
31  if (!ret) {
32  res.setMinDistance(distance);
33  }
34  return ret;
35  } else {
36  return -1;
37  }
38 }
39 
40 std::size_t inline distance_tolerance_neg(const CollisionObject &obj1,
41  const CollisionObject &obj2,
42  DistanceResult &res,
43  const DistanceRequest &req) {
44  SolverEntity_FCL *obj1_entity;
45  FCL_COLLISION_ENTITY_TYPE obj2_entity_type =
46  get_object_fcl_entity_type(&obj1, obj1_entity);
47 
48  if (obj2_entity_type == COLLISION_ENTITY_TYPE_FCL_OBJECT) {
49  double distance = 0;
50  int ret =
51  (static_cast<FCLCollisionObject *>(obj1_entity))
52  ->calculateDistanceNegTolerance(obj2, distance,
57 
58  if (ret >= 0) {
59  res.setMinDistance(distance);
60  if (distance > -1 * (abs(req.compare_tolerance)))
61  res.setTolerancePassed(true);
62  else
63  res.setTolerancePassed(false);
64  }
65  return ret;
66 
67  } else if (obj2_entity_type == COLLISION_ENTITY_TYPE_FCL_OBJECTGROUP) {
68  double distance = 0;
69  int ret =
70  (static_cast<FCLCollisionObjectGroup *>(obj1_entity))
71  ->calculateDistanceNegTolerance(obj2, distance,
76 
77  if (ret >= 0) {
78  res.setMinDistance(distance);
79  if (distance > -1 * (abs(req.compare_tolerance)))
80  res.setTolerancePassed(true);
81  else
82  res.setTolerancePassed(false);
83  }
84  return ret;
85  } else {
86  return -1;
87  }
88 }
89 } // namespace detail
90 
91 // Only DRT_TOLERANCE_NEG works at the moment. It is implemented in FCL for some
92 // shapes. For test purposes only. Underlying implementations of distance queries
93 // in FCL had bugs.
94 
95 std::size_t distance(const CollisionObject &obj1, const CollisionObject &obj2,
96  DistanceResult &res, const DistanceRequest &req) {
97  if (req.dist_request_type == DRT_DISTANCE) {
98  return detail::distance_default(obj1, obj2, res, req);
99  } else if (req.dist_request_type == DRT_TOLERANCE_NEG) {
100  return detail::distance_tolerance_neg(obj1, obj2, res, req);
101  } else
102  return -1;
103 }
104 
105 } // namespace collision
DistanceNodeType dist_node_type
std::size_t distance(const CollisionObject &obj1, const CollisionObject &obj2, DistanceResult &res, const DistanceRequest &req)
bool setTolerancePassed(bool res)
std::size_t distance_tolerance_neg(const CollisionObject &obj1, const CollisionObject &obj2, DistanceResult &res, const DistanceRequest &req)
std::size_t distance_default(const CollisionObject &obj1, const CollisionObject &obj2, DistanceResult &res, const DistanceRequest &req)
FCL_COLLISION_ENTITY_TYPE get_object_fcl_entity_type(const CollisionObject *obj2)
Definition: fcl_helpers.h:11
DistanceRequestType dist_request_type
double setMinDistance(double res)
Base class for CollisionObjects and some of their groups.