9 #include <boost/test/unit_test.hpp>
10 #include <boost/utility/binary.hpp>
12 #include "utils/macros.hpp"
16 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
26 R.isApprox(Eigen::AngleAxis<double>(
v.angular().norm(),
v.angular().normalized()).matrix()));
42 Eigen::Matrix<double, 7, 1>
q0;
43 q0 << 0., 0., 0., 0., 0., 0., 1.;
45 Eigen::Quaterniond quat0(
q.tail<4>());
50 Motion::Vector6 vec6_nan(Motion::Vector6::Constant(NAN));
55 R =
exp3(SE3::Vector3::Zero());
59 Eigen::Quaterniond
quat;
69 Eigen::QuaternionMapd quat_map(vec4.data());
71 BOOST_CHECK(quat_map.toRotationMatrix().isApprox(
M.rotation()));
82 const size_t num_tries = 20;
84 for (
size_t i = 0;
i < num_tries;
i++)
89 R_normed = pinocchio::renormalize_rotation_matrix(R1);
90 BOOST_CHECK((R_normed.transpose() * R_normed).isApprox(Id));
93 tr = R_normed.trace();
94 vals = 2. * R_normed.diagonal().array() - tr + 1.;
102 v.linear().setZero();
115 M.translation().setZero();
118 omega =
log3(
M.rotation());
124 Motion::Vector6 v_nan =
log6(mat4_nan);
129 Eigen::Quaterniond
quat(SE3::Matrix3::Identity());
133 for (
int k = 0; k < 1e3; ++k)
143 const double PI_value = PI<double>();
152 Eigen::Vector4d vec4;
153 Eigen::QuaternionMapd quat_map(vec4.data());
173 Eigen::Quaterniond
quat;
175 Eigen::Quaterniond quat_res;
209 const double eps = 1e-8;
210 for (
int i = 0;
i < 3; ++
i)
215 Jfd.col(
i) = (
log3(R_dR_plus) -
log3(R_dR_minus)) / (2 *
eps);
232 Jexp3(Motion::Vector3::Zero(), Jexp);
240 const double eps = 1e-3;
241 for (
int i = 0;
i < 3; ++
i)
247 Jexp_fd.col(
i) =
log3(Rpn) / (2. *
eps);
253 template<
typename QuaternionLike,
typename Matrix43Like>
255 const Eigen::QuaternionBase<QuaternionLike> & quat,
const Eigen::MatrixBase<Matrix43Like> & Jexp)
259 skew(0.5 *
quat.vec(), Jout.template topRows<3>());
260 Jout.template topRows<3>().diagonal().array() += 0.5 *
quat.w();
261 Jout.template bottomRows<1>() = -0.5 *
quat.vec().transpose();
272 typedef Eigen::Matrix<Scalar, 4, 3> Matrix43;
275 Matrix43
Jexp3, Jexp3_fd;
280 const double eps = 1e-8;
282 for (
int i = 0;
i < 3; ++
i)
287 Jexp3_fd.col(
i) = (quat_plus.coeffs() -
quat.coeffs()) /
eps;
297 Matrix43 Jexp_quat_local;
301 Matrix43 Jcompositon =
Jexp3 * Jlog;
302 BOOST_CHECK(Jcompositon.isApprox(Jexp_quat_local));
311 for (
int i = 0;
i < 3; ++
i)
316 Jexp3_fd.col(
i) = (quat_plus.coeffs() -
quat.coeffs()) /
eps;
328 const double eps = 1e-8;
330 typedef Eigen::Matrix<double, 7, 6> Matrix76;
331 Matrix76 Jexp6_fd, Jexp6_quat;
332 Jexp6_quat.setZero();
333 typedef Eigen::Matrix<double, 4, 3> Matrix43;
341 Jexp6_quat.middleRows<3>(Motion::LINEAR).middleCols<3>(Motion::LINEAR) =
M.rotation();
342 Jexp6_quat.middleRows<4>(Motion::ANGULAR).middleCols<3>(Motion::ANGULAR) =
344 for (
int i = 0;
i < 6; ++
i)
349 Jexp6_fd.middleRows<3>(Motion::LINEAR).col(
i) = (M_next.translation() -
M.translation()) /
eps;
350 Jexp6_fd.middleRows<4>(Motion::ANGULAR).col(
i) = (quat_next.coeffs() -
quat.coeffs()) /
eps;
351 dv.toVector()[
i] = 0.;
363 Eigen::Matrix3d
R(
exp3(
v.angular())), Jexp, Jlog;
423 for (
int i = 0;
i < 6; ++
i)
425 dM.toVector()[
i] = step;
427 Jfd.col(
i) = (
log6(M_dM).toVector() -
log6(
M).toVector()) / step;
428 dM.toVector()[
i] = 0;
439 for (
size_t i = 0;
i < 15;
i++)
450 SE3 dM(M0.actInv(M0));
475 const double eps = 1e-8;
476 for (
int i = 0;
i < 6; ++
i)
480 Jexp_fd.col(
i) =
log6(
M.actInv(M_next)).toVector() /
eps;
499 Ja = -Jlog * (Ma.
inverse() * Mb).toActionMatrixInverse();
507 for (
int i = 0;
i < 6; ++
i)
509 dM.toVector()[
i] = step;
514 dM.toVector()[
i] = 0;
527 Eigen::Matrix<double, 6, 6, Eigen::RowMajor> Jexp, Jlog;
538 Eigen::Matrix<double, 6, 6> Jexp, Jlog;
552 Matrix3
R(
q.matrix());
559 for (
int k = 0; k < 3; ++k)
567 Matrix3 R_dR =
R *
exp3(step * e_k);
568 Matrix3 Jlog_R, Jlog_R_dR;
570 Jlog3(R_dR, Jlog_R_dR);
572 Matrix3 Hlog_e_k_fd = (Jlog_R_dR - Jlog_R) / step;
574 BOOST_CHECK(Hlog_e_k.isApprox(Hlog_e_k_fd, sqrt(step)));
582 typedef Eigen::Matrix4d Matrix4;
583 typedef pinocchio::Motion::Vector6 Vector6;
591 BOOST_CHECK_SMALL(
R.determinant() - 1.0,
EPSILON);
599 BOOST_CHECK_SMALL(
m.rotation().determinant() - 1.0,
EPSILON);
604 Vector6 v6(Vector6::Random());
608 Matrix4
M = m2.toHomogeneousMatrix();
610 Vector6 v6FromLog(nu2FromLog.toVector());
637 const int num_tests = 1e1;
638 for (
int k = 0; k < num_tests; ++k)
647 BOOST_AUTO_TEST_SUITE_END()