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