00001
00002
00003
00004
00005
00006
00007
00008 #ifndef TRANSFORMATION_ESTIMATION_WDF_H
00009 #define TRANSFORMATION_ESTIMATION_WDF_H
00010
00011 #include <pcl/registration/transformation_estimation.h>
00012
00013 #include <pcl/registration/icp.h>
00014 #include "pcl/registration/warp_point_rigid.h"
00015 #include "pcl/registration/warp_point_rigid_6d.h"
00016
00017
00018
00019 #include <unsupported/Eigen/NonLinearOptimization>
00020 #include <iostream>
00021
00022 template <typename PointSource, typename PointTarget>
00023 class TransformationEstimationWDF: public pcl::registration::TransformationEstimation<PointSource, PointTarget> {
00024 typedef pcl::PointCloud<PointSource> PointCloudSource;
00025 typedef typename PointCloudSource::Ptr PointCloudSourcePtr;
00026 typedef typename PointCloudSource::ConstPtr PointCloudSourceConstPtr;
00027
00028 typedef pcl::PointCloud<PointTarget> PointCloudTarget;
00029
00030 typedef pcl::PointIndices::Ptr PointIndicesPtr;
00031 typedef pcl::PointIndices::ConstPtr PointIndicesConstPtr;
00032
00033 float alpha_;
00034 float beta_;
00035 std::vector<int> indices_src_dfp_;
00036 std::vector<int> indices_tgt_dfp_;
00037 bool indices_src_dfp_set_;
00038 bool indices_tgt_dfp_set_;
00039 std::vector<float> weights_dfp_;
00040 bool weights_dfp_set_;
00041
00047 inline void
00048 estimateRigidTransformation (
00049 const pcl::PointCloud<PointSource> &cloud_src,
00050 const pcl::PointCloud<PointTarget> &cloud_tgt,
00051 Eigen::Matrix4f &transformation_matrix);
00052
00059 inline void
00060 estimateRigidTransformation (
00061 const pcl::PointCloud<PointSource> &cloud_src,
00062 const pcl::PointCloud<PointTarget> &cloud_tgt,
00063 const pcl::Correspondences &correspondences,
00064 Eigen::Matrix4f &transformation_matrix);
00065
00072 inline void
00073 estimateRigidTransformation (
00074 const pcl::PointCloud<PointSource> &cloud_src,
00075 const std::vector<int> &indices_src,
00076 const pcl::PointCloud<PointTarget> &cloud_tgt,
00077 Eigen::Matrix4f &transformation_matrix);
00078 public:
00079
00080 TransformationEstimationWDF() {
00081
00082 alpha_ = 0.3;
00083 indices_src_dfp_set_ = false;
00084 indices_tgt_dfp_set_ = false;
00085 weights_dfp_set_ = false;
00086 };
00087
00088 virtual ~TransformationEstimationWDF() {};
00089
00090 inline void
00091 setAlpha(float alpha_arg);
00092
00093 inline float
00094 getAlpha(void);
00095
00096 inline void
00097 setBeta(float alpha_arg);
00098
00099 inline float
00100 getBeta(void);
00101
00102
00110 inline void
00111 setCorrespondecesDFP ( pcl::Correspondences correspondences_dfp );
00112
00120 inline void
00121 setCorrespondecesDFP( std::vector<int> &indices_src_dfp_arg, std::vector<int> &indices_tgt_dfp_arg );
00122
00123 inline void
00124 setWeightsDFP (std::vector<float> weights_dfp_arg);
00125
00138 inline void
00139 estimateRigidTransformation (
00140 const pcl::PointCloud<PointSource> &cloud_src,
00141 const std::vector<int> &indices_src,
00142 const std::vector<int> &indices_src_dfp,
00143 const pcl::PointCloud<PointTarget> &cloud_tgt,
00144 const std::vector<int> &indices_tgt,
00145 const std::vector<int> &indices_tgt_dfp,
00146 float alpha_arg,
00147 Eigen::Matrix4f &transformation_matrix);
00148
00158 inline void
00159 estimateRigidTransformation (
00160 const pcl::PointCloud<PointSource> &cloud_src,
00161 const pcl::PointCloud<PointTarget> &cloud_tgt,
00162 const pcl::Correspondences &correspondences,
00163 const pcl::Correspondences &correspondences_dfp,
00164 float alpha_arg,
00165 Eigen::Matrix4f &transformation_matrix);
00166
00178 inline void
00179 estimateRigidTransformation (
00180 const pcl::PointCloud<PointSource> &cloud_src,
00181 const std::vector<int> &indices_src,
00182 const pcl::PointCloud<PointTarget> &cloud_tgt,
00183 const std::vector<int> &indices_tgt,
00184 Eigen::Matrix4f &transformation_matrix);
00185
00189 void
00190 setWarpFunction (const boost::shared_ptr<pcl::WarpPointRigid<PointSource, PointTarget> > &warp_fcn)
00191 {
00192 warp_point_ = warp_fcn;
00193 }
00194
00195 protected:
00196
00197 friend class pcl::IterativeClosestPoint<PointSource, PointTarget>;
00198
00207 virtual double
00208 computeDistance (const PointSource &p_src, const PointTarget &p_tgt)
00209 {
00210 Eigen::Vector4f s = p_src.getVector4fMap ();
00211 Eigen::Vector4f t = p_tgt.getVector4fMap ();
00212 return ( (s - t).norm () );
00213 }
00214
00215 virtual double
00216 computeDistancePointToPlane (const PointSource &p_src, const PointTarget &p_tgt)
00217 {
00218
00219 pcl::Vector4fMapConst s = p_src.getVector4fMap ();
00220 pcl::Vector4fMapConst t = p_tgt.getVector4fMap ();
00221 pcl::Vector4fMapConst n = p_tgt.getNormalVector4fMap ();
00222 return ((s - t).dot (n));
00223 }
00224
00225 virtual inline double
00226 computeDistanceWeight ( const double &depth )
00227 {
00228
00229 int a = 0.8/depth;
00230 if (a>1.07) return 0;
00231 else return a;
00232 }
00233
00235 std::vector<double> weights_;
00236
00238 const PointCloudSource *tmp_src_;
00239
00241 const PointCloudTarget *tmp_tgt_;
00242
00244 const std::vector<int> *tmp_idx_src_;
00245
00247 const std::vector<int> *tmp_idx_tgt_;
00248
00250 const std::vector<int> *tmp_idx_src_dfp_;
00251
00253 const std::vector<int> *tmp_idx_tgt_dfp_;
00254
00256 const std::vector<float> *tmp_weights_;
00257
00259 const std::vector<float> *tmp_dfp_weights_;
00260
00262 boost::shared_ptr<pcl::WarpPointRigid<PointSource, PointTarget> > warp_point_;
00263
00265 template<typename _Scalar, int NX=Eigen::Dynamic, int NY=Eigen::Dynamic>
00266 struct Functor
00267 {
00268 typedef _Scalar Scalar;
00269 enum {
00270 InputsAtCompileTime = NX,
00271 ValuesAtCompileTime = NY
00272 };
00273 typedef Eigen::Matrix<Scalar,InputsAtCompileTime,1> InputType;
00274 typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,1> ValueType;
00275 typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;
00276
00277 const int m_inputs, m_values;
00278
00279 Functor () : m_inputs (InputsAtCompileTime), m_values (ValuesAtCompileTime) {}
00280 Functor (int inputs, int values, int np, int ndfp) : m_inputs (inputs), m_values (values), number_p(np), number_dfp(ndfp) {}
00281
00282 int number_p;
00283 int number_dfp;
00284
00285 int inputs () const { return m_inputs; }
00286 int values () const { return m_values; }
00287 };
00288
00289 struct OptimizationFunctor : Functor<double>
00290 {
00291 using Functor<double>::m_values;
00292 using Functor<double>::number_p;
00293 using Functor<double>::number_dfp;
00294
00301 OptimizationFunctor (int n, int m, int np, int ndfp, TransformationEstimationWDF<PointSource, PointTarget> *estimator) :
00302 Functor<double> (n,m, np, ndfp), estimator_ (estimator) {}
00303
00309 int operator () (const Eigen::VectorXd &x, Eigen::VectorXd &fvec) const;
00310
00311 TransformationEstimationWDF<PointSource, PointTarget> *estimator_;
00312 };
00313
00314 struct OptimizationFunctorWithWeights : Functor<double>
00315 {
00316 using Functor<double>::m_values;
00317 using Functor<double>::number_p;
00318 using Functor<double>::number_dfp;
00319
00326 OptimizationFunctorWithWeights (int n, int m, int np, int ndfp, TransformationEstimationWDF<PointSource, PointTarget> *estimator) :
00327 Functor<double> (n,m, np, ndfp), estimator_ (estimator) {}
00328
00334 int operator () (const Eigen::VectorXd &x, Eigen::VectorXd &fvec) const;
00335
00336 TransformationEstimationWDF<PointSource, PointTarget> *estimator_;
00337 };
00338 };
00339
00340 #include "../../src/transformation_estimation_wdf.hpp"
00341
00342 #endif