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 |