32 #define TEST_NAME "base/pose"
45 Eigen::Matrix3d::Zero());
46 Eigen::Matrix3d ref_matrix;
47 ref_matrix << 0, -3, 2, 3, 0, -1, -2, 1, 0;
52 const double rx = 0.3;
60 BOOST_CHECK_CLOSE(rx, rxx, 1
e-6);
61 BOOST_CHECK_CLOSE(ry, ryy, 1
e-6);
62 BOOST_CHECK_CLOSE(rz, rzz, 1
e-6);
67 const double ry = 0.3;
74 BOOST_CHECK_CLOSE(rx, rxx, 1
e-6);
75 BOOST_CHECK_CLOSE(ry, ryy, 1
e-6);
76 BOOST_CHECK_CLOSE(rz, rzz, 1
e-6);
82 const double rz = 0.3;
88 BOOST_CHECK_CLOSE(rx, rxx, 1
e-6);
89 BOOST_CHECK_CLOSE(ry, ryy, 1
e-6);
90 BOOST_CHECK_CLOSE(rz, rzz, 1
e-6);
94 const double rx = 0.1;
95 const double ry = 0.2;
96 const double rz = 0.3;
102 BOOST_CHECK_CLOSE(rx, rxx, 1
e-6);
103 BOOST_CHECK_CLOSE(ry, ryy, 1
e-6);
104 BOOST_CHECK_CLOSE(rz, rzz, 1
e-6);
110 const double rz = 0.3;
112 const Eigen::Matrix3d rot_mat1 =
114 BOOST_CHECK(rot_mat0.isApprox(rot_mat1));
132 .isApprox(Eigen::Vector4d(std::sqrt(2) / 2, std::sqrt(2) / 2, 0, 0)));
135 .isApprox(Eigen::Vector4d(std::sqrt(2) / 2, std::sqrt(2) / 2, 0, 0)));
140 Eigen::Vector4d(1, -0, -0, -0));
142 Eigen::Vector4d(2, -0, -0, -0));
145 Eigen::Vector4d(0.1, 0.2, 0.3, 0.4));
156 Eigen::Vector4d(2, 0, 0, 0)),
159 Eigen::Vector4d(0.1, 0.2, 0.3, 0.4),
164 Eigen::Vector4d(0.1, 0.2, 0.3, 0.4))
170 Eigen::Vector3d(0, 0, 0)),
171 Eigen::Vector3d(0, 0, 0));
173 Eigen::Vector3d(0, 0, 0)),
174 Eigen::Vector3d(0, 0, 0));
176 Eigen::Vector3d(1, 1, 0)),
177 Eigen::Vector3d(1, 1, 0));
179 Eigen::Vector3d(1, 1, 0)),
180 Eigen::Vector3d(1, 1, 0));
184 Eigen::Vector3d(1, 1, 0))
185 .isApprox(Eigen::Vector3d(1, -1, 0)));
189 std::vector<Eigen::Vector4d> qvecs;
190 std::vector<double> weights;
203 weights = {1.0, 1.0};
208 weights = {1.0, 2.0};
213 weights = {1.0, 2.0};
218 weights = {1.0, 1.0};
220 .isApprox(Eigen::Vector4d(0.92388, 0.382683, 0, 0), 1
e-6));
223 weights = {1.0, 2.0};
225 .isApprox(Eigen::Vector4d(0.850651, 0.525731, 0, 0), 1
e-6));
230 Eigen::Vector3d(0, 0, 1)),
231 Eigen::Matrix3d::Identity());
233 Eigen::Vector3d(0, 0, 2)),
234 Eigen::Matrix3d::Identity());
236 Eigen::Matrix3d ref_matrix1;
237 ref_matrix1 << 1, 0, 0, 0, 0, 1, 0, -1, 0;
239 Eigen::Vector3d(0, 1, 0)),
241 BOOST_CHECK_EQUAL(ref_matrix1 * Eigen::Vector3d(0, 0, 1),
242 Eigen::Vector3d(0, 1, 0));
244 Eigen::Vector3d(0, 2, 0)),
246 BOOST_CHECK_EQUAL(ref_matrix1 * Eigen::Vector3d(0, 0, 2),
247 Eigen::Vector3d(0, 2, 0));
250 Eigen::Vector3d(0, 0, -1)),
251 Eigen::Matrix3d::Identity());
255 const Eigen::Vector4d qvec = Eigen::Vector4d::Random().normalized();
256 const Eigen::Vector3d tvec(3, 4, 5);
260 BOOST_CHECK_CLOSE((inv_proj_matrix.rightCols<1>() - pose).norm(), 0, 1
e-6);
264 const Eigen::Vector4d qvec = Eigen::Vector4d::Random().normalized();
265 const Eigen::Vector3d tvec(3, 4, 5);
269 BOOST_CHECK((inv_proj_matrix.rightCols<1>() - pose).norm() < 1
e-6);
273 Eigen::Vector4d qvec12;
274 Eigen::Vector3d tvec12;
280 BOOST_CHECK_EQUAL(tvec12, Eigen::Vector3d(0, 0, 0));
286 BOOST_CHECK_EQUAL(tvec12, Eigen::Vector3d(1, 0, 0));
289 Eigen::Vector4d(1, 1, 0, 0), Eigen::Vector3d(0, 0, 0),
291 BOOST_CHECK(qvec12.isApprox(Eigen::Vector4d(0.707107, 0.707107, 0, 0), 1
e-6));
292 BOOST_CHECK_EQUAL(tvec12, Eigen::Vector3d(0, 0, 0));
295 Eigen::Vector4d(1, 1, 0, 0), Eigen::Vector3d(1, 0, 0),
297 BOOST_CHECK(qvec12.isApprox(Eigen::Vector4d(0.707107, 0.707107, 0, 0), 1
e-6));
298 BOOST_CHECK_EQUAL(tvec12, Eigen::Vector3d(1, 0, 0));
301 Eigen::Vector4d(1, 1, 0, 0), Eigen::Vector3d(1, 0, 0),
304 BOOST_CHECK_EQUAL(tvec12, Eigen::Vector3d(1, 0, 0));
307 Eigen::Vector4d(1, 1, 0, 0), Eigen::Vector3d(0, 0, 0),
309 BOOST_CHECK(qvec12.isApprox(Eigen::Vector4d(0.707107, 0.707107, 0, 0), 1
e-6));
310 BOOST_CHECK(tvec12.isApprox(Eigen::Vector3d(0, 1, 0)));
314 Eigen::Vector4d qvec12;
315 Eigen::Vector3d tvec12;
321 BOOST_CHECK_EQUAL(tvec12, Eigen::Vector3d(0, 0, 0));
327 BOOST_CHECK_EQUAL(tvec12, Eigen::Vector3d(0, 1, 2));
333 BOOST_CHECK_EQUAL(tvec12, Eigen::Vector3d(3, 5, 7));
335 Eigen::Vector4d rel_qvec12;
336 Eigen::Vector3d rel_tvec12;
338 Eigen::Vector4d(1, 3, 0, 0), Eigen::Vector3d(3, 4, 5),
339 &rel_qvec12, &rel_tvec12);
341 rel_qvec12, rel_tvec12, &qvec12, &tvec12);
344 BOOST_CHECK(tvec12.isApprox(Eigen::Vector3d(3, 4, 5)));
348 Eigen::Vector4d inv_qvec;
349 Eigen::Vector3d inv_tvec;
353 BOOST_CHECK_EQUAL(inv_tvec, Eigen::Vector3d(0, 0, 0));
354 InvertPose(Eigen::Vector4d(0, 1, 2, 3), Eigen::Vector3d(0, 1, 2), &inv_qvec,
356 Eigen::Vector4d inv_inv_qvec;
357 Eigen::Vector3d inv_inv_tvec;
358 InvertPose(inv_qvec, inv_tvec, &inv_inv_qvec, &inv_inv_tvec);
359 BOOST_CHECK_EQUAL(inv_inv_qvec, Eigen::Vector4d(0, 1, 2, 3));
360 BOOST_CHECK(inv_inv_tvec.isApprox(Eigen::Vector3d(0, 1, 2)));
364 const Eigen::Vector4d qvec1 = Eigen::Vector4d::Random().normalized();
365 const Eigen::Vector3d tvec1 = Eigen::Vector3d::Random();
366 const Eigen::Vector4d qvec2 = Eigen::Vector4d::Random().normalized();
367 const Eigen::Vector3d tvec2 = Eigen::Vector3d::Random();
369 Eigen::Vector4d qveci;
370 Eigen::Vector3d tveci;
373 BOOST_CHECK(tvec1.isApprox(tveci));
376 BOOST_CHECK(tvec2.isApprox(tveci));
379 BOOST_CHECK(((tvec1 + tvec2) / 2).isApprox(tveci));
383 Eigen::Vector4d qvec1(1, 0, 0, 0);
384 Eigen::Vector4d qvec2(1, 0, 0, 0);
386 Eigen::Vector3d tvec1(0, 0, 0);
387 Eigen::Vector3d tvec2(0, 0, 1);
390 BOOST_CHECK_CLOSE(baseline1, 1, 1
e-10);
395 BOOST_CHECK_CLOSE(baseline2, 2, 1
e-10);
399 const Eigen::Matrix3d R = Eigen::Matrix3d::Identity();
400 const Eigen::Vector3d t(1, 0, 0);
402 std::vector<Eigen::Vector2d> points1;
403 std::vector<Eigen::Vector2d> points2;
404 std::vector<Eigen::Vector3d> points3D;
406 points1.emplace_back(0, 0);
407 points2.emplace_back(0.1, 0);
409 BOOST_CHECK_EQUAL(points3D.size(), 1);
411 points1.emplace_back(0, 0);
412 points2.emplace_back(-0.1, 0);
414 BOOST_CHECK_EQUAL(points3D.size(), 1);
418 BOOST_CHECK_EQUAL(points3D.size(), 2);
420 points2[0][0] = -0.2;
421 points2[1][0] = -0.2;
423 BOOST_CHECK_EQUAL(points3D.size(), 0);
Matrix< double, 3, 4 > Matrix3x4d
Eigen::Vector3d ProjectionCenterFromMatrix(const Eigen::Matrix3x4d &proj_matrix)
Eigen::Matrix3d RotationFromUnitVectors(const Eigen::Vector3d &vector1, const Eigen::Vector3d &vector2)
void ComputeRelativePose(const Eigen::Vector4d &qvec1, const Eigen::Vector3d &tvec1, const Eigen::Vector4d &qvec2, const Eigen::Vector3d &tvec2, Eigen::Vector4d *qvec12, Eigen::Vector3d *tvec12)
Eigen::Matrix3d EulerAnglesToRotationMatrix(const double rx, const double ry, const double rz)
Eigen::Vector4d ComposeIdentityQuaternion()
void InvertPose(const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec, Eigen::Vector4d *inv_qvec, Eigen::Vector3d *inv_tvec)
Eigen::Matrix3d CrossProductMatrix(const Eigen::Vector3d &vector)
Eigen::Vector4d NormalizeQuaternion(const Eigen::Vector4d &qvec)
Eigen::Vector4d AverageQuaternions(const std::vector< Eigen::Vector4d > &qvecs, const std::vector< double > &weights)
void ConcatenatePoses(const Eigen::Vector4d &qvec1, const Eigen::Vector3d &tvec1, const Eigen::Vector4d &qvec2, const Eigen::Vector3d &tvec2, Eigen::Vector4d *qvec12, Eigen::Vector3d *tvec12)
Eigen::Matrix3x4d InvertProjectionMatrix(const Eigen::Matrix3x4d &proj_matrix)
Eigen::Vector4d RotationMatrixToQuaternion(const Eigen::Matrix3d &rot_mat)
Eigen::Vector4d ConcatenateQuaternions(const Eigen::Vector4d &qvec1, const Eigen::Vector4d &qvec2)
Eigen::Vector4d InvertQuaternion(const Eigen::Vector4d &qvec)
Eigen::Vector3d QuaternionRotatePoint(const Eigen::Vector4d &qvec, const Eigen::Vector3d &point)
Eigen::Vector3d ProjectionCenterFromPose(const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec)
Eigen::Vector3d CalculateBaseline(const Eigen::Vector4d &qvec1, const Eigen::Vector3d &tvec1, const Eigen::Vector4d &qvec2, const Eigen::Vector3d &tvec2)
void RotationMatrixToEulerAngles(const Eigen::Matrix3d &R, double *rx, double *ry, double *rz)
Eigen::Matrix3x4d ComposeProjectionMatrix(const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec)
void InterpolatePose(const Eigen::Vector4d &qvec1, const Eigen::Vector3d &tvec1, const Eigen::Vector4d &qvec2, const Eigen::Vector3d &tvec2, const double t, Eigen::Vector4d *qveci, Eigen::Vector3d *tveci)
bool CheckCheirality(const Eigen::Matrix3d &R, const Eigen::Vector3d &t, const std::vector< Eigen::Vector2d > &points1, const std::vector< Eigen::Vector2d > &points2, std::vector< Eigen::Vector3d > *points3D)
Eigen::Matrix3d QuaternionToRotationMatrix(const Eigen::Vector4d &qvec)
BOOST_AUTO_TEST_CASE(TestCrossProductMatrix)