pinocchio  UNKNOWN
joint-basic-visitors.hxx
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_basic_visitors_hxx__
19 #define __se3_joint_basic_visitors_hxx__
20 
21 #include "pinocchio/assert.hpp"
22 #include "pinocchio/multibody/joint/joint-basic-visitors.hpp"
23 #include "pinocchio/multibody/joint/joint-composite.hpp"
24 #include "pinocchio/multibody/visitor.hpp"
25 
26 namespace se3
27 {
29 
33  class CreateJointData: public boost::static_visitor<JointDataVariant>
34  {
35  public:
36  template<typename D>
37  JointDataVariant operator()(const JointModelBase<D> & jmodel) const
38  { return JointDataVariant(jmodel.createData()); }
39 
40  static JointDataVariant run( const JointModelVariant & jmodel)
41  { return boost::apply_visitor( CreateJointData(), jmodel ); }
42  };
43  inline JointDataVariant createData(const JointModelVariant & jmodel)
44  {
45  return CreateJointData::run(jmodel);
46  }
47 
52  struct JointCalcZeroOrderVisitor : public fusion::JointVisitor<JointCalcZeroOrderVisitor>
53  {
54  typedef boost::fusion::vector< const Eigen::VectorXd & > ArgsType;
55 
56  JOINT_VISITOR_INIT(JointCalcZeroOrderVisitor);
57 
58  template<typename JointModel>
59  static void algo(const se3::JointModelBase<JointModel> & jmodel,
61  const Eigen::VectorXd & q
62  )
63  {
64  jmodel.calc(jdata.derived(),q);
65  }
66 
67  };
68  inline void calc_zero_order(const JointModelVariant & jmodel, JointDataVariant & jdata, const Eigen::VectorXd & q)
69  {
70  JointCalcZeroOrderVisitor::run( jmodel, jdata, JointCalcZeroOrderVisitor::ArgsType(q) );
71  }
72 
77  struct JointCalcFirstOrderVisitor : public fusion::JointVisitor<JointCalcFirstOrderVisitor>
78  {
79  typedef boost::fusion::vector< const Eigen::VectorXd &,
80  const Eigen::VectorXd & > ArgsType;
81 
82  JOINT_VISITOR_INIT(JointCalcFirstOrderVisitor);
83 
84  template<typename JointModel>
85  static void algo(const se3::JointModelBase<JointModel> & jmodel,
87  const Eigen::VectorXd & q,
88  const Eigen::VectorXd & v
89  )
90  {
91  jmodel.calc(jdata.derived(),q,v);
92  }
93 
94  };
95  inline void calc_first_order(const JointModelVariant & jmodel, JointDataVariant & jdata, const Eigen::VectorXd & q, const Eigen::VectorXd & v)
96  {
97  JointCalcFirstOrderVisitor::run( jmodel, jdata, JointCalcFirstOrderVisitor::ArgsType(q,v) );
98  }
99 
100 
105  struct JointCalcAbaVisitor : public fusion::JointVisitor<JointCalcAbaVisitor>
106  {
107  typedef boost::fusion::vector< Inertia::Matrix6 &,
108  const bool > ArgsType;
109 
110  JOINT_VISITOR_INIT(JointCalcAbaVisitor);
111 
112  template<typename JointModel>
113  static void algo(const se3::JointModelBase<JointModel> & jmodel,
115  Inertia::Matrix6 & I,
116  const bool update_I
117  )
118  {
119  jmodel.calc_aba(jdata.derived(),I,update_I);
120  }
121 
122  };
123  inline void calc_aba(const JointModelVariant & jmodel, JointDataVariant & jdata, Inertia::Matrix6 & I, const bool update_I)
124  {
125  JointCalcAbaVisitor::run( jmodel, jdata, JointCalcAbaVisitor::ArgsType(I, update_I) );
126  }
127 
128  struct JointEpsVisitor: public boost::static_visitor<double>
129  {
130  public:
131 
132  template<typename D>
133  double operator()(const JointModelBase<D> & jmodel) const
134  { return jmodel.finiteDifferenceIncrement(); }
135 
136  static double run(const JointModelVariant & jmodel)
137  { return boost::apply_visitor(JointEpsVisitor(),jmodel); }
138  }; // struct JointEpsVisitor
139 
140  inline double finiteDifferenceIncrement(const JointModelVariant & jmodel)
141  { return JointEpsVisitor::run(jmodel); }
142 
146  class JointNvVisitor: public boost::static_visitor<int>
147  {
148  public:
149  template<typename D>
150  int operator()(const JointModelBase<D> & jmodel) const
151  { return jmodel.nv(); }
152 
153  static int run( const JointModelVariant & jmodel)
154  { return boost::apply_visitor( JointNvVisitor(), jmodel ); }
155  };
156  inline int nv(const JointModelVariant & jmodel) { return JointNvVisitor::run(jmodel); }
157 
158 
162  class JointNqVisitor: public boost::static_visitor<int>
163  {
164  public:
165  template<typename D>
166  int operator()(const JointModelBase<D> & jmodel) const
167  { return jmodel.nq(); }
168 
169  static int run( const JointModelVariant & jmodel)
170  { return boost::apply_visitor( JointNqVisitor(), jmodel ); }
171  };
172  inline int nq(const JointModelVariant & jmodel) { return JointNqVisitor::run(jmodel); }
173 
177  class JointIdxQVisitor: public boost::static_visitor<int>
178  {
179  public:
180  template<typename D>
181  int operator()(const JointModelBase<D> & jmodel) const
182  { return jmodel.idx_q(); }
183 
184  static int run( const JointModelVariant & jmodel)
185  { return boost::apply_visitor( JointIdxQVisitor(), jmodel ); }
186  };
187  inline int idx_q(const JointModelVariant & jmodel) { return JointIdxQVisitor::run(jmodel); }
188 
192  class JointIdxVVisitor: public boost::static_visitor<int>
193  {
194  public:
195  template<typename D>
196  int operator()(const JointModelBase<D> & jmodel) const
197  { return jmodel.idx_v(); }
198 
199  static int run( const JointModelVariant & jmodel)
200  { return boost::apply_visitor( JointIdxVVisitor(), jmodel ); }
201  };
202  inline int idx_v(const JointModelVariant & jmodel) { return JointIdxVVisitor::run(jmodel); }
203 
207  class JointIdVisitor: public boost::static_visitor<JointIndex>
208  {
209  public:
210  template<typename D>
211  JointIndex operator()(const JointModelBase<D> & jmodel) const
212  { return jmodel.id(); }
213 
214  static JointIndex run( const JointModelVariant & jmodel)
215  { return boost::apply_visitor( JointIdVisitor(), jmodel ); }
216  };
217  inline JointIndex id(const JointModelVariant & jmodel) { return JointIdVisitor::run(jmodel); }
218 
222  class JointSetIndexesVisitor: public boost::static_visitor<>
223  {
224  public:
225 
226  JointIndex id;
227  int q;
228  int v;
229 
230  JointSetIndexesVisitor(JointIndex id,int q,int v) : id(id),q(q),v(v) {}
231 
232  template<typename D>
233  void operator()(JointModelBase<D> & jmodel) const
234  { jmodel.setIndexes(id, q, v); }
235 
236  static void run(JointModelVariant & jmodel, JointIndex id, int q, int v)
237  { return boost::apply_visitor( JointSetIndexesVisitor(id, q, v), jmodel ); }
238  };
239  inline void setIndexes(JointModelVariant & jmodel, JointIndex id, int q,int v) { return JointSetIndexesVisitor::run(jmodel, id, q, v); }
240 
241 
245  class JointShortnameVisitor: public boost::static_visitor<std::string>
246  {
247  public:
248 
249  template<typename D>
250  std::string operator()(const JointModelBase<D> & jmodel) const
251  { return jmodel.shortname(); }
252 
253  static std::string run(const JointModelVariant & jmodel)
254  { return boost::apply_visitor( JointShortnameVisitor(), jmodel ); }
255  };
256  inline std::string shortname(const JointModelVariant & jmodel) { return JointShortnameVisitor::run(jmodel);}
257 
258  //
259  // Visitors on JointDatas
260  //
261 
265  class JointConstraintVisitor: public boost::static_visitor< ConstraintXd >
266  {
267  public:
268  template <typename D>
269  ConstraintXd operator()(const JointDataBase<D> & jdata) const
270  {
271  return ConstraintXd(jdata.S().matrix()); }
272 
273  static ConstraintXd run( const JointDataVariant & jdata)
274  { return boost::apply_visitor( JointConstraintVisitor (), jdata ); }
275  };
276  inline ConstraintXd constraint_xd(const JointDataVariant & jdata) { return JointConstraintVisitor::run(jdata); }
277 
281  class JointTransformVisitor: public boost::static_visitor< SE3 >
282  {
283  public:
284  template <typename D>
285  SE3 operator()(const JointDataBase<D> & jdata) const
286  { return SE3(jdata.M()); }
287 
288  static SE3 run( const JointDataVariant & jdata)
289  { return boost::apply_visitor( JointTransformVisitor (), jdata ); }
290  };
291  inline SE3 joint_transform(const JointDataVariant & jdata) { return JointTransformVisitor::run(jdata); }
292 
296  class JointMotionVisitor: public boost::static_visitor< Motion >
297  {
298  public:
299  template <typename D>
300  Motion operator()(const JointDataBase<D> & jdata) const
301  { return Motion(jdata.v()); }
302 
303  static Motion run( const JointDataVariant & jdata)
304  { return boost::apply_visitor( JointMotionVisitor (), jdata ); }
305  };
306  inline Motion motion(const JointDataVariant & jdata) { return JointMotionVisitor::run(jdata); }
307 
311  class JointBiasVisitor: public boost::static_visitor< Motion >
312  {
313  public:
314  template <typename D>
315  Motion operator()(const JointDataBase<D> & jdata) const
316  { return Motion(jdata.c()); }
317 
318  static Motion run( const JointDataVariant & jdata)
319  { return boost::apply_visitor( JointBiasVisitor (), jdata ); }
320  };
321  inline Motion bias(const JointDataVariant & jdata) { return JointBiasVisitor::run(jdata); }
322 
323 
324 
325 
329  // Matrix6X typedefed in Data. Data not included here
330  class JointUInertiaVisitor: public boost::static_visitor< Eigen::Matrix<double,6,Eigen::Dynamic> >
331  {
332  public:
333  template <typename D>
334  Eigen::Matrix<double,6,Eigen::Dynamic> operator()(const JointDataBase<D> & jdata) const
335  { return Eigen::Matrix<double,6,Eigen::Dynamic>(jdata.U()); }
336 
337  static Eigen::Matrix<double,6,Eigen::Dynamic> run( const JointDataVariant & jdata)
338  { return boost::apply_visitor( JointUInertiaVisitor (), jdata ); }
339  };
340  inline Eigen::Matrix<double,6,Eigen::Dynamic> u_inertia(const JointDataVariant & jdata) { return JointUInertiaVisitor::run(jdata); }
341 
345  class JointDInvInertiaVisitor: public boost::static_visitor< Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> >
346  {
347  public:
348  template <typename D>
349  Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> operator()(const JointDataBase<D> & jdata) const
350  { return Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>(jdata.Dinv()); }
351 
352  static Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> run( const JointDataVariant & jdata)
353  { return boost::apply_visitor( JointDInvInertiaVisitor (), jdata ); }
354  };
355  inline Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> dinv_inertia(const JointDataVariant & jdata) { return JointDInvInertiaVisitor::run(jdata); }
356 
360  // Matrix6X typedefed in Data. Data not included here
361  class JointUDInvInertiaVisitor: public boost::static_visitor< Eigen::Matrix<double,6,Eigen::Dynamic> >
362  {
363  public:
364  template <typename D>
365  Eigen::Matrix<double,6,Eigen::Dynamic> operator()(const JointDataBase<D> & jdata) const
366  { return Eigen::Matrix<double,6,Eigen::Dynamic>(jdata.UDinv()); }
367 
368  static Eigen::Matrix<double,6,Eigen::Dynamic> run( const JointDataVariant & jdata)
369  { return boost::apply_visitor( JointUDInvInertiaVisitor (), jdata ); }
370  };
371  inline Eigen::Matrix<double,6,Eigen::Dynamic> udinv_inertia(const JointDataVariant & jdata) { return JointUDInvInertiaVisitor::run(jdata); }
372 
374 
375 } // namespace se3
376 
377 #endif // ifndef __se3_joint_basic_visitors_hxx__
ConstraintXd constraint_xd(const JointDataVariant &jdata)
Visit a JointDataVariant through JointConstraintVisitor to get the joint constraint as a dense constr...
JointCalcFirstOrderVisitor fusion visitor.
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...
JointMotionVisitor visitor.
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...
JointBiasVisitor visitor.
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...
CreateJointData visitor.
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...
JointDInvInertiaVisitor visitor.
int nq(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointNqVisitor to get the dimension of the joint configuration spac...
ConfigVector_t::Scalar finiteDifferenceIncrement() const
Return the resolution of the finite differerence increment according to the Scalar type...
Definition: joint-base.hpp:241
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...
JointSetIndexesVisitor visitor.
JointUDInvInertiaVisitor visitor.
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...
JointIdxVVisitor visitor.
JointCalcAbaVisitor fusion visitor.
Eigen::VectorXd finiteDifferenceIncrement(const Model &model)
Computes the finite difference increments for each degree of freedom according to the current joint c...
JointUInertiaVisitor visitor.
JointIndex id(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointIdVisitor to get the index of the joint in the kinematic chain...
JointIdVisitor visitor.
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...
JointShortnameVisitor visitor.
JointNqVisitor visitor.
JointNvVisitor visitor.
JointIdxQVisitor visitor.
JointTransformVisitor visitor.
JointConstraintVisitor visitor.
JointCalcZeroOrderVisitor fusion visitor.