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;
726 m1->determineMatching2D(
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;
785 q1 = m1->squareDistanceToClosestCorrespondence(
790 q2 = m1->squareDistanceToClosestCorrespondence(
794 w3 = *other_x_trans + Axy;
795 q3 = m1->squareDistanceToClosestCorrespondence(
801 float x1, y1, x2, y2, d1, d2;
802 m1->kdTreeTwoClosestPoint2D(
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;
Use the covariance of the optimal registration, disregarding uncertainty in data association.
mrpt::math::TPoint3D angularDistPivotPoint
The point used to calculate angular distances: e.g.
float maxAngularDistForCorrespondence
Allowed "angular error" (in radians): this permits larger pairing threshold distances to more distant...
double x() const
Common members of all points & poses classes.
float ransac_fuseMaxDiffPhi
float quality
A measure of the 'quality' of the local minimum of the sqr.
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
CPose2D mean
The mean value.
CPose3D mean
The mean value.
const float normalizationStd
float ransac_mahalanobisDistanceThreshold
float kernel(const float &x2, const float &rho2)
Computes: or just return the input if options.useKernel = false.
void y_incr(const double v)
float read_float(const std::string §ion, const std::string &name, float defaultValue, bool failIfNotFound=false) const
float thresholdDist
Initial threshold distance for two points to become a correspondence.
std::shared_ptr< CPose3DPDFGaussian > Ptr
size_t decimation_other_map_points
(Default=1) Only consider 1 out of this number of points from the "other" map.
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.
TICPAlgorithm ICP_algorithm
The algorithm to use (default: icpClassic).
Parameters for se2_l2_robust().
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: ...
#define THROW_EXCEPTION(msg)
GLdouble GLdouble GLdouble GLdouble q
#define THROW_EXCEPTION_FMT(_FORMAT_STRING,...)
bool derivedFrom(const TRuntimeClassId *pBaseClass) const
virtual const mrpt::utils::TRuntimeClassId * GetRuntimeClass() const override
Returns information about the class of an object in runtime.
This file implements several operations that operate element-wise on individual or pairs of container...
const float ransac_mahalanobisDistanceThreshold
double pitch() const
Get the PITCH angle (in radians)
double yaw() const
Get the YAW angle (in radians)
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 skip_quality_calculation
Skip the (sometimes) expensive evaluation of the term 'quality' at ICP output (Default=true) ...
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 ...
const Scalar * const_iterator
unsigned int ransac_nSimulations
float ALFA
The scale factor for threshold everytime convergence is achieved.
TConfigParams options
The options employed by the ICP align.
float kernel_rho
Cauchy kernel rho, for estimating the optimal transformation covariance, in meters (default = 0...
mrpt::poses::CPose3DPDF::Ptr ICP3D_Method_Classic(const mrpt::maps::CMetricMap *m1, const mrpt::maps::CMetricMap *m2, const mrpt::poses::CPose3DPDFGaussian &initialEstimationPDF, TReturnInfo &outInfo)
float minAbsStep_rot
If the correction in all rotation coordinates (yaw,pitch,roll) is below this threshold (in radians)...
uint32_t corresponding_points_decimation
Decimation of the point cloud being registered against the reference one (default=5) - set to 1 to ha...
This class allows loading and storing values and vectors of different types from a configuration text...
T square(const T x)
Inline function for the square of a number.
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.
float goodness
A goodness measure for the alignment, it is a [0,1] range indicator of percentage of correspondences...
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
A cloud of points in 2D or 3D, which can be built from a sequence of laser scans or other sensors...
bool ransac_fuseByCorrsMatch
This base provides a set of functions for maths stuff.
std::shared_ptr< CPosePDF > Ptr
#define CLASS_ID(T)
Access to runtime class ID for a defined class name.
Declares a class that represents a Probability Density function (PDF) of a 2D pose ...
A helper class that can convert an enum value into its textual representation, and viceversa...
unsigned int maxIterations
Maximum number of iterations to run.
This class implements a high-performance stopwatch.
CONTAINER::Scalar sum(const CONTAINER &v)
Computes the sum of all the elements.
void x_incr(const double v)
std::shared_ptr< CPose3DPDF > Ptr
float covariance_varPoints
This is the normalization constant that is used to scale the whole 3x3 covariance.
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 onlyUniqueRobust
Additional consistency filter: "onlyKeepTheClosest" allows one correspondence for each "local map" po...
float maxDistForCorrespondence
Maximum linear distance between two points to be paired (meters)
TICPCovarianceMethod ICP_covariance_method
The method to use for covariance estimation (Default: icpCovFiniteDifferences)
std::shared_ptr< CPosePDFGaussian > Ptr
bool doRANSAC
Perform a RANSAC step, mrpt::tfest::se2_l2_robust(), after the ICP convergence, to obtain a better es...
A class used to store a 3D pose as a translation (x,y,z) and a quaternion (qr,qx,qy,qz).
mrpt::poses::CPosePDF::Ptr ICP_Method_LM(const mrpt::maps::CMetricMap *m1, const mrpt::maps::CMetricMap *m2, const mrpt::poses::CPosePDFGaussian &initialEstimationPDF, TReturnInfo &outInfo)
std::shared_ptr< CPosePDFSOG > Ptr
bool onlyClosestCorrespondences
The usual approach: to consider only the closest correspondence for each local point (Default to true...
unsigned short nIterations
The number of executed iterations until convergence.
bool use_kernel
Whether to use kernel_rho to smooth distances, or use distances directly (default=true) ...
CStream & operator<<(mrpt::utils::CStream &s, const char *a)
GLsizei const GLchar ** string
T wrapToPi(T a)
Modifies the given angle to translate it into the ]-pi,pi] range.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
double roll() const
Get the ROLL angle (in radians)
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...
TICPAlgorithm
The ICP algorithm selection, used in mrpt::slam::CICP::options mrpt_slam_grp.
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...
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...
bool onlyKeepTheClosest
If set to true (default), only the closest correspondence will be returned.
void dumpToTextStream(mrpt::utils::CStream &out) const override
This method should clearly display all the contents of the structure in textual form, sending it to a CStream.
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble GLdouble w2
size_t offset_other_map_points
Index of the first point in the "other" map to start checking for correspondences (Default=0) ...
bool skip_cov_calculation
Skip the computation of the covariance (saves some time) (default=false)
Declares a virtual base class for all metric maps storage classes.
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle...
TConfigParams()
Initializer for default values:
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
float smallestThresholdDist
The size for threshold such that iterations will stop, since it is considered precise enough...
const double & phi() const
Get the phi angle of the 2D pose (in radians)
The ICP algorithm return information.
float ransac_fuseMaxDiffXY
A matrix of dynamic size.
unsigned int ransac_minSetSize
mrpt::poses::CPosePDFSOG transformation
The output as a set of transformations (sum of Gaussians)
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/...
Declares a class that represents a Probability Density function (PDF) of a 3D pose ...
float LM_initial_lambda
[LM method only] The initial value of the lambda parameter in the LM method (default=1e-4) ...
float normalizationStd
RANSAC-step option: The standard deviation in X,Y of landmarks/points which are being matched (used t...
float minAbsStep_trans
If the correction in all translation coordinates (X,Y,Z) is below this threshold (in meters)...
unsigned int ransac_maxSetSize
#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...
TICPCovarianceMethod
ICP covariance estimation methods, used in mrpt::slam::CICP::options.
Parameters for the determination of matchings between point clouds, etc.
float Axy_aprox_derivatives
[LM method only] The size of the perturbance in x & y used to estimate the Jacobians of the square er...
virtual bool isEmpty() const =0
Returns true if the map is empty/no observation has been inserted.
GLenum const GLfloat * params
Output placeholder for se2_l2_robust()
double phi
Orientation (rads)
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. ...
virtual int printf(const char *fmt,...) MRPT_printf_format_check(2
Writes a string to the stream in a textual form.
mrpt::poses::CPosePDF::Ptr ICP_Method_Classic(const mrpt::maps::CMetricMap *m1, const mrpt::maps::CMetricMap *m2, const mrpt::poses::CPosePDFGaussian &initialEstimationPDF, TReturnInfo &outInfo)
Covariance of a least-squares optimizer (includes data association uncertainty)
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble w1
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.