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 #ifndef __POINTMATCHER_TRANSFORMATIONCHECKERS_H
00037 #define __POINTMATCHER_TRANSFORMATIONCHECKERS_H
00038
00039 #include "PointMatcher.h"
00040
00041 template<typename T>
00042 struct TransformationCheckersImpl
00043 {
00044 typedef PointMatcherSupport::Parametrizable Parametrizable;
00045 typedef PointMatcherSupport::Parametrizable P;
00046 typedef Parametrizable::Parameters Parameters;
00047 typedef Parametrizable::ParameterDoc ParameterDoc;
00048 typedef Parametrizable::ParametersDoc ParametersDoc;
00049
00050 typedef typename PointMatcher<T>::TransformationChecker TransformationChecker;
00051 typedef typename PointMatcher<T>::TransformationParameters TransformationParameters;
00052 typedef typename PointMatcher<T>::Vector Vector;
00053 typedef typename PointMatcher<T>::VectorVector VectorVector;
00054 typedef typename PointMatcher<T>::Quaternion Quaternion;
00055 typedef typename PointMatcher<T>::QuaternionVector QuaternionVector;
00056 typedef typename PointMatcher<T>::Matrix Matrix;
00057
00058 struct CounterTransformationChecker: public TransformationChecker
00059 {
00061 struct MaxNumIterationsReached {};
00062
00063 inline static const std::string description()
00064 {
00065 return "This checker stops the ICP loop after a certain number of iterations.";
00066 }
00067 inline static const ParametersDoc availableParameters()
00068 {
00069 return {
00070 {"maxIterationCount", "maximum number of iterations ", "40", "0", "2147483647", &P::Comp<unsigned>}
00071 };
00072 }
00073
00074 const unsigned maxIterationCount;
00075
00076 CounterTransformationChecker(const Parameters& params = Parameters());
00077 virtual void init(const TransformationParameters& parameters, bool& iterate);
00078 virtual void check(const TransformationParameters& parameters, bool& iterate);
00079 };
00080
00081 struct DifferentialTransformationChecker: public TransformationChecker
00082 {
00083 inline static const std::string description()
00084 {
00085 return "This checker stops the ICP loop when the relative motions (i.e. abs(currentIter - lastIter)) of rotation and translation components are below a fix thresholds. This allows to stop the iteration when the point cloud is stabilized. Smoothing can be applied to avoid oscillations. Inspired by \\cite{Chetverikov2002Trimmed}.";
00086 }
00087 inline static const ParametersDoc availableParameters()
00088 {
00089 return {
00090 {"minDiffRotErr", "threshold for rotation error (radian)", "0.001", "0.", "6.2831854", &P::Comp<T>},
00091 {"minDiffTransErr", "threshold for translation error", "0.001", "0.", "inf", &P::Comp<T>},
00092 {"smoothLength", "number of iterations over which to average the differencial error", "3", "0", "2147483647", &P::Comp<unsigned>}
00093 };
00094 }
00095
00096 const T minDiffRotErr;
00097 const T minDiffTransErr;
00098 const unsigned int smoothLength;
00099
00100 protected:
00101 QuaternionVector rotations;
00102 VectorVector translations;
00103
00104 public:
00105 DifferentialTransformationChecker(const Parameters& params = Parameters());
00106
00107 virtual void init(const TransformationParameters& parameters, bool& iterate);
00108 virtual void check(const TransformationParameters& parameters, bool& iterate);
00109 };
00110
00111 struct BoundTransformationChecker: public TransformationChecker
00112 {
00113 inline static const std::string description()
00114 {
00115 return "This checker stops the ICP loop with an exception when the transformation values exceed bounds.";
00116 }
00117 inline static const ParametersDoc availableParameters()
00118 {
00119 return {
00120 {"maxRotationNorm", "rotation bound", "1", "0", "inf", &P::Comp < T > },
00121 {"maxTranslationNorm", "translation bound", "1", "0", "inf", &P::Comp < T > }
00122 };
00123 }
00124
00125 const T maxRotationNorm;
00126 const T maxTranslationNorm;
00127
00128 protected:
00129 Quaternion initialRotation3D;
00130 T initialRotation2D;
00131 Vector initialTranslation;
00132
00133 public:
00134 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00135 BoundTransformationChecker(const Parameters& params = Parameters());
00136 virtual void init(const TransformationParameters& parameters, bool& iterate);
00137 virtual void check(const TransformationParameters& parameters, bool& iterate);
00138 };
00139 };
00140
00141 #endif // __POINTMATCHER_TRANSFORMATIONCHECKERS_H