coal 3.0.2
Coal, The Collision Detection Library. Previously known as HPP-FCL, fork of FCL -- The Flexible Collision Library
Loading...
Searching...
No Matches
collision_object.h
Go to the documentation of this file.
1/*
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2011-2014, Willow Garage, Inc.
5 * Copyright (c) 2014-2015, Open Source Robotics Foundation
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials provided
17 * with the distribution.
18 * * Neither the name of Open Source Robotics Foundation nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 */
35
37
38#ifndef COAL_COLLISION_OBJECT_BASE_H
39#define COAL_COLLISION_OBJECT_BASE_H
40
41#include <limits>
42#include <typeinfo>
43
44#include "coal/deprecated.hh"
45#include "coal/fwd.hh"
46#include "coal/BV/AABB.h"
48
49namespace coal {
50
60
89
92
94class COAL_DLLAPI CollisionGeometry {
95 public:
97 : aabb_center(Vec3s::Constant((std::numeric_limits<CoalScalar>::max)())),
98 aabb_radius(-1),
101 threshold_free(0) {}
102
104 CollisionGeometry(const CollisionGeometry& other) = default;
105
106 virtual ~CollisionGeometry() {}
107
109 virtual CollisionGeometry* clone() const = 0;
110
112 bool operator==(const CollisionGeometry& other) const {
113 return cost_density == other.cost_density &&
116 aabb_center == other.aabb_center &&
117 aabb_radius == other.aabb_radius && aabb_local == other.aabb_local &&
118 isEqual(other);
119 }
120
122 bool operator!=(const CollisionGeometry& other) const {
123 return isNotEqual(other);
124 }
125
127 virtual OBJECT_TYPE getObjectType() const { return OT_UNKNOWN; }
128
130 virtual NODE_TYPE getNodeType() const { return BV_UNKNOWN; }
131
133 virtual void computeLocalAABB() = 0;
134
136 void* getUserData() const { return user_data; }
137
139 void setUserData(void* data) { user_data = data; }
140
142 inline bool isOccupied() const { return cost_density >= threshold_occupied; }
143
145 inline bool isFree() const { return cost_density <= threshold_free; }
146
148 bool isUncertain() const;
149
152
155
159
161 void* user_data;
162
165
168
171
173 virtual Vec3s computeCOM() const { return Vec3s::Zero(); }
174
177 return Matrix3s::Constant(NAN);
178 }
179
181 virtual CoalScalar computeVolume() const { return 0; }
182
186 Vec3s com = computeCOM();
188
189 return (Matrix3s() << C(0, 0) - V * (com[1] * com[1] + com[2] * com[2]),
190 C(0, 1) + V * com[0] * com[1], C(0, 2) + V * com[0] * com[2],
191 C(1, 0) + V * com[1] * com[0],
192 C(1, 1) - V * (com[0] * com[0] + com[2] * com[2]),
193 C(1, 2) + V * com[1] * com[2], C(2, 0) + V * com[2] * com[0],
194 C(2, 1) + V * com[2] * com[1],
195 C(2, 2) - V * (com[0] * com[0] + com[1] * com[1]))
196 .finished();
197 }
198
199 private:
201 virtual bool isEqual(const CollisionGeometry& other) const = 0;
202
204 virtual bool isNotEqual(const CollisionGeometry& other) const {
205 return !(*this == other);
206 }
207
208 public:
209 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
210};
211
214class COAL_DLLAPI CollisionObject {
215 public:
216 CollisionObject(const shared_ptr<CollisionGeometry>& cgeom_,
217 bool compute_local_aabb = true)
218 : cgeom(cgeom_), user_data(nullptr) {
219 init(compute_local_aabb);
220 }
221
222 CollisionObject(const shared_ptr<CollisionGeometry>& cgeom_,
223 const Transform3s& tf, bool compute_local_aabb = true)
224 : cgeom(cgeom_), t(tf), user_data(nullptr) {
225 init(compute_local_aabb);
226 }
227
228 CollisionObject(const shared_ptr<CollisionGeometry>& cgeom_,
229 const Matrix3s& R, const Vec3s& T,
230 bool compute_local_aabb = true)
231 : cgeom(cgeom_), t(R, T), user_data(nullptr) {
232 init(compute_local_aabb);
233 }
234
235 bool operator==(const CollisionObject& other) const {
236 return cgeom == other.cgeom && t == other.t && user_data == other.user_data;
237 }
238
239 bool operator!=(const CollisionObject& other) const {
240 return !(*this == other);
241 }
242
244
246 OBJECT_TYPE getObjectType() const { return cgeom->getObjectType(); }
247
249 NODE_TYPE getNodeType() const { return cgeom->getNodeType(); }
250
252 const AABB& getAABB() const { return aabb; }
253
255 AABB& getAABB() { return aabb; }
256
258 void computeAABB() {
259 if (t.getRotation().isIdentity()) {
260 aabb = translate(cgeom->aabb_local, t.getTranslation());
261 } else {
262 aabb.min_ = aabb.max_ = t.getTranslation();
263
264 Vec3s min_world, max_world;
265 for (int k = 0; k < 3; ++k) {
266 min_world.array() = t.getRotation().row(k).array() *
267 cgeom->aabb_local.min_.transpose().array();
268 max_world.array() = t.getRotation().row(k).array() *
269 cgeom->aabb_local.max_.transpose().array();
270
271 aabb.min_[k] += (min_world.array().min)(max_world.array()).sum();
272 aabb.max_[k] += (min_world.array().max)(max_world.array()).sum();
273 }
274 }
275 }
276
278 void* getUserData() const { return user_data; }
279
281 void setUserData(void* data) { user_data = data; }
282
284 inline const Vec3s& getTranslation() const { return t.getTranslation(); }
285
287 inline const Matrix3s& getRotation() const { return t.getRotation(); }
288
290 inline const Transform3s& getTransform() const { return t; }
291
293 void setRotation(const Matrix3s& R) { t.setRotation(R); }
294
296 void setTranslation(const Vec3s& T) { t.setTranslation(T); }
297
299 void setTransform(const Matrix3s& R, const Vec3s& T) { t.setTransform(R, T); }
300
302 void setTransform(const Transform3s& tf) { t = tf; }
303
305 bool isIdentityTransform() const { return t.isIdentity(); }
306
308 void setIdentityTransform() { t.setIdentity(); }
309
311 const shared_ptr<const CollisionGeometry> collisionGeometry() const {
312 return cgeom;
313 }
314
316 const shared_ptr<CollisionGeometry>& collisionGeometry() { return cgeom; }
317
319 const CollisionGeometry* collisionGeometryPtr() const { return cgeom.get(); }
320
323
331 const shared_ptr<CollisionGeometry>& collision_geometry,
332 bool compute_local_aabb = true) {
333 if (collision_geometry.get() != cgeom.get()) {
334 cgeom = collision_geometry;
335 init(compute_local_aabb);
336 }
337 }
338
339 protected:
340 void init(bool compute_local_aabb = true) {
341 if (cgeom) {
342 if (compute_local_aabb) cgeom->computeLocalAABB();
344 }
345 }
346
347 shared_ptr<CollisionGeometry> cgeom;
348
350
352 mutable AABB aabb;
353
355 void* user_data;
356};
357
358} // namespace coal
359
360#endif
A class describing the AABB collision structure, which is a box in 3D space determined by two diagona...
Definition AABB.h:55
The geometry for the object for collision or distance computation.
Definition collision_object.h:94
Simple transform class used locally by InterpMotion.
Definition transform.h:55
void * user_data
pointer to user defined data specific to this object
Definition collision_object.h:161
void setTransform(const Transform3s &tf)
set object's transform
Definition collision_object.h:302
void setIdentityTransform()
set the object in local coordinate
Definition collision_object.h:308
void setUserData(void *data)
set user data in geometry
Definition collision_object.h:139
void setTransform(const Matrix3s &R, const Vec3s &T)
set object's transform
Definition collision_object.h:299
virtual CollisionGeometry * clone() const =0
Clone *this into a new CollisionGeometry.
void init(bool compute_local_aabb=true)
Definition collision_object.h:340
AABB aabb
AABB in global coordinate.
Definition collision_object.h:352
virtual OBJECT_TYPE getObjectType() const
get the type of the object
Definition collision_object.h:127
virtual Matrix3s computeMomentofInertia() const
compute the inertia matrix, related to the origin
Definition collision_object.h:176
const Vec3s & getTranslation() const
get translation of the object
Definition collision_object.h:284
void * user_data
pointer to user defined data specific to this object
Definition collision_object.h:355
AABB aabb_local
AABB in local coordinate, used for tight AABB when only translation transform.
Definition collision_object.h:158
void * getUserData() const
get user data in geometry
Definition collision_object.h:136
const Matrix3s & getRotation() const
get matrix rotation of the object
Definition collision_object.h:287
void setTranslation(const Vec3s &T)
set object's translation
Definition collision_object.h:296
virtual NODE_TYPE getNodeType() const
get the node type
Definition collision_object.h:130
bool isFree() const
whether the object is completely free
Definition collision_object.h:145
const CollisionGeometry * collisionGeometryPtr() const
get raw pointer to collision geometry of the object instance
Definition collision_object.h:319
shared_ptr< CollisionGeometry > cgeom
Definition collision_object.h:347
virtual Matrix3s computeMomentofInertiaRelatedToCOM() const
compute the inertia matrix, related to the com
Definition collision_object.h:184
CollisionObject(const shared_ptr< CollisionGeometry > &cgeom_, const Transform3s &tf, bool compute_local_aabb=true)
Definition collision_object.h:222
@ GEOM_CONE
Definition collision_object.h:77
@ BV_KDOP24
Definition collision_object.h:73
@ GEOM_TRIANGLE
Definition collision_object.h:82
@ BV_KDOP18
Definition collision_object.h:72
@ BV_RSS
Definition collision_object.h:68
@ GEOM_BOX
Definition collision_object.h:74
@ GEOM_SPHERE
Definition collision_object.h:75
@ BV_KDOP16
Definition collision_object.h:71
@ NODE_COUNT
Definition collision_object.h:87
@ BV_kIOS
Definition collision_object.h:69
@ GEOM_CYLINDER
Definition collision_object.h:78
@ GEOM_CAPSULE
Definition collision_object.h:76
@ HF_OBBRSS
Definition collision_object.h:86
@ BV_UNKNOWN
Definition collision_object.h:65
@ BV_AABB
Definition collision_object.h:66
@ BV_OBBRSS
Definition collision_object.h:70
@ GEOM_ELLIPSOID
Definition collision_object.h:84
@ GEOM_HALFSPACE
Definition collision_object.h:81
@ BV_OBB
Definition collision_object.h:67
@ GEOM_PLANE
Definition collision_object.h:80
@ HF_AABB
Definition collision_object.h:85
@ GEOM_CONVEX
Definition collision_object.h:79
@ GEOM_OCTREE
Definition collision_object.h:83
bool isOccupied() const
whether the object is completely occupied
Definition collision_object.h:142
bool isIdentityTransform() const
whether the object is in local coordinate
Definition collision_object.h:305
CollisionGeometry(const CollisionGeometry &other)=default
Copy constructor.
void setRotation(const Matrix3s &R)
set object's rotation matrix
Definition collision_object.h:293
~CollisionObject()
Definition collision_object.h:243
virtual CoalScalar computeVolume() const
compute the volume
Definition collision_object.h:181
NODE_TYPE getNodeType() const
get the node type
Definition collision_object.h:249
bool operator!=(const CollisionObject &other) const
Definition collision_object.h:239
void * getUserData() const
get user data in object
Definition collision_object.h:278
virtual Vec3s computeCOM() const
compute center of mass
Definition collision_object.h:173
CollisionGeometry * collisionGeometryPtr()
get raw pointer to collision geometry of the object instance
Definition collision_object.h:322
virtual void computeLocalAABB()=0
compute the AABB for object in local coordinate
bool operator==(const CollisionObject &other) const
Definition collision_object.h:235
CoalScalar cost_density
collision cost for unit volume
Definition collision_object.h:164
bool isUncertain() const
whether the object has some uncertainty
bool operator==(const CollisionGeometry &other) const
Equality operator.
Definition collision_object.h:112
CoalScalar threshold_free
threshold for free (<= is free)
Definition collision_object.h:170
CollisionObject(const shared_ptr< CollisionGeometry > &cgeom_, bool compute_local_aabb=true)
Definition collision_object.h:216
virtual ~CollisionGeometry()
Definition collision_object.h:106
Transform3s t
Definition collision_object.h:349
const shared_ptr< const CollisionGeometry > collisionGeometry() const
get shared pointer to collision geometry of the object instance
Definition collision_object.h:311
@ OT_BVH
Definition collision_object.h:54
@ OT_GEOM
Definition collision_object.h:55
@ OT_COUNT
Definition collision_object.h:58
@ OT_OCTREE
Definition collision_object.h:56
@ OT_HFIELD
Definition collision_object.h:57
@ OT_UNKNOWN
Definition collision_object.h:53
CollisionObject(const shared_ptr< CollisionGeometry > &cgeom_, const Matrix3s &R, const Vec3s &T, bool compute_local_aabb=true)
Definition collision_object.h:228
CoalScalar threshold_occupied
threshold for occupied ( >= is occupied)
Definition collision_object.h:167
OBJECT_TYPE getObjectType() const
get the type of the object
Definition collision_object.h:246
bool operator!=(const CollisionGeometry &other) const
Difference operator.
Definition collision_object.h:122
const shared_ptr< CollisionGeometry > & collisionGeometry()
get shared pointer to collision geometry of the object instance
Definition collision_object.h:316
void setUserData(void *data)
set user data in object
Definition collision_object.h:281
Vec3s aabb_center
AABB center in local coordinate.
Definition collision_object.h:151
CollisionGeometry()
Definition collision_object.h:96
void setCollisionGeometry(const shared_ptr< CollisionGeometry > &collision_geometry, bool compute_local_aabb=true)
Associate a new CollisionGeometry.
Definition collision_object.h:330
const Transform3s & getTransform() const
get object's transform
Definition collision_object.h:290
CoalScalar aabb_radius
AABB radius.
Definition collision_object.h:154
void computeAABB()
compute the AABB in world space
Definition collision_object.h:258
AABB & getAABB()
get the AABB in world space
Definition collision_object.h:255
const AABB & getAABB() const
get the AABB in world space
Definition collision_object.h:252
Main namespace.
Definition broadphase_bruteforce.h:44
Eigen::Matrix< CoalScalar, 3, 3 > Matrix3s
Definition data_types.h:81
bool isEqual(const Eigen::MatrixBase< Derived > &lhs, const Eigen::MatrixBase< OtherDerived > &rhs, const CoalScalar tol=std::numeric_limits< CoalScalar >::epsilon() *100)
Definition tools.h:204
NODE_TYPE
traversal node type: bounding volume (AABB, OBB, RSS, kIOS, OBBRSS, KDOP16, KDOP18,...
Definition collision_object.h:64
OBJECT_TYPE
object type: BVH (mesh, points), basic geometry, octree
Definition collision_object.h:52
Eigen::Matrix< CoalScalar, 3, 1 > Vec3s
Definition data_types.h:77
double CoalScalar
Definition data_types.h:76