pinocchio  3.3.1
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
joint-mimic.hpp
1 //
2 // Copyright (c) 2019-2021 INRIA
3 //
4 
5 #ifndef __pinocchio_multibody_joint_mimic_hpp__
6 #define __pinocchio_multibody_joint_mimic_hpp__
7 
8 #include "pinocchio/macros.hpp"
9 #include "pinocchio/multibody/joint/joint-base.hpp"
10 
11 namespace pinocchio
12 {
13 
14  template<class Constraint>
15  struct ScaledJointMotionSubspace;
16 
17  template<class Constraint>
18  struct traits<ScaledJointMotionSubspace<Constraint>>
19  {
20  typedef typename traits<Constraint>::Scalar Scalar;
21  enum
22  {
24  };
25  enum
26  {
29  };
30 
31  typedef typename traits<Constraint>::JointMotion JointMotion;
32  typedef typename traits<Constraint>::JointForce JointForce;
33  typedef typename traits<Constraint>::DenseBase DenseBase;
34  typedef typename traits<Constraint>::ReducedSquaredMatrix ReducedSquaredMatrix;
35 
36  typedef typename traits<Constraint>::MatrixReturnType MatrixReturnType;
37  typedef typename traits<Constraint>::ConstMatrixReturnType ConstMatrixReturnType;
38  typedef ReducedSquaredMatrix StDiagonalMatrixSOperationReturnType;
39  }; // traits ScaledJointMotionSubspace
40 
41  template<class Constraint>
43  {
44  typedef typename SE3GroupAction<Constraint>::ReturnType ReturnType;
45  };
46 
47  template<class Constraint, typename MotionDerived>
48  struct MotionAlgebraAction<ScaledJointMotionSubspace<Constraint>, MotionDerived>
49  {
50  typedef typename MotionAlgebraAction<Constraint, MotionDerived>::ReturnType ReturnType;
51  };
52 
53  template<class Constraint, typename ForceDerived>
54  struct ConstraintForceOp<ScaledJointMotionSubspace<Constraint>, ForceDerived>
55  {
56  typedef typename Constraint::Scalar Scalar;
57  typedef typename ConstraintForceOp<Constraint, ForceDerived>::ReturnType OriginalReturnType;
58 
59  typedef typename ScalarMatrixProduct<Scalar, OriginalReturnType>::type IdealReturnType;
60  typedef Eigen::Matrix<
61  Scalar,
62  IdealReturnType::RowsAtCompileTime,
63  IdealReturnType::ColsAtCompileTime,
64  Constraint::Options>
65  ReturnType;
66  };
67 
68  template<class Constraint, typename ForceSet>
70  {
71  typedef typename Constraint::Scalar Scalar;
72  typedef typename ConstraintForceSetOp<Constraint, ForceSet>::ReturnType OriginalReturnType;
73  typedef typename ScalarMatrixProduct<Scalar, OriginalReturnType>::type IdealReturnType;
74  typedef Eigen::Matrix<
75  Scalar,
76  Constraint::NV,
77  ForceSet::ColsAtCompileTime,
78  Constraint::Options | Eigen::RowMajor>
79  ReturnType;
80  };
81 
82  template<class Constraint>
83  struct ScaledJointMotionSubspace : JointMotionSubspaceBase<ScaledJointMotionSubspace<Constraint>>
84  {
85  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
86 
87  PINOCCHIO_CONSTRAINT_TYPEDEF_TPL(ScaledJointMotionSubspace)
88  enum
89  {
90  NV = Constraint::NV
91  };
93  using Base::nv;
94 
95  typedef typename SE3GroupAction<Constraint>::ReturnType SE3ActionReturnType;
96 
98  {
99  }
100 
101  explicit ScaledJointMotionSubspace(const Scalar & scaling_factor)
102  : m_scaling_factor(scaling_factor)
103  {
104  }
105 
106  ScaledJointMotionSubspace(const Constraint & constraint, const Scalar & scaling_factor)
107  : m_constraint(constraint)
108  , m_scaling_factor(scaling_factor)
109  {
110  }
111 
113  : m_constraint(other.m_constraint)
114  , m_scaling_factor(other.m_scaling_factor)
115  {
116  }
117 
118  ScaledJointMotionSubspace & operator=(const ScaledJointMotionSubspace & other)
119  {
120  m_constraint = other.m_constraint;
121  m_scaling_factor = other.m_scaling_factor;
122  return *this;
123  }
124 
125  template<typename VectorLike>
126  JointMotion __mult__(const Eigen::MatrixBase<VectorLike> & v) const
127  {
128  assert(v.size() == nv());
129  JointMotion jm = m_constraint * v;
130  return jm * m_scaling_factor;
131  }
132 
133  template<typename S1, int O1>
134  SE3ActionReturnType se3Action(const SE3Tpl<S1, O1> & m) const
135  {
136  SE3ActionReturnType res = m_constraint.se3Action(m);
137  return m_scaling_factor * res;
138  }
139 
140  template<typename S1, int O1>
141  SE3ActionReturnType se3ActionInverse(const SE3Tpl<S1, O1> & m) const
142  {
143  SE3ActionReturnType res = m_constraint.se3ActionInverse(m);
144  return m_scaling_factor * res;
145  }
146 
147  int nv_impl() const
148  {
149  return m_constraint.nv();
150  }
151 
152  struct TransposeConst : JointMotionSubspaceTransposeBase<ScaledJointMotionSubspace>
153  {
154  const ScaledJointMotionSubspace & ref;
156  : ref(ref)
157  {
158  }
159 
160  template<typename Derived>
161  typename ConstraintForceOp<ScaledJointMotionSubspace, Derived>::ReturnType
162  operator*(const ForceDense<Derived> & f) const
163  {
164  // TODO: I don't know why, but we should a dense a return type, otherwise it fails at the
165  // evaluation level;
166  typedef
167  typename ConstraintForceOp<ScaledJointMotionSubspace, Derived>::ReturnType ReturnType;
168  return ReturnType(ref.m_scaling_factor * (ref.m_constraint.transpose() * f));
169  }
170 
172  template<typename Derived>
173  typename ConstraintForceSetOp<ScaledJointMotionSubspace, Derived>::ReturnType
174  operator*(const Eigen::MatrixBase<Derived> & F) const
175  {
176  typedef
177  typename ConstraintForceSetOp<ScaledJointMotionSubspace, Derived>::ReturnType ReturnType;
178  return ReturnType(ref.m_scaling_factor * (ref.m_constraint.transpose() * F));
179  }
180 
181  }; // struct TransposeConst
182 
183  TransposeConst transpose() const
184  {
185  return TransposeConst(*this);
186  }
187 
188  DenseBase matrix_impl() const
189  {
190  DenseBase S = m_scaling_factor * m_constraint.matrix();
191  return S;
192  }
193 
194  template<typename MotionDerived>
195  typename MotionAlgebraAction<ScaledJointMotionSubspace, MotionDerived>::ReturnType
196  motionAction(const MotionDense<MotionDerived> & m) const
197  {
198  typedef typename MotionAlgebraAction<ScaledJointMotionSubspace, MotionDerived>::ReturnType
199  ReturnType;
200  ReturnType res = m_scaling_factor * m_constraint.motionAction(m);
201  return res;
202  }
203 
204  inline const Scalar & scaling() const
205  {
206  return m_scaling_factor;
207  }
208  inline Scalar & scaling()
209  {
210  return m_scaling_factor;
211  }
212 
213  inline const Constraint & constraint() const
214  {
215  return m_constraint;
216  }
217  inline Constraint & constraint()
218  {
219  return m_constraint;
220  }
221 
222  bool isEqual(const ScaledJointMotionSubspace & other) const
223  {
224  return internal::comparison_eq(m_constraint, other.m_constraint)
225  && internal::comparison_eq(m_scaling_factor, other.m_scaling_factor);
226  }
227 
228  protected:
229  Constraint m_constraint;
230  Scalar m_scaling_factor;
231  }; // struct ScaledJointMotionSubspace
232 
233  namespace details
234  {
235  template<typename ParentConstraint>
237  {
240 
241  static ReturnType run(const JointMotionSubspaceBase<Constraint> & constraint)
242  {
243  const Constraint & constraint_ = constraint.derived();
244  return (constraint_.constraint().transpose() * constraint_.constraint())
245  * (constraint_.scaling() * constraint_.scaling());
246  }
247  };
248  } // namespace details
249 
250  template<typename S1, int O1, typename _Constraint>
252  {
253  typedef InertiaTpl<S1, O1> Inertia;
255  typedef typename Constraint::Scalar Scalar;
256 
257  typedef typename MultiplicationOp<Inertia, _Constraint>::ReturnType OriginalReturnType;
258  // typedef typename ScalarMatrixProduct<Scalar,OriginalReturnType>::type ReturnType;
259  typedef OriginalReturnType ReturnType;
260  };
261 
262  /* [CRBA] ForceSet operator* (Inertia Y,Constraint S) */
263  namespace impl
264  {
265  template<typename S1, int O1, typename _Constraint>
267  {
268  typedef InertiaTpl<S1, O1> Inertia;
270  typedef typename MultiplicationOp<Inertia, Constraint>::ReturnType ReturnType;
271 
272  static inline ReturnType run(const Inertia & Y, const Constraint & scaled_constraint)
273  {
274  return scaled_constraint.scaling() * (Y * scaled_constraint.constraint());
275  }
276  };
277  } // namespace impl
278 
279  template<typename M6Like, typename _Constraint>
280  struct MultiplicationOp<Eigen::MatrixBase<M6Like>, ScaledJointMotionSubspace<_Constraint>>
281  {
282  typedef typename MultiplicationOp<Inertia, _Constraint>::ReturnType OriginalReturnType;
283  typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(OriginalReturnType) ReturnType;
284  };
285 
286  /* [ABA] operator* (Inertia Y,Constraint S) */
287  namespace impl
288  {
289  template<typename M6Like, typename _Constraint>
290  struct LhsMultiplicationOp<Eigen::MatrixBase<M6Like>, ScaledJointMotionSubspace<_Constraint>>
291  {
293  typedef
294  typename MultiplicationOp<Eigen::MatrixBase<M6Like>, Constraint>::ReturnType ReturnType;
295 
296  static inline ReturnType
297  run(const Eigen::MatrixBase<M6Like> & Y, const Constraint & scaled_constraint)
298  {
299  return scaled_constraint.scaling() * (Y.derived() * scaled_constraint.constraint());
300  }
301  };
302  } // namespace impl
303 
304  template<class Joint>
305  struct JointMimic;
306  template<class JointModel>
307  struct JointModelMimic;
308  template<class JointData>
309  struct JointDataMimic;
310 
311  template<class Joint>
313  {
314  enum
315  {
316  NQ = traits<Joint>::NV,
317  NV = traits<Joint>::NQ
318  };
319  typedef typename traits<Joint>::Scalar Scalar;
320  enum
321  {
322  Options = traits<Joint>::Options
323  };
324 
325  typedef typename traits<Joint>::JointDataDerived JointDataBase;
326  typedef typename traits<Joint>::JointModelDerived JointModelBase;
327 
330 
332  typedef typename traits<Joint>::Transformation_t Transformation_t;
333  typedef typename traits<Joint>::Motion_t Motion_t;
334  typedef typename traits<Joint>::Bias_t Bias_t;
335 
336  // [ABA]
337  typedef typename traits<Joint>::U_t U_t;
338  typedef typename traits<Joint>::D_t D_t;
339  typedef typename traits<Joint>::UD_t UD_t;
340 
341  typedef typename traits<Joint>::ConfigVector_t ConfigVector_t;
342  typedef typename traits<Joint>::TangentVector_t TangentVector_t;
343 
344  PINOCCHIO_JOINT_DATA_BASE_ACCESSOR_DEFAULT_RETURN_TYPE
345  };
346 
347  template<class Joint>
349  {
351  typedef typename traits<JointDerived>::Scalar Scalar;
352  };
353 
354  template<class Joint>
356  {
358  typedef typename traits<JointDerived>::Scalar Scalar;
359  };
360 
361  template<class JointData>
362  struct JointDataMimic : public JointDataBase<JointDataMimic<JointData>>
363  {
364  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
365 
366  typedef typename traits<JointDataMimic>::JointDerived JointDerived;
368 
369  PINOCCHIO_JOINT_DATA_TYPEDEF_TEMPLATE(JointDerived);
370 
372  : m_scaling((Scalar)0)
373  , joint_q(ConfigVector_t::Zero())
374  , joint_v(TangentVector_t::Zero())
375  , S((Scalar)0)
376  {
377  }
378 
379  JointDataMimic(const JointDataMimic & other)
380  {
381  *this = other;
382  }
383 
384  JointDataMimic(const JointDataBase<JointData> & jdata, const Scalar & scaling)
385  : m_jdata_ref(jdata.derived())
386  , m_scaling(scaling)
387  , S(m_jdata_ref.S, scaling)
388  {
389  }
390 
391  JointDataMimic & operator=(const JointDataMimic & other)
392  {
393  m_jdata_ref = other.m_jdata_ref;
394  m_scaling = other.m_scaling;
395  joint_q = other.joint_q;
396  joint_v = other.joint_v;
397  S = Constraint_t(m_jdata_ref.S, other.m_scaling);
398  return *this;
399  }
400 
401  using Base::isEqual;
402  bool isEqual(const JointDataMimic & other) const
403  {
404  return Base::isEqual(other) && internal::comparison_eq(m_jdata_ref, other.m_jdata_ref)
405  && internal::comparison_eq(m_scaling, other.m_scaling)
406  && internal::comparison_eq(joint_q, other.joint_q)
407  && internal::comparison_eq(joint_v, other.joint_v);
408  }
409 
410  static std::string classname()
411  {
412  return std::string("JointDataMimic<") + JointData::classname() + std::string(">");
413  }
414 
415  std::string shortname() const
416  {
417  return std::string("JointDataMimic<") + m_jdata_ref.shortname() + std::string(">");
418  }
419 
420  // Accessors
421  ConfigVectorTypeConstRef joint_q_accessor() const
422  {
423  return joint_q;
424  }
425  ConfigVectorTypeRef joint_q_accessor()
426  {
427  return joint_q;
428  }
429 
430  TangentVectorTypeConstRef joint_v_accessor() const
431  {
432  return joint_v;
433  }
434  TangentVectorTypeRef joint_v_accessor()
435  {
436  return joint_v;
437  }
438 
439  ConstraintTypeConstRef S_accessor() const
440  {
441  return S;
442  }
443  ConstraintTypeRef S_accessor()
444  {
445  return S;
446  }
447 
448  TansformTypeConstRef M_accessor() const
449  {
450  return m_jdata_ref.M;
451  }
452  TansformTypeRef M_accessor()
453  {
454  return m_jdata_ref.M;
455  }
456 
457  MotionTypeConstRef v_accessor() const
458  {
459  return m_jdata_ref.v;
460  }
461  MotionTypeRef v_accessor()
462  {
463  return m_jdata_ref.v;
464  }
465 
466  BiasTypeConstRef c_accessor() const
467  {
468  return m_jdata_ref.c;
469  }
470  BiasTypeRef c_accessor()
471  {
472  return m_jdata_ref.c;
473  }
474 
475  UTypeConstRef U_accessor() const
476  {
477  return m_jdata_ref.U;
478  }
479  UTypeRef U_accessor()
480  {
481  return m_jdata_ref.U;
482  }
483 
484  DTypeConstRef Dinv_accessor() const
485  {
486  return m_jdata_ref.Dinv;
487  }
488  DTypeRef Dinv_accessor()
489  {
490  return m_jdata_ref.Dinv;
491  }
492 
493  UDTypeConstRef UDinv_accessor() const
494  {
495  return m_jdata_ref.UDinv;
496  }
497  UDTypeRef UDinv_accessor()
498  {
499  return m_jdata_ref.UDinv;
500  }
501 
502  DTypeConstRef StU_accessor() const
503  {
504  return m_jdata_ref.StU;
505  }
506  DTypeRef StU_accessor()
507  {
508  return m_jdata_ref.StU;
509  }
510 
511  template<class JointModel>
512  friend struct JointModelMimic;
513 
514  const JointData & jdata() const
515  {
516  return m_jdata_ref;
517  }
518  JointData & jdata()
519  {
520  return m_jdata_ref;
521  }
522 
523  const Scalar & scaling() const
524  {
525  return m_scaling;
526  }
527  Scalar & scaling()
528  {
529  return m_scaling;
530  }
531 
532  ConfigVector_t & jointConfiguration()
533  {
534  return joint_q;
535  }
536  const ConfigVector_t & jointConfiguration() const
537  {
538  return joint_q;
539  }
540 
541  TangentVector_t & jointVelocity()
542  {
543  return joint_v;
544  }
545  const TangentVector_t & jointVelocity() const
546  {
547  return joint_v;
548  }
549 
550  protected:
551  JointData m_jdata_ref;
552  Scalar m_scaling;
553 
555  ConfigVector_t joint_q;
557  TangentVector_t joint_v;
558 
559  public:
560  // data
561  Constraint_t S;
562 
563  }; // struct JointDataMimic
564 
565  template<typename NewScalar, typename JointModel>
566  struct CastType<NewScalar, JointModelMimic<JointModel>>
567  {
568  typedef typename CastType<NewScalar, JointModel>::type JointModelNewType;
570  };
571 
572  template<class JointModel>
573  struct JointModelMimic : public JointModelBase<JointModelMimic<JointModel>>
574  {
575  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
576 
577  typedef typename traits<JointModelMimic>::JointDerived JointDerived;
578 
579  PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(JointDerived);
580 
582  using Base::id;
583  using Base::idx_q;
584  using Base::idx_v;
585  using Base::nq;
586  using Base::nv;
587  using Base::setIndexes;
588 
590  {
591  }
592 
594  const JointModelBase<JointModel> & jmodel, const Scalar & scaling, const Scalar & offset)
595  : m_jmodel_ref(jmodel.derived())
596  , m_scaling(scaling)
597  , m_offset(offset)
598  {
599  }
600 
601  Base & base()
602  {
603  return *static_cast<Base *>(this);
604  }
605  const Base & base() const
606  {
607  return *static_cast<const Base *>(this);
608  }
609 
610  inline int nq_impl() const
611  {
612  return 0;
613  }
614  inline int nv_impl() const
615  {
616  return 0;
617  }
618 
619  inline int idx_q_impl() const
620  {
621  return m_jmodel_ref.idx_q();
622  }
623  inline int idx_v_impl() const
624  {
625  return m_jmodel_ref.idx_v();
626  }
627 
628  void setIndexes_impl(JointIndex id, int /*q*/, int /*v*/)
629  {
630  Base::i_id = id; // Only the id of the joint in the model is different.
631  Base::i_q = m_jmodel_ref.idx_q();
632  Base::i_v = m_jmodel_ref.idx_v();
633  }
634 
635  JointDataDerived createData() const
636  {
637  return JointDataDerived(m_jmodel_ref.createData(), scaling());
638  }
639 
640  const std::vector<bool> hasConfigurationLimit() const
641  {
642  return m_jmodel_ref.hasConfigurationLimit();
643  }
644 
645  const std::vector<bool> hasConfigurationLimitInTangent() const
646  {
647  return m_jmodel_ref.hasConfigurationLimitInTangent();
648  }
649 
650  template<typename ConfigVector>
651  EIGEN_DONT_INLINE void
652  calc(JointDataDerived & jdata, const typename Eigen::MatrixBase<ConfigVector> & qs) const
653  {
654  typedef typename ConfigVectorAffineTransform<JointDerived>::Type AffineTransform;
655 
656  AffineTransform::run(qs.head(m_jmodel_ref.nq()), m_scaling, m_offset, jdata.joint_q);
657  m_jmodel_ref.calc(jdata.m_jdata_ref, jdata.joint_q);
658  }
659 
660  template<typename TangentVector>
661  EIGEN_DONT_INLINE void calc(
662  JointDataDerived & jdata,
663  const Blank blank,
664  const typename Eigen::MatrixBase<TangentVector> & vs) const
665  {
666  jdata.joint_v = m_scaling * vs.head(m_jmodel_ref.nv());
667  m_jmodel_ref.calc(jdata.m_jdata_ref, blank, jdata.joint_v);
668  }
669 
670  template<typename ConfigVector, typename TangentVector>
671  EIGEN_DONT_INLINE void calc(
672  JointDataDerived & jdata,
673  const typename Eigen::MatrixBase<ConfigVector> & qs,
674  const typename Eigen::MatrixBase<TangentVector> & vs) const
675  {
676  typedef typename ConfigVectorAffineTransform<JointDerived>::Type AffineTransform;
677 
678  AffineTransform::run(qs.head(m_jmodel_ref.nq()), m_scaling, m_offset, jdata.joint_q);
679  jdata.joint_v = m_scaling * vs.head(m_jmodel_ref.nv());
680  m_jmodel_ref.calc(jdata.m_jdata_ref, jdata.joint_q, jdata.joint_v);
681  }
682 
683  template<typename VectorLike, typename Matrix6Like>
684  void calc_aba(
685  JointDataDerived & data,
686  const Eigen::MatrixBase<VectorLike> & armature,
687  const Eigen::MatrixBase<Matrix6Like> & I,
688  const bool update_I) const
689  {
690  // TODO: fixme
691  m_jmodel_ref.calc_aba(
692  data.m_jdata_ref, armature, PINOCCHIO_EIGEN_CONST_CAST(Matrix6Like, I), update_I);
693  }
694 
695  static std::string classname()
696  {
697  return std::string("JointModelMimic<") + JointModel::classname() + std::string(">");
698  ;
699  }
700 
701  std::string shortname() const
702  {
703  return std::string("JointModelMimic<") + m_jmodel_ref.shortname() + std::string(">");
704  }
705 
707  template<typename NewScalar>
709  {
710  typedef typename CastType<NewScalar, JointModelMimic>::type ReturnType;
711 
712  ReturnType res(
713  m_jmodel_ref.template cast<NewScalar>(), pinocchio::cast<NewScalar>(m_scaling),
714  pinocchio::cast<NewScalar>(m_offset));
715  res.setIndexes(id(), idx_q(), idx_v());
716  return res;
717  }
718 
719  const JointModel & jmodel() const
720  {
721  return m_jmodel_ref;
722  }
723  JointModel & jmodel()
724  {
725  return m_jmodel_ref;
726  }
727 
728  const Scalar & scaling() const
729  {
730  return m_scaling;
731  }
732  Scalar & scaling()
733  {
734  return m_scaling;
735  }
736 
737  const Scalar & offset() const
738  {
739  return m_offset;
740  }
741  Scalar & offset()
742  {
743  return m_offset;
744  }
745 
746  protected:
747  // data
748  JointModel m_jmodel_ref;
749  Scalar m_scaling, m_offset;
750 
751  public:
752  /* Acces to dedicated segment in robot config space. */
753  // Const access
754  template<typename D>
755  typename SizeDepType<NQ>::template SegmentReturn<D>::ConstType
756  jointConfigSelector_impl(const Eigen::MatrixBase<D> & a) const
757  {
758  return SizeDepType<NQ>::segment(a.derived(), m_jmodel_ref.idx_q(), m_jmodel_ref.nq());
759  }
760 
761  // Non-const access
762  template<typename D>
763  typename SizeDepType<NQ>::template SegmentReturn<D>::Type
764  jointConfigSelector_impl(Eigen::MatrixBase<D> & a) const
765  {
766  return SizeDepType<NQ>::segment(a.derived(), m_jmodel_ref.idx_q(), m_jmodel_ref.nq());
767  }
768 
769  /* Acces to dedicated segment in robot config velocity space. */
770  // Const access
771  template<typename D>
772  typename SizeDepType<NV>::template SegmentReturn<D>::ConstType
773  jointVelocitySelector_impl(const Eigen::MatrixBase<D> & a) const
774  {
775  return SizeDepType<NV>::segment(a.derived(), m_jmodel_ref.idx_v(), m_jmodel_ref.nv());
776  }
777 
778  // Non-const access
779  template<typename D>
780  typename SizeDepType<NV>::template SegmentReturn<D>::Type
781  jointVelocitySelector_impl(Eigen::MatrixBase<D> & a) const
782  {
783  return SizeDepType<NV>::segment(a.derived(), m_jmodel_ref.idx_v(), m_jmodel_ref.nv());
784  }
785 
786  /* Acces to dedicated columns in a ForceSet or MotionSet matrix.*/
787  // Const access
788  template<typename D>
789  typename SizeDepType<NV>::template ColsReturn<D>::ConstType
790  jointCols_impl(const Eigen::MatrixBase<D> & A) const
791  {
792  return SizeDepType<NV>::middleCols(A.derived(), m_jmodel_ref.idx_v(), m_jmodel_ref.nv());
793  }
794 
795  // Non-const access
796  template<typename D>
797  typename SizeDepType<NV>::template ColsReturn<D>::Type
798  jointCols_impl(Eigen::MatrixBase<D> & A) const
799  {
800  return SizeDepType<NV>::middleCols(A.derived(), m_jmodel_ref.idx_v(), m_jmodel_ref.nv());
801  }
802 
803  /* Acces to dedicated rows in a matrix.*/
804  // Const access
805  template<typename D>
806  typename SizeDepType<NV>::template RowsReturn<D>::ConstType
807  jointRows_impl(const Eigen::MatrixBase<D> & A) const
808  {
809  return SizeDepType<NV>::middleRows(A.derived(), m_jmodel_ref.idx_v(), m_jmodel_ref.nv());
810  }
811 
812  // Non-const access
813  template<typename D>
814  typename SizeDepType<NV>::template RowsReturn<D>::Type
815  jointRows_impl(Eigen::MatrixBase<D> & A) const
816  {
817  return SizeDepType<NV>::middleRows(A.derived(), m_jmodel_ref.idx_v(), m_jmodel_ref.nv());
818  }
819 
822  // Const access
823  template<typename D>
824  typename SizeDepType<NV>::template BlockReturn<D>::ConstType
825  jointBlock_impl(const Eigen::MatrixBase<D> & Mat) const
826  {
827  return SizeDepType<NV>::block(
828  Mat.derived(), m_jmodel_ref.idx_v(), m_jmodel_ref.idx_v(), m_jmodel_ref.nv(),
829  m_jmodel_ref.nv());
830  }
831 
832  // Non-const access
833  template<typename D>
834  typename SizeDepType<NV>::template BlockReturn<D>::Type
835  jointBlock_impl(Eigen::MatrixBase<D> & Mat) const
836  {
837  return SizeDepType<NV>::block(
838  Mat.derived(), m_jmodel_ref.idx_v(), m_jmodel_ref.idx_v(), m_jmodel_ref.nv(),
839  m_jmodel_ref.nv());
840  }
841 
842  }; // struct JointModelMimic
843 
844 } // namespace pinocchio
845 
846 #endif // ifndef __pinocchio_multibody_joint_mimic_hpp__
Main pinocchio namespace.
Definition: treeview.dox:11
JointIndex id(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointIdVisitor to get the index of the joint in the kinematic chain.
Blank type.
Definition: fwd.hpp:77
Type of the cast of a class C templated by Scalar and Options, to a new NewScalar type....
Definition: fwd.hpp:99
Return type of the Constraint::Transpose * Force operation.
Return type of the Constraint::Transpose * ForceSet operation.
bool isEqual(const JointDataBase< JointDataMimic< JointData > > &other) const
&#160;
ConfigVector_t joint_q
Transform configuration vector.
TangentVector_t joint_v
Transform velocity vector.
CastType< NewScalar, JointModelMimic >::type cast() const
SizeDepType< NV >::template BlockReturn< D >::ConstType jointBlock_impl(const Eigen::MatrixBase< D > &Mat) const
Returns a block of dimension nv()xnv() located at position idx_v(),idx_v() in the matrix Mat.
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
ConstraintForceSetOp< ScaledJointMotionSubspace, Derived >::ReturnType operator*(const Eigen::MatrixBase< Derived > &F) const
[CRBA] MatrixBase operator* (Constraint::Transpose S, ForceSet::Block)
Common traits structure to fully define base classes for CRTP.
Definition: fwd.hpp:72