38 const size_t N = in_correspondences.size();
45 th[0] = th[1] = th[2] =
params.ransac_threshold_lin;
47 th[3] = th[4] = th[5] =
params.ransac_threshold_ang;
49 th[6] =
params.ransac_threshold_scale;
55 std::numeric_limits<double>::max();
62 N *
params.ransac_maxSetSizePct);
65 params.ransac_nmaxSimulations;
69 "Minimum number of points to be considered a good set is < Minimum " 70 "number of points to fit the model");
75 for (
size_t iterations = 0; iterations < max_it; iterations++)
80 std::vector<uint32_t> rub, mbSet, cSet;
87 for (
size_t i = 0; mbInliers.size() < n && i < N; i++)
89 const size_t idx = mbSet[i];
92 if (
params.user_individual_compat_callback)
95 pm.
idx_this = in_correspondences[idx].this_idx;
96 pm.
idx_other = in_correspondences[idx].other_idx;
97 if (!
params.user_individual_compat_callback(pm))
101 mbInliers.push_back(in_correspondences[idx]);
109 std::cerr <<
"[tfest::se3_l2_robust] Iter " << iterations
110 <<
": It was not possible to find the min no of " 111 "(compatible) matching pairs.\n";
117 mbInliers, mbOutQuat, scale,
params.forceScaleToUnity);
120 std::cerr <<
"[tfest::se3_l2_robust] tfest::se3_l2() returned " 121 "false for tentative subset during RANSAC " 129 mbOut_vec[0] = mbOut.
x();
130 mbOut_vec[1] = mbOut.
y();
131 mbOut_vec[2] = mbOut.z();
133 mbOut_vec[3] = mbOut.
yaw();
134 mbOut_vec[4] = mbOut.
pitch();
135 mbOut_vec[5] = mbOut.
roll();
137 mbOut_vec[6] = scale;
140 for (
size_t k = n; k < N; k++)
142 const size_t idx = mbSet[k];
145 if (
params.user_individual_compat_callback)
148 pm.
idx_this = in_correspondences[idx].this_idx;
149 pm.
idx_other = in_correspondences[idx].other_idx;
150 if (!
params.user_individual_compat_callback(pm))
156 mbInliers.push_back(in_correspondences[idx]);
158 mbInliers, csOutQuat, scale,
params.forceScaleToUnity);
159 mbInliers.erase(mbInliers.end() - 1);
163 std::cerr <<
"[tfest::se3_l2_robust] tfest::se3_l2() returned " 164 "false for tentative subset during RANSAC " 172 if (fabs(mbOut_vec[0] - csOut.
x()) < th[0] &&
173 fabs(mbOut_vec[1] - csOut.
y()) < th[1] &&
174 fabs(mbOut_vec[2] - csOut.z()) < th[2] &&
175 fabs(mbOut_vec[3] - csOut.
yaw()) < th[3] &&
176 fabs(mbOut_vec[4] - csOut.
pitch()) < th[4] &&
177 fabs(mbOut_vec[5] - csOut.
roll()) < th[5] &&
178 fabs(mbOut_vec[6] - scale) < th[6])
191 if (cSet.size() >= d)
195 cSetInliers.resize(cSet.size());
196 for (
size_t m = 0; m < cSet.size(); m++)
197 cSetInliers[m] = in_correspondences[cSet[m]];
202 cSetInliers, cIOutQuat, scale,
203 params.forceScaleToUnity);
206 "tfest::se3_l2() returned false for tentative subset during " 207 "RANSAC iteration!");
211 const double err = std::sqrt(
212 square(mbOut_vec[0] - cIOut.
x()) +
213 square(mbOut_vec[1] - cIOut.
y()) +
214 square(mbOut_vec[2] - cIOut.z()) +
218 square(mbOut_vec[6] - scale));
221 if (err < min_err && cSet.size() >= max_size)
224 max_size = cSet.size();
225 results.transformation = cIOutQuat;
241 std::cerr <<
"[se3_l2_robust] maximum size is == 0!\n";
A namespace of pseudo-random numbers generators of diferent distributions.
void permuteVector(const VEC &in_vector, VEC &out_result)
Returns a random permutation of a vector: all the elements of the input vector are in the output but ...
A compile-time fixed-size numeric matrix container.
Parameters for se3_l2_robust().
double pitch() const
Get the PITCH angle (in radians)
double yaw() const
Get the YAW angle (in radians)
mrpt::vision::TStereoCalibParams params
This base provides a set of functions for maths stuff.
map< string, CVectorDouble > results
#define ASSERTMSG_(f, __ERROR_MSG)
Defines an assertion mechanism.
double x() const
Common members of all points & poses classes.
A class used to store a 3D pose as a translation (x,y,z) and a quaternion (qr,qx,qy,qz).
void linspace(T first, T last, size_t count, VECTOR &out_vector)
Generates an equidistant sequence of numbers given the first one, the last one and the desired number...
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
double roll() const
Get the ROLL angle (in radians)
return_t square(const num_t x)
Inline function for the square of a number.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
bool se3_l2(const mrpt::tfest::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 se3_l2_robust(const mrpt::tfest::TMatchingPairList &in_correspondences, const TSE3RobustParams &in_params, TSE3RobustResult &out_results)
Least-squares (L2 norm) solution to finding the optimal SE(3) transform between two reference frames ...
bool verbose
Show progress messages to std::cout console (default=true)
CRandomGenerator & getRandomGenerator()
A static instance of a CRandomGenerator class, for use in single-thread applications.
Functions for estimating the optimal transformation between two frames of references given measuremen...
For each individual-compatibility (IC) test, the indices of the candidate match between elements in b...
Output placeholder for se3_l2_robust()
int round(const T value)
Returns the closer integer (int) to x.