GCC Code Coverage Report


Directory: ./
File: include/pinocchio/multibody/joint/joint-revolute-unaligned.hpp
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 190 198 96.0%
Branches: 175 415 42.2%

Line Branch Exec Source
1 //
2 // Copyright (c) 2015-2020 CNRS INRIA
3 // Copyright (c) 2015-2016 Wandercraft, 86 rue de Paris 91400 Orsay, France.
4 //
5
6 #ifndef __pinocchio_multibody_joint_revolute_unaligned_hpp__
7 #define __pinocchio_multibody_joint_revolute_unaligned_hpp__
8
9 #include "pinocchio/fwd.hpp"
10 #include "pinocchio/multibody/joint/joint-base.hpp"
11 #include "pinocchio/multibody/joint-motion-subspace.hpp"
12 #include "pinocchio/spatial/inertia.hpp"
13
14 #include "pinocchio/math/matrix.hpp"
15 #include "pinocchio/math/rotation.hpp"
16
17 namespace pinocchio
18 {
19
20 template<typename Scalar, int Options = context::Options>
21 struct MotionRevoluteUnalignedTpl;
22 typedef MotionRevoluteUnalignedTpl<context::Scalar> MotionRevoluteUnaligned;
23
24 template<typename Scalar, int Options>
25 struct SE3GroupAction<MotionRevoluteUnalignedTpl<Scalar, Options>>
26 {
27 typedef MotionTpl<Scalar, Options> ReturnType;
28 };
29
30 template<typename Scalar, int Options, typename MotionDerived>
31 struct MotionAlgebraAction<MotionRevoluteUnalignedTpl<Scalar, Options>, MotionDerived>
32 {
33 typedef MotionTpl<Scalar, Options> ReturnType;
34 };
35
36 template<typename _Scalar, int _Options>
37 struct traits<MotionRevoluteUnalignedTpl<_Scalar, _Options>>
38 {
39 typedef _Scalar Scalar;
40 enum
41 {
42 Options = _Options
43 };
44 typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3;
45 typedef Eigen::Matrix<Scalar, 6, 1, Options> Vector6;
46 typedef Eigen::Matrix<Scalar, 4, 4, Options> Matrix4;
47 typedef Eigen::Matrix<Scalar, 6, 6, Options> Matrix6;
48 typedef typename PINOCCHIO_EIGEN_REF_CONST_TYPE(Vector6) ToVectorConstReturnType;
49 typedef typename PINOCCHIO_EIGEN_REF_TYPE(Vector6) ToVectorReturnType;
50 typedef Vector3 AngularType;
51 typedef Vector3 LinearType;
52 typedef const Vector3 ConstAngularType;
53 typedef const Vector3 ConstLinearType;
54 typedef Matrix6 ActionMatrixType;
55 typedef Matrix4 HomogeneousMatrixType;
56 typedef MotionTpl<Scalar, Options> MotionPlain;
57 typedef MotionPlain PlainReturnType;
58 enum
59 {
60 LINEAR = 0,
61 ANGULAR = 3
62 };
63 }; // traits MotionRevoluteUnalignedTpl
64
65 template<typename _Scalar, int _Options>
66 struct MotionRevoluteUnalignedTpl : MotionBase<MotionRevoluteUnalignedTpl<_Scalar, _Options>>
67 {
68 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
69 MOTION_TYPEDEF_TPL(MotionRevoluteUnalignedTpl);
70
71 14 MotionRevoluteUnalignedTpl()
72 14 {
73 14 }
74
75 template<typename Vector3Like, typename OtherScalar>
76 3310 MotionRevoluteUnalignedTpl(const Eigen::MatrixBase<Vector3Like> & axis, const OtherScalar & w)
77 3310 : m_axis(axis)
78
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
3310 , m_w(w)
79 {
80 3310 }
81
82 1048 inline PlainReturnType plain() const
83 {
84
2/4
✓ Branch 2 taken 1044 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1044 times.
✗ Branch 6 not taken.
1048 return PlainReturnType(PlainReturnType::Vector3::Zero(), m_axis * m_w);
85 }
86
87 template<typename OtherScalar>
88 1 MotionRevoluteUnalignedTpl __mult__(const OtherScalar & alpha) const
89 {
90
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 return MotionRevoluteUnalignedTpl(m_axis, alpha * m_w);
91 }
92
93 template<typename MotionDerived>
94 2 inline void addTo(MotionDense<MotionDerived> & v) const
95 {
96
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 v.angular() += m_axis * m_w;
97 2 }
98
99 template<typename Derived>
100 12 void setTo(MotionDense<Derived> & other) const
101 {
102
1/2
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
12 other.linear().setZero();
103
3/6
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 12 times.
✗ Branch 9 not taken.
12 other.angular().noalias() = m_axis * m_w;
104 12 }
105
106 template<typename S2, int O2, typename D2>
107 3 void se3Action_impl(const SE3Tpl<S2, O2> & m, MotionDense<D2> & v) const
108 {
109 // Angular
110
4/8
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
3 v.angular().noalias() = m_w * m.rotation() * m_axis;
111
112 // Linear
113
4/8
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
3 v.linear().noalias() = m.translation().cross(v.angular());
114 3 }
115
116 template<typename S2, int O2>
117 3 MotionPlain se3Action_impl(const SE3Tpl<S2, O2> & m) const
118 {
119 3 MotionPlain res;
120
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
3 se3Action_impl(m, res);
121 3 return res;
122 }
123
124 template<typename S2, int O2, typename D2>
125 5 void se3ActionInverse_impl(const SE3Tpl<S2, O2> & m, MotionDense<D2> & v) const
126 {
127 // Linear
128 // TODO: use v.angular() as temporary variable
129
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 Vector3 v3_tmp;
130
4/8
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
5 v3_tmp.noalias() = m_axis.cross(m.translation());
131
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 v3_tmp *= m_w;
132
6/12
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
5 v.linear().noalias() = m.rotation().transpose() * v3_tmp;
133
134 // Angular
135
6/12
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 5 times.
✗ Branch 17 not taken.
5 v.angular().noalias() = m.rotation().transpose() * m_axis;
136
2/4
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
5 v.angular() *= m_w;
137 5 }
138
139 template<typename S2, int O2>
140 5 MotionPlain se3ActionInverse_impl(const SE3Tpl<S2, O2> & m) const
141 {
142 5 MotionPlain res;
143
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
5 se3ActionInverse_impl(m, res);
144 5 return res;
145 }
146
147 template<typename M1, typename M2>
148 5 void motionAction(const MotionDense<M1> & v, MotionDense<M2> & mout) const
149 {
150 // Linear
151
4/8
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 5 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
5 mout.linear().noalias() = v.linear().cross(m_axis);
152
1/2
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
5 mout.linear() *= m_w;
153
154 // Angular
155
4/8
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 5 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
5 mout.angular().noalias() = v.angular().cross(m_axis);
156
1/2
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
5 mout.angular() *= m_w;
157 5 }
158
159 template<typename M1>
160 5 MotionPlain motionAction(const MotionDense<M1> & v) const
161 {
162 5 MotionPlain res;
163
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
5 motionAction(v, res);
164 5 return res;
165 }
166
167 34 bool isEqual_impl(const MotionRevoluteUnalignedTpl & other) const
168 {
169 34 return internal::comparison_eq(m_axis, other.m_axis)
170
2/4
✓ Branch 0 taken 34 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 34 times.
✗ Branch 4 not taken.
34 && internal::comparison_eq(m_w, other.m_w);
171 }
172
173 const Scalar & angularRate() const
174 {
175 return m_w;
176 }
177 1123 Scalar & angularRate()
178 {
179 1123 return m_w;
180 }
181
182 const Vector3 & axis() const
183 {
184 return m_axis;
185 }
186 56 Vector3 & axis()
187 {
188 56 return m_axis;
189 }
190
191 protected:
192 Vector3 m_axis;
193 Scalar m_w;
194
195 }; // struct MotionRevoluteUnalignedTpl
196
197 template<typename S1, int O1, typename MotionDerived>
198 inline typename MotionDerived::MotionPlain
199 operator+(const MotionRevoluteUnalignedTpl<S1, O1> & m1, const MotionDense<MotionDerived> & m2)
200 {
201 typename MotionDerived::MotionPlain res(m2);
202 res += m1;
203 return res;
204 }
205
206 template<typename MotionDerived, typename S2, int O2>
207 inline typename MotionDerived::MotionPlain
208 4 operator^(const MotionDense<MotionDerived> & m1, const MotionRevoluteUnalignedTpl<S2, O2> & m2)
209 {
210 4 return m2.motionAction(m1);
211 }
212
213 template<typename Scalar, int Options>
214 struct JointMotionSubspaceRevoluteUnalignedTpl;
215
216 template<typename _Scalar, int _Options>
217 struct traits<JointMotionSubspaceRevoluteUnalignedTpl<_Scalar, _Options>>
218 {
219 typedef _Scalar Scalar;
220 enum
221 {
222 Options = _Options
223 };
224 enum
225 {
226 LINEAR = 0,
227 ANGULAR = 3
228 };
229
230 typedef MotionRevoluteUnalignedTpl<Scalar, Options> JointMotion;
231 typedef Eigen::Matrix<Scalar, 1, 1, Options> JointForce;
232 typedef Eigen::Matrix<Scalar, 6, 1, Options> DenseBase;
233 typedef Eigen::Matrix<Scalar, 1, 1, Options> ReducedSquaredMatrix;
234
235 typedef DenseBase MatrixReturnType;
236 typedef const DenseBase ConstMatrixReturnType;
237
238 typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3;
239
240 typedef typename ReducedSquaredMatrix::IdentityReturnType StDiagonalMatrixSOperationReturnType;
241 }; // traits JointMotionSubspaceRevoluteUnalignedTpl
242
243 template<typename Scalar, int Options>
244 struct SE3GroupAction<JointMotionSubspaceRevoluteUnalignedTpl<Scalar, Options>>
245 {
246 typedef Eigen::Matrix<Scalar, 6, 1, Options> ReturnType;
247 };
248
249 template<typename Scalar, int Options, typename MotionDerived>
250 struct MotionAlgebraAction<
251 JointMotionSubspaceRevoluteUnalignedTpl<Scalar, Options>,
252 MotionDerived>
253 {
254 typedef Eigen::Matrix<Scalar, 6, 1, Options> ReturnType;
255 };
256
257 template<typename Scalar, int Options, typename ForceDerived>
258 struct ConstraintForceOp<JointMotionSubspaceRevoluteUnalignedTpl<Scalar, Options>, ForceDerived>
259 {
260 typedef
261 typename traits<JointMotionSubspaceRevoluteUnalignedTpl<Scalar, Options>>::Vector3 Vector3;
262 typedef Eigen::Matrix<
263 typename PINOCCHIO_EIGEN_DOT_PRODUCT_RETURN_TYPE(
264 Vector3, typename ForceDense<ForceDerived>::ConstAngularType),
265 1,
266 1,
267 Options>
268 ReturnType;
269 };
270
271 template<typename Scalar, int Options, typename ForceSet>
272 struct ConstraintForceSetOp<JointMotionSubspaceRevoluteUnalignedTpl<Scalar, Options>, ForceSet>
273 {
274 typedef
275 typename traits<JointMotionSubspaceRevoluteUnalignedTpl<Scalar, Options>>::Vector3 Vector3;
276 typedef typename MatrixMatrixProduct<
277 Eigen::Transpose<const Vector3>,
278 typename Eigen::MatrixBase<const ForceSet>::template NRowsBlockXpr<3>::Type>::type ReturnType;
279 };
280
281 template<typename _Scalar, int _Options>
282 struct JointMotionSubspaceRevoluteUnalignedTpl
283 : JointMotionSubspaceBase<JointMotionSubspaceRevoluteUnalignedTpl<_Scalar, _Options>>
284 {
285 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
286 PINOCCHIO_CONSTRAINT_TYPEDEF_TPL(JointMotionSubspaceRevoluteUnalignedTpl)
287
288 enum
289 {
290 NV = 1
291 };
292
293 typedef typename traits<JointMotionSubspaceRevoluteUnalignedTpl>::Vector3 Vector3;
294
295 14 JointMotionSubspaceRevoluteUnalignedTpl()
296 14 {
297 14 }
298
299 template<typename Vector3Like>
300 3302 JointMotionSubspaceRevoluteUnalignedTpl(const Eigen::MatrixBase<Vector3Like> & axis)
301 3302 : m_axis(axis)
302 {
303 3302 }
304
305 template<typename Vector1Like>
306 7 JointMotion __mult__(const Eigen::MatrixBase<Vector1Like> & v) const
307 {
308 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector1Like, 1);
309
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
10 return JointMotion(m_axis, v[0]);
310 }
311
312 template<typename S1, int O1>
313 typename SE3GroupAction<JointMotionSubspaceRevoluteUnalignedTpl>::ReturnType
314 16 se3Action(const SE3Tpl<S1, O1> & m) const
315 {
316 typedef
317 typename SE3GroupAction<JointMotionSubspaceRevoluteUnalignedTpl>::ReturnType ReturnType;
318
319 /* X*S = [ R pxR ; 0 R ] [ 0 ; a ] = [ px(Ra) ; Ra ] */
320 16 ReturnType res;
321
3/13
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 16 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 16 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
16 res.template segment<3>(ANGULAR).noalias() = m.rotation() * m_axis;
322
4/8
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 11 not taken.
16 res.template segment<3>(LINEAR).noalias() =
323
0/4
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
16 m.translation().cross(res.template segment<3>(ANGULAR));
324 16 return res;
325 }
326
327 template<typename S1, int O1>
328 typename SE3GroupAction<JointMotionSubspaceRevoluteUnalignedTpl>::ReturnType
329 13 se3ActionInverse(const SE3Tpl<S1, O1> & m) const
330 {
331 typedef
332 typename SE3GroupAction<JointMotionSubspaceRevoluteUnalignedTpl>::ReturnType ReturnType;
333
334 13 ReturnType res;
335
4/16
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 13 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 13 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 13 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
13 res.template segment<3>(ANGULAR).noalias() = m.rotation().transpose() * m_axis;
336
5/10
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 13 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 13 times.
✗ Branch 14 not taken.
13 res.template segment<3>(LINEAR).noalias() =
337
2/10
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 13 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
13 -m.rotation().transpose() * m.translation().cross(m_axis);
338 13 return res;
339 }
340
341 39 int nv_impl() const
342 {
343 39 return NV;
344 }
345
346 struct TransposeConst
347 : JointMotionSubspaceTransposeBase<JointMotionSubspaceRevoluteUnalignedTpl>
348 {
349 const JointMotionSubspaceRevoluteUnalignedTpl & ref;
350 15 TransposeConst(const JointMotionSubspaceRevoluteUnalignedTpl & ref)
351 15 : ref(ref)
352 {
353 15 }
354
355 template<typename ForceDerived>
356 typename ConstraintForceOp<JointMotionSubspaceRevoluteUnalignedTpl, ForceDerived>::ReturnType
357 8 operator*(const ForceDense<ForceDerived> & f) const
358 {
359 typedef typename ConstraintForceOp<
360 JointMotionSubspaceRevoluteUnalignedTpl, ForceDerived>::ReturnType ReturnType;
361 8 ReturnType res;
362
2/10
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
8 res[0] = ref.axis().dot(f.angular());
363 8 return res;
364 }
365
366 /* [CRBA] MatrixBase operator* (Constraint::Transpose S, ForceSet::Block) */
367 template<typename ForceSet>
368 typename ConstraintForceSetOp<JointMotionSubspaceRevoluteUnalignedTpl, ForceSet>::ReturnType
369 5 operator*(const Eigen::MatrixBase<ForceSet> & F)
370 {
371 EIGEN_STATIC_ASSERT(
372 ForceSet::RowsAtCompileTime == 6, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE)
373 /* Return ax.T * F[3:end,:] */
374
2/4
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
5 return ref.axis().transpose() * F.template middleRows<3>(ANGULAR);
375 }
376 };
377
378 15 TransposeConst transpose() const
379 {
380 15 return TransposeConst(*this);
381 }
382
383 /* CRBA joint operators
384 * - ForceSet::Block = ForceSet
385 * - ForceSet operator* (Inertia Y,Constraint S)
386 * - MatrixBase operator* (Constraint::Transpose S, ForceSet::Block)
387 * - SE3::act(ForceSet::Block)
388 */
389 37 DenseBase matrix_impl() const
390 {
391 37 DenseBase S;
392
1/5
✗ Branch 1 not taken.
✓ Branch 2 taken 35 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
37 S.template segment<3>(LINEAR).setZero();
393
1/5
✗ Branch 1 not taken.
✓ Branch 2 taken 35 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
37 S.template segment<3>(ANGULAR) = m_axis;
394 37 return S;
395 }
396
397 template<typename MotionDerived>
398 typename MotionAlgebraAction<JointMotionSubspaceRevoluteUnalignedTpl, MotionDerived>::ReturnType
399 6 motionAction(const MotionDense<MotionDerived> & m) const
400 {
401
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 const typename MotionDerived::ConstLinearType v = m.linear();
402
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 const typename MotionDerived::ConstAngularType w = m.angular();
403
404
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 DenseBase res;
405
4/8
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
6 res.template segment<3>(LINEAR).noalias() = v.cross(m_axis);
406
4/8
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
6 res.template segment<3>(ANGULAR).noalias() = w.cross(m_axis);
407
408 12 return res;
409 }
410
411 31 const Vector3 & axis() const
412 {
413 31 return m_axis;
414 }
415 56 Vector3 & axis()
416 {
417 56 return m_axis;
418 }
419
420 34 bool isEqual(const JointMotionSubspaceRevoluteUnalignedTpl & other) const
421 {
422 34 return internal::comparison_eq(m_axis, other.m_axis);
423 }
424
425 protected:
426 Vector3 m_axis;
427
428 }; // struct JointMotionSubspaceRevoluteUnalignedTpl
429
430 template<typename S1, int O1, typename S2, int O2>
431 struct MultiplicationOp<InertiaTpl<S1, O1>, JointMotionSubspaceRevoluteUnalignedTpl<S2, O2>>
432 {
433 typedef Eigen::Matrix<S2, 6, 1, O2> ReturnType;
434 };
435
436 /* [CRBA] ForceSet operator* (Inertia Y,Constraint S) */
437 namespace impl
438 {
439 template<typename S1, int O1, typename S2, int O2>
440 struct LhsMultiplicationOp<InertiaTpl<S1, O1>, JointMotionSubspaceRevoluteUnalignedTpl<S2, O2>>
441 {
442 typedef InertiaTpl<S1, O1> Inertia;
443 typedef JointMotionSubspaceRevoluteUnalignedTpl<S2, O2> Constraint;
444 typedef typename MultiplicationOp<Inertia, Constraint>::ReturnType ReturnType;
445 7 static inline ReturnType run(const Inertia & Y, const Constraint & cru)
446 {
447
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 ReturnType res;
448
449 /* YS = [ m -mcx ; mcx I-mcxcx ] [ 0 ; w ] = [ mcxw ; Iw -mcxcxw ] */
450
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
7 const typename Inertia::Scalar & m = Y.mass();
451 7 const typename Inertia::Vector3 & c = Y.lever();
452 7 const typename Inertia::Symmetric3 & I = Y.inertia();
453
454
4/10
✓ 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 not taken.
✗ Branch 15 not taken.
7 res.template segment<3>(Inertia::LINEAR) = -m * c.cross(cru.axis());
455
4/8
✓ 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.
7 res.template segment<3>(Inertia::ANGULAR).noalias() = I * cru.axis();
456
3/6
✓ 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.
7 res.template segment<3>(Inertia::ANGULAR) +=
457
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 c.cross(res.template segment<3>(Inertia::LINEAR));
458
459 14 return res;
460 }
461 };
462 } // namespace impl
463
464 template<typename M6Like, typename Scalar, int Options>
465 struct MultiplicationOp<
466 Eigen::MatrixBase<M6Like>,
467 JointMotionSubspaceRevoluteUnalignedTpl<Scalar, Options>>
468 {
469 typedef typename SizeDepType<3>::ColsReturn<M6Like>::ConstType M6LikeCols;
470 typedef typename Eigen::internal::remove_const<M6LikeCols>::type M6LikeColsNonConst;
471
472 typedef JointMotionSubspaceRevoluteUnalignedTpl<Scalar, Options> Constraint;
473 typedef typename Constraint::Vector3 Vector3;
474 typedef const typename MatrixMatrixProduct<M6LikeColsNonConst, Vector3>::type ReturnType;
475 };
476
477 /* [ABA] operator* (Inertia Y,Constraint S) */
478 namespace impl
479 {
480 template<typename M6Like, typename Scalar, int Options>
481 struct LhsMultiplicationOp<
482 Eigen::MatrixBase<M6Like>,
483 JointMotionSubspaceRevoluteUnalignedTpl<Scalar, Options>>
484 {
485 typedef JointMotionSubspaceRevoluteUnalignedTpl<Scalar, Options> Constraint;
486 typedef
487 typename MultiplicationOp<Eigen::MatrixBase<M6Like>, Constraint>::ReturnType ReturnType;
488
489 4 static inline ReturnType run(const Eigen::MatrixBase<M6Like> & Y, const Constraint & cru)
490 {
491 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(M6Like, 6, 6);
492
1/2
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
4 return Y.derived().template middleCols<3>(Constraint::ANGULAR) * cru.axis();
493 }
494 };
495 } // namespace impl
496
497 template<typename Scalar, int Options>
498 struct JointRevoluteUnalignedTpl;
499
500 template<typename _Scalar, int _Options>
501 struct traits<JointRevoluteUnalignedTpl<_Scalar, _Options>>
502 {
503 enum
504 {
505 NQ = 1,
506 NV = 1
507 };
508 typedef _Scalar Scalar;
509 enum
510 {
511 Options = _Options
512 };
513 typedef JointDataRevoluteUnalignedTpl<Scalar, Options> JointDataDerived;
514 typedef JointModelRevoluteUnalignedTpl<Scalar, Options> JointModelDerived;
515 typedef JointMotionSubspaceRevoluteUnalignedTpl<Scalar, Options> Constraint_t;
516 typedef SE3Tpl<Scalar, Options> Transformation_t;
517 typedef MotionRevoluteUnalignedTpl<Scalar, Options> Motion_t;
518 typedef MotionZeroTpl<Scalar, Options> Bias_t;
519
520 // [ABA]
521 typedef Eigen::Matrix<Scalar, 6, NV, Options> U_t;
522 typedef Eigen::Matrix<Scalar, NV, NV, Options> D_t;
523 typedef Eigen::Matrix<Scalar, 6, NV, Options> UD_t;
524
525 typedef Eigen::Matrix<Scalar, NQ, 1, Options> ConfigVector_t;
526 typedef Eigen::Matrix<Scalar, NV, 1, Options> TangentVector_t;
527
528 PINOCCHIO_JOINT_DATA_BASE_ACCESSOR_DEFAULT_RETURN_TYPE
529 };
530
531 template<typename _Scalar, int _Options>
532 struct traits<JointDataRevoluteUnalignedTpl<_Scalar, _Options>>
533 {
534 typedef JointRevoluteUnalignedTpl<_Scalar, _Options> JointDerived;
535 typedef _Scalar Scalar;
536 };
537
538 template<typename _Scalar, int _Options>
539 struct traits<JointModelRevoluteUnalignedTpl<_Scalar, _Options>>
540 {
541 typedef JointRevoluteUnalignedTpl<_Scalar, _Options> JointDerived;
542 typedef _Scalar Scalar;
543 };
544
545 template<typename _Scalar, int _Options>
546 struct JointDataRevoluteUnalignedTpl
547 : public JointDataBase<JointDataRevoluteUnalignedTpl<_Scalar, _Options>>
548 {
549 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
550 typedef JointRevoluteUnalignedTpl<_Scalar, _Options> JointDerived;
551 PINOCCHIO_JOINT_DATA_TYPEDEF_TEMPLATE(JointDerived);
552 951 PINOCCHIO_JOINT_DATA_BASE_DEFAULT_ACCESSOR
553
554 ConfigVector_t joint_q;
555 TangentVector_t joint_v;
556
557 Transformation_t M;
558 Constraint_t S;
559 Motion_t v;
560 Bias_t c;
561
562 // [ABA] specific data
563 U_t U;
564 D_t Dinv;
565 UD_t UDinv;
566 D_t StU;
567
568 76 JointDataRevoluteUnalignedTpl()
569
1/2
✓ Branch 2 taken 76 times.
✗ Branch 3 not taken.
76 : joint_q(ConfigVector_t::Zero())
570
3/5
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
76 , joint_v(TangentVector_t::Zero())
571
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
76 , M(Transformation_t::Identity())
572
3/5
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
76 , S(Constraint_t::Vector3::Zero())
573
3/6
✓ Branch 1 taken 76 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 76 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
76 , v(Constraint_t::Vector3::Zero(), (Scalar)0)
574
3/5
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
76 , U(U_t::Zero())
575
3/5
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
76 , Dinv(D_t::Zero())
576
3/5
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
76 , UDinv(UD_t::Zero())
577
3/5
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 72 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
152 , StU(D_t::Zero())
578 {
579 76 }
580
581 template<typename Vector3Like>
582 3106 JointDataRevoluteUnalignedTpl(const Eigen::MatrixBase<Vector3Like> & axis)
583
1/2
✓ Branch 2 taken 3104 times.
✗ Branch 3 not taken.
3106 : joint_q(ConfigVector_t::Zero())
584
3/5
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3103 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
3106 , joint_v(TangentVector_t::Zero())
585
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
3106 , M(Transformation_t::Identity())
586
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
3106 , S(axis)
587
2/4
✓ Branch 1 taken 3104 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
3106 , v(axis, (Scalar)NAN)
588
3/5
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3103 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
3106 , U(U_t::Zero())
589
3/5
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3103 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
3106 , Dinv(D_t::Zero())
590
3/5
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 3103 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
3106 , UDinv(UD_t::Zero())
591
3/5
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3103 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
6212 , StU(D_t::Zero())
592 {
593 3106 }
594
595 144 static std::string classname()
596 {
597
1/2
✓ Branch 2 taken 144 times.
✗ Branch 3 not taken.
144 return std::string("JointDataRevoluteUnaligned");
598 }
599 3 std::string shortname() const
600 {
601 3 return classname();
602 }
603
604 }; // struct JointDataRevoluteUnalignedTpl
605
606 PINOCCHIO_JOINT_CAST_TYPE_SPECIALIZATION(JointModelRevoluteUnalignedTpl);
607 template<typename _Scalar, int _Options>
608 struct JointModelRevoluteUnalignedTpl
609 : public JointModelBase<JointModelRevoluteUnalignedTpl<_Scalar, _Options>>
610 {
611 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
612 typedef JointRevoluteUnalignedTpl<_Scalar, _Options> JointDerived;
613 PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(JointDerived);
614 typedef Eigen::Matrix<Scalar, 3, 1, _Options> Vector3;
615
616 typedef JointModelBase<JointModelRevoluteUnalignedTpl> Base;
617 using Base::id;
618 using Base::idx_q;
619 using Base::idx_v;
620 using Base::setIndexes;
621
622 116 JointModelRevoluteUnalignedTpl()
623
1/2
✓ Branch 3 taken 116 times.
✗ Branch 4 not taken.
116 : axis(Vector3::UnitX())
624 {
625 116 }
626
627 24 JointModelRevoluteUnalignedTpl(const Scalar & x, const Scalar & y, const Scalar & z)
628 24 : axis(x, y, z)
629 {
630
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
24 normalize(axis);
631
2/11
✗ Branch 1 not taken.
✓ Branch 2 taken 24 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
24 assert(isUnitary(axis) && "Rotation axis is not unitary");
632 24 }
633
634 template<typename Vector3Like>
635 361 JointModelRevoluteUnalignedTpl(const Eigen::MatrixBase<Vector3Like> & axis)
636 361 : axis(axis)
637 {
638 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Vector3Like);
639
5/11
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 348 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 349 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
361 assert(isUnitary(axis) && "Rotation axis is not unitary");
640 361 }
641
642 3106 JointDataDerived createData() const
643 {
644 3106 return JointDataDerived(axis);
645 }
646
647 using Base::isEqual;
648 136 bool isEqual(const JointModelRevoluteUnalignedTpl & other) const
649 {
650
3/4
✓ Branch 1 taken 134 times.
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 134 times.
✗ Branch 5 not taken.
136 return Base::isEqual(other) && internal::comparison_eq(axis, other.axis);
651 }
652
653 const std::vector<bool> hasConfigurationLimit() const
654 {
655 return {true};
656 }
657
658 const std::vector<bool> hasConfigurationLimitInTangent() const
659 {
660 return {true};
661 }
662
663 template<typename ConfigVector>
664 6179 void calc(JointDataDerived & data, const typename Eigen::MatrixBase<ConfigVector> & qs) const
665 {
666
0/4
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
6179 data.joint_q[0] = qs[idx_q()];
667
668 6179 toRotationMatrix(axis, data.joint_q[0], data.M.rotation());
669 6179 }
670
671 template<typename TangentVector>
672 void
673 1 calc(JointDataDerived & data, const Blank, const typename Eigen::MatrixBase<TangentVector> & vs)
674 const
675 {
676 1 data.v.angularRate() = static_cast<Scalar>(vs[idx_v()]);
677 1 }
678
679 template<typename ConfigVector, typename TangentVector>
680 1050 void calc(
681 JointDataDerived & data,
682 const typename Eigen::MatrixBase<ConfigVector> & qs,
683 const typename Eigen::MatrixBase<TangentVector> & vs) const
684 {
685 1050 calc(data, qs.derived());
686
687
1/3
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1050 data.v.angularRate() = static_cast<Scalar>(vs[idx_v()]);
688 1050 }
689
690 template<typename VectorLike, typename Matrix6Like>
691 8 void calc_aba(
692 JointDataDerived & data,
693 const Eigen::MatrixBase<VectorLike> & armature,
694 const Eigen::MatrixBase<Matrix6Like> & I,
695 const bool update_I) const
696 {
697
3/6
✓ 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.
8 data.U.noalias() = I.template middleCols<3>(Motion::ANGULAR) * axis;
698
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.
16 data.Dinv[0] =
699
3/8
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
8 Scalar(1) / (axis.dot(data.U.template segment<3>(Motion::ANGULAR)) + armature[0]);
700
2/4
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
8 data.UDinv.noalias() = data.U * data.Dinv;
701
702
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
8 if (update_I)
703
3/6
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
3 PINOCCHIO_EIGEN_CONST_CAST(Matrix6Like, I).noalias() -= data.UDinv * data.U.transpose();
704 8 }
705
706 19551 static std::string classname()
707 {
708
1/2
✓ Branch 2 taken 19551 times.
✗ Branch 3 not taken.
19551 return std::string("JointModelRevoluteUnaligned");
709 }
710 19409 std::string shortname() const
711 {
712 19409 return classname();
713 }
714
715 /// \returns An expression of *this with the Scalar type casted to NewScalar.
716 template<typename NewScalar>
717 5 JointModelRevoluteUnalignedTpl<NewScalar, Options> cast() const
718 {
719 typedef JointModelRevoluteUnalignedTpl<NewScalar, Options> ReturnType;
720
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
5 ReturnType res(axis.template cast<NewScalar>());
721
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.
5 res.setIndexes(id(), idx_q(), idx_v());
722 5 return res;
723 }
724
725 // data
726
727 ///
728 /// \brief 3d main axis of the joint.
729 ///
730 Vector3 axis;
731 }; // struct JointModelRevoluteUnalignedTpl
732
733 } // namespace pinocchio
734
735 #include <boost/type_traits.hpp>
736
737 namespace boost
738 {
739 template<typename Scalar, int Options>
740 struct has_nothrow_constructor<::pinocchio::JointModelRevoluteUnalignedTpl<Scalar, Options>>
741 : public integral_constant<bool, true>
742 {
743 };
744
745 template<typename Scalar, int Options>
746 struct has_nothrow_copy<::pinocchio::JointModelRevoluteUnalignedTpl<Scalar, Options>>
747 : public integral_constant<bool, true>
748 {
749 };
750
751 template<typename Scalar, int Options>
752 struct has_nothrow_constructor<::pinocchio::JointDataRevoluteUnalignedTpl<Scalar, Options>>
753 : public integral_constant<bool, true>
754 {
755 };
756
757 template<typename Scalar, int Options>
758 struct has_nothrow_copy<::pinocchio::JointDataRevoluteUnalignedTpl<Scalar, Options>>
759 : public integral_constant<bool, true>
760 {
761 };
762 } // namespace boost
763
764 #endif // ifndef __pinocchio_multibody_joint_revolute_unaligned_hpp__
765