Returns a pose corrected 6DoF incidence matrix. More...
Detailed Description
template<typename PointT> class pcl::registration::LUM< PointT >
Globally Consistent Scan Matching based on an algorithm by Lu and Milios.
A GraphSLAM algorithm where registration data is managed in a graph:
Vertices represent poses and hold the point cloud data and relative transformations.
Edges represent pose constraints and hold the correspondence data between two point clouds.
Computation uses the first point cloud in the SLAM graph as a reference pose and attempts to align all other point clouds to it simultaneously. For more information:
F. Lu, E. Milios, Globally Consistent Range Scan Alignment for Environment Mapping, Autonomous Robots 4, April 1997
Dorit Borrmann, Jan Elseberg, Kai Lingemann, Andreas Nüchter, and Joachim Hertzberg, The Efficient Extension of Globally Consistent Scan Matching to 6 DoF, In Proceedings of the 4th International Symposium on 3D Data Processing, Visualization and Transmission (3DPVT '08), June 2008
Usage example:
pcl::registration::LUM<pcl::PointXYZ> lum;
// Add point clouds as vertices to the SLAM graph
lum.addPointCloud (cloud_0);
lum.addPointCloud (cloud_1);
lum.addPointCloud (cloud_2);
// Use your favorite pairwise correspondence estimation algorithm(s)
corrs_0_to_1 = someAlgo (cloud_0, cloud_1);
corrs_1_to_2 = someAlgo (cloud_1, cloud_2);
corrs_2_to_0 = someAlgo (lum.getPointCloud (2), lum.getPointCloud (0));
// Add the correspondence results as edges to the SLAM graph
lum.setCorrespondences (0, 1, corrs_0_to_1);
lum.setCorrespondences (1, 2, corrs_1_to_2);
lum.setCorrespondences (2, 0, corrs_2_to_0);
// Change the computation parameters
lum.setMaxIterations (5);
lum.setConvergenceThreshold (0.0);
// Perform the actual LUM computation
lum.compute ();
// Return the concatenated point cloud result
cloud_out = lum.getConcatenatedCloud ();
// Return the separate point cloud transformations
for(int i = 0; i < lum.getNumVertices (); i++)
{
transforms_out[i] = lum.getTransformation (i);
}
pcl::registration::LUMGlobally Consistent Scan Matching based on an algorithm by Lu and Milios.Definition: lum.h:108
pcl::registration::LUM
Globally Consistent Scan Matching based on an algorithm by Lu and Milios.
Definition: lum.h:108
pcl::registration::LUM::computevoid compute()Perform LUM's globally consistent scan matching.Definition: lum.hpp:221
pcl::registration::LUM::compute
void compute()
Perform LUM's globally consistent scan matching.
Definition: lum.hpp:221
pcl::registration::LUM::getPointCloudPointCloudPtr getPointCloud(const Vertex &vertex) constReturn a point cloud from one of the SLAM graph's vertices.Definition: lum.hpp:130
pcl::registration::LUM::getPointCloud
PointCloudPtr getPointCloud(const Vertex &vertex) const
Return a point cloud from one of the SLAM graph's vertices.
Definition: lum.hpp:130
pcl::registration::LUM::getNumVerticesSLAMGraph::vertices_size_type getNumVertices() constGet the number of vertices in the SLAM graph.Definition: lum.hpp:66
pcl::registration::LUM::getNumVertices
SLAMGraph::vertices_size_type getNumVertices() const
Get the number of vertices in the SLAM graph.
Definition: lum.hpp:66
pcl::registration::LUM::setConvergenceThresholdvoid setConvergenceThreshold(float convergence_threshold)Set the convergence threshold for the compute() method.Definition: lum.hpp:87
pcl::registration::LUM::setConvergenceThreshold
void setConvergenceThreshold(float convergence_threshold)
Set the convergence threshold for the compute() method.
Definition: lum.hpp:87
pcl::registration::LUM::setMaxIterationsvoid setMaxIterations(int max_iterations)Set the maximum number of iterations for the compute() method.Definition: lum.hpp:73
pcl::registration::LUM::setMaxIterations
void setMaxIterations(int max_iterations)
Set the maximum number of iterations for the compute() method.
Definition: lum.hpp:73
pcl::registration::LUM::getConcatenatedCloudPointCloudPtr getConcatenatedCloud() constReturn a concatenated point cloud of all the SLAM graph's point clouds compounded onto their current ...Definition: lum.hpp:294
pcl::registration::LUM::getConcatenatedCloud
PointCloudPtr getConcatenatedCloud() const
Return a concatenated point cloud of all the SLAM graph's point clouds compounded onto their current ...
Definition: lum.hpp:294
pcl::registration::LUM::addPointCloudVertex addPointCloud(const PointCloudPtr &cloud, const Eigen::Vector6f &pose=Eigen::Vector6f::Zero())Add a new point cloud to the SLAM graph.Definition: lum.hpp:101
pcl::registration::LUM::addPointCloud
Vertex addPointCloud(const PointCloudPtr &cloud, const Eigen::Vector6f &pose=Eigen::Vector6f::Zero())
Add a new point cloud to the SLAM graph.
Definition: lum.hpp:101
pcl::registration::LUM::getTransformationEigen::Affine3f getTransformation(const Vertex &vertex) constReturn a pose estimate from one of the SLAM graph's vertices as an affine transformation matrix.Definition: lum.hpp:171
pcl::registration::LUM::getTransformation
Eigen::Affine3f getTransformation(const Vertex &vertex) const
Return a pose estimate from one of the SLAM graph's vertices as an affine transformation matrix.
Definition: lum.hpp:171
pcl::registration::LUM::setCorrespondencesvoid setCorrespondences(const Vertex &source_vertex, const Vertex &target_vertex, const pcl::CorrespondencesPtr &corrs)Add/change a set of correspondences for one of the SLAM graph's edges.Definition: lum.hpp:179
pcl::registration::LUM::setCorrespondences
void setCorrespondences(const Vertex &source_vertex, const Vertex &target_vertex, const pcl::CorrespondencesPtr &corrs)
Add/change a set of correspondences for one of the SLAM graph's edges.
Definition: lum.hpp:179
This method will add a new vertex to the SLAM graph and attach a point cloud to that vertex. Optionally you can specify a pose estimate for this point cloud. A vertex' pose is always relative to the first vertex in the SLAM graph, i.e. the first point cloud that was added. Because this first vertex is the reference, you can not set a pose estimate for this vertex. Providing pose estimates to the vertices in the SLAM graph will reduce overall computation time of LUM.
Note
Vertex descriptors are typecastable to int.
Parameters
[in]
cloud
The new point cloud.
[in]
pose
(optional) The pose estimate relative to the reference pose (first point cloud that was added).
Returns
The vertex descriptor of the newly created vertex.
Computation uses the first point cloud in the SLAM graph as a reference pose and attempts to align all other point clouds to it simultaneously. Things to keep in mind:
Only those parts of the graph connected to the reference pose will properly align to it.
All sets of correspondences should span the same space and need to be sufficient to determine a rigid transformation.
The algorithm draws it strength from loops in the graph because it will distribute errors evenly amongst those loops.
Computation ends when either of the following conditions hold:
The number of iterations reaches max_iterations. Use setMaxIterations() to change.
Get the convergence threshold for the compute() method.
When the compute() method computes the new poses relative to the old poses, it will determine the length of the difference vector. When the average length of all difference vectors becomes less than the convergence_threshold the convergence is assumed to be met.
Returns
The current convergence threshold (default = 0.0).
All data used and produced by LUM is stored in this boost::adjacency_list. It is recommended to use the LUM class itself to build the graph. This method could otherwise be useful for managing several SLAM graphs in one instance of LUM.
Set the convergence threshold for the compute() method.
When the compute() method computes the new poses relative to the old poses, it will determine the length of the difference vector. When the average length of all difference vectors becomes less than the convergence_threshold the convergence is assumed to be met.
Add/change a set of correspondences for one of the SLAM graph's edges.
The edges in the SLAM graph are directional and point from source vertex to target vertex. The query indices of the correspondences, index the points at the source vertex' point cloud. The matching indices of the correspondences, index the points at the target vertex' point cloud. If no edge was present at the specified location, this method will add a new edge to the SLAM graph and attach the correspondences to that edge. If the edge was already present, this method will overwrite the correspondence information of that edge and will not alter the SLAM graph structure.
Note
Vertex descriptors are typecastable to int.
Parameters
[in]
source_vertex
The vertex descriptor of the correspondences' source point cloud.
[in]
target_vertex
The vertex descriptor of the correspondences' target point cloud.
All data used and produced by LUM is stored in this boost::adjacency_list. It is recommended to use the LUM class itself to build the graph. This method could otherwise be useful for managing several SLAM graphs in one instance of LUM.
Change a point cloud on one of the SLAM graph's vertices.
This method will change the point cloud attached to an existing vertex and will not alter the SLAM graph structure. Note that the correspondences attached to this vertex will not change and may need to be updated manually.
Note
Vertex descriptors are typecastable to int.
Parameters
[in]
vertex
The vertex descriptor of which to change the point cloud.
Change a pose estimate on one of the SLAM graph's vertices.
A vertex' pose is always relative to the first vertex in the SLAM graph, i.e. the first point cloud that was added. Because this first vertex is the reference, you can not set a pose estimate for this vertex. Providing pose estimates to the vertices in the SLAM graph will reduce overall computation time of LUM.
Note
Vertex descriptors are typecastable to int.
Parameters
[in]
vertex
The vertex descriptor of which to set the pose estimate.