Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes
distance_field::PropagationDistanceField Class Reference

A DistanceField implementation that uses a vector propagation method. Distances propagate outward from occupied cells, or inwards from unoccupied cells if negative distances are to be computed, which is optional. Outward and inward propagation only occur to a desired maximum distance - cells that are more than this maximum distance from the nearest cell will have maximum distance measurements. More...

#include <propagation_distance_field.h>

Inheritance diagram for distance_field::PropagationDistanceField:
Inheritance graph
[legend]

List of all members.

Public Member Functions

virtual void addPointsToField (const EigenSTL::vector_Vector3d &points)
 Add a set of obstacle points to the distance field, updating distance values accordingly. The distance field may already contain obstacle cells.
const PropDistanceFieldVoxelgetCell (int x, int y, int z) const
 Gets full cell data given an index.
virtual double getDistance (double x, double y, double z) const
 Get the distance value associated with the cell indicated by the world coordinate. If the cell is invalid, max_distance will be returned. If running without negative distances, all obstacle cells will have zero distance. If running with negative distances, the distance will be between -max_distance and max_distance, with no values having a 0 distance.
virtual double getDistance (int x, int y, int z) const
 Get the distance value associated with the cell indicated by the index coordinates. If the cell is invalid, max_distance will be returned. If running without negative distances, all obstacle cells will have zero distance. If running with negative distances, the distance will be between -max_distance and max_distance, with no values having a 0 distance.
int getMaximumDistanceSquared () const
 Gets the maximum distance squared value.
const PropDistanceFieldVoxelgetNearestCell (int x, int y, int z, double &dist, Eigen::Vector3i &pos) const
 Gets nearest surface cell and returns distance to it.
virtual double getUninitializedDistance () const
 Gets a distance value for an invalid cell.
virtual int getXNumCells () const
 Gets the number of cells along the X axis.
virtual int getYNumCells () const
 Gets the number of cells along the Y axis.
virtual int getZNumCells () const
 Gets the number of cells along the Z axis.
virtual bool gridToWorld (int x, int y, int z, double &world_x, double &world_y, double &world_z) const
 Converts from an set of integer indices to a world location given the origin and resolution parameters.
virtual bool isCellValid (int x, int y, int z) const
 Determines whether or not the cell associated with the supplied indices is valid for this distance field.
 PropagationDistanceField (double size_x, double size_y, double size_z, double resolution, double origin_x, double origin_y, double origin_z, double max_distance, bool propagate_negative_distances=false)
 Constructor that initializes entire distance field to empty - all cells will be assigned maximum distance values. All units are arbitrary but are assumed for documentation purposes to represent meters.
 PropagationDistanceField (const octomap::OcTree &octree, const octomap::point3d &bbx_min, const octomap::point3d &bbx_max, double max_distance, bool propagate_negative_distances=false)
 Constructor based on an OcTree and bounding box information. A distance field will be constructed with dimensions based on the supplied bounding box at the resolution of the OcTree. All octree obstacle cells will be added to the resulting distance field using the DistanceField::addOcTreeToField function.
 PropagationDistanceField (std::istream &stream, double max_distance, bool propagate_negative_distances=false)
 Constructor that takes an istream and reads the contents of a saved distance field, adding all obstacle points and running propagation given the arguments for max_distance and propagate_negative_distances. Calls the function readFromStream.
virtual bool readFromStream (std::istream &stream)
 Reads, parameterizes, and populates the distance field based on the supplied stream.
virtual void removePointsFromField (const EigenSTL::vector_Vector3d &points)
 Remove a set of obstacle points from the distance field, updating distance values accordingly.
virtual void reset ()
 Resets the entire distance field to max_distance for positive values and zero for negative values.
virtual void updatePointsInField (const EigenSTL::vector_Vector3d &old_points, const EigenSTL::vector_Vector3d &new_points)
 This function will remove any obstacle points that are in the old point set but not the new point set, and add any obstacle points that are in the new block set but not the old block set. Any points that are in both sets are left unchanged. For more information see DistanceField::updatePointsInField.
virtual bool worldToGrid (double world_x, double world_y, double world_z, int &x, int &y, int &z) const
 Converts from a world location to a set of integer indices. Should return false if the world location is not valid in the distance field, and should populate the index values in either case.
virtual bool writeToStream (std::ostream &stream) const
 Writes the contents of the distance field to the supplied stream.
virtual ~PropagationDistanceField ()
 Empty destructor.

Private Types

typedef std::set
< Eigen::Vector3i,
compareEigen_Vector3i
VoxelSet
 Typedef for set of integer indices.

Private Member Functions

void addNewObstacleVoxels (const std::vector< Eigen::Vector3i > &voxel_points)
 Adds a valid set of integer points to the voxel grid.
int getDirectionNumber (int dx, int dy, int dz) const
 Helper function to get a single number in a 27 connected 3D voxel grid given dx, dy, and dz values.
virtual double getDistance (const PropDistanceFieldVoxel &object) const
 Determines distance based on actual voxel data.
Eigen::Vector3i getLocationDifference (int directionNumber) const
 Helper function that gets change values given single number representing update direction.
void initialize ()
 Initializes the field, resetting the voxel grid and building a sqrt lookup table for efficiency based on max_distance_.
void initNeighborhoods ()
 Helper function for computing location and neighborhood information in 27 connected voxel grid.
void print (const VoxelSet &set)
 Debug function that prints all voxels in a set to logDebug.
void print (const EigenSTL::vector_Vector3d &points)
 Debug function that prints all points in a vector to logDebug.
void propagateNegative ()
 Propagates inward to a maximum distance given the contents of the negative_bucket_queue_, and clears the negative_bucket_queue_.
void propagatePositive ()
 Propagates outward to the maximum distance given the contents of the bucket_queue_, and clears the bucket_queue_.
void removeObstacleVoxels (const std::vector< Eigen::Vector3i > &voxel_points)
 Removes a valid set of integer points from the voxel grid.

Static Private Member Functions

static int eucDistSq (Eigen::Vector3i point1, Eigen::Vector3i point2)
 Computes squared distance between two 3D integer points.

Private Attributes

std::vector< std::vector
< Eigen::Vector3i > > 
bucket_queue_
 Structure used to hold propagation frontier.
std::vector< Eigen::Vector3i > direction_number_to_direction_
 Holds conversion from direction number to integer changes.
double max_distance_
 Holds maximum distance.
int max_distance_sq_
 Holds maximum distance squared in cells.
std::vector< std::vector
< Eigen::Vector3i > > 
negative_bucket_queue_
 Data member that holds points from which to propagate in the negative, where each vector holds points that are a particular integer distance from the closest unoccupied points.
std::vector< std::vector
< std::vector< Eigen::Vector3i > > > 
neighborhoods_
 Holds information on neighbor direction, with 27 different directions. Shows where to propagate given an integer distance and an update direction.
bool propagate_negative_
 Whether or not to propagate negative distances.
std::vector< double > sqrt_table_
 Precomputed square root table for faster distance lookups.
boost::shared_ptr< VoxelGrid
< PropDistanceFieldVoxel > > 
voxel_grid_
 Actual container for distance data.

Detailed Description

A DistanceField implementation that uses a vector propagation method. Distances propagate outward from occupied cells, or inwards from unoccupied cells if negative distances are to be computed, which is optional. Outward and inward propagation only occur to a desired maximum distance - cells that are more than this maximum distance from the nearest cell will have maximum distance measurements.

This class uses a VoxelGrid to hold all data. One important decision that must be made on construction is whether or not to create a signed version of the distance field. If the distance field is unsigned, it means that the minumum obstacle distance is 0, a value that will be assigned to all obstacle cells. Gradient queries for obstacle cells will not give useful information, as the gradient at an obstacle cell will point to the cell itself. If this behavior is acceptable, then the performance of this mode will be more efficient, as no propagation will occur for obstacle cells. The other option is to calculate signed distances. In this case, negative distances up to the maximum distance are calculated for obstacle volumes. This distance encodes the distance of an obstacle cell to the nearest unoccupied obstacle voxel. Furthmore, gradients pointing out of the volume will be produced. Depending on the data, calculating this data can significantly impact the time it takes to add and remove obstacle cells.

Definition at line 134 of file propagation_distance_field.h.


Member Typedef Documentation

Typedef for set of integer indices.

Definition at line 455 of file propagation_distance_field.h.


Constructor & Destructor Documentation

distance_field::PropagationDistanceField::PropagationDistanceField ( double  size_x,
double  size_y,
double  size_z,
double  resolution,
double  origin_x,
double  origin_y,
double  origin_z,
double  max_distance,
bool  propagate_negative_distances = false 
)

Constructor that initializes entire distance field to empty - all cells will be assigned maximum distance values. All units are arbitrary but are assumed for documentation purposes to represent meters.

Parameters:
[in]size_xThe X dimension in meters of the volume to represent
[in]size_yThe Y dimension in meters of the volume to represent
[in]size_zThe Z dimension in meters of the volume to represent
[in]resolutionThe resolution in meters of the volume
[in]origin_xThe minimum X point of the volume
[in]origin_yThe minimum Y point of the volume
[in]origin_zThe minimum Z point of the volume
[in]max_distanceThe maximum distance to which to propagate distance values. Cells that are greater than this distance will be assigned the maximum distance value.
[in]propagate_negative_distancesWhether or not to propagate negative distances. If false, no propagation occurs, and all obstacle cells will be assigned zero distance. See the PropagationDistanceField description for more information on the implications of this.

Definition at line 47 of file propagation_distance_field.cpp.

distance_field::PropagationDistanceField::PropagationDistanceField ( const octomap::OcTree octree,
const octomap::point3d bbx_min,
const octomap::point3d bbx_max,
double  max_distance,
bool  propagate_negative_distances = false 
)

Constructor based on an OcTree and bounding box information. A distance field will be constructed with dimensions based on the supplied bounding box at the resolution of the OcTree. All octree obstacle cells will be added to the resulting distance field using the DistanceField::addOcTreeToField function.

Parameters:
[in]octreeThe OcTree from which to construct the distance field
[in]bbx_minThe minimum world coordinates of the bounding box
[in]bbx_maxThe maximum world coordinates of the bounding box
[in]max_distanceThe maximum distance to which to propagate distance values. Cells that are greater than this distance will be assigned the maximum distance value.
[in]propagate_negative_distancesWhether or not to propagate negative distances. If false, no propagation occurs, and all obstacle cells will be assigned zero distance. See the PropagationDistanceField description for more information on the implications of this.

Definition at line 59 of file propagation_distance_field.cpp.

distance_field::PropagationDistanceField::PropagationDistanceField ( std::istream &  stream,
double  max_distance,
bool  propagate_negative_distances = false 
)

Constructor that takes an istream and reads the contents of a saved distance field, adding all obstacle points and running propagation given the arguments for max_distance and propagate_negative_distances. Calls the function readFromStream.

Parameters:
[in]streamThe stream from which to read the data
[in]max_distanceThe maximum distance to which to propagate distance values. Cells that are greater than this distance will be assigned the maximum distance value.
[in]propagate_negative_distancesWhether or not to propagate negative distances. If false, no propagation occurs, and all obstacle cells will be assigned zero distance. See the PropagationDistanceField description for more information on the implications of this.
Returns:

Definition at line 78 of file propagation_distance_field.cpp.

Empty destructor.

Definition at line 229 of file propagation_distance_field.h.


Member Function Documentation

void distance_field::PropagationDistanceField::addNewObstacleVoxels ( const std::vector< Eigen::Vector3i > &  voxel_points) [private]

Adds a valid set of integer points to the voxel grid.

Parameters:
voxel_pointsValid set of voxel points for addition

Definition at line 245 of file propagation_distance_field.cpp.

Add a set of obstacle points to the distance field, updating distance values accordingly. The distance field may already contain obstacle cells.

The function first checks that each location represents a valid point - only valid points will be added. It takes the vector of valid points and performs positive propagation on them. If the class has been set up to propagate negative distance, those will also be propagated.

Parameters:
[in]pointsThe set of obstacle points to add

Implements distance_field::DistanceField.

Definition at line 200 of file propagation_distance_field.cpp.

int distance_field::PropagationDistanceField::eucDistSq ( Eigen::Vector3i  point1,
Eigen::Vector3i  point2 
) [static, private]

Computes squared distance between two 3D integer points.

Parameters:
point1Point 1 for distance
point2Point 2 for distance
Returns:
Distance between points squared

Definition at line 109 of file propagation_distance_field.cpp.

const PropDistanceFieldVoxel& distance_field::PropagationDistanceField::getCell ( int  x,
int  y,
int  z 
) const [inline]

Gets full cell data given an index.

x,y,z MUST be valid or data corruption (SEGFAULTS) will occur.

Parameters:
[in]xThe integer X location
[in]yThe integer Y location
[in]zThe integer Z location
Returns:
The data in the indicated cell.

Definition at line 393 of file propagation_distance_field.h.

int distance_field::PropagationDistanceField::getDirectionNumber ( int  dx,
int  dy,
int  dz 
) const [private]

Helper function to get a single number in a 27 connected 3D voxel grid given dx, dy, and dz values.

Parameters:
dxThe change in the X direction
dyThe change in the X direction
dzThe change in the Z direction
Returns:
Single number 0-26 representing direction

Definition at line 600 of file propagation_distance_field.cpp.

double distance_field::PropagationDistanceField::getDistance ( double  x,
double  y,
double  z 
) const [virtual]

Get the distance value associated with the cell indicated by the world coordinate. If the cell is invalid, max_distance will be returned. If running without negative distances, all obstacle cells will have zero distance. If running with negative distances, the distance will be between -max_distance and max_distance, with no values having a 0 distance.

Parameters:
[in]xThe X location of the cell
[in]yThe X location of the cell
[in]zThe X location of the cell
Returns:
The distance value

Implements distance_field::DistanceField.

Definition at line 610 of file propagation_distance_field.cpp.

double distance_field::PropagationDistanceField::getDistance ( int  x,
int  y,
int  z 
) const [virtual]

Get the distance value associated with the cell indicated by the index coordinates. If the cell is invalid, max_distance will be returned. If running without negative distances, all obstacle cells will have zero distance. If running with negative distances, the distance will be between -max_distance and max_distance, with no values having a 0 distance.

Parameters:
[in]xThe integer X location
[in]yThe integer Y location
[in]zThe integer Z location
Returns:
The distance value for the cell

Implements distance_field::DistanceField.

Definition at line 615 of file propagation_distance_field.cpp.

double distance_field::PropagationDistanceField::getDistance ( const PropDistanceFieldVoxel object) const [inline, private, virtual]

Determines distance based on actual voxel data.

Parameters:
objectActual voxel data
Returns:
The distance reported by the cell

Definition at line 606 of file propagation_distance_field.h.

Eigen::Vector3i distance_field::PropagationDistanceField::getLocationDifference ( int  directionNumber) const [private]

Helper function that gets change values given single number representing update direction.

Parameters:
directionNumberDirection number 0-26
Returns:
Integer changes

Definition at line 605 of file propagation_distance_field.cpp.

Gets the maximum distance squared value.

Produced by taking the ceiling of the maximum distance divided by the resolution, and then squaring that value.

Returns:
The maximum distance squared.

Definition at line 448 of file propagation_distance_field.h.

const PropDistanceFieldVoxel* distance_field::PropagationDistanceField::getNearestCell ( int  x,
int  y,
int  z,
double &  dist,
Eigen::Vector3i &  pos 
) const [inline]

Gets nearest surface cell and returns distance to it.

x,y,z MUST be valid or data corruption (SEGFAULTS) will occur.

Parameters:
[in]xThe integer X location of the starting cell
[in]yThe integer Y location of the starting cell
[in]zThe integer Z location of the starting cell
[out]distif starting cell is inside, the negative distance to the nearest outside cell if starting cell is outside, the positive distance to the nearest inside cell if nearby cell is unknown, zero
[out]posthe position of the nearest cell
Returns:
If starting cell is inside, the nearest outside cell If starting cell is outside, the nearst inside cell If nearest cell is unknown, return NULL

Definition at line 416 of file propagation_distance_field.h.

virtual double distance_field::PropagationDistanceField::getUninitializedDistance ( ) const [inline, virtual]

Gets a distance value for an invalid cell.

Returns:
The distance associated with an unitialized cell

Implements distance_field::DistanceField.

Definition at line 377 of file propagation_distance_field.h.

Gets the number of cells along the X axis.

Returns:
The number of cells along the X axis

Implements distance_field::DistanceField.

Definition at line 625 of file propagation_distance_field.cpp.

Gets the number of cells along the Y axis.

Returns:
The number of cells along the Y axis

Implements distance_field::DistanceField.

Definition at line 630 of file propagation_distance_field.cpp.

Gets the number of cells along the Z axis.

Returns:
The number of cells along the Z axis

Implements distance_field::DistanceField.

Definition at line 635 of file propagation_distance_field.cpp.

bool distance_field::PropagationDistanceField::gridToWorld ( int  x,
int  y,
int  z,
double &  world_x,
double &  world_y,
double &  world_z 
) const [virtual]

Converts from an set of integer indices to a world location given the origin and resolution parameters.

Parameters:
[in]xThe integer X location
[in]yThe integer Y location
[in]zThe integer Z location
[out]world_xThe computed world X location
[out]world_yThe computed world X location
[out]world_zThe computed world X location
Returns:
Whether or not the transformation is successful. An implementation may or may not choose to return false if the indicated cell is not valid for this distance field.

Implements distance_field::DistanceField.

Definition at line 640 of file propagation_distance_field.cpp.

Initializes the field, resetting the voxel grid and building a sqrt lookup table for efficiency based on max_distance_.

Definition at line 88 of file propagation_distance_field.cpp.

Helper function for computing location and neighborhood information in 27 connected voxel grid.

Definition at line 542 of file propagation_distance_field.cpp.

bool distance_field::PropagationDistanceField::isCellValid ( int  x,
int  y,
int  z 
) const [virtual]

Determines whether or not the cell associated with the supplied indices is valid for this distance field.

Parameters:
[in]xThe X index of the cell
[in]yThe Y index of the cell
[in]zThe Z index of the cell
Returns:
True if the cell is valid, otherwise false.

Implements distance_field::DistanceField.

Definition at line 620 of file propagation_distance_field.cpp.

Debug function that prints all voxels in a set to logDebug.

Parameters:
setVoxel set to print

Definition at line 117 of file propagation_distance_field.cpp.

Debug function that prints all points in a vector to logDebug.

Parameters:
pointsPoints to print

Definition at line 129 of file propagation_distance_field.cpp.

Propagates inward to a maximum distance given the contents of the negative_bucket_queue_, and clears the negative_bucket_queue_.

Definition at line 463 of file propagation_distance_field.cpp.

Propagates outward to the maximum distance given the contents of the bucket_queue_, and clears the bucket_queue_.

Definition at line 404 of file propagation_distance_field.cpp.

bool distance_field::PropagationDistanceField::readFromStream ( std::istream &  stream) [virtual]

Reads, parameterizes, and populates the distance field based on the supplied stream.

This function assumes that the file begins with ASCII data, and that the binary data has been written in bit formulation and compressed using Zlib. The function will reinitialize all data members based on the data in the file, using preset values for max_distance_ and propagate_negative_distances_. All occupied cells will be added to the distance field.

Parameters:
[in]streamThe stream from which to read
Returns:
True if reading, parameterizing, and populating the distance field is successful; otherwise False.

Implements distance_field::DistanceField.

Definition at line 685 of file propagation_distance_field.cpp.

void distance_field::PropagationDistanceField::removeObstacleVoxels ( const std::vector< Eigen::Vector3i > &  voxel_points) [private]

Removes a valid set of integer points from the voxel grid.

Parameters:
voxel_pointsValid set of voxel points for removal

Definition at line 322 of file propagation_distance_field.cpp.

Remove a set of obstacle points from the distance field, updating distance values accordingly.

This function is relatively less efficient than adding points to the field in terms of positive distances - adding a given number of points will be less comptationally expensive than removing the same number of points. This is due to the nature of the propagation algorithm - when removing sets of cells, we must search outward from the freed cells and then propagate inward. Negative distances can be propagated more efficiently, as propagation can occur outward from newly freed cells without requiring a search step. If the set of occupied points that remain after removal is small it may be more efficient to call reset and then to add the remaining points rather than removing a set of points.

Parameters:
[in]pointsThe set of obstacle points that will be set as free

Implements distance_field::DistanceField.

Definition at line 221 of file propagation_distance_field.cpp.

Resets the entire distance field to max_distance for positive values and zero for negative values.

Implements distance_field::DistanceField.

Definition at line 522 of file propagation_distance_field.cpp.

This function will remove any obstacle points that are in the old point set but not the new point set, and add any obstacle points that are in the new block set but not the old block set. Any points that are in both sets are left unchanged. For more information see DistanceField::updatePointsInField.

The implementation of this function finds the set of points that are in the old_points and not the new_points, and the in the new_points and not the old_points using std::set_difference. It then calls a removal function on the former set, and an addition function on the latter set.

If there is no overlap between the old_points and the new_points it is more efficient to first call removePointsFromField on the old_points and then addPointsToField on the new points - this does not require computing set differences.

Parameters:
[in]old_pointsThe set of points that all should be obstacle cells in the distance field
[in]new_pointsThe set of points, all of which are intended to be obstacle points in the distance field

Implements distance_field::DistanceField.

Definition at line 142 of file propagation_distance_field.cpp.

bool distance_field::PropagationDistanceField::worldToGrid ( double  world_x,
double  world_y,
double  world_z,
int &  x,
int &  y,
int &  z 
) const [virtual]

Converts from a world location to a set of integer indices. Should return false if the world location is not valid in the distance field, and should populate the index values in either case.

Parameters:
[in]world_xThe world X location
[in]world_yThe world Y location
[in]world_zThe world Z location
[out]xThe computed integer X location
[out]yThe computed integer X location
[out]zThe computed integer X location
Returns:
True if all the world values result in integer indices that pass a validity check; otherwise False.

Implements distance_field::DistanceField.

Definition at line 646 of file propagation_distance_field.cpp.

bool distance_field::PropagationDistanceField::writeToStream ( std::ostream &  stream) const [virtual]

Writes the contents of the distance field to the supplied stream.

This function writes the resolution, size, and origin parameters to the file in ASCII. It then writes the occupancy data only in bit form (with values or 1 representing occupancy, and 0 representing empty space). It further runs Zlib compression on the binary data before actually writing to disk. The max_distance and propagate_negative_distances values are not written to file, and the distances themselves will need to be recreated on load.

Parameters:
[out]streamThe stream to which to write the distance field contents.
Returns:
True

Implements distance_field::DistanceField.

Definition at line 651 of file propagation_distance_field.cpp.


Member Data Documentation

std::vector<std::vector<Eigen::Vector3i> > distance_field::PropagationDistanceField::bucket_queue_ [private]

Structure used to hold propagation frontier.

Data member that holds points from which to propagate, where each vector holds points that are a particular integer distance from the closest obstacle points

Definition at line 562 of file propagation_distance_field.h.

Holds conversion from direction number to integer changes.

Definition at line 585 of file propagation_distance_field.h.

Holds maximum distance.

Definition at line 566 of file propagation_distance_field.h.

Holds maximum distance squared in cells.

Definition at line 567 of file propagation_distance_field.h.

std::vector<std::vector<Eigen::Vector3i> > distance_field::PropagationDistanceField::negative_bucket_queue_ [private]

Data member that holds points from which to propagate in the negative, where each vector holds points that are a particular integer distance from the closest unoccupied points.

Definition at line 564 of file propagation_distance_field.h.

std::vector<std::vector<std::vector<Eigen::Vector3i > > > distance_field::PropagationDistanceField::neighborhoods_ [private]

Holds information on neighbor direction, with 27 different directions. Shows where to propagate given an integer distance and an update direction.

[0] - for expansion of d=0 [1] - for expansion of d>=1 Under this, we have the 27 directions Then, a list of neighborhoods for each direction

Definition at line 583 of file propagation_distance_field.h.

Whether or not to propagate negative distances.

Definition at line 557 of file propagation_distance_field.h.

Precomputed square root table for faster distance lookups.

Definition at line 569 of file propagation_distance_field.h.

Actual container for distance data.

Definition at line 559 of file propagation_distance_field.h.


The documentation for this class was generated from the following files:


moveit_core
Author(s): Ioan Sucan , Sachin Chitta , Acorn Pooley
autogenerated on Thu Aug 27 2015 13:58:53