39 #ifndef COAL_COLLISION_DATA_H 
   40 #define COAL_COLLISION_DATA_H 
  108   static const int NONE = -1;
 
  111   Contact() : o1(NULL), o2(NULL), b1(NONE), b2(NONE) {
 
  112     penetration_depth = (std::numeric_limits<CoalScalar>::max)();
 
  113     nearest_points[0] = nearest_points[1] = normal = pos =
 
  114         Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN());
 
  119       : o1(o1_), o2(o2_), b1(b1_), b2(b2_) {
 
  120     penetration_depth = (std::numeric_limits<CoalScalar>::max)();
 
  121     nearest_points[0] = nearest_points[1] = normal = pos =
 
  122         Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN());
 
  132         nearest_points{pos_ - (depth_ * normal_ / 2),
 
  133                        pos_ + (depth_ * normal_ / 2)},
 
  135         penetration_depth(depth_) {}
 
  145         nearest_points{p1, p2},
 
  147         penetration_depth(depth_) {}
 
  150     if (b1 == other.
b1) 
return b2 < other.
b2;
 
  151     return b1 < other.
b1;
 
  155     return o1 == other.
o1 && o2 == other.
o2 && b1 == other.
b1 &&
 
  156            b2 == other.
b2 && normal == other.
normal && pos == other.
pos &&
 
  177   bool enable_cached_gjk_guess;
 
  186   size_t gjk_max_iterations;
 
  204   size_t epa_max_iterations;
 
  224         enable_cached_gjk_guess(false),
 
  225         cached_gjk_guess(1, 0, 0),
 
  234         enable_timings(false),
 
  235         collision_distance_threshold(
 
  236             Eigen::NumTraits<
CoalScalar>::dummy_precision()) {}
 
  260            gjk_convergence_criterion_type ==
 
  286       : cached_gjk_guess(
Vec3s::Zero()),
 
  321   bool enable_distance_lower_bound;
 
  350       : num_max_contacts(num_max_contacts_),
 
  351         enable_contact(flag & 
CONTACT),
 
  354         break_distance(1e-3),
 
  355         distance_upper_bound((std::numeric_limits<
CoalScalar>::max)()) {}
 
  359       : num_max_contacts(1),
 
  360         enable_contact(true),
 
  361         enable_distance_lower_bound(false),
 
  363         break_distance(1e-3),
 
  364         distance_upper_bound((std::numeric_limits<
CoalScalar>::max)()) {}
 
  393   std::vector<Contact> contacts;
 
  418       : distance_lower_bound((std::numeric_limits<
CoalScalar>::max)()) {
 
  419     nearest_points[0] = nearest_points[1] = normal =
 
  420         Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN());
 
  426     if (distance_lower_bound_ < distance_lower_bound)
 
  427       distance_lower_bound = distance_lower_bound_;
 
  435     return contacts == other.contacts &&
 
  450     if (contacts.size() == 0)
 
  452           "The number of contacts is zero. No Contact can be returned.",
 
  453           std::invalid_argument);
 
  455     if (i < contacts.size())
 
  458       return contacts.back();
 
  463     if (contacts.size() == 0)
 
  465           "The number of contacts is zero. No Contact can be returned.",
 
  466           std::invalid_argument);
 
  468     if (i < contacts.size())
 
  476     contacts_.resize(contacts.size());
 
  477     std::copy(contacts.begin(), contacts.end(), contacts_.begin());
 
  480   const std::vector<Contact>& 
getContacts()
 const { 
return contacts; }
 
  484     distance_lower_bound = (std::numeric_limits<CoalScalar>::max)();
 
  487     nearest_points[0] = nearest_points[1] = normal =
 
  488         Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN());
 
  549   static constexpr 
size_t default_preallocated_size = 12;
 
  561   explicit ContactPatch(
size_t preallocated_size = default_preallocated_size)
 
  564         penetration_depth(0) {
 
  565     this->m_points.reserve(preallocated_size);
 
  570     if (this->direction == PatchDirection::INVERTED) {
 
  577   size_t size()
 const { 
return this->m_points.size(); }
 
  586     this->m_points.emplace_back(point.template head<2>());
 
  591     Vec3s point(0, 0, 0);
 
  592     point.head<2>() = this->point(i);
 
  601     Vec3s point = this->getPoint(i);
 
  602     point -= (this->penetration_depth / 2) * this->getNormal();
 
  610     Vec3s point = this->getPoint(i);
 
  611     point += (this->penetration_depth / 2) * this->getNormal();
 
  623     COAL_ASSERT(this->m_points.size() > 0, 
"Patch is empty.", std::logic_error);
 
  624     if (i < this->m_points.size()) {
 
  625       return this->m_points[i];
 
  627     return this->m_points.back();
 
  632     COAL_ASSERT(this->m_points.size() > 0, 
"Patch is empty.", std::logic_error);
 
  633     if (i < this->m_points.size()) {
 
  634       return this->m_points[i];
 
  636     return this->m_points.back();
 
  641     this->m_points.clear();
 
  643     this->penetration_depth = 0;
 
  651     return this->tf == other.
tf && this->direction == other.
direction &&
 
  653            this->points() == other.
points();
 
  660                   Eigen::NumTraits<CoalScalar>::dummy_precision())
 const {
 
  664     if (!this->getNormal().isApprox(other.
getNormal(), tol)) {
 
  672     if (this->direction != other.
direction) {
 
  676     if (this->size() != other.
size()) {
 
  681     for (
size_t i = 0; i < this->size(); ++i) {
 
  683       const Vec3s pi = this->getPoint(i);
 
  684       for (
size_t j = 0; j < other.
size(); ++j) {
 
  686         if (pi.isApprox(other_pj, tol)) {
 
  710   contact_patch.
direction = ContactPatch::PatchDirection::DEFAULT;
 
  762                                size_t num_samples_curved_shapes =
 
  765       : max_num_patch(max_num_patch) {
 
  766     this->setNumSamplesCurvedShapes(num_samples_curved_shapes);
 
  767     this->setPatchTolerance(patch_tolerance);
 
  772                                size_t num_samples_curved_shapes =
 
  775       : max_num_patch(collision_request.num_max_contacts) {
 
  776     this->setNumSamplesCurvedShapes(num_samples_curved_shapes);
 
  777     this->setPatchTolerance(patch_tolerance);
 
  782     if (num_samples_curved_shapes < 3) {
 
  784           "`num_samples_curved_shapes` cannot be lower than 3. Setting it to " 
  785           "3 to prevent bugs.");
 
  786       this->m_num_samples_curved_shapes = 3;
 
  788       this->m_num_samples_curved_shapes = num_samples_curved_shapes;
 
  794     return this->m_num_samples_curved_shapes;
 
  799     if (patch_tolerance < 0) {
 
  801           "`patch_tolerance` cannot be negative. Setting it to 0 to prevent " 
  803       this->m_patch_tolerance = Eigen::NumTraits<CoalScalar>::dummy_precision();
 
  805       this->m_patch_tolerance = patch_tolerance;
 
  815            this->getNumSamplesCurvedShapes() ==
 
  847     const size_t max_num_patch = 1;
 
  854       : m_id_available_patch(0) {
 
  863     if (this->m_id_available_patch >= this->m_contact_patches_data.size()) {
 
  865           "Trying to get an unused contact patch but all contact patches are " 
  866           "used. Increasing size of contact patches vector, at the cost of a " 
  867           "copy. You should increase `max_num_patch` in the " 
  868           "`ContactPatchRequest`.");
 
  869       this->m_contact_patches_data.emplace_back(
 
  870           this->m_contact_patches_data.back());
 
  871       this->m_contact_patches_data.back().clear();
 
  874         this->m_contact_patches_data[this->m_id_available_patch];
 
  875     contact_patch.
clear();
 
  876     this->m_contact_patches.emplace_back(contact_patch);
 
  877     ++(this->m_id_available_patch);
 
  878     return this->m_contact_patches.back();
 
  883     if (this->m_contact_patches.empty()) {
 
  885           "The number of contact patches is zero. No ContactPatch can be " 
  887           std::invalid_argument);
 
  889     if (i < this->m_contact_patches.size()) {
 
  890       return this->m_contact_patches[i];
 
  892     return this->m_contact_patches.back();
 
  897     if (this->m_contact_patches.empty()) {
 
  899           "The number of contact patches is zero. No ContactPatch can be " 
  901           std::invalid_argument);
 
  903     if (i < this->m_contact_patches.size()) {
 
  904       return this->m_contact_patches[i];
 
  906     return this->m_contact_patches.back();
 
  911     this->m_contact_patches.clear();
 
  912     this->m_id_available_patch = 0;
 
  913     for (
ContactPatch& patch : this->m_contact_patches_data) {
 
  920     if (this->m_contact_patches_data.size() < request.
max_num_patch) {
 
  923     for (
ContactPatch& patch : this->m_contact_patches_data) {
 
  932     assert(this->m_contact_patches_data.size() >= request.
max_num_patch);
 
  933     if (this->m_contact_patches_data.size() < request.
max_num_patch) {
 
  937     for (
const ContactPatch& patch : this->m_contact_patches_data) {
 
  939         assert(patch.points().capacity() >=
 
  953     for (
size_t i = 0; i < this->numContactPatches(); ++i) {
 
  956       if (!(patch == other_patch)) {
 
  970     for (
size_t i = 0; i < this->numContactPatches(); ++i) {
 
  975       for (
size_t j = 0; j < patch.
size(); ++j) {
 
  976         patch.
point(i)(0) *= -1.0;  
 
  982 struct DistanceResult;
 
  990       Nearest points are always computed : they are the points of the shapes
 
  993               .\n Use `enable_signed_distance` 
if you want to compute a 
signed 
  994                   minimum 
distance(and thus its corresponding nearest points)
 
  996   bool enable_nearest_points;
 
 1010   bool enable_signed_distance;
 
 1023                   bool enable_signed_distance_ = true,
 
 1025       : enable_nearest_points(enable_nearest_points_),
 
 1026         enable_signed_distance(enable_signed_distance_),
 
 1028         abs_err(abs_err_) {}
 
 1086   static const int NONE = -1;
 
 1089       CoalScalar min_distance_ = (std::numeric_limits<CoalScalar>::max)())
 
 1090       : min_distance(min_distance_), o1(NULL), o2(NULL), b1(NONE), b2(NONE) {
 
 1092         Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN()));
 
 1093     nearest_points[0] = nearest_points[1] = normal = nan;
 
 1118       nearest_points[0] = p1;
 
 1119       nearest_points[1] = p2;
 
 1128       o1 = other_result.
o1;
 
 1129       o2 = other_result.
o2;
 
 1130       b1 = other_result.
b1;
 
 1131       b2 = other_result.
b2;
 
 1134       normal = other_result.
normal;
 
 1141         Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN()));
 
 1142     min_distance = (std::numeric_limits<CoalScalar>::max)();
 
 1147     nearest_points[0] = nearest_points[1] = normal = nan;
 
 1156                    normal == other.
normal && o1 == other.
o1 && o2 == other.
o2 &&
 
 1157                    b1 == other.
b1 && b2 == other.
b2;
 
 1160     if ((o1 != NULL) ^ (other.
o1 != NULL)) 
return false;
 
 1161     is_same &= (o1 == other.
o1);
 
 1165     if ((o2 != NULL) ^ (other.
o2 != NULL)) 
return false;
 
 1166     is_same &= (o2 == other.
o2);
 
 1174 namespace internal {
 
 1180   CoalScalar new_dlb = std::sqrt(sqrDistLowerBound);  
 
 1188                                              const Vec3s& normal) {
 
 1205                                            static_cast<int>(b));
 
 1211                                            static_cast<int>(b));
 
 1217                                            static_cast<int>(b));
 
The geometry for the object for collision or distance computation.
Definition: collision_object.h:94
 
#define COAL_DLLAPI
Definition: config.hh:88
 
#define COAL_DEPRECATED_MESSAGE(message)
Definition: deprecated.hh:38
 
#define COAL_COMPILER_DIAGNOSTIC_IGNORED_DEPRECECATED_DECLARATIONS
Definition: fwd.hh:122
 
#define COAL_ASSERT(check, message, exception)
Definition: fwd.hh:82
 
#define COAL_COMPILER_DIAGNOSTIC_PUSH
Definition: fwd.hh:120
 
#define COAL_COMPILER_DIAGNOSTIC_POP
Definition: fwd.hh:121
 
#define COAL_THROW_PRETTY(message, exception)
Definition: fwd.hh:64
 
CoalScalar distance(const Matrix3s &R0, const Vec3s &T0, const kIOS &b1, const kIOS &b2, Vec3s *P=NULL, Vec3s *Q=NULL)
Approximate distance between two kIOS bounding volumes.
 
#define COAL_LOG_WARNING(message)
Definition: logging.h:50
 
void updateDistanceLowerBoundFromBV(const CollisionRequest &, CollisionResult &res, const CoalScalar sqrDistLowerBound)
Definition: collision_data.h:1175
 
void updateDistanceLowerBoundFromLeaf(const CollisionRequest &, CollisionResult &res, const CoalScalar &distance, const Vec3s &p0, const Vec3s &p1, const Vec3s &normal)
Definition: collision_data.h:1184
 
Main namespace.
Definition: broadphase_bruteforce.h:44
 
GJKConvergenceCriterionType
Wether the convergence criterion is scaled on the norm of the solution or not.
Definition: data_types.h:108
 
@ Relative
Definition: data_types.h:108
 
CollisionRequestFlag & operator|=(CollisionRequestFlag &a, CollisionRequestFlag b)
Definition: collision_data.h:1220
 
constexpr size_t GJK_DEFAULT_MAX_ITERATIONS
GJK.
Definition: narrowphase_defaults.h:46
 
CollisionRequestFlag
flag declaration for specifying required params in CollisionResult
Definition: collision_data.h:304
 
@ CONTACT
Definition: collision_data.h:305
 
@ NO_REQUEST
Definition: collision_data.h:307
 
@ DISTANCE_LOWER_BOUND
Definition: collision_data.h:306
 
Matrix3s constructOrthonormalBasisFromVector(const Vec3s &vec)
Construct othonormal basis from vector. The z-axis is the normalized input vector.
Definition: transform.h:262
 
constexpr size_t EPA_DEFAULT_MAX_ITERATIONS
Definition: narrowphase_defaults.h:59
 
CollisionRequestFlag operator&(CollisionRequestFlag a, CollisionRequestFlag b)
Definition: collision_data.h:1208
 
constexpr CoalScalar EPA_DEFAULT_TOLERANCE
Definition: narrowphase_defaults.h:60
 
constexpr CoalScalar GJK_DEFAULT_TOLERANCE
Definition: narrowphase_defaults.h:47
 
Eigen::Matrix< CoalScalar, 2, 1 > Vec2s
Definition: data_types.h:78
 
Eigen::Vector2i support_func_guess_t
Definition: data_types.h:87
 
CollisionRequestFlag operator|(CollisionRequestFlag a, CollisionRequestFlag b)
Definition: collision_data.h:1202
 
GJKConvergenceCriterion
Which convergence criterion is used to stop the algorithm (when the shapes are not in collision)....
Definition: data_types.h:104
 
@ Default
Definition: data_types.h:104
 
GJKInitialGuess
Initial guess to use for the GJK algorithm DefaultGuess: Vec3s(1, 0, 0) CachedGuess: previous vector ...
Definition: data_types.h:95
 
@ DefaultGuess
Definition: data_types.h:95
 
@ CachedGuess
Definition: data_types.h:95
 
CollisionRequestFlag operator~(CollisionRequestFlag a)
Definition: collision_data.h:1198
 
CollisionRequestFlag & operator^=(CollisionRequestFlag &a, CollisionRequestFlag b)
Definition: collision_data.h:1230
 
CollisionRequestFlag operator^(CollisionRequestFlag a, CollisionRequestFlag b)
Definition: collision_data.h:1214
 
CollisionRequestFlag & operator&=(CollisionRequestFlag &a, CollisionRequestFlag b)
Definition: collision_data.h:1225
 
void constructContactPatchFrameFromContact(const Contact &contact, ContactPatch &contact_patch)
Construct a frame from a Contact's position and normal. Because both Contact's position and normal ar...
Definition: collision_data.h:704
 
Eigen::Matrix< CoalScalar, 3, 1 > Vec3s
Definition: data_types.h:77
 
double CoalScalar
Definition: data_types.h:76
 
GJKVariant
Variant to use for the GJK algorithm.
Definition: data_types.h:98
 
@ DefaultGJK
Definition: data_types.h:98
 
request to the collision algorithm
Definition: collision_data.h:311
 
CollisionRequest()
Default constructor.
Definition: collision_data.h:358
 
bool enable_distance_lower_bound
Whether a lower bound on distance is returned when objects are disjoint.
Definition: collision_data.h:321
 
CoalScalar security_margin
Distance below which objects are considered in collision. See Collision.
Definition: collision_data.h:328
 
bool operator==(const CollisionRequest &other) const
whether two CollisionRequest are the same or not
Definition: collision_data.h:370
 
bool enable_contact
whether the contact information (normal, penetration depth and contact position) will return.
Definition: collision_data.h:317
 
bool isSatisfied(const CollisionResult &result) const
 
CoalScalar break_distance
Distance below which bounding volumes are broken down. See Collision.
Definition: collision_data.h:332
 
size_t num_max_contacts
The maximum number of contacts that can be returned.
Definition: collision_data.h:313
 
CoalScalar distance_upper_bound
Distance above which GJK solver makes an early stopping. GJK stops searching for the closest points w...
Definition: collision_data.h:340
 
collision result
Definition: collision_data.h:390
 
Vec3s normal
normal associated to nearest_points. Same as CollisionResult::nearest_points but for the normal.
Definition: collision_data.h:405
 
void swapObjects()
reposition Contact objects when fcl inverts them during their construction.
 
CollisionResult()
Definition: collision_data.h:417
 
void addContact(const Contact &c)
add one contact into result structure
Definition: collision_data.h:431
 
const std::vector< Contact > & getContacts() const
Definition: collision_data.h:480
 
std::array< Vec3s, 2 > nearest_points
nearest points. A CollisionResult can have multiple contacts. The nearest points in CollisionResults ...
Definition: collision_data.h:414
 
const Contact & getContact(size_t i) const
get the i-th contact calculated
Definition: collision_data.h:449
 
void getContacts(std::vector< Contact > &contacts_) const
get all the contacts
Definition: collision_data.h:475
 
void updateDistanceLowerBound(const CoalScalar &distance_lower_bound_)
Update the lower bound only if the distance is inferior.
Definition: collision_data.h:424
 
size_t numContacts() const
number of contacts found
Definition: collision_data.h:446
 
void clear()
clear the results obtained
Definition: collision_data.h:483
 
CoalScalar distance_lower_bound
Definition: collision_data.h:401
 
void setContact(size_t i, const Contact &c)
set the i-th contact calculated
Definition: collision_data.h:462
 
bool isCollision() const
return binary collision result
Definition: collision_data.h:443
 
bool operator==(const CollisionResult &other) const
whether two CollisionResult are the same or not
Definition: collision_data.h:434
 
request to the distance computation
Definition: collision_data.h:985
 
CoalScalar rel_err
error threshold for approximate distance
Definition: collision_data.h:1013
 
CoalScalar abs_err
Definition: collision_data.h:1014
 
bool enable_signed_distance
whether to compute the penetration depth when objects are in collision. Turning this off can save com...
Definition: collision_data.h:1010
 
bool operator==(const DistanceRequest &other) const
whether two DistanceRequest are the same or not
Definition: collision_data.h:1039
 
DistanceRequest & operator=(const DistanceRequest &other)=default
 
bool isSatisfied(const DistanceResult &result) const
 
bool enable_nearest_points
whether to return the nearest points. Nearest points are always computed and are the points of the sh...
Definition: collision_data.h:996
 
distance result
Definition: collision_data.h:1051
 
CoalScalar min_distance
minimum distance between two objects. If two objects are in collision and DistanceRequest::enable_sig...
Definition: collision_data.h:1058
 
int b1
information about the nearest point in object 1 if object 1 is mesh or point cloud,...
Definition: collision_data.h:1077
 
const CollisionGeometry * o2
collision object 2
Definition: collision_data.h:1071
 
void clear()
clear the result
Definition: collision_data.h:1139
 
void update(CoalScalar distance, const CollisionGeometry *o1_, const CollisionGeometry *o2_, int b1_, int b2_, const Vec3s &p1, const Vec3s &p2, const Vec3s &normal_)
add distance information into the result
Definition: collision_data.h:1109
 
const CollisionGeometry * o1
collision object 1
Definition: collision_data.h:1068
 
int b2
information about the nearest point in object 2 if object 2 is mesh or point cloud,...
Definition: collision_data.h:1083
 
DistanceResult(CoalScalar min_distance_=(std::numeric_limits< CoalScalar >::max)())
Definition: collision_data.h:1088
 
std::array< Vec3s, 2 > nearest_points
nearest points. See CollisionResult::nearest_points.
Definition: collision_data.h:1065
 
Vec3s normal
normal.
Definition: collision_data.h:1061
 
bool operator==(const DistanceResult &other) const
whether two DistanceResult are the same or not
Definition: collision_data.h:1152
 
void update(const DistanceResult &other_result)
add distance information into the result
Definition: collision_data.h:1125
 
void update(CoalScalar distance, const CollisionGeometry *o1_, const CollisionGeometry *o2_, int b1_, int b2_)
add distance information into the result
Definition: collision_data.h:1097
 
base class for all query requests
Definition: collision_data.h:170
 
CoalScalar epa_tolerance
tolerance for EPA. Note: This tolerance determines the precision on the estimated distance between tw...
Definition: collision_data.h:211
 
QueryRequest(const QueryRequest &other)=default
Copy constructor.
 
Vec3s cached_gjk_guess
the gjk initial guess set by user
Definition: collision_data.h:180
 
size_t epa_max_iterations
max number of iterations for EPA
Definition: collision_data.h:204
 
GJKConvergenceCriterion gjk_convergence_criterion
convergence criterion used to stop GJK
Definition: collision_data.h:198
 
CoalScalar collision_distance_threshold
threshold below which a collision is considered.
Definition: collision_data.h:217
 
bool operator==(const QueryRequest &other) const
whether two QueryRequest are the same or not
Definition: collision_data.h:253
 
bool enable_timings
enable timings when performing collision/distance request
Definition: collision_data.h:214
 
QueryRequest & operator=(const QueryRequest &other)=default
Copy assignment operator.
 
support_func_guess_t cached_support_func_guess
the support function initial guess set by user
Definition: collision_data.h:183
 
CoalScalar gjk_tolerance
tolerance for the GJK algorithm. Note: This tolerance determines the precision on the estimated dista...
Definition: collision_data.h:192
 
bool enable_cached_gjk_guess
whether enable gjk initial guess @Deprecated Use gjk_initial_guess instead
Definition: collision_data.h:177
 
GJKVariant gjk_variant
whether to enable the Nesterov accleration of GJK
Definition: collision_data.h:195
 
GJKConvergenceCriterionType gjk_convergence_criterion_type
convergence criterion used to stop GJK
Definition: collision_data.h:201
 
GJKInitialGuess gjk_initial_guess
Definition: collision_data.h:172
 
void updateGuess(const QueryResult &result) const
Updates the guess for the internal GJK algorithm in order to warm-start it when reusing this collisio...
Definition: collision_data.h:290
 
size_t gjk_max_iterations
maximum iteration for the GJK algorithm
Definition: collision_data.h:186
 
base class for all query results
Definition: collision_data.h:275
 
Vec3s cached_gjk_guess
stores the last GJK ray when relevant.
Definition: collision_data.h:277
 
support_func_guess_t cached_support_func_guess
stores the last support function vertex index, when relevant.
Definition: collision_data.h:280
 
QueryResult()
Definition: collision_data.h:285
 
CPUTimes timings
timings for the given request
Definition: collision_data.h:283