68 std::vector<mrpt::math::TPoint3D>&
70 std::vector<mrpt::math::TPoint3D>&
73 double& out_scale,
bool forceScaleToUnity)
79 TPoint3D ct_others(0, 0, 0), ct_this(0, 0, 0);
80 const size_t nMatches = points_this.size();
85 for (
size_t i = 0; i < nMatches; i++)
87 ct_others += points_other[i];
88 ct_this += points_this[i];
91 const double F = 1.0 / nMatches;
98 for (
size_t i = 0; i < nMatches; i++)
100 points_this[i] -= ct_this;
101 points_other[i] -= ct_others;
103 S.get_unsafe(0, 0) += points_other[i].x * points_this[i].x;
104 S.get_unsafe(0, 1) += points_other[i].x * points_this[i].y;
105 S.get_unsafe(0, 2) += points_other[i].x * points_this[i].z;
107 S.get_unsafe(1, 0) += points_other[i].y * points_this[i].x;
108 S.get_unsafe(1, 1) += points_other[i].y * points_this[i].y;
109 S.get_unsafe(1, 2) += points_other[i].y * points_this[i].z;
111 S.get_unsafe(2, 0) += points_other[i].z * points_this[i].x;
112 S.get_unsafe(2, 1) += points_other[i].z * points_this[i].y;
113 S.get_unsafe(2, 2) += points_other[i].z * points_this[i].z;
120 0, 0, S.get_unsafe(0, 0) + S.get_unsafe(1, 1) + S.get_unsafe(2, 2));
121 N.set_unsafe(0, 1, S.get_unsafe(1, 2) - S.get_unsafe(2, 1));
122 N.set_unsafe(0, 2, S.get_unsafe(2, 0) - S.get_unsafe(0, 2));
123 N.set_unsafe(0, 3, S.get_unsafe(0, 1) - S.get_unsafe(1, 0));
125 N.set_unsafe(1, 0, N.get_unsafe(0, 1));
127 1, 1, S.get_unsafe(0, 0) - S.get_unsafe(1, 1) - S.get_unsafe(2, 2));
128 N.set_unsafe(1, 2, S.get_unsafe(0, 1) + S.get_unsafe(1, 0));
129 N.set_unsafe(1, 3, S.get_unsafe(2, 0) + S.get_unsafe(0, 2));
131 N.set_unsafe(2, 0, N.get_unsafe(0, 2));
132 N.set_unsafe(2, 1, N.get_unsafe(1, 2));
134 2, 2, -S.get_unsafe(0, 0) + S.get_unsafe(1, 1) - S.get_unsafe(2, 2));
135 N.set_unsafe(2, 3, S.get_unsafe(1, 2) + S.get_unsafe(2, 1));
137 N.set_unsafe(3, 0, N.get_unsafe(0, 3));
138 N.set_unsafe(3, 1, N.get_unsafe(1, 3));
139 N.set_unsafe(3, 2, N.get_unsafe(2, 3));
141 3, 3, -S.get_unsafe(0, 0) - S.get_unsafe(1, 1) + S.get_unsafe(2, 2));
148 N.eigenVectors(Z, D);
149 Z.extractCol(Z.cols() - 1,
v);
153 sqrt(
v[0] *
v[0] +
v[1] *
v[1] +
v[2] *
v[2] +
v[3] *
v[3]) - 1.0) <
166 for (
unsigned int i = 0; i < 4; i++)
167 out_transform[i + 3] =
v[i];
171 if (forceScaleToUnity)
179 for (
size_t i = 0; i < nMatches; i++)
188 s = std::sqrt(
num / den);
193 ct_others.x, ct_others.y, ct_others.z, pp.
x, pp.
y, pp.
z);
196 out_transform[0] = ct_this.
x - pp.
x;
197 out_transform[1] = ct_this.
y - pp.
y;
198 out_transform[2] = ct_this.z - pp.
z;
207 const std::vector<mrpt::math::TPoint3D>& in_points_this,
208 const std::vector<mrpt::math::TPoint3D>& in_points_other,
210 bool forceScaleToUnity)
214 std::vector<mrpt::math::TPoint3D> points_this = in_points_this;
215 std::vector<mrpt::math::TPoint3D> points_other = in_points_other;
218 points_this, points_other, out_transform, out_scale, forceScaleToUnity);
224 bool forceScaleToUnity)
227 const size_t N = corrs.size();
228 std::vector<mrpt::math::TPoint3D> points_this(N), points_other(N);
229 for (
size_t i = 0; i < N; i++)
231 points_this[i].x = corrs[i].this_x;
232 points_this[i].y = corrs[i].this_y;
233 points_this[i].z = corrs[i].this_z;
234 points_other[i].x = corrs[i].other_x;
235 points_other[i].y = corrs[i].other_y;
236 points_other[i].z = corrs[i].other_z;
239 points_this, points_other, out_transform, out_scale, forceScaleToUnity);
double x() const
Common members of all points & poses classes.
T square(const T x)
Inline function for the square of a number.
void composePoint(const double lx, const double ly, const double lz, double &gx, double &gy, double &gz, mrpt::math::CMatrixFixedNumeric< double, 3, 3 > *out_jacobian_df_dpoint=nullptr, mrpt::math::CMatrixFixedNumeric< double, 3, 7 > *out_jacobian_df_dpose=nullptr) const
Computes the 3D point G such as .
This base provides a set of functions for maths stuff.
bool se3_l2_internal(std::vector< mrpt::math::TPoint3D > &points_this, std::vector< mrpt::math::TPoint3D > &points_other, mrpt::poses::CPose3DQuat &out_transform, double &out_scale, bool forceScaleToUnity)
#define ASSERT_EQUAL_(__A, __B)
Assert comparing two values, reporting their actual values upon failure.
double x
X,Y,Z coordinates.
A class used to store a 3D pose as a translation (x,y,z) and a quaternion (qr,qx,qy,qz).
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
#define ASSERTDEB_(f)
Defines an assertion mechanism - only when compiled in debug.
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 ...
Functions for estimating the optimal transformation between two frames of references given measuremen...