39#ifndef COAL_COLLISION_DATA_H 40#define COAL_COLLISION_DATA_H 49#include "coal/config.hh" 114 Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN());
119 :
o1(o1_),
o2(o2_),
b1(b1_),
b2(b2_) {
122 Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN());
133 pos_ + (depth_ * normal_ / 2)},
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 &&
236 Eigen::NumTraits<
CoalScalar>::dummy_precision()) {}
320 COAL_DEPRECATED_MESSAGE(A lower bound on
distance is always computed.)
393 std::vector<Contact> contacts;
420 Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN());
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; }
488 Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN());
565 this->m_points.reserve(preallocated_size);
577 size_t size()
const {
return this->m_points.size(); }
586 this->m_points.emplace_back(
point.template head<2>());
592 point.head<2>() = this->point(i);
623 COAL_ASSERT(this->m_points.size() > 0,
"Patch is empty.", std::logic_error);
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);
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 &&
660 Eigen::NumTraits<CoalScalar>::dummy_precision())
const {
672 if (this->direction != other.
direction) {
681 for (
size_t i = 0; i < this->
size(); ++i) {
684 for (
size_t j = 0; j < other.
size(); ++j) {
686 if (pi.isApprox(other_pj, tol)) {
762 size_t num_samples_curved_shapes =
772 size_t num_samples_curved_shapes =
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;
847 const size_t max_num_patch = 1;
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);
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);
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() >=
956 if (!(patch == other_patch)) {
975 for (
size_t j = 0; j < patch.
size(); ++j) {
976 patch.
point(i)(0) *= -1.0;
982struct DistanceResult;
989 COAL_DEPRECATED_MESSAGE(
990 Nearest points are always computed : they are the points of the shapes
994 minimum
distance(and thus its corresponding nearest points)
1023 bool enable_signed_distance_ = true,
1089 CoalScalar min_distance_ = (std::numeric_limits<CoalScalar>::max)())
1092 Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN()));
1128 o1 = other_result.
o1;
1129 o2 = other_result.
o2;
1130 b1 = other_result.
b1;
1131 b2 = other_result.
b2;
1141 Vec3s::Constant(std::numeric_limits<CoalScalar>::quiet_NaN()));
1142 min_distance = (std::numeric_limits<CoalScalar>::max)();
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);
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_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
Definition collision_data.h:1174
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
CollisionRequestFlag & operator|=(CollisionRequestFlag &a, CollisionRequestFlag b)
Definition collision_data.h:1220
CollisionRequestFlag & operator&=(CollisionRequestFlag &a, CollisionRequestFlag b)
Definition collision_data.h:1225
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
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
CollisionRequestFlag & operator^=(CollisionRequestFlag &a, CollisionRequestFlag b)
Definition collision_data.h:1230
constexpr size_t EPA_DEFAULT_MAX_ITERATIONS
Definition narrowphase_defaults.h:59
CollisionRequestFlag operator&(CollisionRequestFlag a, CollisionRequestFlag b)
Definition collision_data.h:1208
ContactPatch SupportSet
Structure used for internal computations. A support set and a contact patch can be represented by the...
Definition collision_data.h:721
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:1214
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
CollisionRequest(const CollisionRequestFlag flag, size_t num_max_contacts_)
Constructor from a flag and a maximal number of contacts.
Definition collision_data.h:349
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
std::array< Vec3s, 2 > nearest_points
nearest points. A CollisionResult can have multiple contacts. The nearest points in CollisionResults ...
Definition collision_data.h:414
void getContacts(std::vector< Contact > &contacts_) const
get all the contacts
Definition collision_data.h:475
const std::vector< Contact > & getContacts() const
Definition collision_data.h:480
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
const Contact & getContact(size_t i) const
get the i-th contact calculated
Definition collision_data.h:449
DistanceRequest & operator=(const DistanceRequest &other)=default
CoalScalar rel_err
error threshold for approximate distance
Definition collision_data.h:1013
CoalScalar abs_err
Definition collision_data.h:1014
DistanceRequest(bool enable_nearest_points_=true, bool enable_signed_distance_=true, CoalScalar rel_err_=0.0, CoalScalar abs_err_=0.0)
Definition collision_data.h:1022
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
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
static const int NONE
invalid contact primitive information
Definition collision_data.h:1086
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
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
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
QueryRequest()
Default constructor.
Definition collision_data.h:222
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
QueryRequest & operator=(const QueryRequest &other)=default
Copy assignment operator.
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