pinocchio  2.4.4
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
joint-generic.hpp
1 //
2 // Copyright (c) 2016-2020 CNRS INRIA
3 //
4 
5 #ifndef __pinocchio_joint_generic_hpp__
6 #define __pinocchio_joint_generic_hpp__
7 
8 #include "pinocchio/multibody/joint/joint-collection.hpp"
9 #include "pinocchio/multibody/joint/joint-composite.hpp"
10 #include "pinocchio/multibody/joint/joint-basic-visitors.hxx"
11 #include "pinocchio/container/aligned-vector.hpp"
12 
13 #include <boost/mpl/contains.hpp>
14 
15 namespace pinocchio
16 {
17 
18  template<typename Scalar, int Options = 0, template<typename S, int O> class JointCollectionTpl = JointCollectionDefaultTpl>
19  struct JointTpl;
20  typedef JointTpl<double> Joint;
21 
22  template<typename _Scalar, int _Options, template<typename S, int O> class JointCollectionTpl>
23  struct traits< JointTpl<_Scalar,_Options,JointCollectionTpl> >
24  {
25  enum {
26  Options = _Options,
27  NQ = Eigen::Dynamic, // Dynamic because unknown at compile time
28  NV = Eigen::Dynamic
29  };
30 
31  typedef _Scalar Scalar;
32  typedef JointCollectionTpl<Scalar,Options> JointCollection;
35 
40 
41  // [ABA]
42  typedef Eigen::Matrix<Scalar,6,Eigen::Dynamic,Options> U_t;
43  typedef Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic,Options> D_t;
44  typedef Eigen::Matrix<Scalar,6,Eigen::Dynamic,Options> UD_t;
45 
46  typedef Constraint_t ConstraintTypeConstRef;
47  typedef Constraint_t ConstraintTypeRef;
48  typedef Transformation_t TansformTypeConstRef;
49  typedef Transformation_t TansformTypeRef;
50  typedef Motion_t MotionTypeConstRef;
51  typedef Motion_t MotionTypeRef;
52  typedef Bias_t BiasTypeConstRef;
53  typedef Bias_t BiasTypeRef;
54  typedef U_t UTypeConstRef;
55  typedef U_t UTypeRef;
56  typedef D_t DTypeConstRef;
57  typedef D_t DTypeRef;
58  typedef UD_t UDTypeConstRef;
59  typedef UD_t UDTypeRef;
60 
61  typedef Eigen::Matrix<Scalar,Eigen::Dynamic,1,Options> ConfigVector_t;
62  typedef Eigen::Matrix<Scalar,Eigen::Dynamic,1,Options> TangentVector_t;
63  };
64 
65  template<typename Scalar, int Options, template<typename S, int O> class JointCollectionTpl>
66  struct traits< JointDataTpl<Scalar,Options,JointCollectionTpl> >
68 
69  template<typename Scalar, int Options, template<typename S, int O> class JointCollectionTpl>
70  struct traits< JointModelTpl<Scalar,Options,JointCollectionTpl> >
72 
73  template<typename _Scalar, int _Options, template<typename S, int O> class JointCollectionTpl>
74  struct JointDataTpl
75  : public JointDataBase< JointDataTpl<_Scalar,_Options,JointCollectionTpl> >
76  , JointCollectionTpl<_Scalar,_Options>::JointDataVariant
77  {
78  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
79 
81  typedef JointDataBase<JointDataTpl> Base;
82 
83  PINOCCHIO_JOINT_DATA_TYPEDEF_TEMPLATE(JointDerived);
84 
85  typedef JointCollectionTpl<_Scalar,_Options> JointCollection;
86  typedef typename JointCollection::JointDataVariant JointDataVariant;
87 
88  using Base::operator==;
89  using Base::operator!=;
90 
91  JointDataVariant & toVariant() { return *static_cast<JointDataVariant*>(this); }
92  const JointDataVariant & toVariant() const { return *static_cast<const JointDataVariant*>(this); }
93 
94  Constraint_t S() const { return constraint_xd(*this); }
95  Transformation_t M() const { return joint_transform(*this); }
96  Motion_t v() const { return motion(*this); }
97  Bias_t c() const { return bias(*this); }
98 
99  // [ABA CCRBA]
100  U_t U() const { return u_inertia(*this); }
101  D_t Dinv() const { return dinv_inertia(*this); }
102  UD_t UDinv() const { return udinv_inertia(*this); }
103 
104  JointDataTpl()
105  : JointDataVariant()
106  {}
107 
108  JointDataTpl(const JointDataVariant & jdata_variant)
109  : JointDataVariant(jdata_variant)
110  {}
111 
112  template<typename JointDataDerived>
114  : JointCollection::JointDataVariant((JointDataVariant)jdata.derived())
115  {
116  BOOST_MPL_ASSERT((boost::mpl::contains<typename JointDataVariant::types,JointDataDerived>));
117  }
118 
119  // Define all the standard accessors
120  Constraint_t S_accessor() const { return S(); }
121  Transformation_t M_accessor() const { return M(); }
122  Motion_t v_accessor() const { return v(); }
123  Bias_t c_accessor() const { return c(); }
124  U_t U_accessor() const { return U(); }
125  D_t Dinv_accessor() const { return Dinv(); }
126  UD_t UDinv_accessor() const { return UDinv(); }
127 
128  static std::string classname() { return "JointData"; }
129  std::string shortname() const { return ::pinocchio::shortname(*this); }
130 
131  bool isEqual(const JointDataTpl & other) const
132  {
133  return Base::isEqual(other)
134  && toVariant() == other.toVariant();
135  }
136 
137  };
138 
139  template<typename NewScalar, typename Scalar, int Options, template<typename S, int O> class JointCollectionTpl>
140  struct CastType< NewScalar, JointModelTpl<Scalar,Options,JointCollectionTpl> >
141  {
143  };
144 
145  template<typename _Scalar, int _Options, template<typename S, int O> class JointCollectionTpl>
146  struct JointModelTpl
147  : JointModelBase< JointModelTpl<_Scalar,_Options,JointCollectionTpl> >
148  , JointCollectionTpl<_Scalar,_Options>::JointModelVariant
149  {
150  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
151 
153 
154  PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(JointDerived);
155  PINOCCHIO_JOINT_USE_INDEXES(JointModelTpl);
156 
157  typedef JointCollectionTpl<Scalar,Options> JointCollection;
158  typedef typename JointCollection::JointDataVariant JointDataVariant;
159  typedef typename JointCollection::JointModelVariant JointModelVariant;
160 
161  using Base::id;
162  using Base::setIndexes;
163  using Base::operator==;
164  using Base::operator!=;
165 
166  JointModelTpl() : JointModelVariant() {}
167 
168  JointModelTpl(const JointModelVariant & jmodel_variant)
169  : JointCollection::JointModelVariant(jmodel_variant)
170  {}
171 
172  template<typename JointModelDerived>
174  : JointModelVariant((JointModelVariant)jmodel.derived())
175  {
176  BOOST_MPL_ASSERT((boost::mpl::contains<typename JointModelVariant::types,JointModelDerived>));
177  }
178 
179  JointModelVariant & toVariant()
180  { return *static_cast<JointModelVariant*>(this); }
181 
182  const JointModelVariant & toVariant() const
183  { return *static_cast<const JointModelVariant*>(this); }
184 
185  JointDataDerived createData() const
186  { return ::pinocchio::createData<Scalar,Options,JointCollectionTpl>(*this); }
187 
188  using Base::isEqual;
189  bool isEqual(const JointModelTpl & other) const
190  {
191  return Base::isEqual(other)
192  && toVariant() == other.toVariant();
193  }
194 
195  template<typename ConfigVector>
196  void calc(JointDataDerived & data,
197  const Eigen::MatrixBase<ConfigVector> & q) const
198  { calc_zero_order(*this,data,q); }
199 
200  template<typename ConfigVector, typename TangentVector>
201  void calc(JointDataDerived & data,
202  const Eigen::MatrixBase<ConfigVector> & q,
203  const Eigen::MatrixBase<TangentVector> & v) const
204  { calc_first_order(*this,data,q,v); }
205 
206  template<typename Matrix6Like>
207  void calc_aba(JointDataDerived & data, const Eigen::MatrixBase<Matrix6Like> & I, const bool update_I) const
208  { ::pinocchio::calc_aba(*this,data,PINOCCHIO_EIGEN_CONST_CAST(Matrix6Like,I),update_I); }
209 
210  std::string shortname() const { return ::pinocchio::shortname(*this); }
211  static std::string classname() { return "JointModel"; }
212 
213  int nq_impl() const { return ::pinocchio::nq(*this); }
214  int nv_impl() const { return ::pinocchio::nv(*this); }
215 
216  int idx_q_impl() const { return ::pinocchio::idx_q(*this); }
217  int idx_v_impl() const { return ::pinocchio::idx_v(*this); }
218 
219  JointIndex id_impl() const { return ::pinocchio::id(*this); }
220 
221  void setIndexes(JointIndex id, int nq, int nv)
222  { ::pinocchio::setIndexes(*this,id, nq, nv); }
223 
225  template<typename NewScalar>
227  {
228  return cast_joint<NewScalar,Scalar,Options,JointCollectionTpl>(*this);
229  }
230  };
231 
232  typedef PINOCCHIO_ALIGNED_STD_VECTOR(JointData) JointDataVector;
233  typedef PINOCCHIO_ALIGNED_STD_VECTOR(JointModel) JointModelVector;
234 
235 } // namespace pinocchio
236 
237 #endif // ifndef __pinocchio_joint_generic_hpp__
int nv(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointNvVisitor to get the dimension of the joint tangent space...
MotionTpl< Scalar, Options > motion(const JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata)
Visit a JointDataTpl through JointMotionVisitor to get the joint internal motion as a dense motion...
int nq(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointNqVisitor to get the dimension of the joint configuration space...
JointDataTpl< Scalar, Options, JointCollectionTpl > createData(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through CreateData visitor to create a JointDataTpl.
SE3Tpl< Scalar, Options > joint_transform(const JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata)
Visit a JointDataTpl through JointTransformVisitor to get the joint internal transform (transform bet...
Eigen::Matrix< Scalar, 6, Eigen::Dynamic, Options > udinv_inertia(const JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata)
Visit a JointDataTpl through JointUDInvInertiaVisitor to get U*D^{-1} matrix of the inertia matrix de...
std::string shortname(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointShortnameVisitor to get the shortname of the derived joint model...
Eigen::Matrix< Scalar, 6, Eigen::Dynamic, Options > u_inertia(const JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata)
Visit a JointDataTpl through JointUInertiaVisitor to get the U matrix of the inertia matrix decomposi...
Main pinocchio namespace.
Definition: treeview.dox:24
void setIndexes(JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel, JointIndex id, int q, int v)
Visit a JointModelTpl through JointSetIndexesVisitor to set the indexes of the joint in the kinematic...
MotionTpl< Scalar, Options > bias(const JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata)
Visit a JointDataTpl through JointBiasVisitor to get the joint bias as a dense motion.
void calc_first_order(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel, JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata, const Eigen::MatrixBase< ConfigVectorType > &q, const Eigen::MatrixBase< TangentVectorType > &v)
Visit a JointModelTpl and the corresponding JointDataTpl through JointCalcFirstOrderVisitor to comput...
Common traits structure to fully define base classes for CRTP.
Definition: fwd.hpp:35
Type of the cast of a class C templated by Scalar and Options, to a new NewScalar type...
Definition: fwd.hpp:46
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic, Options > dinv_inertia(const JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata)
Visit a JointDataTpl through JointDInvInertiaVisitor to get the D^{-1} matrix of the inertia matrix d...
ConstraintTpl< Eigen::Dynamic, Scalar, Options > constraint_xd(const JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata)
Visit a JointDataVariant through JointConstraintVisitor to get the joint constraint as a dense constr...
void calc_aba(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel, JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata, const Eigen::MatrixBase< Matrix6Type > &I, const bool update_I)
Visit a JointModelTpl and the corresponding JointDataTpl through JointCalcAbaVisitor to...
JointModelTpl< NewScalar, Options, JointCollectionTpl > cast() const
void calc_zero_order(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel, JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata, const Eigen::MatrixBase< ConfigVectorType > &q)
Visit a JointModelTpl and the corresponding JointDataTpl through JointCalcZeroOrderVisitor to compute...