pinocchio  3.2.0
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
model.hpp
1 //
2 // Copyright (c) 2015-2020 CNRS INRIA
3 // Copyright (c) 2015 Wandercraft, 86 rue de Paris 91400 Orsay, France.
4 //
5 
6 #ifndef __pinocchio_multibody_model_hpp__
7 #define __pinocchio_multibody_model_hpp__
8 
9 #include "pinocchio/spatial/fwd.hpp"
10 #include "pinocchio/spatial/se3.hpp"
11 #include "pinocchio/spatial/force.hpp"
12 #include "pinocchio/spatial/motion.hpp"
13 #include "pinocchio/spatial/inertia.hpp"
14 
15 #include "pinocchio/multibody/fwd.hpp"
16 #include "pinocchio/multibody/frame.hpp"
17 #include "pinocchio/multibody/joint/joint-generic.hpp"
18 
19 #include "pinocchio/container/aligned-vector.hpp"
20 
21 #include "pinocchio/serialization/serializable.hpp"
22 
23 #include <map>
24 #include <iterator>
25 
26 namespace pinocchio
27 {
28  template<
29  typename NewScalar,
30  typename Scalar,
31  int Options,
32  template<typename, int>
33  class JointCollectionTpl>
34  struct CastType<NewScalar, ModelTpl<Scalar, Options, JointCollectionTpl>>
35  {
37  };
38 
39  template<typename _Scalar, int _Options, template<typename, int> class JointCollectionTpl>
40  struct traits<ModelTpl<_Scalar, _Options, JointCollectionTpl>>
41  {
42  typedef _Scalar Scalar;
43  };
44 
45  template<typename _Scalar, int _Options, template<typename, int> class JointCollectionTpl>
46  struct ModelTpl
47  : serialization::Serializable<ModelTpl<_Scalar, _Options, JointCollectionTpl>>
48  , NumericalBase<ModelTpl<_Scalar, _Options, JointCollectionTpl>>
49  {
50  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
51 
52  typedef _Scalar Scalar;
53  enum
54  {
55  Options = _Options
56  };
57 
58  typedef JointCollectionTpl<Scalar, Options> JointCollection;
60 
66 
67  typedef pinocchio::Index Index;
68  typedef pinocchio::JointIndex JointIndex;
69  typedef pinocchio::GeomIndex GeomIndex;
70  typedef pinocchio::FrameIndex FrameIndex;
71  typedef std::vector<Index> IndexVector;
72 
75 
76  typedef PINOCCHIO_ALIGNED_STD_VECTOR(JointModel) JointModelVector;
77  typedef PINOCCHIO_ALIGNED_STD_VECTOR(JointData) JointDataVector;
78 
79  typedef PINOCCHIO_ALIGNED_STD_VECTOR(Frame) FrameVector;
80 
81  typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1, Options> VectorXs;
82  typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3;
83 
84  typedef PINOCCHIO_ALIGNED_STD_VECTOR(Inertia) InertiaVector;
85  typedef PINOCCHIO_ALIGNED_STD_VECTOR(SE3) SE3Vector;
86 
88  typedef VectorXs ConfigVectorType;
89 
91  typedef std::map<std::string, ConfigVectorType> ConfigVectorMap;
92 
96  typedef VectorXs TangentVectorType;
97 
99  int nq;
100 
102  int nv;
103 
105  int njoints;
106 
108  int nbodies;
109 
111  int nframes;
112 
114  InertiaVector inertias;
115 
117  SE3Vector jointPlacements;
118 
120  JointModelVector joints;
121 
123  std::vector<int> idx_qs;
124 
126  std::vector<int> nqs;
127 
129  std::vector<int> idx_vs;
130 
132  std::vector<int> nvs;
133 
136  std::vector<JointIndex> parents;
137 
140  std::vector<IndexVector> children;
141 
143  std::vector<std::string> names;
144 
147 
150  VectorXs armature;
151 
154 
157 
160 
163 
166 
169 
172 
175 
177  FrameVector frames;
178 
184  std::vector<IndexVector> supports;
185 
189  std::vector<IndexVector> subtrees;
190 
193 
195  static const Vector3 gravity981;
196 
198  std::string name;
199 
202  : nq(0)
203  , nv(0)
204  , njoints(1)
205  , nbodies(1)
206  , nframes(0)
207  , inertias(1, Inertia::Zero())
208  , jointPlacements(1, SE3::Identity())
209  , joints(1)
210  , idx_qs(1, 0)
211  , nqs(1, 0)
212  , idx_vs(1, 0)
213  , nvs(1, 0)
214  , parents(1, 0)
215  , children(1)
216  , names(1)
217  , supports(1, IndexVector(1, 0))
218  , subtrees(1)
219  , gravity(gravity981, Vector3::Zero())
220  {
221  names[0] = "universe"; // Should be "universe joint (trivial)"
222  // FIXME Should the universe joint be a FIXED_JOINT even if it is
223  // in the list of joints ? See comment in definition of
224  // Model::addJointFrame and Model::addBodyFrame
225  addFrame(Frame("universe", 0, 0, SE3::Identity(), FIXED_JOINT));
226  }
227 
233  template<typename S2, int O2>
234  explicit ModelTpl(const ModelTpl<S2, O2> & other)
235  {
236  *this = other.template cast<Scalar>();
237  }
238 
240  template<typename NewScalar>
242 
248  bool operator==(const ModelTpl & other) const;
249 
253  bool operator!=(const ModelTpl & other) const
254  {
255  return !(*this == other);
256  }
257 
277  JointIndex addJoint(
278  const JointIndex parent,
279  const JointModel & joint_model,
280  const SE3 & joint_placement,
281  const std::string & joint_name);
282 
292  JointIndex addJoint(
293  const JointIndex parent,
294  const JointModel & joint_model,
295  const SE3 & joint_placement,
296  const std::string & joint_name,
297  const VectorXs & max_effort,
298  const VectorXs & max_velocity,
299  const VectorXs & min_config,
300  const VectorXs & max_config);
301 
309  JointIndex addJoint(
310  const JointIndex parent,
311  const JointModel & joint_model,
312  const SE3 & joint_placement,
313  const std::string & joint_name,
314  const VectorXs & max_effort,
315  const VectorXs & max_velocity,
316  const VectorXs & min_config,
317  const VectorXs & max_config,
318  const VectorXs & friction,
319  const VectorXs & damping);
320 
330  FrameIndex addJointFrame(const JointIndex & joint_index, int previous_frame_index = -1);
331 
343  const JointIndex joint_index,
344  const Inertia & Y,
345  const SE3 & body_placement = SE3::Identity());
346 
359  FrameIndex addBodyFrame(
360  const std::string & body_name,
361  const JointIndex & parentJoint,
362  const SE3 & body_placement = SE3::Identity(),
363  int parentFrame = -1);
364 
376  FrameIndex getBodyId(const std::string & name) const;
377 
385  bool existBodyName(const std::string & name) const;
386 
397  JointIndex getJointId(const std::string & name) const;
398 
406  bool existJointName(const std::string & name) const;
407 
421  FrameIndex getFrameId(
422  const std::string & name,
423  const FrameType & type = (FrameType)(JOINT | FIXED_JOINT | BODY | OP_FRAME | SENSOR)) const;
424 
434  const std::string & name,
435  const FrameType & type = (FrameType)(JOINT | FIXED_JOINT | BODY | OP_FRAME | SENSOR)) const;
436 
449  FrameIndex addFrame(const Frame & frame, const bool append_inertia = true);
450 
461  template<typename D>
462  bool check(const AlgorithmCheckerBase<D> & checker = AlgorithmCheckerBase<D>()) const
463  {
464  return checker.checkModel(*this);
465  }
466 
472  std::vector<bool> hasConfigurationLimit();
473 
479  std::vector<bool> hasConfigurationLimitInTangent();
480 
482  bool check() const;
483 
491  bool check(const Data & data) const;
492 
493  protected:
499  void addJointIndexToParentSubtrees(const JointIndex joint_id);
500  };
501 
502 } // namespace pinocchio
503 
504 /* --- Details -------------------------------------------------------------- */
505 /* --- Details -------------------------------------------------------------- */
506 /* --- Details -------------------------------------------------------------- */
507 #include "pinocchio/multibody/model.hxx"
508 
509 #if PINOCCHIO_ENABLE_TEMPLATE_INSTANTIATION
510  #include "pinocchio/multibody/model.txx"
511 #endif // PINOCCHIO_ENABLE_TEMPLATE_INSTANTIATION
512 
513 #endif // ifndef __pinocchio_multibody_model_hpp__
Main pinocchio namespace.
Definition: treeview.dox:11
FrameType
Enum on the possible types of frames.
Definition: frame.hpp:32
@ BODY
body frame: attached to the collision, inertial or visual properties of a link
Definition: frame.hpp:36
@ SENSOR
sensor frame: defined in a sensor element
Definition: frame.hpp:38
@ OP_FRAME
operational frame: user-defined frames that are defined at runtime
Definition: frame.hpp:33
@ JOINT
joint frame: attached to the child body of a joint (a.k.a. child frame)
Definition: frame.hpp:34
@ FIXED_JOINT
fixed joint frame: joint frame but for a fixed joint
Definition: frame.hpp:35
CRTP class describing the API of the checkers.
Definition: check.hpp:23
Type of the cast of a class C templated by Scalar and Options, to a new NewScalar type....
Definition: fwd.hpp:99
A Plucker coordinate frame attached to a parent joint inside a kinematic tree.
Definition: frame.hpp:56
JointIndex addJoint(const JointIndex parent, const JointModel &joint_model, const SE3 &joint_placement, const std::string &joint_name, const VectorXs &max_effort, const VectorXs &max_velocity, const VectorXs &min_config, const VectorXs &max_config, const VectorXs &friction, const VectorXs &damping)
TangentVectorType velocityLimit
Vector of maximal joint velocities.
Definition: model.hpp:168
TangentVectorType friction
Vector of joint friction parameters.
Definition: model.hpp:159
std::vector< int > idx_vs
Starting index of the *i*th joint in the tangent configuration space.
Definition: model.hpp:129
FrameIndex addJointFrame(const JointIndex &joint_index, int previous_frame_index=-1)
Add a joint to the frame tree.
std::vector< IndexVector > subtrees
Vector of joint subtrees. subtree[j] corresponds to the subtree supported by the joint j....
Definition: model.hpp:189
std::vector< IndexVector > supports
Vector of joint supports. supports[j] corresponds to the vector of indices of the joints located on t...
Definition: model.hpp:184
std::vector< bool > hasConfigurationLimit()
Check if joints have configuration limits.
Motion gravity
Spatial gravity of the model.
Definition: model.hpp:192
FrameIndex getBodyId(const std::string &name) const
Return the index of a body given by its name.
bool operator==(const ModelTpl &other) const
Equality comparison operator.
ConfigVectorType upperPositionLimit
Upper joint configuration limit.
Definition: model.hpp:174
TangentVectorType rotorGearRatio
Vector of rotor gear ratio parameters.
Definition: model.hpp:156
ModelTpl()
Default constructor. Builds an empty model with no joints.
Definition: model.hpp:201
bool operator!=(const ModelTpl &other) const
Definition: model.hpp:253
InertiaVector inertias
Vector of spatial inertias supported by each joint.
Definition: model.hpp:114
FrameIndex addBodyFrame(const std::string &body_name, const JointIndex &parentJoint, const SE3 &body_placement=SE3::Identity(), int parentFrame=-1)
Add a body to the frame tree.
std::vector< int > idx_qs
Vector of starting index of the *i*th joint in the configuration space.
Definition: model.hpp:123
SE3Vector jointPlacements
Vector of joint placements: placement of a joint i wrt its parent joint frame.
Definition: model.hpp:117
int nframes
Number of operational frames.
Definition: model.hpp:111
VectorXs TangentVectorType
Dense vectorized version of a joint tangent vector (e.g. velocity, acceleration, etc)....
Definition: model.hpp:96
JointModelVector joints
Vector of joint models.
Definition: model.hpp:120
JointIndex addJoint(const JointIndex parent, const JointModel &joint_model, const SE3 &joint_placement, const std::string &joint_name)
Add a joint to the kinematic tree with infinite bounds.
bool check() const
Run check(fusion::list) with DEFAULT_CHECKERS as argument.
std::vector< int > nqs
Vector of dimension of the joint configuration subspace.
Definition: model.hpp:126
std::vector< IndexVector > children
Vector of children index. Chidren of the i*th joint, denoted *mu(i) corresponds to the set (i==parent...
Definition: model.hpp:140
ModelTpl(const ModelTpl< S2, O2 > &other)
Copy constructor by casting.
Definition: model.hpp:234
TangentVectorType rotorInertia
Vector of rotor inertia parameters.
Definition: model.hpp:153
TangentVectorType effortLimit
Vector of maximal joint torques.
Definition: model.hpp:165
int nq
Dimension of the configuration vector representation.
Definition: model.hpp:99
std::vector< JointIndex > parents
Vector of parent joint indexes. The parent of joint i, denoted li, corresponds to li==parents[i].
Definition: model.hpp:136
int nbodies
Number of bodies.
Definition: model.hpp:108
CastType< NewScalar, ModelTpl >::type cast() const
std::string name
Model name.
Definition: model.hpp:198
std::vector< std::string > names
Name of the joints.
Definition: model.hpp:143
JointIndex getJointId(const std::string &name) const
Return the index of a joint given by its name.
int nv
Dimension of the velocity vector space.
Definition: model.hpp:102
void appendBodyToJoint(const JointIndex joint_index, const Inertia &Y, const SE3 &body_placement=SE3::Identity())
Append a body to a given joint of the kinematic tree.
bool check(const Data &data) const
Run checkData on data and current model.
ConfigVectorMap referenceConfigurations
Map of reference configurations, indexed by user given names.
Definition: model.hpp:146
FrameVector frames
Vector of operational frames registered on the model.
Definition: model.hpp:177
void addJointIndexToParentSubtrees(const JointIndex joint_id)
Add the joint_id to its parent subtrees.
bool existBodyName(const std::string &name) const
Check if a body given by its name exists.
FrameIndex getFrameId(const std::string &name, const FrameType &type=(FrameType)(JOINT|FIXED_JOINT|BODY|OP_FRAME|SENSOR)) const
Returns the index of a frame given by its name.
std::vector< int > nvs
Dimension of the *i*th joint tangent subspace.
Definition: model.hpp:132
VectorXs armature
Vector of armature values expressed at the joint level This vector may contain the contribution of ro...
Definition: model.hpp:150
bool check(const AlgorithmCheckerBase< D > &checker=AlgorithmCheckerBase< D >()) const
Check the validity of the attributes of Model with respect to the specification of some algorithms.
Definition: model.hpp:462
static const Vector3 gravity981
Default 3D gravity vector (=(0,0,-9.81)).
Definition: model.hpp:195
JointIndex addJoint(const JointIndex parent, const JointModel &joint_model, const SE3 &joint_placement, const std::string &joint_name, const VectorXs &max_effort, const VectorXs &max_velocity, const VectorXs &min_config, const VectorXs &max_config)
int njoints
Number of joints.
Definition: model.hpp:105
VectorXs ConfigVectorType
Dense vectorized version of a joint configuration vector.
Definition: model.hpp:88
std::map< std::string, ConfigVectorType > ConfigVectorMap
Map between a string (key) and a configuration vector.
Definition: model.hpp:91
bool existFrame(const std::string &name, const FrameType &type=(FrameType)(JOINT|FIXED_JOINT|BODY|OP_FRAME|SENSOR)) const
Checks if a frame given by its name exists.
bool existJointName(const std::string &name) const
Check if a joint given by its name exists.
TangentVectorType damping
Vector of joint damping parameters.
Definition: model.hpp:162
ConfigVectorType lowerPositionLimit
Lower joint configuration limit.
Definition: model.hpp:171
FrameIndex addFrame(const Frame &frame, const bool append_inertia=true)
Adds a frame to the kinematic tree. The inertia stored within the frame will be happened to the inert...
std::vector< bool > hasConfigurationLimitInTangent()
Check if joints have configuration limits.
Common traits structure to fully define base classes for CRTP.
Definition: fwd.hpp:72