Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef IA_RANSAC_H_
00039 #define IA_RANSAC_H_
00040
00041 #include <pcl/registration/registration.h>
00042 #include <pcl/registration/transformation_estimation_svd.h>
00043
00044 namespace pcl
00045 {
00051 template <typename PointSource, typename PointTarget, typename FeatureT>
00052 class SampleConsensusInitialAlignment : public Registration<PointSource, PointTarget>
00053 {
00054 public:
00055 using Registration<PointSource, PointTarget>::reg_name_;
00056 using Registration<PointSource, PointTarget>::input_;
00057 using Registration<PointSource, PointTarget>::indices_;
00058 using Registration<PointSource, PointTarget>::target_;
00059 using Registration<PointSource, PointTarget>::final_transformation_;
00060 using Registration<PointSource, PointTarget>::transformation_;
00061 using Registration<PointSource, PointTarget>::corr_dist_threshold_;
00062 using Registration<PointSource, PointTarget>::min_number_correspondences_;
00063 using Registration<PointSource, PointTarget>::max_iterations_;
00064 using Registration<PointSource, PointTarget>::tree_;
00065 using Registration<PointSource, PointTarget>::transformation_estimation_;
00066 using Registration<PointSource, PointTarget>::getClassName;
00067
00068 typedef typename Registration<PointSource, PointTarget>::PointCloudSource PointCloudSource;
00069 typedef typename PointCloudSource::Ptr PointCloudSourcePtr;
00070 typedef typename PointCloudSource::ConstPtr PointCloudSourceConstPtr;
00071
00072 typedef typename Registration<PointSource, PointTarget>::PointCloudTarget PointCloudTarget;
00073
00074 typedef PointIndices::Ptr PointIndicesPtr;
00075 typedef PointIndices::ConstPtr PointIndicesConstPtr;
00076
00077 typedef pcl::PointCloud<FeatureT> FeatureCloud;
00078 typedef typename FeatureCloud::Ptr FeatureCloudPtr;
00079 typedef typename FeatureCloud::ConstPtr FeatureCloudConstPtr;
00080
00081
00082 class ErrorFunctor
00083 {
00084 public:
00085 virtual ~ErrorFunctor () {}
00086 virtual float operator () (float d) const = 0;
00087 };
00088
00089 class HuberPenalty : public ErrorFunctor
00090 {
00091 private:
00092 HuberPenalty () {}
00093 public:
00094 HuberPenalty (float threshold) : threshold_ (threshold) {}
00095 virtual float operator () (float e) const
00096 {
00097 if (e <= threshold_)
00098 return (0.5 * e*e);
00099 else
00100 return (0.5 * threshold_ * (2.0 * fabs (e) - threshold_));
00101 }
00102 protected:
00103 float threshold_;
00104 };
00105
00106 class TruncatedError : public ErrorFunctor
00107 {
00108 private:
00109 TruncatedError () {}
00110 public:
00111 virtual ~TruncatedError () {}
00112
00113 TruncatedError (float threshold) : threshold_ (threshold) {}
00114 virtual float operator () (float e) const
00115 {
00116 if (e <= threshold_)
00117 return (e / threshold_);
00118 else
00119 return (1.0);
00120 }
00121 protected:
00122 float threshold_;
00123 };
00124
00125 typedef typename KdTreeFLANN<FeatureT>::Ptr FeatureKdTreePtr;
00127 SampleConsensusInitialAlignment () :
00128 input_features_ (), target_features_ (),
00129 nr_samples_(3), min_sample_distance_ (0.0f), k_correspondences_ (10),
00130 feature_tree_ (new pcl::KdTreeFLANN<FeatureT>),
00131 error_functor_ ()
00132 {
00133 reg_name_ = "SampleConsensusInitialAlignment";
00134 max_iterations_ = 1000;
00135 transformation_estimation_.reset (new pcl::registration::TransformationEstimationSVD<PointSource, PointTarget>);
00136 };
00137
00141 void
00142 setSourceFeatures (const FeatureCloudConstPtr &features);
00143
00145 inline FeatureCloudConstPtr const
00146 getSourceFeatures () { return (input_features_); }
00147
00151 void
00152 setTargetFeatures (const FeatureCloudConstPtr &features);
00153
00155 inline FeatureCloudConstPtr const
00156 getTargetFeatures () { return (target_features_); }
00157
00161 void
00162 setMinSampleDistance (float min_sample_distance) { min_sample_distance_ = min_sample_distance; }
00163
00165 float
00166 getMinSampleDistance () { return (min_sample_distance_); }
00167
00171 void
00172 setNumberOfSamples (int nr_samples) { nr_samples_ = nr_samples; }
00173
00175 int
00176 getNumberOfSamples () { return (nr_samples_); }
00177
00182 void
00183 setCorrespondenceRandomness (int k) { k_correspondences_ = k; }
00184
00186 int
00187 getCorrespondenceRandomness () { return (k_correspondences_); }
00188
00193 void
00194 setErrorFunction (const boost::shared_ptr<ErrorFunctor> & error_functor) { error_functor_ = error_functor; }
00195
00199 boost::shared_ptr<ErrorFunctor>
00200 getErrorFunction () { return (error_functor_); }
00201
00202 protected:
00206 inline int
00207 getRandomIndex (int n) { return (static_cast<int> (n * (rand () / (RAND_MAX + 1.0)))); };
00208
00216 void
00217 selectSamples (const PointCloudSource &cloud, int nr_samples, float min_sample_distance,
00218 std::vector<int> &sample_indices);
00219
00227 void
00228 findSimilarFeatures (const FeatureCloud &input_features, const std::vector<int> &sample_indices,
00229 std::vector<int> &corresponding_indices);
00230
00235 float
00236 computeErrorMetric (const PointCloudSource &cloud, float threshold);
00237
00241 virtual void
00242 computeTransformation (PointCloudSource &output, const Eigen::Matrix4f& guess);
00243
00245 FeatureCloudConstPtr input_features_;
00246
00248 FeatureCloudConstPtr target_features_;
00249
00251 int nr_samples_;
00252
00254 float min_sample_distance_;
00255
00257 int k_correspondences_;
00258
00260 FeatureKdTreePtr feature_tree_;
00261
00263 boost::shared_ptr<ErrorFunctor> error_functor_;
00264 public:
00265 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00266 };
00267 }
00268
00269 #include <pcl/registration/impl/ia_ransac.hpp>
00270
00271 #endif //#ifndef IA_RANSAC_H_