42 #include <pcl/registration/bfgs.h>
56 template <
typename Po
intSource,
typename Po
intTarget>
91 typedef Eigen::Matrix<double, 6, 1> Vector6d;
96 : k_correspondences_(20)
97 , gicp_epsilon_(0.001)
98 , rotation_epsilon_(2e-3)
99 , input_covariances_(0)
100 , target_covariances_(0)
102 , max_inner_iterations_(20)
104 min_number_correspondences_ = 4;
105 reg_name_ =
"GeneralizedIterativeClosestPoint";
106 max_iterations_ = 200;
107 transformation_epsilon_ = 5e-4;
108 corr_dist_threshold_ = 5.;
109 rigid_transformation_estimation_ =
111 this, _1, _2, _3, _4, _5);
121 if (cloud->points.empty ())
123 PCL_ERROR (
"[pcl::%s::setInputInput] Invalid or empty point cloud dataset given!\n",
getClassName ().c_str ());
128 for (
size_t i = 0; i < input.
size (); ++i)
129 input[i].data[3] = 1.0;
132 input_tree_->setInputCloud (input_);
133 input_covariances_.reserve (input_->size ());
143 target_covariances_.reserve (target_->size ());
156 const std::vector<int> &indices_src,
157 const PointCloudTarget &cloud_tgt,
158 const std::vector<int> &indices_tgt,
159 Eigen::Matrix4f &transformation_matrix);
164 assert(index < mahalanobis_.size());
165 return mahalanobis_[index];
222 int k_correspondences_;
228 double gicp_epsilon_;
234 double rotation_epsilon_;
237 Eigen::Matrix4f base_transformation_;
240 const PointCloudSource *tmp_src_;
243 const PointCloudTarget *tmp_tgt_;
246 const std::vector<int> *tmp_idx_src_;
249 const std::vector<int> *tmp_idx_tgt_;
252 InputKdTreePtr input_tree_;
255 std::vector<Eigen::Matrix3d> input_covariances_;
258 std::vector<Eigen::Matrix3d> target_covariances_;
261 std::vector<Eigen::Matrix3d> mahalanobis_;
264 int max_inner_iterations_;
272 template<
typename Po
intT>
275 std::vector<Eigen::Matrix3d>& cloud_covariances);
282 matricesInnerProd(
const Eigen::MatrixXd& mat1,
const Eigen::MatrixXd& mat2)
const
285 size_t n = mat1.rows();
287 for(
size_t i = 0; i < n; i++)
288 for(
size_t j = 0; j < n; j++)
289 r += mat1 (j, i) * mat2 (i,j);
298 computeTransformation (PointCloudSource &output,
const Eigen::Matrix4f &guess);
306 searchForNeighbors (
const PointSource &query, std::vector<int>& index, std::vector<float>&
distance)
308 int k = tree_->nearestKSearch (query, 1, index, distance);
315 void applyState(Eigen::Matrix4f &t,
const Vector6d& x)
const;
318 struct OptimizationFunctorWithIndices :
public BFGSDummyFunctor<double,6>
321 : BFGSDummyFunctor<double,6> (), gicp_(gicp) {}
322 double operator() (
const Vector6d& x);
323 void df(
const Vector6d &x, Vector6d &df);
324 void fdf(
const Vector6d &x,
double &f, Vector6d &df);
330 boost::function<void(const pcl::PointCloud<PointSource> &cloud_src,
331 const std::vector<int> &src_indices,
333 const std::vector<int> &tgt_indices,
334 Eigen::Matrix4f &transformation_matrix)> rigid_transformation_estimation_;
340 #endif //#ifndef PCL_GICP_H_