37 #ifndef HPP_FCL_HEIGHT_FIELD_H
38 #define HPP_FCL_HEIGHT_FIELD_H
55 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
72 Eigen::DenseIndex
x_id, x_size;
73 Eigen::DenseIndex
y_id, y_size;
85 max_height(std::numeric_limits<
FCL_REAL>::lowest()),
86 contact_active_faces(0) {}
91 x_size == other.
x_size && y_id == other.
y_id &&
101 inline bool isLeaf()
const {
return x_size == 1 && y_size == 1; }
112 return Eigen::Vector2i(x_id, y_id);
115 return Eigen::Vector2i(x_id + x_size / 2, y_id + y_size / 2);
128 template <
typename BV>
130 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
139 return Base::operator==(other) && bv == other.
bv;
149 FCL_REAL& sqrDistLowerBound)
const {
150 return bv.overlap(other.
bv, request, sqrDistLowerBound);
156 Vec3f* P2 = NULL)
const {
157 return bv.distance(other.
bv, P1, P2);
165 return Matrix3f::Identity();
173 template <
typename BV>
176 AABB bv_aabb(pointA, pointB);
179 convertBV(bv_aabb, bv);
186 AABB bv_aabb(pointA, pointB);
187 convertBV(bv_aabb, bv);
202 template <
typename BV>
205 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
210 typedef std::vector<Node, Eigen::aligned_allocator<Node>>
BVS;
215 min_height((std::numeric_limits<
FCL_REAL>::min)()),
216 max_height((std::numeric_limits<
FCL_REAL>::max)()) {}
232 init(x_dim, y_dim, heights, min_height);
243 heights(other.heights),
244 min_height(other.min_height),
245 max_height(other.max_height),
246 x_grid(other.x_grid),
247 y_grid(other.y_grid),
249 num_bvs(other.num_bvs) {}
279 const Vec3f A(x_grid[0], y_grid[0], min_height);
280 const Vec3f B(x_grid[x_grid.size() - 1], y_grid[y_grid.size() - 1],
282 const AABB aabb_(A, B);
284 aabb_radius = (A - B).norm() / 2.;
286 aabb_center = aabb_.
center();
291 if (new_heights.rows() != heights.rows() ||
292 new_heights.cols() != heights.cols())
294 "The matrix containing the new heights values does not have the same "
295 "matrix size as the original one.\n"
296 "\tinput values - rows: "
297 << new_heights.rows() <<
" - cols: " << new_heights.cols() <<
"\n"
298 <<
"\texpected values - rows: " << heights.rows()
299 <<
" - cols: " << heights.cols() <<
"\n",
300 std::invalid_argument);
302 heights = new_heights.cwiseMax(min_height);
303 this->max_height = recursiveUpdateHeight(0);
304 assert(this->max_height == heights.maxCoeff());
312 this->heights = heights.cwiseMax(min_height);
313 this->min_height = min_height;
314 this->max_height = heights.maxCoeff();
316 const Eigen::DenseIndex NX = heights.cols(), NY = heights.rows();
317 assert(NX >= 2 &&
"The number of columns is too small.");
318 assert(NY >= 2 &&
"The number of rows is too small.");
320 x_grid = VecXf::LinSpaced(NX, -0.5 * x_dim, 0.5 * x_dim);
321 y_grid = VecXf::LinSpaced(NY, 0.5 * y_dim, -0.5 * y_dim);
324 const size_t num_tot_bvs =
325 (size_t)(NX * NY) - 1 + (size_t)((NX - 1) * (NY - 1));
326 bvs.resize(num_tot_bvs);
364 const FCL_REAL max_recursive_height =
365 recursiveBuildTree(0, 0, heights.cols() - 1, 0, heights.rows() - 1);
366 assert(max_recursive_height == max_height &&
367 "the maximal height is not correct");
379 max_height = heights.block<2, 2>(bv_node.
y_id, bv_node.
x_id).maxCoeff();
382 max_left_height = recursiveUpdateHeight(bv_node.
leftChild()),
383 max_right_height = recursiveUpdateHeight(bv_node.
rightChild());
385 max_height = (std::max)(max_left_height, max_right_height);
390 const Vec3f pointA(x_grid[bv_node.
x_id], y_grid[bv_node.
y_id], min_height);
392 y_grid[bv_node.
y_id + bv_node.
y_size], max_height);
400 const Eigen::DenseIndex x_size,
401 const Eigen::DenseIndex y_id,
402 const Eigen::DenseIndex y_size) {
403 assert(x_id < heights.cols() &&
"x_id is out of bounds");
404 assert(y_id < heights.rows() &&
"y_id is out of bounds");
405 assert(x_size >= 0 && y_size >= 0 &&
406 "x_size or y_size are not of correct value");
407 assert(bv_id < bvs.size() &&
"bv_id exceeds the vector dimension");
414 max_height = heights.block<2, 2>(y_id, x_id).maxCoeff();
419 FCL_REAL max_left_height = min_height, max_right_height = min_height;
420 if (x_size >= y_size)
422 Eigen::DenseIndex x_size_half = x_size / 2;
423 if (x_size == 1) x_size_half = 1;
424 max_left_height = recursiveBuildTree(bv_node.
leftChild(), x_id,
425 x_size_half, y_id, y_size);
428 recursiveBuildTree(bv_node.
rightChild(), x_id + x_size_half,
429 x_size - x_size_half, y_id, y_size);
432 Eigen::DenseIndex y_size_half = y_size / 2;
433 if (y_size == 1) y_size_half = 1;
434 max_left_height = recursiveBuildTree(bv_node.
leftChild(), x_id, x_size,
438 recursiveBuildTree(bv_node.
rightChild(), x_id, x_size,
439 y_id + y_size_half, y_size - y_size_half);
442 max_height = (std::max)(max_left_height, max_right_height);
448 const Vec3f pointA(x_grid[x_id], y_grid[y_id], min_height);
449 assert(x_id + x_size < x_grid.size());
450 assert(y_id + y_size < y_grid.size());
451 const Vec3f pointB(x_grid[x_id + x_size], y_grid[y_id + y_size],
465 if (bv_node.
x_id == 0)
468 if (bv_node.
y_id == 0)
471 if (bv_node.
x_id + 1 == heights.cols() - 1)
474 if (bv_node.
y_id + 1 == heights.rows() - 1)
502 if (other_ptr ==
nullptr)
return false;
505 return x_dim == other.
x_dim && y_dim == other.
y_dim &&
508 y_grid == other.
y_grid && bvs == other.
bvs &&
A class describing the AABB collision structure, which is a box in 3D space determined by two diagona...
Definition: AABB.h:56
The geometry for the object for collision or distance computation.
Definition: collision_object.h:95
Data structure depicting a height field given by the base grid dimensions and the elevation along the...
Definition: hfield.h:203
FCL_REAL max_height
Definition: hfield.h:351
FCL_REAL recursiveBuildTree(const size_t bv_id, const Eigen::DenseIndex x_id, const Eigen::DenseIndex x_size, const Eigen::DenseIndex y_id, const Eigen::DenseIndex y_size)
Definition: hfield.h:399
const BVS & getNodes() const
Definition: hfield.h:271
FCL_REAL y_dim
Definition: hfield.h:344
virtual HeightField< BV > * clone() const
Clone *this into a new CollisionGeometry.
Definition: hfield.h:269
void init(const FCL_REAL x_dim, const FCL_REAL y_dim, const MatrixXf &heights, const FCL_REAL min_height)
Definition: hfield.h:308
FCL_REAL computeVolume() const
compute the volume
Definition: hfield.h:338
FCL_REAL min_height
Minimal height of the Height Field: all values bellow min_height will be discarded.
Definition: hfield.h:351
const VecXf & getXGrid() const
Returns a const reference of the grid along the X direction.
Definition: hfield.h:252
HFNode< BV > & getBV(unsigned int i)
Access the bv giving the its index.
Definition: hfield.h:490
FCL_REAL x_dim
Dimensions in meters along X and Y directions.
Definition: hfield.h:344
VecXf y_grid
Definition: hfield.h:355
Vec3f computeCOM() const
compute center of mass
Definition: hfield.h:336
FCL_REAL getXDim() const
Returns the dimension of the Height Field along the X direction.
Definition: hfield.h:260
OBJECT_TYPE getObjectType() const
Get the object type: it is a HFIELD.
Definition: hfield.h:334
FCL_REAL getYDim() const
Returns the dimension of the Height Field along the Y direction.
Definition: hfield.h:262
int buildTree()
Build the bounding volume hierarchy.
Definition: hfield.h:362
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef CollisionGeometry Base
Definition: hfield.h:207
FCL_REAL getMinHeight() const
Returns the minimal height value of the Height Field.
Definition: hfield.h:265
HeightField(const HeightField &other)
Copy contructor from another HeightField.
Definition: hfield.h:239
HFNode< BV > Node
Definition: hfield.h:209
BVS bvs
Bounding volume hierarchy.
Definition: hfield.h:358
const HFNode< BV > & getBV(unsigned int i) const
Access the bv giving the its index.
Definition: hfield.h:483
FCL_REAL recursiveUpdateHeight(const size_t bv_id)
Definition: hfield.h:374
const VecXf & getYGrid() const
Returns a const reference of the grid along the Y direction.
Definition: hfield.h:254
const MatrixXf & getHeights() const
Returns a const reference of the heights.
Definition: hfield.h:257
std::vector< Node, Eigen::aligned_allocator< Node > > BVS
Definition: hfield.h:210
VecXf x_grid
Grids along the X and Y directions. Useful for plotting or other related things.
Definition: hfield.h:355
void computeLocalAABB()
Compute the AABB for the HeightField, used for broad-phase collision.
Definition: hfield.h:278
virtual ~HeightField()
deconstruction, delete mesh data related.
Definition: hfield.h:274
NODE_TYPE getNodeType() const
Get the BV type: default is unknown.
Definition: hfield.h:497
HeightField(const FCL_REAL x_dim, const FCL_REAL y_dim, const MatrixXf &heights, const FCL_REAL min_height=(FCL_REAL) 0)
Constructing an HeightField from its base dimensions and the set of heights points....
Definition: hfield.h:229
unsigned int num_bvs
Definition: hfield.h:359
Matrix3f computeMomentofInertia() const
compute the inertia matrix, related to the origin
Definition: hfield.h:340
HeightField()
Constructing an empty HeightField.
Definition: hfield.h:213
MatrixXf heights
Elevation values in meters of the Height Field.
Definition: hfield.h:347
void updateHeights(const MatrixXf &new_heights)
Update Height Field height.
Definition: hfield.h:290
FCL_REAL getMaxHeight() const
Returns the maximal height value of the Height Field.
Definition: hfield.h:267
#define HPP_FCL_DLLAPI
Definition: config.hh:88
#define HPP_FCL_THROW_PRETTY(message, exception)
Definition: fwd.hh:64
#define HPP_FCL_UNUSED_VARIABLE(var)
Definition: fwd.hh:56
Vec3f center() const
Center of the AABB.
Definition: AABB.h:165
@ OT_HFIELD
Definition: collision_object.h:58
@ BV_UNKNOWN
Definition: collision_object.h:66
CollisionRequestFlag operator&(CollisionRequestFlag a, CollisionRequestFlag b)
Definition: collision_data.h:1210
Eigen::Matrix< FCL_REAL, 3, 3 > Matrix3f
Definition: data_types.h:71
Eigen::Matrix< FCL_REAL, 3, 1 > Vec3f
Definition: data_types.h:67
Eigen::Matrix< FCL_REAL, Eigen::Dynamic, Eigen::Dynamic > MatrixXf
Definition: data_types.h:76
OBJECT_TYPE
object type: BVH (mesh, points), basic geometry, octree
Definition: collision_object.h:53
Eigen::Matrix< FCL_REAL, Eigen::Dynamic, 1 > VecXf
Definition: data_types.h:70
NODE_TYPE
traversal node type: bounding volume (AABB, OBB, RSS, kIOS, OBBRSS, KDOP16, KDOP18,...
Definition: collision_object.h:65
bool isEqual(const Eigen::MatrixBase< Derived > &lhs, const Eigen::MatrixBase< OtherDerived > &rhs, const FCL_REAL tol=std::numeric_limits< FCL_REAL >::epsilon() *100)
Definition: tools.h:205
double FCL_REAL
Definition: data_types.h:66
@ BVH_OK
Definition: BVH_internal.h:65
Main namespace.
Definition: broadphase_bruteforce.h:44
request to the collision algorithm
Definition: collision_data.h:312
size_t leftChild() const
Return the index of the first child. The index is referred to the bounding volume array (i....
Definition: hfield.h:105
FCL_REAL max_height
Definition: hfield.h:75
size_t rightChild() const
Return the index of the second child. The index is referred to the bounding volume array (i....
Definition: hfield.h:109
Eigen::Vector2i leftChildIndexes() const
Definition: hfield.h:111
Eigen::DenseIndex y_size
Definition: hfield.h:73
bool operator!=(const HFNodeBase &other) const
Difference operator.
Definition: hfield.h:97
Eigen::DenseIndex x_id
Definition: hfield.h:72
bool isLeaf() const
Whether current node is a leaf node (i.e. contains a primitive index)
Definition: hfield.h:101
Eigen::DenseIndex x_size
Definition: hfield.h:72
Eigen::DenseIndex y_id
Definition: hfield.h:73
size_t first_child
An index for first child node or primitive If the value is positive, it is the index of the first chi...
Definition: hfield.h:70
bool operator==(const HFNodeBase &other) const
Comparison operator.
Definition: hfield.h:89
int contact_active_faces
Definition: hfield.h:76
HFNodeBase()
Default constructor.
Definition: hfield.h:79
FaceOrientation
Definition: hfield.h:57
Eigen::Vector2i rightChildIndexes() const
Definition: hfield.h:114
FCL_REAL distance(const HFNode &other, Vec3f *P1=NULL, Vec3f *P2=NULL) const
Compute the distance between two BVNode. P1 and P2, if not NULL and the underlying BV supports distan...
Definition: hfield.h:155
bool overlap(const HFNode &other) const
Check whether two BVNode collide.
Definition: hfield.h:146
Vec3f getCenter() const
Access to the center of the BV.
Definition: hfield.h:161
bool overlap(const HFNode &other, const CollisionRequest &request, FCL_REAL &sqrDistLowerBound) const
Check whether two BVNode collide.
Definition: hfield.h:148
bool operator!=(const HFNode &other) const
Difference operator.
Definition: hfield.h:143
bool operator==(const HFNode &other) const
Equality operator.
Definition: hfield.h:138
virtual ~HFNode()
Definition: hfield.h:168
hpp::fcl::Matrix3f::IdentityReturnType getOrientation() const
Access to the orientation of the BV.
Definition: hfield.h:164
BV bv
bounding volume storing the geometry
Definition: hfield.h:135
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef HFNodeBase Base
Definition: hfield.h:132
static void run(const Vec3f &pointA, const Vec3f &pointB, AABB &bv)
Definition: hfield.h:185
static void run(const Vec3f &pointA, const Vec3f &pointB, BV &bv)
Definition: hfield.h:175