| Directory: | ./ |
|---|---|
| File: | include/pinocchio/spatial/log.hxx |
| Date: | 2025-02-12 21:03:38 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 169 | 177 | 95.5% |
| Branches: | 397 | 927 | 42.8% |
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // | ||
| 2 | // Copyright (c) 2015-2021 CNRS INRIA | ||
| 3 | // | ||
| 4 | |||
| 5 | #ifndef __pinocchio_spatial_log_hxx__ | ||
| 6 | #define __pinocchio_spatial_log_hxx__ | ||
| 7 | |||
| 8 | namespace pinocchio | ||
| 9 | { | ||
| 10 | |||
| 11 | namespace internal | ||
| 12 | { | ||
| 13 | template<long i0, typename Matrix3, typename Vector3> | ||
| 14 | 98658 | void compute_theta_axis( | |
| 15 | const typename Matrix3::Scalar & val, | ||
| 16 | const Eigen::MatrixBase<Matrix3> & R, | ||
| 17 | typename Matrix3::Scalar & angle, | ||
| 18 | const Eigen::MatrixBase<Vector3> & _axis) | ||
| 19 | { | ||
| 20 | typedef typename Matrix3::Scalar Scalar; | ||
| 21 |
3/8✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
18 | static const Scalar eps = Eigen::NumTraits<Scalar>::epsilon(); |
| 22 | |||
| 23 | static const long i1 = (i0 + 1) % 3; | ||
| 24 | static const long i2 = (i0 + 2) % 3; | ||
| 25 | 98658 | Vector3 & axis = _axis.const_cast_derived(); | |
| 26 | |||
| 27 |
5/10✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 9 times.
✗ Branch 14 not taken.
|
98676 | const Scalar s = |
| 28 | 98640 | math::sqrt(val + eps + eps * eps) | |
| 29 | 197280 | * if_then_else( | |
| 30 |
4/8✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49329 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
|
98676 | GE, R.coeff(i2, i1), R.coeff(i1, i2), Scalar(1.), |
| 31 |
1/2✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
|
98658 | Scalar(-1.)); // Ensure value in sqrt is non negative and that s is non zero |
| 32 |
4/8✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
|
98658 | axis[i0] = s / Scalar(2); |
| 33 |
10/20✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49329 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 49329 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 9 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 9 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 9 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 9 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 9 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 9 times.
✗ Branch 29 not taken.
|
98658 | axis[i1] = Scalar(1) / (2 * s) * (R.coeff(i1, i0) + R.coeff(i0, i1)); |
| 34 |
10/20✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49329 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 49329 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 9 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 9 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 9 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 9 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 9 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 9 times.
✗ Branch 29 not taken.
|
98658 | axis[i2] = Scalar(1) / (2 * s) * (R.coeff(i2, i0) + R.coeff(i0, i2)); |
| 35 |
8/16✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49329 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 9 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 9 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 9 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 9 times.
✗ Branch 23 not taken.
|
98676 | const Scalar w = Scalar(1) / (2 * s) * (R.coeff(i2, i1) - R.coeff(i1, i2)); |
| 36 | |||
| 37 |
1/2✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
|
98658 | const Scalar axis_norm = axis.norm(); |
| 38 |
4/8✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
|
98658 | angle = 2 * math::atan2(axis_norm, w); |
| 39 |
1/2✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
|
98658 | axis /= axis_norm; |
| 40 | 98658 | } | |
| 41 | } // namespace internal | ||
| 42 | |||
| 43 | /// \brief Renormalize a rotation matrix. | ||
| 44 | template<typename Matrix3> | ||
| 45 | inline typename PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix3) | ||
| 46 | 17603 | renormalize_rotation_matrix(const Eigen::MatrixBase<Matrix3> & R) | |
| 47 | { | ||
| 48 | 17603 | typename PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix3) Rout; | |
| 49 |
13/20✓ Branch 1 taken 3 times.
✓ Branch 2 taken 16460 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 16460 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 16460 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 11 taken 16460 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✓ Branch 14 taken 16460 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✓ Branch 17 taken 16460 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
|
17603 | Rout.col(0).noalias() = R.col(0) / R.col(0).norm(); |
| 50 |
13/20✓ Branch 1 taken 3 times.
✓ Branch 2 taken 16460 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 16460 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 16460 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 11 taken 16460 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✓ Branch 14 taken 16460 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✓ Branch 17 taken 16460 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
|
17603 | Rout.col(1).noalias() = R.col(1) / R.col(1).norm(); |
| 51 |
11/17✓ Branch 1 taken 3 times.
✓ Branch 2 taken 16460 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 16460 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 16460 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 11 taken 16460 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✓ Branch 14 taken 16460 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
|
17603 | Rout.col(2).noalias() = Rout.col(0).cross(Rout.col(1)); |
| 52 |
11/17✓ Branch 1 taken 3 times.
✓ Branch 2 taken 16460 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 16460 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 16460 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 11 taken 16460 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✓ Branch 14 taken 16460 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
|
17603 | Rout.col(0).noalias() = Rout.col(1).cross(Rout.col(2)); |
| 53 | 17603 | return Rout; | |
| 54 | } | ||
| 55 | |||
| 56 | /// \brief Generic evaluation of log3 function | ||
| 57 | template<typename _Scalar> | ||
| 58 | struct log3_impl | ||
| 59 | { | ||
| 60 | template<typename Matrix3Like, typename Vector3Out> | ||
| 61 | 17563 | static void run( | |
| 62 | const Eigen::MatrixBase<Matrix3Like> & R, | ||
| 63 | typename Matrix3Like::Scalar & theta, | ||
| 64 | const Eigen::MatrixBase<Vector3Out> & angle_axis) | ||
| 65 | { | ||
| 66 |
2/4✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16443 times.
✗ Branch 5 not taken.
|
17563 | PINOCCHIO_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix3Like, R, 3, 3); |
| 67 |
2/4✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16443 times.
✗ Branch 5 not taken.
|
17563 | PINOCCHIO_ASSERT_MATRIX_SPECIFIC_SIZE(Vector3Out, angle_axis, 3, 1); |
| 68 | using namespace internal; | ||
| 69 | |||
| 70 | typedef typename Matrix3Like::Scalar Scalar; | ||
| 71 | typedef Eigen::Matrix<Scalar, 3, 1, PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix3Like)::Options> Vector3; | ||
| 72 |
3/8✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
4 | static const Scalar eps = Eigen::NumTraits<Scalar>::epsilon(); |
| 73 | |||
| 74 |
4/8✓ Branch 0 taken 25 times.
✓ Branch 1 taken 16418 times.
✓ Branch 3 taken 25 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
17563 | const static Scalar PI_value = PI<Scalar>(); |
| 75 | 17563 | Vector3Out & angle_axis_ = angle_axis.const_cast_derived(); | |
| 76 | |||
| 77 | typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix3Like) Matrix3; | ||
| 78 |
1/2✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
|
17563 | const Matrix3 Rnormed = renormalize_rotation_matrix(R); |
| 79 | |||
| 80 |
1/2✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
|
17563 | const Scalar tr = Rnormed.trace(); |
| 81 |
4/8✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
|
17567 | const Scalar cos_value = (tr - Scalar(1)) / Scalar(2); |
| 82 | |||
| 83 |
1/2✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
|
17563 | const Scalar prec = TaylorSeriesExpansion<Scalar>::template precision<2>(); |
| 84 | // Singular cases when theta == PI | ||
| 85 |
1/2✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
|
17563 | Vector3 angle_axis_singular; |
| 86 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
4 | Scalar theta_singular; |
| 87 | |||
| 88 | { | ||
| 89 |
1/2✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
|
17563 | Vector3 val_singular; |
| 90 |
8/16✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16443 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16443 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 16443 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 16443 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 16443 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 16443 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
|
17563 | val_singular.array() = 2 * Rnormed.diagonal().array() - tr + Scalar(1); |
| 91 |
3/6✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16443 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16443 times.
✗ Branch 8 not taken.
|
17563 | Vector3 axis_0, axis_1, axis_2; |
| 92 |
3/6✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
|
4 | Scalar theta_0, theta_1, theta_2; |
| 93 | |||
| 94 |
2/4✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16443 times.
✗ Branch 5 not taken.
|
17563 | internal::compute_theta_axis<0>(val_singular[0], Rnormed, theta_0, axis_0); |
| 95 |
2/4✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16443 times.
✗ Branch 5 not taken.
|
17563 | internal::compute_theta_axis<1>(val_singular[1], Rnormed, theta_1, axis_1); |
| 96 |
2/4✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16443 times.
✗ Branch 5 not taken.
|
17563 | internal::compute_theta_axis<2>(val_singular[2], Rnormed, theta_2, axis_2); |
| 97 | |||
| 98 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
35122 | theta_singular = if_then_else( |
| 99 |
3/6✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16443 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
|
17563 | GE, val_singular[0], val_singular[1], |
| 100 |
3/6✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16443 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16443 times.
✗ Branch 8 not taken.
|
17563 | if_then_else(GE, val_singular[0], val_singular[2], theta_0, theta_2), |
| 101 |
4/8✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16443 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16443 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 16440 times.
✗ Branch 11 not taken.
|
17563 | if_then_else(GE, val_singular[1], val_singular[2], theta_1, theta_2)); |
| 102 | |||
| 103 |
2/2✓ Branch 0 taken 49329 times.
✓ Branch 1 taken 16443 times.
|
70252 | for (int k = 0; k < 3; ++k) |
| 104 |
2/4✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
|
52689 | angle_axis_singular[k] = if_then_else( |
| 105 |
3/6✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49329 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
|
52689 | GE, val_singular[0], val_singular[1], |
| 106 |
5/10✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49329 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 49329 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 49329 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 49329 times.
✗ Branch 14 not taken.
|
52689 | if_then_else(GE, val_singular[0], val_singular[2], axis_0[k], axis_2[k]), |
| 107 |
6/12✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49329 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 49329 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 49329 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 49329 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 49320 times.
✗ Branch 17 not taken.
|
105366 | if_then_else(GE, val_singular[1], val_singular[2], axis_1[k], axis_2[k])); |
| 108 | 4 | } | |
| 109 |
7/14✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
|
17567 | const Scalar acos_expansion = math::sqrt(2 * (1 - cos_value) + eps * eps); |
| 110 |
3/6✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
|
35138 | const Scalar theta_nominal = if_then_else( |
| 111 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
8 | LE, tr, static_cast<Scalar>(Scalar(3) - prec), |
| 112 |
1/2✓ Branch 1 taken 16440 times.
✗ Branch 2 not taken.
|
17559 | if_then_else( |
| 113 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
8 | GE, tr, static_cast<Scalar>(Scalar(-1) + prec), |
| 114 |
1/2✓ Branch 1 taken 16440 times.
✗ Branch 2 not taken.
|
17559 | math::acos(cos_value), // then |
| 115 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
8 | static_cast<Scalar>(PI_value - acos_expansion) // else |
| 116 | ), | ||
| 117 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
17563 | static_cast<Scalar>(acos_expansion) // else |
| 118 | ); | ||
| 119 |
5/11✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16440 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
17563 | assert( |
| 120 | check_expression_if_real<Scalar>(theta_nominal == theta_nominal) | ||
| 121 | && "theta contains some NaN"); // theta != NaN | ||
| 122 | |||
| 123 |
1/2✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
|
17563 | Vector3 antisymmetric_R; |
| 124 |
1/2✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
|
17563 | unSkew(Rnormed, antisymmetric_R); |
| 125 |
1/2✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
|
17563 | const Scalar norm_antisymmetric_R_squared = antisymmetric_R.squaredNorm(); |
| 126 | |||
| 127 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
35122 | const Scalar t = if_then_else( |
| 128 | GE, theta_nominal, prec, | ||
| 129 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
8 | static_cast<Scalar>(theta_nominal / sin(theta_nominal)), // then |
| 130 |
6/12✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
|
24 | static_cast<Scalar>( |
| 131 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
17575 | Scalar(1.) + norm_antisymmetric_R_squared / Scalar(6) |
| 132 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
17567 | + norm_antisymmetric_R_squared * norm_antisymmetric_R_squared * Scalar(3) |
| 133 |
1/2✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
|
17563 | / Scalar(40)) // else |
| 134 | ); | ||
| 135 | |||
| 136 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
35122 | theta = if_then_else( |
| 137 |
2/4✓ Branch 1 taken 16443 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
17567 | GE, cos_value, static_cast<Scalar>(Scalar(-1.) + prec), theta_nominal, theta_singular); |
| 138 | |||
| 139 |
2/2✓ Branch 0 taken 49329 times.
✓ Branch 1 taken 16443 times.
|
70252 | for (int k = 0; k < 3; ++k) |
| 140 |
3/6✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
|
52689 | angle_axis_[k] = if_then_else( |
| 141 |
2/4✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
|
24 | GE, cos_value, static_cast<Scalar>(Scalar(-1.) + prec), |
| 142 |
2/4✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
|
52701 | static_cast<Scalar>(t * antisymmetric_R[k]), |
| 143 |
2/4✓ Branch 1 taken 49329 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 49329 times.
✗ Branch 5 not taken.
|
105378 | static_cast<Scalar>(theta_singular * angle_axis_singular[k])); |
| 144 | 17563 | } | |
| 145 | }; | ||
| 146 | |||
| 147 | /// \brief Generic evaluation of Jlog3 function | ||
| 148 | template<typename _Scalar> | ||
| 149 | struct Jlog3_impl | ||
| 150 | { | ||
| 151 | template<typename Scalar, typename Vector3Like, typename Matrix3Like> | ||
| 152 | 1159 | static void run( | |
| 153 | const Scalar & theta, | ||
| 154 | const Eigen::MatrixBase<Vector3Like> & log, | ||
| 155 | const Eigen::MatrixBase<Matrix3Like> & Jlog) | ||
| 156 | { | ||
| 157 |
2/4✓ Branch 1 taken 641 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 641 times.
✗ Branch 5 not taken.
|
1159 | PINOCCHIO_ASSERT_MATRIX_SPECIFIC_SIZE(Vector3Like, log, 3, 1); |
| 158 |
2/4✓ Branch 1 taken 641 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 641 times.
✗ Branch 5 not taken.
|
1159 | PINOCCHIO_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix3Like, Jlog, 3, 3); |
| 159 | |||
| 160 | using namespace internal; | ||
| 161 | ✗ | Scalar ct, st; | |
| 162 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
1159 | SINCOS(theta, &st, &ct); |
| 163 |
0/6✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
1159 | const Scalar st_1mct = st / (Scalar(1) - ct); |
| 164 |
1/2✓ Branch 1 taken 641 times.
✗ Branch 2 not taken.
|
1159 | const Scalar prec = TaylorSeriesExpansion<Scalar>::template precision<3>(); |
| 165 | |||
| 166 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
2318 | const Scalar alpha = if_then_else( |
| 167 | LT, theta, prec, | ||
| 168 | ✗ | static_cast<Scalar>(Scalar(1) / Scalar(12) + theta * theta / Scalar(720)), // then | |
| 169 |
1/14✓ Branch 1 taken 641 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
|
1159 | static_cast<Scalar>(Scalar(1) / (theta * theta) - st_1mct / (Scalar(2) * theta)) // else |
| 170 | ); | ||
| 171 | |||
| 172 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
2318 | const Scalar diag_value = if_then_else( |
| 173 | LT, theta, prec, | ||
| 174 | ✗ | static_cast<Scalar>(Scalar(0.5) * (2 - theta * theta / Scalar(6))), // then | |
| 175 |
1/6✓ Branch 1 taken 641 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
1159 | static_cast<Scalar>(Scalar(0.5) * (theta * st_1mct)) // else |
| 176 | ); | ||
| 177 | |||
| 178 | 1159 | Matrix3Like & Jlog_ = PINOCCHIO_EIGEN_CONST_CAST(Matrix3Like, Jlog); | |
| 179 |
5/10✓ Branch 1 taken 641 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 641 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 641 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 641 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 641 times.
✗ Branch 14 not taken.
|
1159 | Jlog_.noalias() = alpha * log * log.transpose(); |
| 180 |
3/6✓ Branch 1 taken 641 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 641 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 641 times.
✗ Branch 8 not taken.
|
1159 | Jlog_.diagonal().array() += diag_value; |
| 181 | |||
| 182 | // Jlog += r_{\times}/2 | ||
| 183 |
2/6✓ Branch 1 taken 641 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 641 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
1159 | addSkew(Scalar(0.5) * log, Jlog_); |
| 184 | 1159 | } | |
| 185 | }; | ||
| 186 | |||
| 187 | /// \brief Generic evaluation of log6 function | ||
| 188 | template<typename _Scalar> | ||
| 189 | struct log6_impl | ||
| 190 | { | ||
| 191 | template<typename Scalar, int Options, typename MotionDerived> | ||
| 192 | 14826 | static void run(const SE3Tpl<Scalar, Options> & M, MotionDense<MotionDerived> & mout) | |
| 193 | { | ||
| 194 | typedef SE3Tpl<Scalar, Options> SE3; | ||
| 195 | typedef typename SE3::Vector3 Vector3; | ||
| 196 | |||
| 197 |
1/2✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
|
14826 | typename SE3::ConstAngularRef R = M.rotation(); |
| 198 |
1/2✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
|
14826 | typename SE3::ConstLinearRef p = M.translation(); |
| 199 | |||
| 200 | using namespace internal; | ||
| 201 | |||
| 202 |
1/2✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
|
14826 | Vector3 antisymmetric_R; |
| 203 |
1/2✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
|
14826 | unSkew(R, antisymmetric_R); |
| 204 |
1/2✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
|
14826 | const Scalar norm_antisymmetric_R_squared = antisymmetric_R.squaredNorm(); |
| 205 | |||
| 206 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Scalar theta; |
| 207 |
1/2✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
|
14826 | const Scalar tr = R.trace(); |
| 208 |
1/2✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
|
14826 | const Vector3 w(log3(R, theta)); // t in [0,Ï€] |
| 209 | 14826 | const Scalar & t2 = norm_antisymmetric_R_squared; | |
| 210 | |||
| 211 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | Scalar st, ct; |
| 212 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
14826 | SINCOS(theta, &st, &ct); |
| 213 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
29651 | const Scalar alpha = if_then_else( |
| 214 | GE, tr, | ||
| 215 |
3/6✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
14827 | static_cast<Scalar>(Scalar(3) - TaylorSeriesExpansion<Scalar>::template precision<2>()), |
| 216 |
8/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
|
2 | static_cast<Scalar>(Scalar(1) - t2 / Scalar(12) - t2 * t2 / Scalar(720)), // then |
| 217 |
6/12✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
14827 | static_cast<Scalar>(theta * st / (Scalar(2) * (Scalar(1) - ct))) // else |
| 218 | ); | ||
| 219 | |||
| 220 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
29651 | const Scalar beta = if_then_else( |
| 221 | GE, tr, | ||
| 222 |
3/6✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
14827 | static_cast<Scalar>(Scalar(3) - TaylorSeriesExpansion<Scalar>::template precision<2>()), |
| 223 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
2 | static_cast<Scalar>(Scalar(1) / Scalar(12) + t2 / Scalar(720)), // then |
| 224 |
7/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
|
6 | static_cast<Scalar>( |
| 225 |
3/6✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
14830 | Scalar(1) / (theta * theta) - st / (Scalar(2) * theta * (Scalar(1) - ct))) // else |
| 226 | ); | ||
| 227 | |||
| 228 |
12/24✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14826 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14826 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 14826 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 14826 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 14826 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 14826 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 14826 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 14826 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 14826 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
|
14826 | mout.linear().noalias() = alpha * p - Scalar(0.5) * w.cross(p) + (beta * w.dot(p)) * w; |
| 229 |
2/4✓ Branch 1 taken 14826 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14826 times.
✗ Branch 5 not taken.
|
14826 | mout.angular() = w; |
| 230 | 14826 | } | |
| 231 | |||
| 232 | template<typename Vector3Like, typename QuaternionLike, typename MotionDerived> | ||
| 233 | 8075 | static void run( | |
| 234 | const Eigen::QuaternionBase<QuaternionLike> & quat, | ||
| 235 | const Eigen::MatrixBase<Vector3Like> & vec, | ||
| 236 | MotionDense<MotionDerived> & mout) | ||
| 237 | { | ||
| 238 |
2/4✓ Branch 1 taken 8075 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8075 times.
✗ Branch 5 not taken.
|
8075 | PINOCCHIO_ASSERT_MATRIX_SPECIFIC_SIZE(Vector3Like, vec, 3, 1); |
| 239 | |||
| 240 | typedef typename Vector3Like::Scalar Scalar; | ||
| 241 | enum | ||
| 242 | { | ||
| 243 | Options = PINOCCHIO_EIGEN_PLAIN_TYPE(Vector3Like)::Options | ||
| 244 | }; | ||
| 245 | typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3; | ||
| 246 |
1/2✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
|
8075 | const Scalar eps = Eigen::NumTraits<Scalar>::epsilon(); |
| 247 | |||
| 248 | using namespace internal; | ||
| 249 | |||
| 250 |
5/10✓ Branch 1 taken 8075 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8075 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 165 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 165 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 165 times.
✗ Branch 14 not taken.
|
8240 | const Scalar pos_neg = if_then_else(GE, quat.w(), Scalar(0), Scalar(+1), Scalar(-1)); |
| 251 | |||
| 252 |
1/2✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
|
165 | Scalar theta; |
| 253 |
1/2✓ Branch 1 taken 8075 times.
✗ Branch 2 not taken.
|
8075 | Vector3 w(quaternion::log3(quat, theta)); // theta nonsingular by construction |
| 254 |
1/2✓ Branch 1 taken 8075 times.
✗ Branch 2 not taken.
|
8075 | const Scalar t2 = w.squaredNorm(); |
| 255 | |||
| 256 | // Scalar st,ct; SINCOS(theta,&st,&ct); | ||
| 257 |
2/4✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 165 times.
✗ Branch 5 not taken.
|
165 | Scalar st_2, ct_2; |
| 258 |
3/6✓ Branch 1 taken 8075 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 165 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 165 times.
✗ Branch 8 not taken.
|
8075 | ct_2 = pos_neg * quat.w(); |
| 259 |
6/12✓ Branch 1 taken 8075 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8075 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 165 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 165 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 165 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 165 times.
✗ Branch 17 not taken.
|
8075 | st_2 = math::sqrt(quat.vec().squaredNorm() + eps * eps); |
| 260 |
1/2✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
|
8075 | const Scalar cot_th_2 = ct_2 / st_2; |
| 261 | // const Scalar cot_th_2 = ( st / (Scalar(1) - ct) ); // cotan of half angle | ||
| 262 | |||
| 263 | // we use formula (9.26) from | ||
| 264 | // https://ingmec.ual.es/~jlblanco/papers/jlblanco2010geometry3D_techrep.pdf for the linear | ||
| 265 | // part of the Log map. A Taylor series expansion of cotan can be used up to order 4 | ||
| 266 |
2/4✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 165 times.
✗ Branch 5 not taken.
|
8075 | const Scalar th_2_squared = t2 / Scalar(4); // (theta / 2) squared |
| 267 | |||
| 268 | // const Scalar alpha = if_then_else(LE,theta,TaylorSeriesExpansion<Scalar>::template | ||
| 269 | // precision<3>(), | ||
| 270 | // static_cast<Scalar>(Scalar(1) - t2/Scalar(12) - | ||
| 271 | // t2*t2/Scalar(720)), // then | ||
| 272 | // static_cast<Scalar>(theta * cot_th_2 /(Scalar(2))) | ||
| 273 | // // else | ||
| 274 | // ); | ||
| 275 | |||
| 276 |
8/16✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 165 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 165 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 165 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 165 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 165 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 165 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 165 times.
✗ Branch 23 not taken.
|
8240 | const Scalar beta_alt = (Scalar(1) / Scalar(3) - th_2_squared / Scalar(45)) / Scalar(4); |
| 277 |
2/4✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 165 times.
✗ Branch 5 not taken.
|
16150 | const Scalar beta = if_then_else( |
| 278 |
1/2✓ Branch 1 taken 7910 times.
✗ Branch 2 not taken.
|
7910 | LE, theta, TaylorSeriesExpansion<Scalar>::template precision<3>(), |
| 279 |
1/2✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
|
330 | static_cast<Scalar>(beta_alt), // then |
| 280 |
6/12✓ Branch 1 taken 8075 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 165 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 165 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 165 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 165 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 165 times.
✗ Branch 17 not taken.
|
8240 | static_cast<Scalar>(Scalar(1) / t2 - cot_th_2 * Scalar(0.5) / theta) // else |
| 281 | // static_cast<Scalar>(Scalar(1) / t2 - st/(Scalar(2)*theta*(Scalar(1)-ct))) // else | ||
| 282 | ); | ||
| 283 | |||
| 284 | // mout.linear().noalias() = alpha * vec - Scalar(0.5) * w.cross(vec) + (beta * w.dot(vec)) * | ||
| 285 | // w; | ||
| 286 |
11/22✓ Branch 1 taken 8075 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8075 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8075 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8075 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8075 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 8075 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 8075 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 8075 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 8075 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 8075 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 165 times.
✗ Branch 32 not taken.
|
8075 | mout.linear().noalias() = vec - Scalar(0.5) * w.cross(vec) + beta * w.cross(w.cross(vec)); |
| 287 |
2/4✓ Branch 1 taken 8075 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8075 times.
✗ Branch 5 not taken.
|
8075 | mout.angular() = w; |
| 288 | 8075 | } | |
| 289 | }; | ||
| 290 | |||
| 291 | template<typename _Scalar> | ||
| 292 | struct Jlog6_impl | ||
| 293 | { | ||
| 294 | template<typename Scalar, int Options, typename Matrix6Like> | ||
| 295 | 420 | static void run(const SE3Tpl<Scalar, Options> & M, const Eigen::MatrixBase<Matrix6Like> & Jlog) | |
| 296 | { | ||
| 297 |
2/4✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 374 times.
✗ Branch 5 not taken.
|
420 | PINOCCHIO_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix6Like, Jlog, 6, 6); |
| 298 | |||
| 299 | typedef SE3Tpl<Scalar, Options> SE3; | ||
| 300 | typedef typename SE3::Vector3 Vector3; | ||
| 301 | 420 | Matrix6Like & value = PINOCCHIO_EIGEN_CONST_CAST(Matrix6Like, Jlog); | |
| 302 | |||
| 303 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | typename SE3::ConstAngularRef R = M.rotation(); |
| 304 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | typename SE3::ConstLinearRef p = M.translation(); |
| 305 | |||
| 306 | using namespace internal; | ||
| 307 | |||
| 308 | ✗ | Scalar t; | |
| 309 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | Vector3 w(log3(R, t)); |
| 310 | |||
| 311 | // value is decomposed as following: | ||
| 312 | // value = [ A, B; | ||
| 313 | // C, D ] | ||
| 314 | typedef Eigen::Block<Matrix6Like, 3, 3> Block33; | ||
| 315 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | Block33 A = value.template topLeftCorner<3, 3>(); |
| 316 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | Block33 B = value.template topRightCorner<3, 3>(); |
| 317 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | Block33 C = value.template bottomLeftCorner<3, 3>(); |
| 318 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | Block33 D = value.template bottomRightCorner<3, 3>(); |
| 319 | |||
| 320 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | Jlog3(t, w, A); |
| 321 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | D = A; |
| 322 | |||
| 323 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
420 | const Scalar t2 = t * t; |
| 324 |
0/6✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
420 | const Scalar tinv = Scalar(1) / t, t2inv = tinv * tinv; |
| 325 | |||
| 326 | ✗ | Scalar st, ct; | |
| 327 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
420 | SINCOS(t, &st, &ct); |
| 328 |
0/12✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
420 | const Scalar inv_2_2ct = Scalar(1) / (Scalar(2) * (Scalar(1) - ct)); |
| 329 | |||
| 330 |
0/4✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
840 | const Scalar beta = if_then_else( |
| 331 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | LT, t, TaylorSeriesExpansion<Scalar>::template precision<3>(), |
| 332 | ✗ | static_cast<Scalar>(Scalar(1) / Scalar(12) + t2 / Scalar(720)), // then | |
| 333 |
1/6✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
420 | static_cast<Scalar>(t2inv - st * tinv * inv_2_2ct) // else |
| 334 | ); | ||
| 335 | |||
| 336 |
0/4✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
840 | const Scalar beta_dot_over_theta = if_then_else( |
| 337 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | LT, t, TaylorSeriesExpansion<Scalar>::template precision<3>(), |
| 338 | ✗ | static_cast<Scalar>(Scalar(1) / Scalar(360)), // then | |
| 339 | ✗ | static_cast<Scalar>( | |
| 340 |
1/4✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
420 | -Scalar(2) * t2inv * t2inv + (Scalar(1) + st * tinv) * t2inv * inv_2_2ct) // else |
| 341 | ); | ||
| 342 | |||
| 343 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | const Scalar wTp = w.dot(p); |
| 344 |
2/16✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 374 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
420 | const Vector3 v3_tmp( |
| 345 |
2/4✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 374 times.
✗ Branch 5 not taken.
|
420 | (beta_dot_over_theta * wTp) * w - (t2 * beta_dot_over_theta + Scalar(2) * beta) * p); |
| 346 | // C can be treated as a temporary variable | ||
| 347 |
4/8✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 374 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 374 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 374 times.
✗ Branch 11 not taken.
|
420 | C.noalias() = v3_tmp * w.transpose(); |
| 348 |
5/10✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 374 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 374 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 374 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 374 times.
✗ Branch 14 not taken.
|
420 | C.noalias() += beta * w * p.transpose(); |
| 349 |
3/8✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 374 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 374 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
420 | C.diagonal().array() += wTp * beta; |
| 350 |
2/6✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 374 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
420 | addSkew(Scalar(.5) * p, C); |
| 351 | |||
| 352 |
3/6✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 374 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 374 times.
✗ Branch 8 not taken.
|
420 | B.noalias() = C * A; |
| 353 |
1/2✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
|
420 | C.setZero(); |
| 354 | 420 | } | |
| 355 | }; | ||
| 356 | |||
| 357 | } // namespace pinocchio | ||
| 358 | |||
| 359 | #endif // ifndef __pinocchio_spatial_log_hxx__ | ||
| 360 |