Collision Checker
fcl_distance_requests.cc
Go to the documentation of this file.
2 #include <stdlib.h>
3 
4 namespace collision {
5 namespace solvers {
6 namespace solverFCL {
9  void *cdata_, FCL_PRECISION &dist) {
10  DistanceData *cdata = static_cast<DistanceData *>(cdata_);
11  const fcl::DistanceRequest<FCL_PRECISION> &request = cdata->request;
12  fcl::DistanceResult<FCL_PRECISION> &result = cdata->result;
13  if (cdata->done) {
14  dist = result.min_distance;
15  return true;
16  }
17  if (o1->collisionGeometry() == o2->collisionGeometry()) {
18  dist = get_max_distance();
19  cdata->result_code = -1;
20  } else {
21  // dist = -1 * penetrationDepth(o1->getAABB(), o2->getAABB());
22  fcl::distance(o1, o2, request, result);
23  dist = result.min_distance;
24  }
25  if (cdata->minDist > dist) {
26  cdata->minDist = dist;
27  }
28  if (dist <= 0) return true; // in collision or in touch
29  return cdata->done;
30 }
31 double penetrationDepth(fcl::AABBd boxA, fcl::AABBd boxB) {
32  typedef double S;
33  S result = 0;
34  if (boxA.overlap(boxB)) {
35  for (std::size_t i = 0; i < 3; ++i) {
36  const S &amin = boxA.min_[i];
37  const S &amax = boxA.max_[i];
38  const S &bmin = boxB.min_[i];
39  const S &bmax = boxB.max_[i];
40 
41  if (amin < bmax) {
42  S delta = bmax - amin;
43  result += delta * delta;
44  } else if (amax > bmin) {
45  S delta = amax - bmin;
46  result += delta * delta;
47  }
48  }
49  }
50  return std::sqrt(result);
51 }
52 
55  void *cdata_, FCL_PRECISION &dist) {
56  ToleranceDistanceData *cdata = static_cast<ToleranceDistanceData *>(cdata_);
57  const fcl::DistanceRequest<FCL_PRECISION> &request = cdata->request;
58 
59  fcl::DistanceResult<FCL_PRECISION> &result = cdata->result;
60  if (cdata->done) {
61  dist = result.min_distance;
62  return true;
63  }
64  // TODO: add a check that geometries are not the same
65  if (o1->collisionGeometry() == o2->collisionGeometry()) {
66  dist = get_max_distance();
67  cdata->result_code = -1;
68  } else {
69  dist = -1 * penetrationDepth(o1->getAABB(), o2->getAABB());
70  }
71 
72  if (cdata->minDist > dist) {
73  cdata->minDist = dist;
74  }
75  if (dist < -abs(cdata->tolerance))
76  return true; // one object penetrates more than tolerated
77  return cdata->done;
78 }
79 
82  void *cdata_, FCL_PRECISION &dist) {
83  ToleranceDistanceData *cdata = static_cast<ToleranceDistanceData *>(cdata_);
84  const fcl::DistanceRequest<FCL_PRECISION> &request = cdata->request;
85 
86  fcl::DistanceResult<FCL_PRECISION> &result = cdata->result;
87  if (cdata->done) {
88  dist = result.min_distance;
89  return true;
90  }
91  // TODO: add a check that geometries are not the same
92  if (o1->collisionGeometry() == o2->collisionGeometry()) {
93  dist = get_max_distance();
94  cdata->result_code = -1;
95  } else {
96  fcl::distance(o1, o2, request, result);
97  dist = result.min_distance;
98  }
99 
100  if (cdata->minDist > dist) {
101  cdata->minDist = dist;
102  }
103  if (dist < -abs(cdata->tolerance))
104  return true; // one object penetrates more than tolerated
105  return cdata->done;
106 }
108  return std::numeric_limits<FCL_PRECISION>::max();
109 }
111  done = false;
113 }
114 DistanceData::DistanceData(void) { this->result_code = 0; }
116  tolerance = DEFAULT_DISTANCE_TOLERANCE;
117 }
118 } // namespace solverFCL
119 
120 } // namespace solvers
121 } // namespace collision
fcl::DistanceResult< FCL_PRECISION > result
double penetrationDepth(fcl::AABBd boxA, fcl::AABBd boxB)
fcl::DistanceRequest< FCL_PRECISION > request
bool toleranceDistanceFunction(fcl::CollisionObject< FCL_PRECISION > *o1, fcl::CollisionObject< FCL_PRECISION > *o2, void *cdata_, FCL_PRECISION &dist)
std::size_t distance(const CollisionObject &obj1, const CollisionObject &obj2, DistanceResult &res, const DistanceRequest &req)
#define DEFAULT_DISTANCE_TOLERANCE
Definition: fcl_decl.h:8
bool toleranceBBDistanceFunction(fcl::CollisionObject< FCL_PRECISION > *o1, fcl::CollisionObject< FCL_PRECISION > *o2, void *cdata_, FCL_PRECISION &dist)
bool defaultDistanceFunction(fcl::CollisionObject< FCL_PRECISION > *o1, fcl::CollisionObject< FCL_PRECISION > *o2, void *cdata_, FCL_PRECISION &dist)