Directory: | ./ |
---|---|
File: | include/pinocchio/spatial/inertia.hpp |
Date: | 2025-02-12 21:03:38 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 517 | 522 | 99.0% |
Branches: | 620 | 2224 | 27.9% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | // | ||
2 | // Copyright (c) 2015-2021 CNRS INRIA | ||
3 | // Copyright (c) 2016 Wandercraft, 86 rue de Paris 91400 Orsay, France. | ||
4 | // | ||
5 | |||
6 | #ifndef __pinocchio_spatial_inertia_hpp__ | ||
7 | #define __pinocchio_spatial_inertia_hpp__ | ||
8 | |||
9 | #include "pinocchio/math/fwd.hpp" | ||
10 | #include "pinocchio/spatial/symmetric3.hpp" | ||
11 | #include "pinocchio/spatial/force.hpp" | ||
12 | #include "pinocchio/spatial/motion.hpp" | ||
13 | #include "pinocchio/spatial/skew.hpp" | ||
14 | |||
15 | namespace pinocchio | ||
16 | { | ||
17 | template<class Derived> | ||
18 | struct InertiaBase : NumericalBase<Derived> | ||
19 | { | ||
20 | SPATIAL_TYPEDEF_TEMPLATE(Derived); | ||
21 | |||
22 | 105492 | Derived & derived() | |
23 | { | ||
24 | 105492 | return *static_cast<Derived *>(this); | |
25 | } | ||
26 | 385786 | const Derived & derived() const | |
27 | { | ||
28 | 386071 | return *static_cast<const Derived *>(this); | |
29 | } | ||
30 | |||
31 | Derived & const_cast_derived() const | ||
32 | { | ||
33 | return *const_cast<Derived *>(&derived()); | ||
34 | } | ||
35 | |||
36 | Scalar mass() const | ||
37 | { | ||
38 | return static_cast<const Derived *>(this)->mass(); | ||
39 | } | ||
40 | Scalar & mass() | ||
41 | { | ||
42 | return static_cast<const Derived *>(this)->mass(); | ||
43 | } | ||
44 | const Vector3 & lever() const | ||
45 | { | ||
46 | return static_cast<const Derived *>(this)->lever(); | ||
47 | } | ||
48 | Vector3 & lever() | ||
49 | { | ||
50 | return static_cast<const Derived *>(this)->lever(); | ||
51 | } | ||
52 | const Symmetric3 & inertia() const | ||
53 | { | ||
54 | return static_cast<const Derived *>(this)->inertia(); | ||
55 | } | ||
56 | Symmetric3 & inertia() | ||
57 | { | ||
58 | return static_cast<const Derived *>(this)->inertia(); | ||
59 | } | ||
60 | |||
61 | template<typename Matrix6Like> | ||
62 | void matrix(const Eigen::MatrixBase<Matrix6Like> & mat) const | ||
63 | { | ||
64 | derived().matrix_impl(mat); | ||
65 | } | ||
66 | 9694 | Matrix6 matrix() const | |
67 | { | ||
68 | 9694 | return derived().matrix_impl(); | |
69 | } | ||
70 | 862 | operator Matrix6() const | |
71 | { | ||
72 | 862 | return matrix(); | |
73 | } | ||
74 | |||
75 | template<typename Matrix6Like> | ||
76 | void inverse(const Eigen::MatrixBase<Matrix6Like> & mat) const | ||
77 | { | ||
78 | derived().inverse_impl(mat); | ||
79 | } | ||
80 | 1 | Matrix6 inverse() const | |
81 | { | ||
82 | 1 | return derived().inverse_impl(); | |
83 | } | ||
84 | |||
85 | Derived & operator=(const Derived & clone) | ||
86 | { | ||
87 | return derived().__equl__(clone); | ||
88 | } | ||
89 | 11748 | bool operator==(const Derived & other) const | |
90 | { | ||
91 | 11748 | return derived().isEqual(other); | |
92 | } | ||
93 | 647 | bool operator!=(const Derived & other) const | |
94 | { | ||
95 | 647 | return !(*this == other); | |
96 | } | ||
97 | |||
98 | 105489 | Derived & operator+=(const Derived & Yb) | |
99 | { | ||
100 | 105489 | return derived().__pequ__(Yb); | |
101 | } | ||
102 | 100007 | Derived operator+(const Derived & Yb) const | |
103 | { | ||
104 | 100007 | return derived().__plus__(Yb); | |
105 | } | ||
106 | 3 | Derived & operator-=(const Derived & Yb) | |
107 | { | ||
108 | 3 | return derived().__mequ__(Yb); | |
109 | } | ||
110 | 1 | Derived operator-(const Derived & Yb) const | |
111 | { | ||
112 | 1 | return derived().__minus__(Yb); | |
113 | } | ||
114 | |||
115 | template<typename MotionDerived> | ||
116 | ForceTpl<typename traits<MotionDerived>::Scalar, traits<MotionDerived>::Options> | ||
117 | 167614 | operator*(const MotionDense<MotionDerived> & v) const | |
118 | { | ||
119 | 167614 | return derived().__mult__(v); | |
120 | } | ||
121 | |||
122 | template<typename MotionDerived> | ||
123 | 7523 | Scalar vtiv(const MotionDense<MotionDerived> & v) const | |
124 | { | ||
125 | 7523 | return derived().vtiv_impl(v); | |
126 | } | ||
127 | |||
128 | template<typename MotionDerived> | ||
129 | Matrix6 variation(const MotionDense<MotionDerived> & v) const | ||
130 | { | ||
131 | return derived().variation_impl(v); | ||
132 | } | ||
133 | |||
134 | /// \brief Time variation operator. | ||
135 | /// It computes the time derivative of an inertia I corresponding to the formula \f$ | ||
136 | /// \dot{I} = v \times^{*} I \f$. | ||
137 | /// | ||
138 | /// \param[in] v The spatial velocity of the frame supporting the inertia. | ||
139 | /// \param[in] I The spatial inertia in motion. | ||
140 | /// \param[out] Iout The time derivative of the inertia I. | ||
141 | /// | ||
142 | template<typename MotionDerived, typename M6> | ||
143 | static void | ||
144 | 131 | vxi(const MotionDense<MotionDerived> & v, const Derived & I, const Eigen::MatrixBase<M6> & Iout) | |
145 | { | ||
146 | EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(M6, Matrix6); | ||
147 | 131 | Derived::vxi_impl(v, I, Iout); | |
148 | 131 | } | |
149 | |||
150 | template<typename MotionDerived> | ||
151 | 129 | Matrix6 vxi(const MotionDense<MotionDerived> & v) const | |
152 | { | ||
153 | 129 | Matrix6 Iout; | |
154 |
0/2✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
129 | vxi(v, derived(), Iout); |
155 | 129 | return Iout; | |
156 | } | ||
157 | |||
158 | /// \brief Time variation operator. | ||
159 | /// It computes the time derivative of an inertia I corresponding to the formula \f$ | ||
160 | /// \dot{I} = v \times^{*} I \f$. | ||
161 | /// | ||
162 | /// \param[in] v The spatial velocity of the frame supporting the inertia. | ||
163 | /// \param[in] I The spatial inertia in motion. | ||
164 | /// \param[out] Iout The time derivative of the inertia I. | ||
165 | /// | ||
166 | template<typename MotionDerived, typename M6> | ||
167 | static void | ||
168 | 3 | ivx(const MotionDense<MotionDerived> & v, const Derived & I, const Eigen::MatrixBase<M6> & Iout) | |
169 | { | ||
170 | EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(M6, Matrix6); | ||
171 | 3 | Derived::ivx_impl(v, I, Iout); | |
172 | 3 | } | |
173 | |||
174 | template<typename MotionDerived> | ||
175 | 1 | Matrix6 ivx(const MotionDense<MotionDerived> & v) const | |
176 | { | ||
177 | 1 | Matrix6 Iout; | |
178 |
0/2✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1 | ivx(v, derived(), Iout); |
179 | 1 | return Iout; | |
180 | } | ||
181 | |||
182 | void setZero() | ||
183 | { | ||
184 | derived().setZero(); | ||
185 | } | ||
186 | void setIdentity() | ||
187 | { | ||
188 | derived().setIdentity(); | ||
189 | } | ||
190 | void setRandom() | ||
191 | { | ||
192 | derived().setRandom(); | ||
193 | } | ||
194 | |||
195 | 1307 | bool isApprox( | |
196 | const Derived & other, | ||
197 | const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision()) const | ||
198 | { | ||
199 | 1307 | return derived().isApprox_impl(other, prec); | |
200 | } | ||
201 | |||
202 | 2334 | bool isZero(const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision()) const | |
203 | { | ||
204 | 2334 | return derived().isZero_impl(prec); | |
205 | } | ||
206 | |||
207 | /// aI = aXb.act(bI) | ||
208 | template<typename S2, int O2> | ||
209 | 106157 | Derived se3Action(const SE3Tpl<S2, O2> & M) const | |
210 | { | ||
211 | 106157 | return derived().se3Action_impl(M); | |
212 | } | ||
213 | |||
214 | /// bI = aXb.actInv(aI) | ||
215 | template<typename S2, int O2> | ||
216 | 9 | Derived se3ActionInverse(const SE3Tpl<S2, O2> & M) const | |
217 | { | ||
218 | 9 | return derived().se3ActionInverse_impl(M); | |
219 | } | ||
220 | |||
221 | 100009 | void disp(std::ostream & os) const | |
222 | { | ||
223 | 100009 | static_cast<const Derived *>(this)->disp_impl(os); | |
224 | 100009 | } | |
225 | 100009 | friend std::ostream & operator<<(std::ostream & os, const InertiaBase<Derived> & X) | |
226 | { | ||
227 | 100009 | X.disp(os); | |
228 | 100009 | return os; | |
229 | } | ||
230 | }; | ||
231 | |||
232 | // class InertiaBase | ||
233 | template<typename T, int U> | ||
234 | struct traits<InertiaTpl<T, U>> | ||
235 | { | ||
236 | typedef T Scalar; | ||
237 | typedef Eigen::Matrix<T, 3, 1, U> Vector3; | ||
238 | typedef Eigen::Matrix<T, 4, 1, U> Vector4; | ||
239 | typedef Eigen::Matrix<T, 6, 1, U> Vector6; | ||
240 | typedef Eigen::Matrix<T, 3, 3, U> Matrix3; | ||
241 | typedef Eigen::Matrix<T, 4, 4, U> Matrix4; | ||
242 | typedef Eigen::Matrix<T, 6, 6, U> Matrix6; | ||
243 | typedef Eigen::Matrix<T, 10, 10, U> Matrix10; | ||
244 | typedef Matrix6 ActionMatrix_t; | ||
245 | typedef Vector3 Angular_t; | ||
246 | typedef Vector3 Linear_t; | ||
247 | typedef const Vector3 ConstAngular_t; | ||
248 | typedef const Vector3 ConstLinear_t; | ||
249 | typedef Eigen::Quaternion<T, U> Quaternion_t; | ||
250 | typedef SE3Tpl<T, U> SE3; | ||
251 | typedef ForceTpl<T, U> Force; | ||
252 | typedef MotionTpl<T, U> Motion; | ||
253 | typedef Symmetric3Tpl<T, U> Symmetric3; | ||
254 | typedef PseudoInertiaTpl<T, U> PseudoInertia; | ||
255 | typedef LogCholeskyParametersTpl<T, U> LogCholeskyParameters; | ||
256 | enum | ||
257 | { | ||
258 | LINEAR = 0, | ||
259 | ANGULAR = 3 | ||
260 | }; | ||
261 | }; // traits InertiaTpl | ||
262 | |||
263 | template<typename _Scalar, int _Options> | ||
264 | struct InertiaTpl : public InertiaBase<InertiaTpl<_Scalar, _Options>> | ||
265 | { | ||
266 | EIGEN_MAKE_ALIGNED_OPERATOR_NEW | ||
267 | |||
268 | SPATIAL_TYPEDEF_TEMPLATE(InertiaTpl); | ||
269 | enum | ||
270 | { | ||
271 | Options = _Options | ||
272 | }; | ||
273 | |||
274 | typedef typename Symmetric3::AlphaSkewSquare AlphaSkewSquare; | ||
275 | typedef Eigen::Matrix<Scalar, 10, 1, Options> Vector10; | ||
276 | typedef Eigen::Matrix<Scalar, 10, 10, Options> Matrix10; | ||
277 | typedef PseudoInertiaTpl<Scalar, Options> PseudoInertia; | ||
278 | typedef LogCholeskyParametersTpl<Scalar, Options> LogCholeskyParameters; | ||
279 | |||
280 | // Constructors | ||
281 | 1779 | InertiaTpl() | |
282 |
2/4✓ Branch 2 taken 411 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 411 times.
✗ Branch 6 not taken.
|
1779 | { |
283 | 1779 | } | |
284 | |||
285 | 3042 | InertiaTpl(const Scalar & mass, const Vector3 & com, const Matrix3 & rotational_inertia) | |
286 | 3042 | : m_mass(mass) | |
287 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
3042 | , m_com(com) |
288 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
3042 | , m_inertia(rotational_inertia) |
289 | { | ||
290 | 3042 | } | |
291 | |||
292 | 1 | explicit InertiaTpl(const Matrix6 & I6) | |
293 | 1 | { | |
294 |
5/10✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
|
1 | assert(check_expression_if_real<Scalar>(pinocchio::isZero(I6 - I6.transpose()))); |
295 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mass() = I6(LINEAR, LINEAR); |
296 | const typename Matrix6::template ConstFixedBlockXpr<3, 3>::Type mc_cross = | ||
297 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | I6.template block<3, 3>(ANGULAR, LINEAR); |
298 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | lever() = unSkew(mc_cross); |
299 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | lever() /= mass(); |
300 | |||
301 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | Matrix3 I3(mc_cross * mc_cross); |
302 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | I3 /= mass(); |
303 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | I3 += I6.template block<3, 3>(ANGULAR, ANGULAR); |
304 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const Symmetric3 S3(I3); |
305 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | inertia() = S3; |
306 | 1 | } | |
307 | |||
308 | 479801 | InertiaTpl(const Scalar & mass, const Vector3 & com, const Symmetric3 & rotational_inertia) | |
309 | 479801 | : m_mass(mass) | |
310 |
1/2✓ Branch 1 taken 2317 times.
✗ Branch 2 not taken.
|
479801 | , m_com(com) |
311 |
1/2✓ Branch 1 taken 2317 times.
✗ Branch 2 not taken.
|
479801 | , m_inertia(rotational_inertia) |
312 | { | ||
313 | 479801 | } | |
314 | |||
315 | 581906 | InertiaTpl(const InertiaTpl & clone) // Copy constructor | |
316 | 581906 | : m_mass(clone.mass()) | |
317 |
1/2✓ Branch 2 taken 2393 times.
✗ Branch 3 not taken.
|
581906 | , m_com(clone.lever()) |
318 |
1/2✓ Branch 2 taken 2393 times.
✗ Branch 3 not taken.
|
581906 | , m_inertia(clone.inertia()) |
319 | { | ||
320 | 581906 | } | |
321 | |||
322 | 116323 | InertiaTpl & operator=(const InertiaTpl & clone) // Copy assignment operator | |
323 | { | ||
324 |
1/2✓ Branch 2 taken 1423 times.
✗ Branch 3 not taken.
|
116323 | m_mass = clone.mass(); |
325 | 116323 | m_com = clone.lever(); | |
326 | 116323 | m_inertia = clone.inertia(); | |
327 | 116323 | return *this; | |
328 | } | ||
329 | |||
330 | template<typename S2, int O2> | ||
331 | 1 | explicit InertiaTpl(const InertiaTpl<S2, O2> & clone) | |
332 | 1 | { | |
333 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | *this = clone.template cast<Scalar>(); |
334 | 1 | } | |
335 | |||
336 | // Initializers | ||
337 | 53107 | static InertiaTpl Zero() | |
338 | { | ||
339 |
4/8✓ Branch 2 taken 52050 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 52050 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 52050 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 930 times.
✗ Branch 12 not taken.
|
106214 | return InertiaTpl(Scalar(0), Vector3::Zero(), Symmetric3::Zero()); |
340 | } | ||
341 | |||
342 | 2402 | void setZero() | |
343 | { | ||
344 |
1/2✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
2402 | mass() = Scalar(0); |
345 | 2402 | lever().setZero(); | |
346 | 2402 | inertia().setZero(); | |
347 | 2402 | } | |
348 | |||
349 | 292 | static InertiaTpl Identity() | |
350 | { | ||
351 |
3/8✓ Branch 2 taken 292 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 292 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 292 times.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
|
584 | return InertiaTpl(Scalar(1), Vector3::Zero(), Symmetric3::Identity()); |
352 | } | ||
353 | |||
354 | 1 | void setIdentity() | |
355 | { | ||
356 |
0/2✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | mass() = Scalar(1); |
357 | 1 | lever().setZero(); | |
358 | 1 | inertia().setIdentity(); | |
359 | 1 | } | |
360 | |||
361 | 211236 | static InertiaTpl Random() | |
362 | { | ||
363 | // We have to shoot "I" definite positive and not only symmetric. | ||
364 | return InertiaTpl( | ||
365 |
4/12✓ Branch 2 taken 211236 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 211236 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 211236 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 211236 times.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
422472 | Eigen::internal::random<Scalar>() + 1, Vector3::Random(), Symmetric3::RandomPositive()); |
366 | } | ||
367 | |||
368 | /// | ||
369 | /// \brief Computes the Inertia of a sphere defined by its mass and its radius. | ||
370 | /// | ||
371 | /// \param[in] mass of the sphere. | ||
372 | /// \param[in] radius of the sphere. | ||
373 | /// | ||
374 | 7 | static InertiaTpl FromSphere(const Scalar mass, const Scalar radius) | |
375 | { | ||
376 |
0/8✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
|
7 | return FromEllipsoid(mass, radius, radius, radius); |
377 | } | ||
378 | |||
379 | /// | ||
380 | /// \brief Computes the Inertia of an ellipsoid defined by its mass and main semi-axis | ||
381 | /// dimensions (x,y,z). | ||
382 | /// | ||
383 | /// \param[in] mass of the ellipsoid. | ||
384 | /// \param[in] x semi-axis dimension along the local X axis. | ||
385 | /// \param[in] y semi-axis dimension along the local Y axis. | ||
386 | /// \param[in] z semi-axis dimension along the local Z axis. | ||
387 | /// | ||
388 | static InertiaTpl | ||
389 | 14 | FromEllipsoid(const Scalar mass, const Scalar x, const Scalar y, const Scalar z) | |
390 | { | ||
391 |
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.
|
14 | const Scalar a = mass * (y * y + z * z) / Scalar(5); |
392 |
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.
|
14 | const Scalar b = mass * (x * x + z * z) / Scalar(5); |
393 |
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.
|
14 | const Scalar c = mass * (y * y + x * x) / Scalar(5); |
394 | return InertiaTpl( | ||
395 |
4/14✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 14 times.
✗ 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.
|
14 | mass, Vector3::Zero(), Symmetric3(a, Scalar(0), b, Scalar(0), Scalar(0), c)); |
396 | } | ||
397 | |||
398 | /// | ||
399 | /// \brief Computes the Inertia of a cylinder defined by its mass, radius and length along the Z | ||
400 | /// axis. | ||
401 | /// | ||
402 | /// \param[in] mass of the cylinder. | ||
403 | /// \param[in] radius of the cylinder. | ||
404 | /// \param[in] length of the cylinder. | ||
405 | /// | ||
406 | 10 | static InertiaTpl FromCylinder(const Scalar mass, const Scalar radius, const Scalar length) | |
407 | { | ||
408 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
10 | const Scalar radius_square = radius * radius; |
409 |
0/14✗ 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.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
|
10 | const Scalar a = mass * (radius_square / Scalar(4) + length * length / Scalar(12)); |
410 |
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.
|
10 | const Scalar c = mass * (radius_square / Scalar(2)); |
411 | return InertiaTpl( | ||
412 |
4/14✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 10 times.
✗ 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.
|
10 | mass, Vector3::Zero(), Symmetric3(a, Scalar(0), a, Scalar(0), Scalar(0), c)); |
413 | } | ||
414 | |||
415 | /// | ||
416 | /// \brief Computes the Inertia of a box defined by its mass and main dimensions (x,y,z). | ||
417 | /// | ||
418 | /// \param[in] mass of the box. | ||
419 | /// \param[in] x dimension along the local X axis. | ||
420 | /// \param[in] y dimension along the local Y axis. | ||
421 | /// \param[in] z dimension along the local Z axis. | ||
422 | /// | ||
423 | 12 | static InertiaTpl FromBox(const Scalar mass, const Scalar x, const Scalar y, const Scalar z) | |
424 | { | ||
425 |
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.
|
12 | const Scalar a = mass * (y * y + z * z) / Scalar(12); |
426 |
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.
|
12 | const Scalar b = mass * (x * x + z * z) / Scalar(12); |
427 |
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.
|
12 | const Scalar c = mass * (y * y + x * x) / Scalar(12); |
428 | return InertiaTpl( | ||
429 |
4/14✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 12 times.
✗ 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.
|
12 | mass, Vector3::Zero(), Symmetric3(a, Scalar(0), b, Scalar(0), Scalar(0), c)); |
430 | } | ||
431 | |||
432 | /// | ||
433 | /// \brief Computes the Inertia of a capsule defined by its mass, radius and length along the Z | ||
434 | /// axis. Assumes a uniform density. | ||
435 | /// | ||
436 | /// \param[in] mass of the capsule. | ||
437 | /// \param[in] radius of the capsule. | ||
438 | /// \param[in] height of the capsule. | ||
439 | 26 | static InertiaTpl FromCapsule(const Scalar mass, const Scalar radius, const Scalar height) | |
440 | { | ||
441 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
26 | const Scalar pi = boost::math::constants::pi<Scalar>(); |
442 | |||
443 | // first need to compute mass repartition between cylinder and halfsphere | ||
444 |
1/6✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
26 | const Scalar v_cyl = pi * math::pow(radius, 2) * height; |
445 |
1/12✓ Branch 1 taken 26 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.
|
26 | const Scalar v_hs = Scalar(2) / Scalar(3) * math::pow(radius, 3) * pi; |
446 |
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.
|
26 | const Scalar total_v = v_cyl + Scalar(2) * v_hs; |
447 | |||
448 |
0/4✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
26 | const Scalar m_cyl = mass * (v_cyl / total_v); |
449 |
0/4✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
26 | const Scalar m_hs = mass * (v_hs / total_v); |
450 | |||
451 | // Then Distance between halfSphere center and cylindere center. | ||
452 |
0/10✗ 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.
|
26 | const Scalar dist_hc_cyl = height / Scalar(2) + Scalar(0.375) * radius; |
453 | |||
454 | // Computes inertia terms | ||
455 |
0/8✗ 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.
|
26 | const Scalar ix_c = |
456 |
2/8✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
26 | m_cyl * (math::pow(height, 2) / Scalar(12) + math::pow(radius, 2) / Scalar(4)); |
457 |
1/8✓ Branch 1 taken 26 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.
|
26 | const Scalar iz_c = m_cyl * math::pow(radius, 2) / Scalar(2); |
458 | |||
459 | // For halfsphere inertia see, "Dynamics: Theory and Applications" McGraw-Hill, New York, | ||
460 | // 1985, by T.R. Kane and D.A. Levinson, Appendix 23. | ||
461 |
1/8✓ Branch 1 taken 26 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.
|
26 | const Scalar ix_hs = m_hs * math::pow(radius, 2) * Scalar(0.259375); |
462 |
1/8✓ Branch 1 taken 26 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.
|
26 | const Scalar iz_hs = m_hs * math::pow(radius, 2) * Scalar(0.4); |
463 | |||
464 | // Put everything together using the parallel axis theorem | ||
465 |
1/12✓ Branch 1 taken 26 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.
|
26 | const Scalar ix = ix_c + Scalar(2) * (ix_hs + m_hs * math::pow(dist_hc_cyl, 2)); |
466 |
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.
|
26 | const Scalar iz = iz_c + Scalar(2) * iz_hs; |
467 | |||
468 | return InertiaTpl( | ||
469 |
4/14✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 26 times.
✗ 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.
|
26 | mass, Vector3::Zero(), Symmetric3(ix, Scalar(0), ix, Scalar(0), Scalar(0), iz)); |
470 | } | ||
471 | |||
472 | 3 | void setRandom() | |
473 | { | ||
474 |
0/6✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
3 | mass() = static_cast<Scalar>(std::rand()) / static_cast<Scalar>(RAND_MAX); |
475 | 3 | lever().setRandom(); | |
476 | 3 | inertia().setRandom(); | |
477 | 3 | } | |
478 | |||
479 | template<typename Matrix6Like> | ||
480 | 9694 | void matrix_impl(const Eigen::MatrixBase<Matrix6Like> & M_) const | |
481 | { | ||
482 | 9694 | Matrix6Like & M = M_.const_cast_derived(); | |
483 | |||
484 |
1/2✓ Branch 2 taken 9579 times.
✗ Branch 3 not taken.
|
9694 | M.template block<3, 3>(LINEAR, LINEAR).setZero(); |
485 |
4/7✓ Branch 2 taken 9579 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 207 times.
✓ Branch 6 taken 9372 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 207 times.
✗ Branch 9 not taken.
|
9694 | M.template block<3, 3>(LINEAR, LINEAR).diagonal().fill(mass()); |
486 |
5/8✓ Branch 3 taken 207 times.
✓ Branch 4 taken 9372 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 207 times.
✓ Branch 7 taken 9372 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 207 times.
✗ Branch 10 not taken.
|
9694 | M.template block<3, 3>(ANGULAR, LINEAR) = alphaSkew(mass(), lever()); |
487 |
3/6✓ Branch 2 taken 9579 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 9579 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 9579 times.
✗ Branch 9 not taken.
|
9694 | M.template block<3, 3>(LINEAR, ANGULAR) = -M.template block<3, 3>(ANGULAR, LINEAR); |
488 |
4/8✓ Branch 1 taken 9579 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9579 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9579 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9579 times.
✗ Branch 11 not taken.
|
9694 | M.template block<3, 3>(ANGULAR, ANGULAR) = |
489 | 9962 | (inertia() - AlphaSkewSquare(mass(), lever())).matrix(); | |
490 | 9694 | } | |
491 | |||
492 | 9694 | Matrix6 matrix_impl() const | |
493 | { | ||
494 | 9694 | Matrix6 M; | |
495 |
1/2✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
|
9694 | matrix_impl(M); |
496 | 9694 | return M; | |
497 | } | ||
498 | |||
499 | template<typename Matrix6Like> | ||
500 | 1 | void inverse_impl(const Eigen::MatrixBase<Matrix6Like> & M_) const | |
501 | { | ||
502 | 1 | Matrix6Like & M = M_.const_cast_derived(); | |
503 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | inertia().inverse(M.template block<3, 3>(ANGULAR, ANGULAR)); |
504 | |||
505 |
5/10✓ 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.
|
1 | M.template block<3, 3>(LINEAR, ANGULAR).noalias() = |
506 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | -M.template block<3, 3>(ANGULAR, ANGULAR).colwise().cross(lever()); |
507 |
4/8✓ 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.
|
1 | M.template block<3, 3>(ANGULAR, LINEAR) = M.template block<3, 3>(LINEAR, ANGULAR).transpose(); |
508 | |||
509 |
3/11✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
1 | const Scalar &cx = lever()[0], cy = lever()[1], cz = lever()[2]; |
510 | |||
511 |
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.
|
2 | M.template block<3, 3>(LINEAR, LINEAR).col(0).noalias() = |
512 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | cy * M.template block<3, 3>(LINEAR, ANGULAR).col(2) |
513 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | - cz * M.template block<3, 3>(LINEAR, ANGULAR).col(1); |
514 | |||
515 |
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.
|
2 | M.template block<3, 3>(LINEAR, LINEAR).col(1).noalias() = |
516 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | cz * M.template block<3, 3>(LINEAR, ANGULAR).col(0) |
517 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | - cx * M.template block<3, 3>(LINEAR, ANGULAR).col(2); |
518 | |||
519 |
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.
|
2 | M.template block<3, 3>(LINEAR, LINEAR).col(2).noalias() = |
520 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | cx * M.template block<3, 3>(LINEAR, ANGULAR).col(1) |
521 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | - cy * M.template block<3, 3>(LINEAR, ANGULAR).col(0); |
522 | |||
523 |
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.
|
1 | const Scalar m_inv = Scalar(1) / mass(); |
524 |
4/8✓ 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.
|
1 | M.template block<3, 3>(LINEAR, LINEAR).diagonal().array() += m_inv; |
525 | 1 | } | |
526 | |||
527 | 1 | Matrix6 inverse_impl() const | |
528 | { | ||
529 | 1 | Matrix6 res; | |
530 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
1 | inverse_impl(res); |
531 | 1 | return res; | |
532 | } | ||
533 | |||
534 | /** Returns the representation of the matrix as a vector of dynamic parameters. | ||
535 | * The parameters are given as | ||
536 | * \f$ v = [m, mc_x, mc_y, mc_z, I_{xx}, I_{xy}, I_{yy}, I_{xz}, I_{yz}, I_{zz}]^T \f$ | ||
537 | * where \f$ c \f$ is the center of mass, \f$ I = I_C + mS^T(c)S(c) \f$ and \f$ I_C \f$ has its | ||
538 | * origin at the barycenter and \f$ S(c) \f$ is the the skew matrix representation of the cross | ||
539 | * product operator. | ||
540 | */ | ||
541 | 122 | Vector10 toDynamicParameters() const | |
542 | { | ||
543 | 122 | Vector10 v; | |
544 | |||
545 |
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.
|
122 | v[0] = mass(); |
546 |
4/14✗ Branch 2 not taken.
✓ Branch 3 taken 122 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 122 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 122 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 122 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
122 | v.template segment<3>(1).noalias() = mass() * lever(); |
547 |
3/13✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 5 taken 122 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 122 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 122 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
122 | v.template segment<6>(4) = (inertia() - AlphaSkewSquare(mass(), lever())).data(); |
548 | |||
549 | 122 | return v; | |
550 | } | ||
551 | |||
552 | /** Builds and inertia matrix from a vector of dynamic parameters. | ||
553 | * | ||
554 | * @param[in] params The dynamic parameters. | ||
555 | * | ||
556 | * The parameters are given as | ||
557 | * \f$ v = [m, mc_x, mc_y, mc_z, I_{xx}, I_{xy}, I_{yy}, I_{xz}, I_{yz}, I_{zz}]^T \f$ | ||
558 | * where \f$ I = I_C + mS^T(c)S(c) \f$ and \f$ I_C \f$ has its origin at the barycenter. | ||
559 | */ | ||
560 | template<typename Vector10Like> | ||
561 | 11 | static InertiaTpl FromDynamicParameters(const Eigen::MatrixBase<Vector10Like> & params) | |
562 | { | ||
563 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
11 | PINOCCHIO_ASSERT_MATRIX_SPECIFIC_SIZE(Vector10Like, params, 10, 1); |
564 | |||
565 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
11 | const Scalar & mass = params[0]; |
566 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
11 | Vector3 lever = params.template segment<3>(1); |
567 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
11 | lever /= mass; |
568 | |||
569 | return InertiaTpl( | ||
570 |
6/12✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
|
11 | mass, lever, Symmetric3(params.template segment<6>(4)) + AlphaSkewSquare(mass, lever)); |
571 | } | ||
572 | |||
573 | /** | ||
574 | |||
575 | * @brief Create an InertiaTpl object from a PseudoInertia object. | ||
576 | * | ||
577 | * @param pseudo_inertia A PseudoInertia object. | ||
578 | * @return An InertiaTpl object. | ||
579 | */ | ||
580 | |||
581 | ✗ | static InertiaTpl FromPseudoInertia(const PseudoInertia & pseudo_inertia) | |
582 | { | ||
583 | ✗ | return pseudo_inertia.toInertia(); | |
584 | } | ||
585 | |||
586 | /** | ||
587 | * @brief Convert the InertiaTpl object to a 4x4 pseudo inertia matrix. | ||
588 | * | ||
589 | * @return A 4x4 pseudo inertia matrix. | ||
590 | */ | ||
591 | 3 | PseudoInertia toPseudoInertia() const | |
592 | { | ||
593 | 3 | PseudoInertia pseudo_inertia = PseudoInertia::FromInertia(*this); | |
594 | 3 | return pseudo_inertia; | |
595 | } | ||
596 | |||
597 | /** | ||
598 | * @brief Create an InertiaTpl object from log Cholesky parameters. | ||
599 | * | ||
600 | * @param log_cholesky A log cholesky parameters object | ||
601 | * | ||
602 | * @return An InertiaTpl object. | ||
603 | */ | ||
604 | 2 | static InertiaTpl FromLogCholeskyParameters(const LogCholeskyParameters & log_cholesky) | |
605 | { | ||
606 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Vector10 dynamic_params = log_cholesky.toDynamicParameters(); |
607 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
4 | return FromDynamicParameters(dynamic_params); |
608 | } | ||
609 | |||
610 | // Arithmetic operators | ||
611 | InertiaTpl & __equl__(const InertiaTpl & clone) | ||
612 | { | ||
613 | mass() = clone.mass(); | ||
614 | lever() = clone.lever(); | ||
615 | inertia() = clone.inertia(); | ||
616 | return *this; | ||
617 | } | ||
618 | |||
619 | // Required by std::vector boost::python bindings. | ||
620 | 11749 | bool isEqual(const InertiaTpl & Y2) const | |
621 | { | ||
622 |
4/6✓ Branch 2 taken 8104 times.
✓ Branch 3 taken 2 times.
✓ Branch 7 taken 8104 times.
✗ Branch 8 not taken.
✓ Branch 12 taken 8104 times.
✗ Branch 13 not taken.
|
11749 | return (mass() == Y2.mass()) && (lever() == Y2.lever()) && (inertia() == Y2.inertia()); |
623 | } | ||
624 | |||
625 | 1307 | bool isApprox_impl( | |
626 | const InertiaTpl & other, | ||
627 | const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision()) const | ||
628 | { | ||
629 | using math::fabs; | ||
630 | 1307 | return fabs(static_cast<Scalar>(mass() - other.mass())) <= prec | |
631 |
5/10✓ Branch 0 taken 1303 times.
✗ Branch 1 not taken.
✓ Branch 5 taken 1303 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1303 times.
✗ Branch 8 not taken.
✓ Branch 12 taken 1303 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1303 times.
✗ Branch 15 not taken.
|
1307 | && lever().isApprox(other.lever(), prec) && inertia().isApprox(other.inertia(), prec); |
632 | } | ||
633 | |||
634 | 2334 | bool isZero_impl(const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision()) const | |
635 | { | ||
636 | using math::fabs; | ||
637 |
6/10✓ Branch 2 taken 392 times.
✓ Branch 3 taken 1942 times.
✓ Branch 6 taken 392 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 392 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 392 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 392 times.
✗ Branch 15 not taken.
|
2334 | return fabs(mass()) <= prec && lever().isZero(prec) && inertia().isZero(prec); |
638 | } | ||
639 | |||
640 | 100007 | InertiaTpl __plus__(const InertiaTpl & Yb) const | |
641 | { | ||
642 | /* Y_{a+b} = ( m_a+m_b, | ||
643 | * (m_a*c_a + m_b*c_b ) / (m_a + m_b), | ||
644 | * I_a + I_b - (m_a*m_b)/(m_a+m_b) * AB_x * AB_x ) | ||
645 | */ | ||
646 | |||
647 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
100007 | const Scalar eps = ::Eigen::NumTraits<Scalar>::epsilon(); |
648 | |||
649 |
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.
|
100007 | const Scalar & mab = mass() + Yb.mass(); |
650 |
1/6✓ Branch 1 taken 100007 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
100007 | const Scalar mab_inv = Scalar(1) / math::max(mab, eps); |
651 |
2/4✓ Branch 3 taken 100007 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 100007 times.
✗ Branch 7 not taken.
|
100007 | const Vector3 & AB = (lever() - Yb.lever()).eval(); |
652 | return InertiaTpl( | ||
653 | 200014 | mab, (mass() * lever() + Yb.mass() * Yb.lever()) * mab_inv, | |
654 | 100007 | inertia() + Yb.inertia() | |
655 |
9/39✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 100007 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 100007 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 100007 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 100007 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 100007 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 100007 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 100007 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 100007 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 100007 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
|
400028 | - (mass() * Yb.mass() * mab_inv) * typename Symmetric3::SkewSquare(AB)); |
656 | } | ||
657 | |||
658 | 105489 | InertiaTpl & __pequ__(const InertiaTpl & Yb) | |
659 | { | ||
660 |
4/8✓ Branch 0 taken 9 times.
✓ Branch 1 taken 89 times.
✓ 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.
|
133 | static const Scalar eps = ::Eigen::NumTraits<Scalar>::epsilon(); |
661 | |||
662 | 105489 | const InertiaTpl & Ya = *this; | |
663 |
2/4✓ Branch 1 taken 98 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 98 times.
✗ Branch 6 not taken.
|
105489 | const Scalar & mab = mass() + Yb.mass(); |
664 |
3/6✓ Branch 1 taken 105427 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 98 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 98 times.
✗ Branch 8 not taken.
|
105622 | const Scalar mab_inv = Scalar(1) / math::max(mab, eps); |
665 |
2/4✓ Branch 3 taken 105427 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 105427 times.
✗ Branch 7 not taken.
|
105489 | const Vector3 & AB = (Ya.lever() - Yb.lever()).eval(); |
666 |
3/5✓ Branch 2 taken 98 times.
✓ Branch 3 taken 105329 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 98 times.
✗ Branch 7 not taken.
|
105489 | lever() *= (mass() * mab_inv); |
667 |
6/10✓ Branch 2 taken 98 times.
✓ Branch 3 taken 105329 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 98 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 105329 times.
✓ Branch 8 taken 98 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 98 times.
✗ Branch 13 not taken.
|
105489 | lever() += (Yb.mass() * mab_inv) * Yb.lever(); // c *= mab_inv; |
668 |
1/2✓ Branch 3 taken 105427 times.
✗ Branch 4 not taken.
|
105489 | inertia() += Yb.inertia(); |
669 |
7/13✓ Branch 2 taken 98 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 105329 times.
✓ Branch 5 taken 98 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 105427 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 98 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 98 times.
✗ Branch 15 not taken.
✓ Branch 18 taken 98 times.
✗ Branch 19 not taken.
|
105489 | inertia() -= (Ya.mass() * Yb.mass() * mab_inv) * typename Symmetric3::SkewSquare(AB); |
670 |
1/2✓ Branch 2 taken 98 times.
✗ Branch 3 not taken.
|
105489 | mass() = mab; |
671 | 105489 | return *this; | |
672 | 133 | } | |
673 | |||
674 | 1 | InertiaTpl __minus__(const InertiaTpl & Yb) const | |
675 | { | ||
676 | /* Y_{a} = ( m_{a+b}+m_b, | ||
677 | * (m_{a+b}*c_{a+b} - m_b*c_b ) / (m_a), | ||
678 | * I_{a+b} - I_b + (m_a*m_b)/(m_a+m_b) * AB_x * AB_x ) | ||
679 | */ | ||
680 | |||
681 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
1 | const Scalar eps = ::Eigen::NumTraits<Scalar>::epsilon(); |
682 | |||
683 |
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.
|
1 | const Scalar ma = mass() - Yb.mass(); |
684 |
2/7✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
1 | assert(check_expression_if_real<Scalar>(ma >= Scalar(0))); |
685 | |||
686 |
1/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
1 | const Scalar ma_inv = Scalar(1) / math::max(ma, eps); |
687 |
5/19✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
1 | const Vector3 c_a((mass() * lever() - Yb.mass() * Yb.lever()) * ma_inv); |
688 | |||
689 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | const Vector3 AB = c_a - Yb.lever(); |
690 | |||
691 | return InertiaTpl( | ||
692 | ma, c_a, | ||
693 |
5/23✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
1 | inertia() - Yb.inertia() + (ma * Yb.mass() / mass()) * typename Symmetric3::SkewSquare(AB)); |
694 | } | ||
695 | |||
696 | 3 | InertiaTpl & __mequ__(const InertiaTpl & Yb) | |
697 | { | ||
698 | ✗ | static const Scalar eps = ::Eigen::NumTraits<Scalar>::epsilon(); | |
699 | |||
700 |
0/4✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
|
3 | const Scalar ma = mass() - Yb.mass(); |
701 |
2/7✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
3 | assert(check_expression_if_real<Scalar>(ma >= Scalar(0))); |
702 | |||
703 |
1/6✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
3 | const Scalar ma_inv = Scalar(1) / math::max(ma, eps); |
704 | |||
705 |
1/5✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
3 | lever() *= (mass() * ma_inv); |
706 |
3/14✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
|
3 | lever().noalias() -= (Yb.mass() * ma_inv) * Yb.lever(); |
707 | |||
708 |
2/4✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
|
3 | const Vector3 AB = lever() - Yb.lever(); |
709 |
1/2✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
|
3 | inertia() -= Yb.inertia(); |
710 |
3/15✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
|
3 | inertia() += (ma * Yb.mass() / mass()) * typename Symmetric3::SkewSquare(AB); |
711 |
0/2✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3 | mass() = ma; |
712 | |||
713 | 3 | return *this; | |
714 | } | ||
715 | |||
716 | template<typename MotionDerived> | ||
717 | ForceTpl<typename traits<MotionDerived>::Scalar, traits<MotionDerived>::Options> | ||
718 | 167614 | __mult__(const MotionDense<MotionDerived> & v) const | |
719 | { | ||
720 | typedef ForceTpl<typename traits<MotionDerived>::Scalar, traits<MotionDerived>::Options> | ||
721 | ReturnType; | ||
722 | 167614 | ReturnType f; | |
723 |
1/2✓ Branch 1 taken 492 times.
✗ Branch 2 not taken.
|
167614 | __mult__(v, f); |
724 | 167614 | return f; | |
725 | } | ||
726 | |||
727 | template<typename MotionDerived, typename ForceDerived> | ||
728 | 351182 | void __mult__(const MotionDense<MotionDerived> & v, ForceDense<ForceDerived> & f) const | |
729 | { | ||
730 |
12/20✓ Branch 3 taken 248608 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 248608 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 248608 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 886 times.
✓ Branch 13 taken 247722 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 886 times.
✓ Branch 16 taken 247722 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 886 times.
✓ Branch 19 taken 247722 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 886 times.
✓ Branch 22 taken 247722 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 886 times.
✗ Branch 25 not taken.
|
351182 | f.linear().noalias() = mass() * (v.linear() - lever().cross(v.angular())); |
731 |
2/4✓ Branch 2 taken 248608 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 248608 times.
✗ Branch 7 not taken.
|
351182 | Symmetric3::rhsMult(inertia(), v.angular(), f.angular()); |
732 |
3/6✓ Branch 3 taken 248608 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 248608 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 248608 times.
✗ Branch 10 not taken.
|
351182 | f.angular() += lever().cross(f.linear()); |
733 | // f.angular().noalias() = c.cross(f.linear()) + I*v.angular(); | ||
734 | 351182 | } | |
735 | |||
736 | template<typename MotionDerived> | ||
737 | 7523 | Scalar vtiv_impl(const MotionDense<MotionDerived> & v) const | |
738 | { | ||
739 |
2/4✓ Branch 2 taken 7523 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7523 times.
✗ Branch 6 not taken.
|
7523 | const Vector3 cxw(lever().cross(v.angular())); |
740 |
13/22✓ Branch 1 taken 1 times.
✓ Branch 2 taken 7522 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 7522 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 7522 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 7522 times.
✗ Branch 12 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.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
|
7524 | Scalar res = mass() * (v.linear().squaredNorm() - Scalar(2) * v.linear().dot(cxw)); |
741 |
7/12✓ Branch 2 taken 7523 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 7522 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 7522 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
|
7524 | const Vector3 mcxcxw(-mass() * lever().cross(cxw)); |
742 |
3/6✓ Branch 1 taken 7523 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7523 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
7523 | res += v.angular().dot(mcxcxw); |
743 |
4/8✓ Branch 2 taken 7523 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7523 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7523 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
|
7523 | res += inertia().vtiv(v.angular()); |
744 | |||
745 | 7524 | return res; | |
746 | 1 | } | |
747 | |||
748 | template<typename MotionDerived> | ||
749 | 15291 | Matrix6 variation(const MotionDense<MotionDerived> & v) const | |
750 | { | ||
751 |
1/2✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
|
15291 | Matrix6 res; |
752 |
3/5✓ Branch 1 taken 27 times.
✓ Branch 2 taken 14900 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
✗ Branch 5 not taken.
|
15291 | const Motion mv(v * mass()); |
753 | |||
754 |
8/16✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14927 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14927 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 14927 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 14927 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 14927 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 14927 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 14927 times.
✗ Branch 23 not taken.
|
45873 | res.template block<3, 3>(LINEAR, ANGULAR) = |
755 |
3/6✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 14927 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 14927 times.
✗ Branch 10 not taken.
|
45900 | -skew(mv.linear()) - skewSquare(mv.angular(), lever()) + skewSquare(lever(), mv.angular()); |
756 |
2/4✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14927 times.
✗ Branch 5 not taken.
|
15291 | res.template block<3, 3>(ANGULAR, LINEAR) = |
757 |
2/4✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14927 times.
✗ Branch 5 not taken.
|
15291 | res.template block<3, 3>(LINEAR, ANGULAR).transpose(); |
758 | |||
759 | // res.template block<3,3>(LINEAR,LINEAR) = mv.linear()*c.transpose(); // use as | ||
760 | // temporary variable res.template block<3,3>(ANGULAR,ANGULAR) = res.template | ||
761 | // block<3,3>(LINEAR,LINEAR) - res.template block<3,3>(LINEAR,LINEAR).transpose(); | ||
762 |
6/12✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14927 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14927 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 14927 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 14927 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 14927 times.
✗ Branch 17 not taken.
|
30582 | res.template block<3, 3>(ANGULAR, ANGULAR) = |
763 |
2/4✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 14927 times.
✗ Branch 7 not taken.
|
30609 | -skewSquare(mv.linear(), lever()) - skewSquare(lever(), mv.linear()); |
764 | |||
765 |
4/8✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14927 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14927 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 14927 times.
✗ Branch 11 not taken.
|
15291 | res.template block<3, 3>(LINEAR, LINEAR) = |
766 |
1/2✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
|
15318 | (inertia() - AlphaSkewSquare(mass(), lever())).matrix(); |
767 | |||
768 |
2/4✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14927 times.
✗ Branch 5 not taken.
|
15291 | res.template block<3, 3>(ANGULAR, ANGULAR) -= |
769 |
4/8✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14927 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14927 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 14927 times.
✗ Branch 11 not taken.
|
15318 | res.template block<3, 3>(LINEAR, LINEAR) * skew(v.angular()); |
770 |
3/6✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14927 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14927 times.
✗ Branch 8 not taken.
|
15291 | res.template block<3, 3>(ANGULAR, ANGULAR) += |
771 |
2/4✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14927 times.
✗ Branch 5 not taken.
|
15291 | cross(v.angular(), res.template block<3, 3>(LINEAR, LINEAR)); |
772 | |||
773 |
2/4✓ Branch 1 taken 14927 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14927 times.
✗ Branch 5 not taken.
|
15291 | res.template block<3, 3>(LINEAR, LINEAR).setZero(); |
774 | 30582 | return res; | |
775 | 27 | } | |
776 | |||
777 | template<typename MotionDerived, typename M6> | ||
778 | 131 | static void vxi_impl( | |
779 | const MotionDense<MotionDerived> & v, | ||
780 | const InertiaTpl & I, | ||
781 | const Eigen::MatrixBase<M6> & Iout) | ||
782 | { | ||
783 | EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(M6, 6, 6); | ||
784 | 131 | M6 & Iout_ = PINOCCHIO_EIGEN_CONST_CAST(M6, Iout); | |
785 | |||
786 | // Block 1,1 | ||
787 |
3/9✓ Branch 1 taken 131 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 131 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 131 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
131 | alphaSkew(I.mass(), v.angular(), Iout_.template block<3, 3>(LINEAR, LINEAR)); |
788 | // Iout_.template block<3,3>(LINEAR,LINEAR) = alphaSkew(I.mass(),v.angular()); | ||
789 |
2/8✗ Branch 2 not taken.
✓ Branch 3 taken 131 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 131 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
131 | const Vector3 mc(I.mass() * I.lever()); |
790 | |||
791 | // Block 1,2 | ||
792 |
4/8✓ Branch 1 taken 131 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 131 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 131 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 131 times.
✗ Branch 11 not taken.
|
131 | skewSquare(-v.angular(), mc, Iout_.template block<3, 3>(LINEAR, ANGULAR)); |
793 | |||
794 | //// Block 2,1 | ||
795 |
3/9✓ Branch 1 taken 131 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 131 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 131 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
131 | alphaSkew(I.mass(), v.linear(), Iout_.template block<3, 3>(ANGULAR, LINEAR)); |
796 |
3/6✓ Branch 1 taken 131 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 131 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 131 times.
✗ Branch 8 not taken.
|
131 | Iout_.template block<3, 3>(ANGULAR, LINEAR) -= Iout_.template block<3, 3>(LINEAR, ANGULAR); |
797 | |||
798 | //// Block 2,2 | ||
799 |
4/8✓ Branch 1 taken 131 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 131 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 131 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 131 times.
✗ Branch 11 not taken.
|
131 | skewSquare(-v.linear(), mc, Iout_.template block<3, 3>(ANGULAR, ANGULAR)); |
800 | |||
801 | // TODO: I do not why, but depending on the CPU, these three lines can give | ||
802 | // wrong output. | ||
803 | // typename Symmetric3::AlphaSkewSquare mcxcx(I.mass(),I.lever()); | ||
804 | // const Symmetric3 I_mcxcx(I.inertia() - mcxcx); | ||
805 | // Iout_.template block<3,3>(ANGULAR,ANGULAR) += I_mcxcx.vxs(v.angular()); | ||
806 |
1/6✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 131 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
131 | Symmetric3 mcxcx(typename Symmetric3::AlphaSkewSquare(I.mass(), I.lever())); |
807 |
4/8✓ Branch 2 taken 131 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 131 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 131 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 131 times.
✗ Branch 12 not taken.
|
131 | Iout_.template block<3, 3>(ANGULAR, ANGULAR) += I.inertia().vxs(v.angular()); |
808 |
4/8✓ Branch 1 taken 131 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 131 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 131 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 131 times.
✗ Branch 11 not taken.
|
131 | Iout_.template block<3, 3>(ANGULAR, ANGULAR) -= mcxcx.vxs(v.angular()); |
809 | 131 | } | |
810 | |||
811 | template<typename MotionDerived, typename M6> | ||
812 | 3 | static void ivx_impl( | |
813 | const MotionDense<MotionDerived> & v, | ||
814 | const InertiaTpl & I, | ||
815 | const Eigen::MatrixBase<M6> & Iout) | ||
816 | { | ||
817 | EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(M6, 6, 6); | ||
818 | 3 | M6 & Iout_ = PINOCCHIO_EIGEN_CONST_CAST(M6, Iout); | |
819 | |||
820 | // Block 1,1 | ||
821 |
3/9✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
3 | alphaSkew(I.mass(), v.angular(), Iout_.template block<3, 3>(LINEAR, LINEAR)); |
822 | |||
823 | // Block 2,1 | ||
824 |
2/8✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
3 | const Vector3 mc(I.mass() * I.lever()); |
825 |
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.
|
3 | skewSquare(mc, v.angular(), Iout_.template block<3, 3>(ANGULAR, LINEAR)); |
826 | |||
827 | // Block 1,2 | ||
828 |
3/9✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
3 | alphaSkew(I.mass(), v.linear(), Iout_.template block<3, 3>(LINEAR, ANGULAR)); |
829 | |||
830 | // Block 2,2 | ||
831 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
3 | cross( |
832 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | -I.lever(), Iout_.template block<3, 3>(ANGULAR, LINEAR), |
833 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | Iout_.template block<3, 3>(ANGULAR, ANGULAR)); |
834 |
4/8✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
|
3 | Iout_.template block<3, 3>(ANGULAR, ANGULAR) += I.inertia().svx(v.angular()); |
835 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
|
12 | for (int k = 0; k < 3; ++k) |
836 |
4/8✓ 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.
|
9 | Iout_.template block<3, 3>(ANGULAR, ANGULAR).col(k) += |
837 |
2/4✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
|
18 | I.lever().cross(Iout_.template block<3, 3>(LINEAR, ANGULAR).col(k)); |
838 | |||
839 | // Block 1,2 | ||
840 |
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.
|
3 | Iout_.template block<3, 3>(LINEAR, ANGULAR) -= Iout_.template block<3, 3>(ANGULAR, LINEAR); |
841 | 3 | } | |
842 | |||
843 | // Getters | ||
844 | 2340835 | Scalar mass() const | |
845 | { | ||
846 | 2340835 | return m_mass; | |
847 | } | ||
848 | 2282674 | const Vector3 & lever() const | |
849 | { | ||
850 | 2314805 | return m_com; | |
851 | } | ||
852 | 1505765 | const Symmetric3 & inertia() const | |
853 | { | ||
854 | 1535908 | return m_inertia; | |
855 | } | ||
856 | |||
857 | 328077 | Scalar & mass() | |
858 | { | ||
859 | 328077 | return m_mass; | |
860 | } | ||
861 | 226502 | Vector3 & lever() | |
862 | { | ||
863 | 226639 | return m_com; | |
864 | } | ||
865 | 217923 | Symmetric3 & inertia() | |
866 | { | ||
867 | 218058 | return m_inertia; | |
868 | } | ||
869 | |||
870 | /// aI = aXb.act(bI) | ||
871 | template<typename S2, int O2> | ||
872 | 106157 | InertiaTpl se3Action_impl(const SE3Tpl<S2, O2> & M) const | |
873 | { | ||
874 | /* The multiplication RIR' has a particular form that could be used, however it | ||
875 | * does not seems to be more efficient, see http://stackoverflow.m_comom/questions/ | ||
876 | * 13215467/eigen-best-way-to-evaluate-asa-transpose-and-store-the-result-in-a-symmetric .*/ | ||
877 | return InertiaTpl( | ||
878 |
8/15✓ Branch 5 taken 106034 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 106034 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 106034 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 106034 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 106034 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 126 times.
✓ Branch 21 taken 105908 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 126 times.
✗ Branch 24 not taken.
|
212125 | mass(), M.translation() + M.rotation() * lever(), inertia().rotate(M.rotation())); |
879 | } | ||
880 | |||
881 | /// bI = aXb.actInv(aI) | ||
882 | template<typename S2, int O2> | ||
883 | 9 | InertiaTpl se3ActionInverse_impl(const SE3Tpl<S2, O2> & M) const | |
884 | { | ||
885 | return InertiaTpl( | ||
886 |
3/6✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
|
27 | mass(), M.rotation().transpose() * (lever() - M.translation()), |
887 |
5/12✓ 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.
✓ Branch 16 taken 9 times.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
|
45 | inertia().rotate(M.rotation().transpose())); |
888 | } | ||
889 | |||
890 | template<typename MotionDerived> | ||
891 | 652 | Force vxiv(const MotionDense<MotionDerived> & v) const | |
892 | { | ||
893 |
4/12✓ Branch 2 taken 652 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 652 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 652 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 652 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
652 | const Vector3 & mcxw = mass() * lever().cross(v.angular()); |
894 |
4/13✓ Branch 1 taken 652 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 652 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 652 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 652 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
|
652 | const Vector3 & mv_mcxw = mass() * v.linear() - mcxw; |
895 | return Force( | ||
896 |
1/2✓ Branch 1 taken 652 times.
✗ Branch 2 not taken.
|
652 | v.angular().cross(mv_mcxw), |
897 |
2/4✓ Branch 1 taken 652 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 652 times.
✗ Branch 5 not taken.
|
1304 | v.angular().cross(lever().cross(mv_mcxw) + inertia() * v.angular()) |
898 |
9/18✓ Branch 1 taken 652 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 652 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 652 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 652 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 652 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 652 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 652 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 652 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 652 times.
✗ Branch 26 not taken.
|
2608 | - v.linear().cross(mcxw)); |
899 | } | ||
900 | |||
901 | 100009 | void disp_impl(std::ostream & os) const | |
902 | { | ||
903 |
0/2✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
100009 | os << " m = " << mass() << "\n" |
904 |
1/9✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 100009 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
|
100009 | << " c = " << lever().transpose() << "\n" |
905 |
2/4✓ Branch 1 taken 100009 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100009 times.
✗ Branch 5 not taken.
|
100009 | << " I = \n" |
906 |
3/6✓ Branch 2 taken 100009 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100009 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 100009 times.
✗ Branch 9 not taken.
|
100009 | << inertia().matrix() << ""; |
907 | 100009 | } | |
908 | |||
909 | /// \returns An expression of *this with the Scalar type casted to NewScalar. | ||
910 | template<typename NewScalar> | ||
911 | 6978 | InertiaTpl<NewScalar, Options> cast() const | |
912 | { | ||
913 | return InertiaTpl<NewScalar, Options>( | ||
914 |
4/6✓ Branch 2 taken 4779 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4779 times.
✗ Branch 7 not taken.
|
8924 | pinocchio::cast<NewScalar>(mass()), lever().template cast<NewScalar>(), |
915 |
4/8✓ Branch 3 taken 6045 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1265 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1265 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1261 times.
✗ Branch 13 not taken.
|
21278 | inertia().template cast<NewScalar>()); |
916 | } | ||
917 | |||
918 | // TODO: adjust code | ||
919 | // /// \brief Check whether *this is a valid inertia, resulting from a positive mass | ||
920 | // distribution bool isValid() const | ||
921 | // { | ||
922 | // return | ||
923 | // (m_mass > Scalar(0) && m_inertia.isValid()) | ||
924 | // || (m_mass == Scalar(0) && (m_inertia.data().array() == Scalar(0)).all()); | ||
925 | // } | ||
926 | |||
927 | protected: | ||
928 | Scalar m_mass; | ||
929 | Vector3 m_com; | ||
930 | Symmetric3 m_inertia; | ||
931 | |||
932 | }; // class InertiaTpl | ||
933 | |||
934 | /** | ||
935 | * @brief A structure representing a pseudo inertia matrix. | ||
936 | * | ||
937 | * References: | ||
938 | * - Wensing, Patrick M., Sangbae Kim, and Jean-Jacques E. Slotine. "Linear matrix inequalities | ||
939 | * for physically consistent inertial parameter identification: A statistical perspective on the | ||
940 | * mass distribution." IEEE Robotics and Automation Letters 3.1 (2017): 60-67. | ||
941 | */ | ||
942 | template<typename _Scalar, int _Options> | ||
943 | struct PseudoInertiaTpl | ||
944 | { | ||
945 | typedef _Scalar Scalar; | ||
946 | enum | ||
947 | { | ||
948 | Options = _Options, | ||
949 | }; | ||
950 | typedef Eigen::Matrix<Scalar, 4, 4, Options> Matrix4; | ||
951 | typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3; | ||
952 | typedef Eigen::Matrix<Scalar, 3, 3, Options> Matrix3; | ||
953 | typedef Eigen::Matrix<Scalar, 10, 1, Options> Vector10; | ||
954 | typedef LogCholeskyParametersTpl<Scalar, Options> LogCholeskyParameters; | ||
955 | |||
956 | Scalar mass; ///< Mass of the pseudo inertia | ||
957 | Vector3 h; ///< Vector part of the pseudo inertia | ||
958 | Matrix3 sigma; ///< 3x3 matrix part of the pseudo inertia | ||
959 | |||
960 | 10 | PseudoInertiaTpl(Scalar mass, const Vector3 & h, const Matrix3 & sigma) | |
961 | 10 | : mass(mass) | |
962 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
10 | , h(h) |
963 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
10 | , sigma(sigma) |
964 | { | ||
965 | 10 | } | |
966 | |||
967 | /** | ||
968 | * @brief Converts the PseudoInertiaTpl object to a 4x4 matrix. | ||
969 | * @return A 4x4 pseudo inertia matrix. | ||
970 | */ | ||
971 | 6 | Matrix4 toMatrix() const | |
972 | { | ||
973 |
1/2✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
|
6 | Matrix4 pseudo_inertia = Matrix4::Zero(); |
974 |
1/5✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
6 | pseudo_inertia.template block<3, 3>(0, 0) = sigma; |
975 |
1/5✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
6 | pseudo_inertia.template block<3, 1>(0, 3) = h; |
976 |
2/8✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
6 | pseudo_inertia.template block<1, 3>(3, 0) = h.transpose(); |
977 |
0/4✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
6 | pseudo_inertia(3, 3) = mass; |
978 | 6 | return pseudo_inertia; | |
979 | } | ||
980 | |||
981 | /** | ||
982 | * @brief Constructs a PseudoInertiaTpl object from a 4x4 pseudo inertia matrix. | ||
983 | * @param pseudo_inertia A 4x4 pseudo inertia matrix. | ||
984 | * @return A PseudoInertiaTpl object. | ||
985 | */ | ||
986 | 2 | static PseudoInertiaTpl FromMatrix(const Matrix4 & pseudo_inertia) | |
987 | { | ||
988 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | Scalar mass = pseudo_inertia(3, 3); |
989 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | Vector3 h = pseudo_inertia.template block<3, 1>(0, 3); |
990 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | Matrix3 sigma = pseudo_inertia.template block<3, 3>(0, 0); |
991 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4 | return PseudoInertiaTpl(mass, h, sigma); |
992 | } | ||
993 | |||
994 | /** | ||
995 | * @brief Constructs a PseudoInertiaTpl object from dynamic parameters. | ||
996 | * @param dynamic_params A 10-dimensional vector of dynamic parameters. | ||
997 | * @return A PseudoInertiaTpl object. | ||
998 | */ | ||
999 | template<typename Vector10Like> | ||
1000 | static PseudoInertiaTpl | ||
1001 | 12 | FromDynamicParameters(const Eigen::MatrixBase<Vector10Like> & dynamic_params) | |
1002 | { | ||
1003 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
12 | PINOCCHIO_ASSERT_MATRIX_SPECIFIC_SIZE(Vector10Like, dynamic_params, 10, 1); |
1004 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
12 | Scalar mass = dynamic_params[0]; |
1005 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
12 | Vector3 h = dynamic_params.template segment<3>(1); |
1006 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
12 | Matrix3 I_bar; |
1007 | // clang-format off | ||
1008 |
6/12✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
|
24 | I_bar << dynamic_params[4], dynamic_params[5], dynamic_params[7], |
1009 |
6/12✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
|
12 | dynamic_params[5], dynamic_params[6], dynamic_params[8], |
1010 |
6/12✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
|
12 | dynamic_params[7], dynamic_params[8], dynamic_params[9]; |
1011 | // clang-format on | ||
1012 | |||
1013 |
5/14✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
|
12 | Matrix3 sigma = 0.5 * I_bar.trace() * Matrix3::Identity() - I_bar; |
1014 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
24 | return PseudoInertiaTpl(mass, h, sigma); |
1015 | } | ||
1016 | |||
1017 | /** | ||
1018 | * @brief Converts the PseudoInertiaTpl object to dynamic parameters. | ||
1019 | * @return A 10-dimensional vector of dynamic parameters. | ||
1020 | */ | ||
1021 | 4 | Vector10 toDynamicParameters() const | |
1022 | { | ||
1023 |
5/10✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
|
4 | Matrix3 I_bar = sigma.trace() * Matrix3::Identity() - sigma; |
1024 | |||
1025 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | Vector10 dynamic_params; |
1026 |
1/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4 | dynamic_params[0] = mass; |
1027 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | dynamic_params.template segment<3>(1) = h; |
1028 |
2/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
4 | dynamic_params[4] = I_bar(0, 0); |
1029 |
2/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
4 | dynamic_params[5] = I_bar(0, 1); |
1030 |
2/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
4 | dynamic_params[6] = I_bar(1, 1); |
1031 |
2/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
4 | dynamic_params[7] = I_bar(0, 2); |
1032 |
2/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
4 | dynamic_params[8] = I_bar(1, 2); |
1033 |
2/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
4 | dynamic_params[9] = I_bar(2, 2); |
1034 | |||
1035 | 8 | return dynamic_params; | |
1036 | } | ||
1037 | |||
1038 | /** | ||
1039 | * @brief Constructs a PseudoInertiaTpl object from an InertiaTpl object. | ||
1040 | * @param inertia An InertiaTpl object. | ||
1041 | * @return A PseudoInertiaTpl object. | ||
1042 | */ | ||
1043 | 4 | static PseudoInertiaTpl FromInertia(const InertiaTpl<Scalar, Options> & inertia) | |
1044 | { | ||
1045 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | Vector10 dynamic_params = inertia.toDynamicParameters(); |
1046 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
8 | return FromDynamicParameters(dynamic_params); |
1047 | } | ||
1048 | |||
1049 | /** | ||
1050 | * @brief Converts the PseudoInertiaTpl object to an InertiaTpl object. | ||
1051 | * @return An InertiaTpl object. | ||
1052 | */ | ||
1053 | 2 | InertiaTpl<Scalar, Options> toInertia() const | |
1054 | { | ||
1055 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Vector10 dynamic_params = toDynamicParameters(); |
1056 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
4 | return InertiaTpl<Scalar, Options>::FromDynamicParameters(dynamic_params); |
1057 | } | ||
1058 | |||
1059 | /** | ||
1060 | * @brief Constructs a PseudoInertiaTpl object from log Cholesky parameters. | ||
1061 | * @param log_cholesky A 10-dimensional vector of log Cholesky parameters. | ||
1062 | * @return A PseudoInertiaTpl object. | ||
1063 | */ | ||
1064 | static PseudoInertiaTpl FromLogCholeskyParameters(const LogCholeskyParameters & log_cholesky) | ||
1065 | { | ||
1066 | Vector10 dynamic_params = log_cholesky.toDynamicParameters(); | ||
1067 | return FromDynamicParameters(dynamic_params); | ||
1068 | } | ||
1069 | |||
1070 | /// \returns An expression of *this with the Scalar type casted to NewScalar. | ||
1071 | template<typename NewScalar> | ||
1072 | 1 | PseudoInertiaTpl<NewScalar, Options> cast() const | |
1073 | { | ||
1074 | return PseudoInertiaTpl<NewScalar, Options>( | ||
1075 | 2 | pinocchio::cast<NewScalar>(mass), h.template cast<NewScalar>(), | |
1076 |
0/10✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
1 | sigma.template cast<NewScalar>()); |
1077 | } | ||
1078 | |||
1079 | 1 | void disp_impl(std::ostream & os) const | |
1080 | { | ||
1081 | 1 | os << " m = " << mass << "\n" | |
1082 |
1/2✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | << " h = " << h.transpose() << "\n" |
1083 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | << " sigma = \n" |
1084 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | << sigma << ""; |
1085 | 1 | } | |
1086 | |||
1087 | 1 | friend std::ostream & operator<<(std::ostream & os, const PseudoInertiaTpl & pi) | |
1088 | { | ||
1089 | 1 | pi.disp_impl(os); | |
1090 | 1 | return os; | |
1091 | } | ||
1092 | }; | ||
1093 | |||
1094 | /** | ||
1095 | * @brief A structure representing log Cholesky parameters. | ||
1096 | * | ||
1097 | * References: | ||
1098 | * - Rucker, Caleb, and Patrick M. Wensing. "Smooth parameterization of rigid-body inertia." | ||
1099 | * IEEE Robotics and Automation Letters 7.2 (2022): 2771-2778. | ||
1100 | */ | ||
1101 | template<typename _Scalar, int _Options> | ||
1102 | struct LogCholeskyParametersTpl | ||
1103 | { | ||
1104 | typedef _Scalar Scalar; | ||
1105 | enum | ||
1106 | { | ||
1107 | Options = _Options, | ||
1108 | }; | ||
1109 | typedef Eigen::Matrix<Scalar, 10, 1, Options> Vector10; | ||
1110 | typedef Eigen::Matrix<Scalar, 10, 10, Options> Matrix10; | ||
1111 | typedef PseudoInertiaTpl<Scalar, Options> PseudoInertia; | ||
1112 | |||
1113 | Vector10 parameters; ///< 10-dimensional vector of log Cholesky parameters | ||
1114 | /** | ||
1115 | * @brief Constructor for LogCholeskyParametersTpl. | ||
1116 | * @param log_cholesky A 10-dimensional vector of log Cholesky parameters. | ||
1117 | */ | ||
1118 | 2 | explicit LogCholeskyParametersTpl(const Vector10 & log_cholesky) | |
1119 | 2 | : parameters(log_cholesky) | |
1120 | { | ||
1121 | 2 | } | |
1122 | /** | ||
1123 | * @brief Converts the LogCholeskyParametersTpl object to dynamic parameters. | ||
1124 | * @return A 10-dimensional vector of dynamic parameters. | ||
1125 | */ | ||
1126 | 7 | Vector10 toDynamicParameters() const | |
1127 | { | ||
1128 | using math::exp; | ||
1129 | using math::pow; | ||
1130 | |||
1131 | // clang-format off | ||
1132 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | Vector10 dynamic_params; |
1133 | |||
1134 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | const Scalar alpha = parameters[0]; |
1135 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | const Scalar d1 = parameters[1]; |
1136 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | const Scalar d2 = parameters[2]; |
1137 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | const Scalar d3 = parameters[3]; |
1138 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | const Scalar s12 = parameters[4]; |
1139 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | const Scalar s23 = parameters[5]; |
1140 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | const Scalar s13 = parameters[6]; |
1141 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | const Scalar t1 = parameters[7]; |
1142 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | const Scalar t2 = parameters[8]; |
1143 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | const Scalar t3 = parameters[9]; |
1144 | |||
1145 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
7 | const Scalar exp_d1 = exp(d1); |
1146 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
7 | const Scalar exp_d2 = exp(d2); |
1147 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
7 | const Scalar exp_d3 = exp(d3); |
1148 | |||
1149 |
1/6✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
7 | dynamic_params[0] = 1; |
1150 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | dynamic_params[1] = t1; |
1151 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | dynamic_params[2] = t2; |
1152 |
1/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
7 | dynamic_params[3] = t3; |
1153 |
6/22✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
|
7 | dynamic_params[4] = pow(s23, 2) + pow(t2, 2) + pow(t3, 2) + pow(exp_d2, 2) + pow(exp_d3, 2); |
1154 |
1/16✓ Branch 1 taken 7 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.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
7 | dynamic_params[5] = -s12 * exp_d2 - s13 * s23 - t1 * t2; |
1155 |
7/26✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 7 times.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
|
7 | dynamic_params[6] = pow(s12, 2) + pow(s13, 2) + pow(t1, 2) + pow(t3, 2) + pow(exp_d1, 2) + pow(exp_d3, 2); |
1156 |
1/12✓ Branch 1 taken 7 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.
|
7 | dynamic_params[7] = -s13 * exp_d3 - t1 * t3; |
1157 |
1/12✓ Branch 1 taken 7 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.
|
7 | dynamic_params[8] = -s23 * exp_d3 - t2 * t3; |
1158 |
8/30✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 7 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 7 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 7 times.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
|
7 | dynamic_params[9] = pow(s12, 2) + pow(s13, 2) + pow(s23, 2) + pow(t1, 2) + pow(t2, 2) + pow(exp_d1, 2) + pow(exp_d2, 2); |
1159 | |||
1160 |
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.
|
7 | const Scalar exp_2_alpha = exp(2 * alpha); |
1161 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | dynamic_params *= exp_2_alpha; |
1162 | // clang-format on | ||
1163 | |||
1164 | 14 | return dynamic_params; | |
1165 | } | ||
1166 | |||
1167 | /** | ||
1168 | * @brief Converts the LogCholeskyParametersTpl object to a PseudoInertiaTpl object. | ||
1169 | * @return A PseudoInertiaTpl object. | ||
1170 | */ | ||
1171 | 2 | PseudoInertia toPseudoInertia() const | |
1172 | { | ||
1173 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | Vector10 dynamic_params = toDynamicParameters(); |
1174 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
4 | return PseudoInertia::FromDynamicParameters(dynamic_params); |
1175 | } | ||
1176 | |||
1177 | /** | ||
1178 | * @brief Converts the LogCholeskyParametersTpl object to an InertiaTpl object. | ||
1179 | * @return An InertiaTpl object. | ||
1180 | */ | ||
1181 | 1 | InertiaTpl<Scalar, Options> toInertia() const | |
1182 | { | ||
1183 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Vector10 dynamic_params = toDynamicParameters(); |
1184 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | return InertiaTpl<Scalar, Options>::FromDynamicParameters(dynamic_params); |
1185 | } | ||
1186 | |||
1187 | /** | ||
1188 | * @brief Calculates the Jacobian of the log Cholesky parameters. | ||
1189 | * @return A 10x10 matrix representing the Jacobian. | ||
1190 | */ | ||
1191 | 2 | Matrix10 calculateJacobian() const | |
1192 | { | ||
1193 | using math::exp; | ||
1194 | using math::pow; | ||
1195 | |||
1196 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | Matrix10 jacobian = Matrix10::Zero(); |
1197 | |||
1198 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | const Scalar alpha = parameters[0]; |
1199 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | const Scalar d1 = parameters[1]; |
1200 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | const Scalar d2 = parameters[2]; |
1201 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | const Scalar d3 = parameters[3]; |
1202 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | const Scalar s12 = parameters[4]; |
1203 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | const Scalar s23 = parameters[5]; |
1204 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | const Scalar s13 = parameters[6]; |
1205 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | const Scalar t1 = parameters[7]; |
1206 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | const Scalar t2 = parameters[8]; |
1207 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | const Scalar t3 = parameters[9]; |
1208 | |||
1209 |
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.
|
2 | const Scalar exp_2alpha = exp(2 * alpha); |
1210 |
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.
|
2 | const Scalar exp_2d1 = exp(2 * d1); |
1211 |
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.
|
2 | const Scalar exp_2d2 = exp(2 * d2); |
1212 |
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.
|
2 | const Scalar exp_2d3 = exp(2 * d3); |
1213 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
2 | const Scalar exp_d1 = exp(d1); |
1214 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
2 | const Scalar exp_d2 = exp(d2); |
1215 |
0/2✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
2 | const Scalar exp_d3 = exp(d3); |
1216 | |||
1217 | // clang-format off | ||
1218 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(0, 0) = 2 * exp_2alpha; |
1219 | |||
1220 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(1, 0) = 2 * t1 * exp_2alpha; |
1221 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | jacobian(1, 7) = exp_2alpha; |
1222 | |||
1223 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(2, 0) = 2 * t2 * exp_2alpha; |
1224 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | jacobian(2, 8) = exp_2alpha; |
1225 | |||
1226 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(3, 0) = 2 * t3 * exp_2alpha; |
1227 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | jacobian(3, 9) = exp_2alpha; |
1228 | |||
1229 |
4/24✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ 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.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
|
2 | jacobian(4, 0) = 2 * (pow(s23, 2) + pow(t2, 2) + pow(t3, 2) + exp_2d2 + exp_2d3) * exp_2alpha; |
1230 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(4, 2) = 2 * exp_2alpha * exp_2d2; |
1231 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(4, 3) = 2 * exp_2alpha * exp_2d3; |
1232 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(4, 5) = 2 * s23 * exp_2alpha; |
1233 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(4, 8) = 2 * t2 * exp_2alpha; |
1234 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(4, 9) = 2 * t3 * exp_2alpha; |
1235 | |||
1236 |
1/20✓ Branch 1 taken 2 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.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
2 | jacobian(5, 0) = -2 * (s12 * exp_d2 + s13 * s23 + t1 * t2) * exp_2alpha; |
1237 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(5, 2) = -s12 * exp_2alpha * exp_d2; |
1238 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(5, 4) = -exp_2alpha * exp_d2; |
1239 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(5, 5) = -s13 * exp_2alpha; |
1240 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(5, 6) = -s23 * exp_2alpha; |
1241 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(5, 7) = -t2 * exp_2alpha; |
1242 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(5, 8) = -t1 * exp_2alpha; |
1243 | |||
1244 |
5/28✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ 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.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
|
2 | jacobian(6, 0) = 2 * (pow(s12, 2) + pow(s13, 2) + pow(t1, 2) + pow(t3, 2) + exp_2d1 + exp_2d3) * exp_2alpha; |
1245 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(6, 1) = 2 * exp_2alpha * exp_2d1; |
1246 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(6, 3) = 2 * exp_2alpha * exp_2d3; |
1247 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(6, 4) = 2 * s12 * exp_2alpha; |
1248 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(6, 6) = 2 * s13 * exp_2alpha; |
1249 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(6, 7) = 2 * t1 * exp_2alpha; |
1250 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(6, 9) = 2 * t3 * exp_2alpha; |
1251 | |||
1252 |
1/16✓ Branch 1 taken 2 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.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
2 | jacobian(7, 0) = -2 * (s13 * exp_d3 + t1 * t3) * exp_2alpha; |
1253 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(7, 3) = -s13 * exp_2alpha * exp_d3; |
1254 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(7, 6) = -exp_2alpha * exp_d3; |
1255 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(7, 7) = -t3 * exp_2alpha; |
1256 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(7, 9) = -t1 * exp_2alpha; |
1257 | |||
1258 |
1/16✓ Branch 1 taken 2 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.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
2 | jacobian(8, 0) = -2 * (s23 * exp_d3 + t2 * t3) * exp_2alpha; |
1259 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(8, 3) = -s23 * exp_2alpha * exp_d3; |
1260 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(8, 5) = -exp_2alpha * exp_d3; |
1261 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(8, 8) = -t3 * exp_2alpha; |
1262 |
1/8✓ Branch 1 taken 2 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.
|
2 | jacobian(8, 9) = -t2 * exp_2alpha; |
1263 | |||
1264 |
6/32✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
|
2 | jacobian(9, 0) = 2 * (pow(s12, 2) + pow(s13, 2) + pow(s23, 2) + pow(t1, 2) + pow(t2, 2) + exp_2d1 + exp_2d2) * exp_2alpha; |
1265 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(9, 1) = 2 * exp_2alpha * exp_2d1; |
1266 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(9, 2) = 2 * exp_2alpha * exp_2d2; |
1267 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(9, 4) = 2 * s12 * exp_2alpha; |
1268 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(9, 5) = 2 * s23 * exp_2alpha; |
1269 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(9, 6) = 2 * s13 * exp_2alpha; |
1270 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(9, 7) = 2 * t1 * exp_2alpha; |
1271 |
1/10✓ Branch 1 taken 2 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.
|
2 | jacobian(9, 8) = 2 * t2 * exp_2alpha; |
1272 | // clang-format on | ||
1273 | |||
1274 | 4 | return jacobian; | |
1275 | } | ||
1276 | |||
1277 | /// \returns An expression of *this with the Scalar type casted to NewScalar. | ||
1278 | template<typename NewScalar> | ||
1279 | ✗ | LogCholeskyParametersTpl<NewScalar, Options> cast() const | |
1280 | { | ||
1281 | ✗ | return LogCholeskyParametersTpl<NewScalar, Options>(parameters.template cast<NewScalar>()); | |
1282 | } | ||
1283 | |||
1284 | 1 | void disp_impl(std::ostream & os) const | |
1285 | { | ||
1286 | 1 | os << " alpha: " << parameters[0] << "\n" | |
1287 | 1 | << " d1: " << parameters[1] << "\n" | |
1288 | 1 | << " d2: " << parameters[2] << "\n" | |
1289 | 1 | << " d3: " << parameters[3] << "\n" | |
1290 | 1 | << " s12: " << parameters[4] << "\n" | |
1291 | 1 | << " s23: " << parameters[5] << "\n" | |
1292 | 1 | << " s13: " << parameters[6] << "\n" | |
1293 | 1 | << " t1: " << parameters[7] << "\n" | |
1294 | 1 | << " t2: " << parameters[8] << "\n" | |
1295 | 1 | << " t3: " << parameters[9] << ""; | |
1296 | 1 | } | |
1297 | |||
1298 | 1 | friend std::ostream & operator<<(std::ostream & os, const LogCholeskyParametersTpl & lcp) | |
1299 | { | ||
1300 | 1 | lcp.disp_impl(os); | |
1301 | 1 | return os; | |
1302 | } | ||
1303 | }; | ||
1304 | |||
1305 | } // namespace pinocchio | ||
1306 | |||
1307 | #endif // ifndef __pinocchio_spatial_inertia_hpp__ | ||
1308 |