pinocchio  3.7.0
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
 
Loading...
Searching...
No Matches
joint-revolute-unaligned.hpp
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
17namespace 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>
26 {
28 };
29
30 template<typename Scalar, int Options, typename MotionDerived>
35
36 template<typename _Scalar, int _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;
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 {
69 MOTION_TYPEDEF_TPL(MotionRevoluteUnalignedTpl);
70
72 {
73 }
74
75 template<typename Vector3Like, typename OtherScalar>
76 MotionRevoluteUnalignedTpl(const Eigen::MatrixBase<Vector3Like> & axis, const OtherScalar & w)
77 : m_axis(axis)
78 , m_w(w)
79 {
80 }
81
82 inline PlainReturnType plain() const
83 {
84 return PlainReturnType(PlainReturnType::Vector3::Zero(), m_axis * m_w);
85 }
86
87 template<typename OtherScalar>
88 MotionRevoluteUnalignedTpl __mult__(const OtherScalar & alpha) const
89 {
90 return MotionRevoluteUnalignedTpl(m_axis, alpha * m_w);
91 }
92
93 template<typename MotionDerived>
94 inline void addTo(MotionDense<MotionDerived> & v) const
95 {
96 v.angular() += m_axis * m_w;
97 }
98
99 template<typename Derived>
100 void setTo(MotionDense<Derived> & other) const
101 {
102 other.linear().setZero();
103 other.angular().noalias() = m_axis * m_w;
104 }
105
106 template<typename S2, int O2, typename D2>
107 void se3Action_impl(const SE3Tpl<S2, O2> & m, MotionDense<D2> & v) const
108 {
109 // Angular
110 v.angular().noalias() = m_w * m.rotation() * m_axis;
111
112 // Linear
113 v.linear().noalias() = m.translation().cross(v.angular());
114 }
115
116 template<typename S2, int O2>
117 MotionPlain se3Action_impl(const SE3Tpl<S2, O2> & m) const
118 {
119 MotionPlain res;
120 se3Action_impl(m, res);
121 return res;
122 }
123
124 template<typename S2, int O2, typename D2>
125 void se3ActionInverse_impl(const SE3Tpl<S2, O2> & m, MotionDense<D2> & v) const
126 {
127 // Linear
128 // TODO: use v.angular() as temporary variable
129 Vector3 v3_tmp;
130 v3_tmp.noalias() = m_axis.cross(m.translation());
131 v3_tmp *= m_w;
132 v.linear().noalias() = m.rotation().transpose() * v3_tmp;
133
134 // Angular
135 v.angular().noalias() = m.rotation().transpose() * m_axis;
136 v.angular() *= 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 void motionAction(const MotionDense<M1> & v, MotionDense<M2> & mout) const
149 {
150 // Linear
151 mout.linear().noalias() = v.linear().cross(m_axis);
152 mout.linear() *= m_w;
153
154 // Angular
155 mout.angular().noalias() = v.angular().cross(m_axis);
156 mout.angular() *= m_w;
157 }
158
159 template<typename M1>
160 MotionPlain motionAction(const MotionDense<M1> & v) const
161 {
162 MotionPlain res;
163 motionAction(v, res);
164 return res;
165 }
166
167 bool isEqual_impl(const MotionRevoluteUnalignedTpl & other) const
168 {
169 return internal::comparison_eq(m_axis, other.m_axis)
170 && internal::comparison_eq(m_w, other.m_w);
171 }
172
173 const Scalar & angularRate() const
174 {
175 return m_w;
176 }
177 Scalar & angularRate()
178 {
179 return m_w;
180 }
181
182 const Vector3 & axis() const
183 {
184 return m_axis;
185 }
186 Vector3 & axis()
187 {
188 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
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 operator^(const MotionDense<MotionDerived> & m1, const MotionRevoluteUnalignedTpl<S2, O2> & m2)
209 {
210 return m2.motionAction(m1);
211 }
212
213 template<typename Scalar, int Options>
214 struct JointMotionSubspaceRevoluteUnalignedTpl;
215
216 template<typename _Scalar, int _Options>
218 {
219 typedef _Scalar Scalar;
220 enum
221 {
222 Options = _Options
223 };
224 enum
225 {
226 LINEAR = 0,
227 ANGULAR = 3
228 };
229
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>
245 {
246 typedef Eigen::Matrix<Scalar, 6, 1, Options> ReturnType;
247 };
248
249 template<typename Scalar, int Options, typename MotionDerived>
253 {
254 typedef Eigen::Matrix<Scalar, 6, 1, Options> ReturnType;
255 };
256
257 template<typename Scalar, int Options, typename ForceDerived>
259 {
260 typedef
262 typedef Eigen::Matrix<
263 typename PINOCCHIO_EIGEN_DOT_PRODUCT_RETURN_TYPE(
265 1,
266 1,
267 Options>
268 ReturnType;
269 };
270
271 template<typename Scalar, int Options, typename ForceSet>
273 {
274 typedef
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>
283 : JointMotionSubspaceBase<JointMotionSubspaceRevoluteUnalignedTpl<_Scalar, _Options>>
284 {
286 PINOCCHIO_CONSTRAINT_TYPEDEF_TPL(JointMotionSubspaceRevoluteUnalignedTpl)
287
288 enum
289 {
290 NV = 1
291 };
292
294
296 {
297 }
298
299 template<typename Vector3Like>
300 JointMotionSubspaceRevoluteUnalignedTpl(const Eigen::MatrixBase<Vector3Like> & axis)
301 : m_axis(axis)
302 {
303 }
304
305 template<typename Vector1Like>
306 JointMotion __mult__(const Eigen::MatrixBase<Vector1Like> & v) const
307 {
309 return JointMotion(m_axis, v[0]);
310 }
311
312 template<typename S1, int O1>
313 typename SE3GroupAction<JointMotionSubspaceRevoluteUnalignedTpl>::ReturnType
314 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 ReturnType res;
321 res.template segment<3>(ANGULAR).noalias() = m.rotation() * m_axis;
322 res.template segment<3>(LINEAR).noalias() =
323 m.translation().cross(res.template segment<3>(ANGULAR));
324 return res;
325 }
326
327 template<typename S1, int O1>
328 typename SE3GroupAction<JointMotionSubspaceRevoluteUnalignedTpl>::ReturnType
329 se3ActionInverse(const SE3Tpl<S1, O1> & m) const
330 {
331 typedef
332 typename SE3GroupAction<JointMotionSubspaceRevoluteUnalignedTpl>::ReturnType ReturnType;
333
334 ReturnType res;
335 res.template segment<3>(ANGULAR).noalias() = m.rotation().transpose() * m_axis;
336 res.template segment<3>(LINEAR).noalias() =
337 -m.rotation().transpose() * m.translation().cross(m_axis);
338 return res;
339 }
340
341 int nv_impl() const
342 {
343 return NV;
344 }
345
347 : JointMotionSubspaceTransposeBase<JointMotionSubspaceRevoluteUnalignedTpl>
348 {
351 : ref(ref)
352 {
353 }
354
355 template<typename ForceDerived>
357 operator*(const ForceDense<ForceDerived> & f) const
358 {
359 typedef typename ConstraintForceOp<
361 ReturnType res;
362 res[0] = ref.axis().dot(f.angular());
363 return res;
364 }
365
366 /* [CRBA] MatrixBase operator* (Constraint::Transpose S, ForceSet::Block) */
367 template<typename ForceSet>
369 operator*(const Eigen::MatrixBase<ForceSet> & F)
370 {
372 ForceSet::RowsAtCompileTime == 6, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE)
373 /* Return ax.T * F[3:end,:] */
374 return ref.axis().transpose() * F.template middleRows<3>(ANGULAR);
375 }
376 };
377
378 TransposeConst transpose() const
379 {
380 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 DenseBase matrix_impl() const
390 {
391 DenseBase S;
392 S.template segment<3>(LINEAR).setZero();
393 S.template segment<3>(ANGULAR) = m_axis;
394 return S;
395 }
396
397 template<typename MotionDerived>
398 typename MotionAlgebraAction<JointMotionSubspaceRevoluteUnalignedTpl, MotionDerived>::ReturnType
399 motionAction(const MotionDense<MotionDerived> & m) const
400 {
401 const typename MotionDerived::ConstLinearType v = m.linear();
402 const typename MotionDerived::ConstAngularType w = m.angular();
403
404 DenseBase res;
405 res.template segment<3>(LINEAR).noalias() = v.cross(m_axis);
406 res.template segment<3>(ANGULAR).noalias() = w.cross(m_axis);
407
408 return res;
409 }
410
411 const Vector3 & axis() const
412 {
413 return m_axis;
414 }
415 Vector3 & axis()
416 {
417 return m_axis;
418 }
419
420 bool isEqual(const JointMotionSubspaceRevoluteUnalignedTpl & other) const
421 {
422 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>
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>
441 {
444 typedef typename MultiplicationOp<Inertia, Constraint>::ReturnType ReturnType;
445 static inline ReturnType run(const Inertia & Y, const Constraint & cru)
446 {
447 ReturnType res;
448
449 /* YS = [ m -mcx ; mcx I-mcxcx ] [ 0 ; w ] = [ mcxw ; Iw -mcxcxw ] */
450 const typename Inertia::Scalar & m = Y.mass();
451 const typename Inertia::Vector3 & c = Y.lever();
452 const typename Inertia::Symmetric3 & I = Y.inertia();
453
454 res.template segment<3>(Inertia::LINEAR) = -m * c.cross(cru.axis());
455 res.template segment<3>(Inertia::ANGULAR).noalias() = I * cru.axis();
456 res.template segment<3>(Inertia::ANGULAR) +=
457 c.cross(res.template segment<3>(Inertia::LINEAR));
458
459 return res;
460 }
461 };
462 } // namespace impl
463
464 template<typename M6Like, typename Scalar, int Options>
466 Eigen::MatrixBase<M6Like>,
468 {
469 typedef typename SizeDepType<3>::ColsReturn<M6Like>::ConstType M6LikeCols;
470 typedef typename Eigen::internal::remove_const<M6LikeCols>::type M6LikeColsNonConst;
471
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>
482 Eigen::MatrixBase<M6Like>,
484 {
486 typedef
487 typename MultiplicationOp<Eigen::MatrixBase<M6Like>, Constraint>::ReturnType ReturnType;
488
489 static inline ReturnType run(const Eigen::MatrixBase<M6Like> & Y, const Constraint & cru)
490 {
492 return Y.derived().template middleCols<3>(Constraint::ANGULAR) * cru.axis();
493 }
494 };
495 } // namespace impl
496
497 template<typename Scalar, int Options>
499
500 template<typename _Scalar, int _Options>
502 {
503 enum
504 {
505 NQ = 1,
506 NV = 1,
507 NVExtended = 1
508 };
509 typedef _Scalar Scalar;
510 enum
511 {
512 Options = _Options
513 };
520
521 // [ABA]
522 typedef Eigen::Matrix<Scalar, 6, NV, Options> U_t;
523 typedef Eigen::Matrix<Scalar, NV, NV, Options> D_t;
524 typedef Eigen::Matrix<Scalar, 6, NV, Options> UD_t;
525
526 typedef Eigen::Matrix<Scalar, NQ, 1, Options> ConfigVector_t;
527 typedef Eigen::Matrix<Scalar, NV, 1, Options> TangentVector_t;
528
529 typedef boost::mpl::true_ is_mimicable_t;
530
531 PINOCCHIO_JOINT_DATA_BASE_ACCESSOR_DEFAULT_RETURN_TYPE
532 };
533
534 template<typename _Scalar, int _Options>
540
541 template<typename _Scalar, int _Options>
547
548 template<typename _Scalar, int _Options>
550 : public JointDataBase<JointDataRevoluteUnalignedTpl<_Scalar, _Options>>
551 {
554 PINOCCHIO_JOINT_DATA_TYPEDEF_TEMPLATE(JointDerived);
555 PINOCCHIO_JOINT_DATA_BASE_DEFAULT_ACCESSOR
556
557 ConfigVector_t joint_q;
558 TangentVector_t joint_v;
559
560 Transformation_t M;
561 Constraint_t S;
562 Motion_t v;
563 Bias_t c;
564
565 // [ABA] specific data
566 U_t U;
567 D_t Dinv;
568 UD_t UDinv;
569 D_t StU;
570
572 : joint_q(ConfigVector_t::Zero())
573 , joint_v(TangentVector_t::Zero())
574 , M(Transformation_t::Identity())
575 , S(Constraint_t::Vector3::Zero())
576 , v(Constraint_t::Vector3::Zero(), (Scalar)0)
577 , U(U_t::Zero())
578 , Dinv(D_t::Zero())
579 , UDinv(UD_t::Zero())
580 , StU(D_t::Zero())
581 {
582 }
583
584 template<typename Vector3Like>
585 JointDataRevoluteUnalignedTpl(const Eigen::MatrixBase<Vector3Like> & axis)
586 : joint_q(ConfigVector_t::Zero())
587 , joint_v(TangentVector_t::Zero())
588 , M(Transformation_t::Identity())
589 , S(axis)
590 , v(axis, (Scalar)NAN)
591 , U(U_t::Zero())
592 , Dinv(D_t::Zero())
593 , UDinv(UD_t::Zero())
594 , StU(D_t::Zero())
595 {
596 }
597
598 static std::string classname()
599 {
600 return std::string("JointDataRevoluteUnaligned");
601 }
602 std::string shortname() const
603 {
604 return classname();
605 }
606
607 }; // struct JointDataRevoluteUnalignedTpl
608
609 PINOCCHIO_JOINT_CAST_TYPE_SPECIALIZATION(JointModelRevoluteUnalignedTpl);
610 template<typename _Scalar, int _Options>
612 : public JointModelBase<JointModelRevoluteUnalignedTpl<_Scalar, _Options>>
613 {
616 PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(JointDerived);
617 typedef Eigen::Matrix<Scalar, 3, 1, _Options> Vector3;
618
620 using Base::id;
621 using Base::idx_q;
622 using Base::idx_v;
623 using Base::idx_vExtended;
624 using Base::setIndexes;
625
627 : axis(Vector3::UnitX())
628 {
629 }
630
631 JointModelRevoluteUnalignedTpl(const Scalar & x, const Scalar & y, const Scalar & z)
632 : axis(x, y, z)
633 {
635 assert(isUnitary(axis) && "Rotation axis is not unitary");
636 }
637
638 template<typename Vector3Like>
639 JointModelRevoluteUnalignedTpl(const Eigen::MatrixBase<Vector3Like> & axis)
640 : axis(axis)
641 {
643 assert(isUnitary(axis) && "Rotation axis is not unitary");
644 }
645
646 JointDataDerived createData() const
647 {
648 return JointDataDerived(axis);
649 }
650
651 using Base::isEqual;
652 bool isEqual(const JointModelRevoluteUnalignedTpl & other) const
653 {
654 return Base::isEqual(other) && internal::comparison_eq(axis, other.axis);
655 }
656
657 const std::vector<bool> hasConfigurationLimit() const
658 {
659 return {true};
660 }
661
662 const std::vector<bool> hasConfigurationLimitInTangent() const
663 {
664 return {true};
665 }
666
667 template<typename ConfigVector>
668 void calc(JointDataDerived & data, const typename Eigen::MatrixBase<ConfigVector> & qs) const
669 {
670 data.joint_q[0] = qs[idx_q()];
671
672 toRotationMatrix(axis, data.joint_q[0], data.M.rotation());
673 }
674
675 template<typename TangentVector>
676 void
677 calc(JointDataDerived & data, const Blank, const typename Eigen::MatrixBase<TangentVector> & vs)
678 const
679 {
680 data.v.angularRate() = static_cast<Scalar>(vs[idx_v()]);
681 }
682
683 template<typename ConfigVector, typename TangentVector>
684 void calc(
685 JointDataDerived & data,
686 const typename Eigen::MatrixBase<ConfigVector> & qs,
687 const typename Eigen::MatrixBase<TangentVector> & vs) const
688 {
689 calc(data, qs.derived());
690
691 data.v.angularRate() = static_cast<Scalar>(vs[idx_v()]);
692 }
693
694 template<typename VectorLike, typename Matrix6Like>
695 void calc_aba(
696 JointDataDerived & data,
697 const Eigen::MatrixBase<VectorLike> & armature,
698 const Eigen::MatrixBase<Matrix6Like> & I,
699 const bool update_I) const
700 {
701 data.U.noalias() = I.template middleCols<3>(Motion::ANGULAR) * axis;
702 data.Dinv[0] =
703 Scalar(1) / (axis.dot(data.U.template segment<3>(Motion::ANGULAR)) + armature[0]);
704 data.UDinv.noalias() = data.U * data.Dinv;
705
706 if (update_I)
707 PINOCCHIO_EIGEN_CONST_CAST(Matrix6Like, I).noalias() -= data.UDinv * data.U.transpose();
708 }
709
710 static std::string classname()
711 {
712 return std::string("JointModelRevoluteUnaligned");
713 }
714 std::string shortname() const
715 {
716 return classname();
717 }
718
720 template<typename NewScalar>
722 {
724 ReturnType res(axis.template cast<NewScalar>());
725 res.setIndexes(id(), idx_q(), idx_v(), idx_vExtended());
726 return res;
727 }
728
729 // data
730
734 Vector3 axis;
735 }; // struct JointModelRevoluteUnalignedTpl
736
737 template<typename Scalar, int Options>
739 {
741 };
742} // namespace pinocchio
743
744#include <boost/type_traits.hpp>
745
746namespace boost
747{
748 template<typename Scalar, int Options>
749 struct has_nothrow_constructor<::pinocchio::JointModelRevoluteUnalignedTpl<Scalar, Options>>
750 : public integral_constant<bool, true>
751 {
752 };
753
754 template<typename Scalar, int Options>
755 struct has_nothrow_copy<::pinocchio::JointModelRevoluteUnalignedTpl<Scalar, Options>>
756 : public integral_constant<bool, true>
757 {
758 };
759
760 template<typename Scalar, int Options>
761 struct has_nothrow_constructor<::pinocchio::JointDataRevoluteUnalignedTpl<Scalar, Options>>
762 : public integral_constant<bool, true>
763 {
764 };
765
766 template<typename Scalar, int Options>
767 struct has_nothrow_copy<::pinocchio::JointDataRevoluteUnalignedTpl<Scalar, Options>>
768 : public integral_constant<bool, true>
769 {
770 };
771} // namespace boost
772
773#endif // ifndef __pinocchio_multibody_joint_revolute_unaligned_hpp__
Main pinocchio namespace.
Definition treeview.dox:11
void toRotationMatrix(const Eigen::MatrixBase< Vector3 > &axis, const Scalar &cos_value, const Scalar &sin_value, const Eigen::MatrixBase< Matrix3 > &res)
Computes a rotation matrix from a vector and values of sin and cos orientations values.
Definition rotation.hpp:26
void normalize(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const Eigen::MatrixBase< ConfigVectorType > &qout)
Normalize a configuration vector.
JointDataTpl< Scalar, Options, JointCollectionTpl >::TangentVector_t joint_v(const JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata)
Visit a JointDataVariant through JointConfigVisitor to get the joint velocity vector.
JointDataTpl< Scalar, Options, JointCollectionTpl >::ConfigVector_t joint_q(const JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata)
Visit a JointDataVariant through JointConfigVisitor to get the joint configuration vector.
bool isUnitary(const Eigen::MatrixBase< MatrixLike > &mat, const typename MatrixLike::RealScalar &prec=Eigen::NumTraits< typename MatrixLike::Scalar >::dummy_precision())
Check whether the input matrix is Unitary within the given precision.
Definition matrix.hpp:155
Blank type.
Definition fwd.hpp:77
Assign the correct configuration vector space affine transformation according to the joint type....
Return type of the Constraint::Transpose * Force operation.
Return type of the Constraint::Transpose * ForceSet operation.
JointModelRevoluteUnalignedTpl< NewScalar, Options > cast() const
Linear affine transformation of the configuration vector. Valide for most common joints which are evo...
Return type of the ation of a Motion onto an object of type D.
Definition motion.hpp:46
Forward declaration of the multiplication operation return type. Should be overloaded,...
Definition binary-op.hpp:15
Common traits structure to fully define base classes for CRTP.
Definition fwd.hpp:72