pinocchio  UNKNOWN
joint.hpp
1 //
2 // Copyright (c) 2016 CNRS
3 //
4 // This file is part of Pinocchio
5 // Pinocchio is free software: you can redistribute it
6 // and/or modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation, either version
8 // 3 of the License, or (at your option) any later version.
9 //
10 // Pinocchio is distributed in the hope that it will be
11 // useful, but WITHOUT ANY WARRANTY; without even the implied warranty
12 // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // General Lesser Public License for more details. You should have
14 // received a copy of the GNU Lesser General Public License along with
15 // Pinocchio If not, see
16 // <http://www.gnu.org/licenses/>.
17 
18 #ifndef __se3_joint_model_hpp__
19 #define __se3_joint_model_hpp__
20 
21 #include "pinocchio/assert.hpp"
22 #include "pinocchio/multibody/joint/joint-variant.hpp"
23 #include "pinocchio/multibody/joint/joint-basic-visitors.hxx"
24 #include "pinocchio/container/aligned-vector.hpp"
25 
26 namespace se3
27 {
28 
29  struct Joint;
30  struct JointModel;
31  struct JointData;
32 
33  template<>
34  struct traits<Joint>
35  {
36  enum {
37  NQ = -1, // Dynamic because unknown at compilation
38  NV = -1
39  };
40  typedef double Scalar;
43  typedef ConstraintXd Constraint_t;
44  typedef SE3 Transformation_t;
45  typedef Motion Motion_t;
46  typedef Motion Bias_t;
47 
48  typedef Eigen::Matrix<double,6,Eigen::Dynamic> F_t;
49  // [ABA]
50  typedef Eigen::Matrix<double,6,Eigen::Dynamic> U_t;
51  typedef Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> D_t;
52  typedef Eigen::Matrix<double,6,Eigen::Dynamic> UD_t;
53 
54  typedef Eigen::Matrix<double,Eigen::Dynamic,1> ConfigVector_t;
55  typedef Eigen::Matrix<double,Eigen::Dynamic,1> TangentVector_t;
56  };
57 
58  template<> struct traits<JointData> { typedef Joint JointDerived; };
59  template<> struct traits<JointModel> { typedef Joint JointDerived; };
60 
61  struct JointData : public JointDataBase<JointData> , JointDataVariant
62  {
63  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
64  typedef Joint JointDerived;
65 
66  SE3_JOINT_TYPEDEF;
67 
68  JointDataVariant & toVariant() { return *static_cast<JointDataVariant*>(this); }
69  const JointDataVariant & toVariant() const { return *static_cast<const JointDataVariant*>(this); }
70 
71  const Constraint_t S() const { return constraint_xd(*this); }
72  const Transformation_t M() const { return joint_transform(*this); }
73  const Motion_t v() const { return motion(*this); }
74  const Bias_t c() const { return bias(*this); }
75 
76  // // [ABA CCRBA]
77  const U_t U() const { return u_inertia(*this); }
78  U_t U() { return u_inertia(*this); }
79  const D_t Dinv() const { return dinv_inertia(*this); }
80  const UD_t UDinv() const { return udinv_inertia(*this); }
81 
82  JointData() : JointDataVariant() {}
83  JointData(const JointDataVariant & jdata) : JointDataVariant(jdata) {}
84 
85  };
86 
87  struct JointModel : public JointModelBase<JointModel> , JointModelVariant
88  {
89  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
90  typedef JointModelVariant JointModelBoostVariant;
91  typedef Joint JointDerived;
92 
93  SE3_JOINT_TYPEDEF;
94  SE3_JOINT_USE_INDEXES;
95  using Base::id;
96  using Base::setIndexes;
97  using Base::operator==;
98 
99  JointModel() : JointModelVariant() {}
100  JointModel(const JointModelVariant & model_variant) : JointModelVariant(model_variant)
101  {}
102 
103  JointModelVariant& toVariant() { return *static_cast<JointModelVariant*>(this); }
104  const JointModelVariant& toVariant() const { return *static_cast<const JointModelVariant*>(this); }
105 
106  JointDataVariant createData() { return ::se3::createData(*this); }
107 
108  void calc(JointData & data,const Eigen::VectorXd & q) const { calc_zero_order(*this,data,q); }
109 
110  void calc(JointData & data, const Eigen::VectorXd & q, const Eigen::VectorXd & v) const
111  { calc_first_order(*this,data,q,v); }
112 
113  void calc_aba(JointData & data, Inertia::Matrix6 & I, const bool update_I) const
114  { ::se3::calc_aba(*this,data,I,update_I); }
115  std::string shortname() const { return ::se3::shortname(*this); }
116  static std::string classname() { return "JointModel"; }
117 
118  int nq_impl() const { return ::se3::nq(*this); }
119  int nv_impl() const { return ::se3::nv(*this); }
120 
121  int idx_q() const { return ::se3::idx_q(*this); }
122  int idx_v() const { return ::se3::idx_v(*this); }
123 
124  JointIndex id() const { return ::se3::id(*this); }
125 
126  void setIndexes(JointIndex id,int nq,int nv) { ::se3::setIndexes(*this,id, nq, nv); }
127  };
128 
131 
132 } // namespace se3
133 
134 #endif // ifndef __se3_joint_model_hpp__
ConstraintXd constraint_xd(const JointDataVariant &jdata)
Visit a JointDataVariant through JointConstraintVisitor to get the joint constraint as a dense constr...
JointDataVariant createData(const JointModelVariant &jmodel)
Visit a JointModelVariant through CreateData visitor to create a JointDataVariant.
Motion motion(const JointDataVariant &jdata)
Visit a JointDataVariant through JointMotionVisitor to get the joint internal motion as a dense motio...
Eigen::Matrix< double, 6, Eigen::Dynamic > u_inertia(const JointDataVariant &jdata)
Visit a JointDataVariant through JointUInertiaVisitor to get the U matrix of the inertia matrix decom...
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > dinv_inertia(const JointDataVariant &jdata)
Visit a JointDataVariant through JointDInvInertiaVisitor to get the D^{-1} matrix of the inertia matr...
SE3 joint_transform(const JointDataVariant &jdata)
Visit a JointDataVariant through JointTransformVisitor to get the joint internal transform (transform...
Eigen::Matrix< double, 6, Eigen::Dynamic > udinv_inertia(const JointDataVariant &jdata)
Visit a JointDataVariant through JointUDInvInertiaVisitor to get U*D^{-1} matrix of the inertia matri...
void calc_aba(const JointModelVariant &jmodel, JointDataVariant &jdata, Inertia::Matrix6 &I, const bool update_I)
Visit a JointDataVariant and the corresponding JointModelVariant through JointCalcAbaVisitor to...
int nq(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointNqVisitor to get the dimension of the joint configuration spac...
Motion bias(const JointDataVariant &jdata)
Visit a JointDataVariant through JointBiasVisitor to get the joint bias as a dense motion...
void calc_zero_order(const JointModelVariant &jmodel, JointDataVariant &jdata, const Eigen::VectorXd &q)
Visit a JointDataVariant and the corresponding JointModelVariant through JointCalcZeroOrderVisitor to...
void setIndexes(JointModelVariant &jmodel, JointIndex id, int q, int v)
Visit a JointModelVariant through JointSetIndexesVisitor to set the indexes of the joint in the kinem...
std::string shortname(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointShortnameVisitor to get the shortname of the derived joint mod...
int nv(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointNvVisitor to get the dimension of the joint tangent space...
int idx_q(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointIdxQVisitor to get the index in the full model configuration s...
JointIndex id(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointIdVisitor to get the index of the joint in the kinematic chain...
int idx_v(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointIdxVVisitor to get the index in the full model tangent space c...
void calc_first_order(const JointModelVariant &jmodel, JointDataVariant &jdata, const Eigen::VectorXd &q, const Eigen::VectorXd &v)
Visit a JointDataVariant and the corresponding JointModelVariant through JointCalcFirstOrderVisitor t...