69 if (runningTime) tictac.Tic();
71 switch (options.ICP_algorithm)
75 ICP_Method_Classic(m1, mm2, initialEstimationPDF, outInfo);
78 resultPDF = ICP_Method_LM(m1, mm2, initialEstimationPDF, outInfo);
82 "Invalid value for ICP_algorithm: %i",
83 static_cast<int>(options.ICP_algorithm));
86 if (runningTime) *runningTime = tictac.Tac();
89 if (info) *
static_cast<TReturnInfo*
>(info) = outInfo;
103 onlyClosestCorrespondences(true),
104 onlyUniqueRobust(false),
106 minAbsStep_trans(1e-6f),
107 minAbsStep_rot(1e-6f),
108 thresholdDist(0.75f),
111 smallestThresholdDist(0.10f),
112 covariance_varPoints(
square(0.02f)),
115 ransac_minSetSize(3),
116 ransac_maxSetSize(20),
117 ransac_nSimulations(100),
120 ransac_fuseByCorrsMatch(true),
121 ransac_fuseMaxDiffXY(0.01f),
122 ransac_fuseMaxDiffPhi(
DEG2RAD(0.1f)),
126 Axy_aprox_derivatives(0.05f),
128 LM_initial_lambda(1e-4f),
130 skip_cov_calculation(false),
131 skip_quality_calculation(true),
133 corresponding_points_decimation(5)
148 section,
"ICP_algorithm", ICP_algorithm);
150 section,
"ICP_covariance_method", ICP_covariance_method);
155 section.c_str(),
"thresholdAng_DEG",
RAD2DEG(thresholdAng)));
172 ransac_fuseMaxDiffPhi =
DEG2RAD(
174 section.c_str(),
"ransac_fuseMaxDiffPhi_DEG",
175 RAD2DEG(ransac_fuseMaxDiffPhi)));
186 corresponding_points_decimation,
int, iniFile, section);
194 out.
printf(
"\n----------- [CICP::TConfigParams] ------------ \n\n");
197 "ICP_algorithm = %s\n",
201 "ICP_covariance_method = %s\n",
203 ICP_covariance_method)
205 out.
printf(
"maxIterations = %i\n", maxIterations);
207 "minAbsStep_trans = %f\n", minAbsStep_trans);
209 "minAbsStep_rot = %f\n", minAbsStep_rot);
211 out.
printf(
"thresholdDist = %f\n", thresholdDist);
213 "thresholdAng = %f deg\n",
215 out.
printf(
"ALFA = %f\n", ALFA);
217 "smallestThresholdDist = %f\n",
218 smallestThresholdDist);
220 "onlyClosestCorrespondences = %c\n",
221 onlyClosestCorrespondences ?
'Y' :
'N');
223 "onlyUniqueRobust = %c\n",
224 onlyUniqueRobust ?
'Y' :
'N');
226 "covariance_varPoints = %f\n", covariance_varPoints);
228 "doRANSAC = %c\n", doRANSAC ?
'Y' :
'N');
230 "ransac_minSetSize = %i\n", ransac_minSetSize);
232 "ransac_maxSetSize = %i\n", ransac_maxSetSize);
234 "ransac_mahalanobisDistanceThreshold = %f\n",
237 "ransac_nSimulations = %i\n", ransac_nSimulations);
239 "ransac_fuseByCorrsMatch = %c\n",
240 ransac_fuseByCorrsMatch ?
'Y' :
'N');
242 "ransac_fuseMaxDiffXY = %f\n", ransac_fuseMaxDiffXY);
244 "ransac_fuseMaxDiffPhi = %f deg\n",
245 RAD2DEG(ransac_fuseMaxDiffPhi));
248 out.
printf(
"kernel_rho = %f\n", kernel_rho);
251 use_kernel ?
'Y' :
'N');
253 "Axy_aprox_derivatives = %f\n",
254 Axy_aprox_derivatives);
256 "LM_initial_lambda = %f\n", LM_initial_lambda);
258 "skip_cov_calculation = %c\n",
259 skip_cov_calculation ?
'Y' :
'N');
261 "skip_quality_calculation = %c\n",
262 skip_quality_calculation ?
'Y' :
'N');
264 "corresponding_points_decimation = %u\n",
265 (
unsigned int)corresponding_points_decimation);
293 size_t nCorrespondences = 0;
294 bool keepApproaching;
314 gaussPdf = mrpt::make_aligned_shared<CPosePDFGaussian>();
317 gaussPdf->mean = grossEst;
347 gaussPdf->mean.x(), gaussPdf->mean.y(),
353 correspondences, matchParams, matchExtraResults);
355 nCorrespondences = correspondences.size();
360 if (!nCorrespondences)
363 keepApproaching =
false;
377 keepApproaching =
true;
378 if (!(fabs(lastMeanPose.
x() - gaussPdf->mean.x()) >
380 fabs(lastMeanPose.
y() - gaussPdf->mean.y()) >
384 lastMeanPose.
phi() - gaussPdf->mean.phi())) >
391 keepApproaching =
false;
398 lastMeanPose = gaussPdf->mean;
442 Eigen::Matrix<double, 3, Eigen::Dynamic> D(
443 3, nCorrespondences);
445 const TPose2D transf(gaussPdf->mean);
447 double ccos = cos(transf.
phi);
448 double csin = sin(transf.
phi);
459 for (i = 0, it = correspondences.begin();
460 i < nCorrespondences; ++i, ++it)
462 float other_x_trans =
463 transf.
x + ccos * it->other_x - csin * it->other_y;
464 float other_y_trans =
465 transf.
y + csin * it->other_x + ccos * it->other_y;
469 w1 = other_x_trans - Axy;
472 square(it->this_y - other_y_trans),
478 square(it->this_y - other_y_trans),
481 w3 = other_x_trans + Axy;
484 square(it->this_y - other_y_trans),
488 A = ((q3 - q2) / ((w3 -
w2) * (w3 -
w1))) -
489 ((q1 - q2) / ((
w1 -
w2) * (w3 -
w1)));
490 B = ((q1 - q2) + (A * ((
w2 *
w2) - (
w1 *
w1)))) /
493 D(0, i) = (2 * A * other_x_trans) + B;
497 w1 = other_y_trans - Axy;
499 square(it->this_x - other_x_trans) +
505 square(it->this_x - other_x_trans) +
509 w3 = other_y_trans + Axy;
511 square(it->this_x - other_x_trans) +
516 A = ((q3 - q2) / ((w3 -
w2) * (w3 -
w1))) -
517 ((q1 - q2) / ((
w1 -
w2) * (w3 -
w1)));
518 B = ((q1 - q2) + (A * ((
w2 *
w2) - (
w1 *
w1)))) /
521 D(1, i) = (2 * A * other_y_trans) + B;
527 (-csin * it->other_x - ccos * it->other_y) +
528 D(1, i) * (ccos * it->other_x - csin * it->other_y);
535 for (i = 0; i < 3; i++)
540 DDt.inv(gaussPdf->cov);
545 "Invalid value for ICP_covariance_method: %i",
574 TPoint3D(gaussPdf->mean.x(), gaussPdf->mean.y(), 0);
578 correspondences, matchParams, matchExtraResults);
584 correspondences, matchParams, matchExtraResults);
590 correspondences, matchParams, matchExtraResults);
596 correspondences, matchParams, matchExtraResults);
601 correspondences, matchParams, matchExtraResults);
605 -max(EX1 - E0, max(EX2 - E0, max(EY1 - E0, EY2 - E0))) /
620 params.ransac_mahalanobisDistanceThreshold =
626 params.ransac_algorithmForLandmarks =
false;
632 SOG = mrpt::make_aligned_shared<CPosePDFSOG>();
641 resultPDF = gaussPdf;
661 size_t nCorrespondences = 0;
662 bool keepIteratingICP;
666 std::vector<float> other_xs_trans, other_ys_trans;
729 correspondences, matchParams, matchExtraResults);
731 nCorrespondences = correspondences.size();
733 if (!nCorrespondences)
736 keepIteratingICP =
false;
743 dJ_dq.setSize(3, nCorrespondences);
749 double ccos = cos(
q.phi());
750 double csin = sin(
q.phi());
761 std::vector<float> sq_errors;
763 q, sq_errors, other_xs_trans, other_ys_trans);
764 double OSE_initial =
math::sum(sq_errors);
773 for (i = 0, it = correspondences.begin(),
774 other_x_trans = other_xs_trans.begin(),
775 other_y_trans = other_ys_trans.begin();
776 i < nCorrespondences;
777 ++i, ++it, ++other_x_trans, ++other_y_trans)
783 #ifndef ICP_DISTANCES_TO_LINE
784 w1 = *other_x_trans - Axy;
794 w3 = *other_x_trans + Axy;
801 float x1, y1, x2, y2, d1, d2;
803 *other_x_trans, *other_y_trans,
808 w1 = *other_x_trans - Axy;
810 w1, *other_y_trans, x1, y1, x2, y2);
815 w2, *other_y_trans, x1, y1, x2, y2);
818 w3 = *other_x_trans + Axy;
820 w3, *other_y_trans, x1, y1, x2, y2);
824 A = ((q3 - q2) / ((w3 -
w2) * (w3 -
w1))) -
825 ((q1 - q2) / ((
w1 -
w2) * (w3 -
w1)));
826 B = ((q1 - q2) + (A * ((
w2 *
w2) - (
w1 *
w1)))) / (
w1 -
w2);
828 dJ_dq.get_unsafe(0, i) = (2 * A * *other_x_trans) + B;
832 w1 = *other_y_trans - Axy;
833 #ifdef ICP_DISTANCES_TO_LINE
835 *other_x_trans,
w1, x1, y1, x2, y2);
839 square(it->this_x - *other_x_trans) +
851 w3 = *other_y_trans + Axy;
852 #ifdef ICP_DISTANCES_TO_LINE
854 *other_x_trans, w3, x1, y1, x2, y2);
858 square(it->this_x - *other_x_trans) +
864 A = ((q3 - q2) / ((w3 -
w2) * (w3 -
w1))) -
865 ((q1 - q2) / ((
w1 -
w2) * (w3 -
w1)));
866 B = ((q1 - q2) + (A * ((
w2 *
w2) - (
w1 *
w1)))) / (
w1 -
w2);
868 dJ_dq.get_unsafe(1, i) = (2 * A * *other_y_trans) + B;
872 dJ_dq.get_unsafe(2, i) =
873 dJ_dq.get_unsafe(0, i) *
874 (-csin * it->other_x - ccos * it->other_y) +
875 dJ_dq.get_unsafe(1, i) *
876 (ccos * it->other_x - csin * it->other_y);
884 H_.multiply_AAt(dJ_dq);
889 bool keepIteratingLM =
true;
896 std::vector<float> new_sq_errors, new_other_xs_trans,
899 const size_t maxLMiters = 100;
901 while (keepIteratingLM && ++nLMiters < maxLMiters)
907 for (i = 0; i < 3; i++)
914 Eigen::VectorXf dJsq, LM_delta;
916 Eigen::Map<Eigen::VectorXf>(
917 &sq_errors[0], sq_errors.size()),
919 C_inv.multiply_Ab(dJsq, LM_delta);
921 q_new.
x(
q.x() - LM_delta[0]);
922 q_new.
y(
q.y() - LM_delta[1]);
923 q_new.
phi(
q.phi() - LM_delta[2]);
928 q_new, new_sq_errors, new_other_xs_trans,
931 float OSE_new =
math::sum(new_sq_errors);
933 bool improved = OSE_new < OSE_initial;
936 cout <<
"_____________" << endl;
937 cout <<
"q -> q_new : " <<
q <<
" -> " << q_new << endl;
938 printf(
"err: %f -> %f lambda: %e\n", OSE_initial ,OSE_new, lambda );
954 OSE_initial = OSE_new;
965 cout <<
"ICP loop: " << lastMeanPose <<
" -> " <<
q <<
" LM iters: " << nLMiters <<
" threshold: " << matchParams.
maxDistForCorrespondence << endl;
970 keepIteratingICP =
true;
980 keepIteratingICP =
false;
1054 if (runningTime) tictac.Tic();
1067 "Invalid value for ICP_algorithm: %i",
1071 if (runningTime) *runningTime = tictac.Tac();
1077 "Refactor `info` so it is polymorphic and can use dynamic_cast<> "
1097 size_t nCorrespondences = 0;
1098 bool keepApproaching;
1119 gaussPdf = mrpt::make_aligned_shared<CPose3DPDFGaussian>();
1122 gaussPdf->mean = grossEst;
1149 gaussPdf->mean.x(), gaussPdf->mean.y(), gaussPdf->mean.z());
1157 correspondences, matchParams, matchExtraResults);
1159 nCorrespondences = correspondences.size();
1161 if (!nCorrespondences)
1164 keepApproaching =
false;
1171 double transf_scale;
1173 correspondences, estPoseQuat, transf_scale,
1179 keepApproaching =
true;
1180 if (!(fabs(lastMeanPose.
x() - gaussPdf->mean.x()) >
1182 fabs(lastMeanPose.
y() - gaussPdf->mean.y()) >
1184 fabs(lastMeanPose.z() - gaussPdf->mean.z()) >
1188 lastMeanPose.
yaw() - gaussPdf->mean.yaw())) >
1192 lastMeanPose.
pitch() - gaussPdf->mean.pitch())) >
1196 lastMeanPose.
roll() - gaussPdf->mean.roll())) >
1203 keepApproaching =
false;
1210 lastMeanPose = gaussPdf->mean;
1244 resultPDF = gaussPdf;
#define MRPT_LOAD_CONFIG_VAR( variableName, variableType, configFileObject, sectionNameStr)
An useful macro for loading variables stored in a INI-like file under a key with the same name that t...
#define CLASS_ID(T)
Access to runtime class ID for a defined class name.
Declares a virtual base class for all metric maps storage classes.
virtual const mrpt::utils::TRuntimeClassId * GetRuntimeClass() const override
Returns information about the class of an object in runtime.
virtual void determineMatching3D(const mrpt::maps::CMetricMap *otherMap, const mrpt::poses::CPose3D &otherMapPose, mrpt::utils::TMatchingPairList &correspondences, const TMatchingParams ¶ms, TMatchingExtraResults &extraResults) const
Computes the matchings between this and another 3D points map - method used in 3D-ICP.
virtual void determineMatching2D(const mrpt::maps::CMetricMap *otherMap, const mrpt::poses::CPose2D &otherMapPose, mrpt::utils::TMatchingPairList &correspondences, const TMatchingParams ¶ms, TMatchingExtraResults &extraResults) const
Computes the matching between this and another 2D point map, which includes finding:
virtual bool isEmpty() const =0
Returns true if the map is empty/no observation has been inserted.
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans or other sensors.
virtual float squareDistanceToClosestCorrespondence(float x0, float y0) const override
Returns the square distance from the 2D point (x0,y0) to the closest correspondence in the map.
virtual void determineMatching2D(const mrpt::maps::CMetricMap *otherMap, const mrpt::poses::CPose2D &otherMapPose, mrpt::utils::TMatchingPairList &correspondences, const TMatchingParams ¶ms, TMatchingExtraResults &extraResults) const override
Computes the matching between this and another 2D point map, which includes finding:
virtual bool isEmpty() const override
Returns true if the map is empty/no observation has been inserted.
A matrix of dynamic size.
void kdTreeTwoClosestPoint2D(float x0, float y0, float &out_x1, float &out_y1, float &out_x2, float &out_y2, float &out_dist_sqr1, float &out_dist_sqr2) const
KD Tree-based search for the TWO closest point to some given 2D coordinates.
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle.
const double & phi() const
Get the phi angle of the 2D pose (in radians)
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
double pitch() const
Get the PITCH angle (in radians)
double roll() const
Get the ROLL angle (in radians)
double yaw() const
Get the YAW angle (in radians)
Declares a class that represents a Probability Density function (PDF) of a 3D pose .
CPose3D mean
The mean value.
std::shared_ptr< CPose3DPDFGaussian > Ptr
std::shared_ptr< CPose3DPDF > Ptr
A class used to store a 3D pose as a translation (x,y,z) and a quaternion (qr,qx,qy,...
double x() const
Common members of all points & poses classes.
void y_incr(const double v)
void x_incr(const double v)
Declares a class that represents a Probability Density function (PDF) of a 2D pose .
CPose2D mean
The mean value.
std::shared_ptr< CPosePDFGaussian > Ptr
std::shared_ptr< CPosePDF > Ptr
std::shared_ptr< CPosePDFSOG > Ptr
unsigned int maxIterations
Maximum number of iterations to run.
bool skip_quality_calculation
Skip the (sometimes) expensive evaluation of the term 'quality' at ICP output (Default=true)
float Axy_aprox_derivatives
[LM method only] The size of the perturbance in x & y used to estimate the Jacobians of the square er...
float ransac_fuseMaxDiffXY
TICPAlgorithm ICP_algorithm
The algorithm to use (default: icpClassic).
uint32_t corresponding_points_decimation
Decimation of the point cloud being registered against the reference one (default=5) - set to 1 to ha...
float ransac_fuseMaxDiffPhi
float smallestThresholdDist
The size for threshold such that iterations will stop, since it is considered precise enough.
void loadFromConfigFile(const mrpt::utils::CConfigFileBase &source, const std::string §ion) override
This method load the options from a ".ini"-like file or memory-stored string list.
float normalizationStd
RANSAC-step option: The standard deviation in X,Y of landmarks/points which are being matched (used t...
bool onlyClosestCorrespondences
The usual approach: to consider only the closest correspondence for each local point (Default to true...
bool skip_cov_calculation
Skip the computation of the covariance (saves some time) (default=false)
float minAbsStep_trans
If the correction in all translation coordinates (X,Y,Z) is below this threshold (in meters),...
TICPCovarianceMethod ICP_covariance_method
The method to use for covariance estimation (Default: icpCovFiniteDifferences)
TConfigParams()
Initializer for default values:
float ALFA
The scale factor for threshold everytime convergence is achieved.
bool doRANSAC
Perform a RANSAC step, mrpt::tfest::se2_l2_robust(), after the ICP convergence, to obtain a better es...
bool ransac_fuseByCorrsMatch
float thresholdDist
Initial threshold distance for two points to become a correspondence.
float kernel_rho
Cauchy kernel rho, for estimating the optimal transformation covariance, in meters (default = 0....
float covariance_varPoints
This is the normalization constant that is used to scale the whole 3x3 covariance.
bool use_kernel
Whether to use kernel_rho to smooth distances, or use distances directly (default=true)
unsigned int ransac_minSetSize
float LM_initial_lambda
[LM method only] The initial value of the lambda parameter in the LM method (default=1e-4)
float ransac_mahalanobisDistanceThreshold
unsigned int ransac_maxSetSize
float minAbsStep_rot
If the correction in all rotation coordinates (yaw,pitch,roll) is below this threshold (in radians),...
void dumpToTextStream(mrpt::utils::CStream &out) const override
This method should clearly display all the contents of the structure in textual form,...
unsigned int ransac_nSimulations
mrpt::poses::CPose3DPDF::Ptr Align3DPDF(const mrpt::maps::CMetricMap *m1, const mrpt::maps::CMetricMap *m2, const mrpt::poses::CPose3DPDFGaussian &initialEstimationPDF, float *runningTime=nullptr, void *info=nullptr)
The virtual method for aligning a pair of metric maps, aligning the full 6D pose.
float kernel(const float &x2, const float &rho2)
Computes:
mrpt::poses::CPosePDF::Ptr ICP_Method_Classic(const mrpt::maps::CMetricMap *m1, const mrpt::maps::CMetricMap *m2, const mrpt::poses::CPosePDFGaussian &initialEstimationPDF, TReturnInfo &outInfo)
mrpt::poses::CPosePDF::Ptr AlignPDF(const mrpt::maps::CMetricMap *m1, const mrpt::maps::CMetricMap *m2, const mrpt::poses::CPosePDFGaussian &initialEstimationPDF, float *runningTime=nullptr, void *info=nullptr)
An implementation of CMetricMapsAlignmentAlgorithm for the case of a point maps and a occupancy grid/...
mrpt::poses::CPosePDF::Ptr ICP_Method_LM(const mrpt::maps::CMetricMap *m1, const mrpt::maps::CMetricMap *m2, const mrpt::poses::CPosePDFGaussian &initialEstimationPDF, TReturnInfo &outInfo)
TConfigParams options
The options employed by the ICP align.
mrpt::poses::CPose3DPDF::Ptr ICP3D_Method_Classic(const mrpt::maps::CMetricMap *m1, const mrpt::maps::CMetricMap *m2, const mrpt::poses::CPose3DPDFGaussian &initialEstimationPDF, TReturnInfo &outInfo)
This class allows loading and storing values and vectors of different types from a configuration text...
ENUMTYPE read_enum(const std::string §ion, const std::string &name, const ENUMTYPE &defaultValue, bool failIfNotFound=false) const
Reads an "enum" value, where the value in the config file can be either a numerical value or the symb...
float read_float(const std::string §ion, const std::string &name, float defaultValue, bool failIfNotFound=false) const
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
virtual int printf(const char *fmt,...) MRPT_printf_format_check(2
Writes a string to the stream in a textual form.
This class implements a high-performance stopwatch.
void squareErrorVector(const mrpt::poses::CPose2D &q, std::vector< float > &out_sqErrs) const
Returns a vector with the square error between each pair of correspondences in the list,...
const Scalar * const_iterator
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble GLdouble w2
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble w1
GLenum const GLfloat * params
GLsizei const GLchar ** string
GLdouble GLdouble GLdouble GLdouble q
T wrapToPi(T a)
Modifies the given angle to translate it into the ]-pi,pi] range.
double closestSquareDistanceFromPointToLine(const double &Px, const double &Py, const double &x1, const double &y1, const double &x2, const double &y2)
Returns the square distance from a point to a line.
TICPCovarianceMethod
ICP covariance estimation methods, used in mrpt::slam::CICP::options <>
@ icpCovLinealMSE
Use the covariance of the optimal registration, disregarding uncertainty in data association.
@ icpCovFiniteDifferences
Covariance of a least-squares optimizer (includes data association uncertainty)
void pause(const std::string &msg=std::string("Press any key to continue...")) noexcept
Shows the message "Press any key to continue" (or other custom message) to the current standard outpu...
bool se2_l2(const mrpt::utils::TMatchingPairList &in_correspondences, mrpt::math::TPose2D &out_transformation, mrpt::math::CMatrixDouble33 *out_estimateCovariance=nullptr)
Least-squares (L2 norm) solution to finding the optimal SE(2) (x,y,yaw) between two reference frames.
bool se3_l2(const mrpt::utils::TMatchingPairList &in_correspondences, mrpt::poses::CPose3DQuat &out_transform, double &out_scale, bool forceScaleToUnity=false)
Least-squares (L2 norm) solution to finding the optimal SE(3) transform between two reference frames ...
bool se2_l2_robust(const mrpt::utils::TMatchingPairList &in_correspondences, const double in_normalizationStd, const TSE2RobustParams &in_ransac_params, TSE2RobustResult &out_results)
Robust least-squares (L2 norm) solution to finding the optimal SE(2) (x,y,yaw) between two reference ...
#define THROW_EXCEPTION(msg)
#define THROW_EXCEPTION_FMT(_FORMAT_STRING,...)
This base provides a set of functions for maths stuff.
CONTAINER::Scalar sum(const CONTAINER &v)
Computes the sum of all the elements.
T square(const T x)
Inline function for the square of a number.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
TICPAlgorithm
The ICP algorithm selection, used in mrpt::slam::CICP::options mrpt_slam_grp
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values,...
CStream & operator<<(mrpt::utils::CStream &s, const char *a)
This file implements several operations that operate element-wise on individual or pairs of container...
const float normalizationStd
const float ransac_mahalanobisDistanceThreshold
Parameters for the determination of matchings between point clouds, etc.
float maxDistForCorrespondence
Maximum linear distance between two points to be paired (meters)
size_t decimation_other_map_points
(Default=1) Only consider 1 out of this number of points from the "other" map.
bool onlyKeepTheClosest
If set to true (default), only the closest correspondence will be returned.
bool onlyUniqueRobust
Additional consistency filter: "onlyKeepTheClosest" allows one correspondence for each "local map" po...
size_t offset_other_map_points
Index of the first point in the "other" map to start checking for correspondences (Default=0)
float maxAngularDistForCorrespondence
Allowed "angular error" (in radians): this permits larger pairing threshold distances to more distant...
mrpt::math::TPoint3D angularDistPivotPoint
The point used to calculate angular distances: e.g.
double phi
Orientation (rads)
The ICP algorithm return information.
float quality
A measure of the 'quality' of the local minimum of the sqr.
unsigned short nIterations
The number of executed iterations until convergence.
float goodness
A goodness measure for the alignment, it is a [0,1] range indicator of percentage of correspondences.
Parameters for se2_l2_robust().
Output placeholder for se2_l2_robust()
mrpt::poses::CPosePDFSOG transformation
The output as a set of transformations (sum of Gaussians)
A helper class that can convert an enum value into its textual representation, and viceversa.
bool derivedFrom(const TRuntimeClassId *pBaseClass) const