MultiBody.h
Go to the documentation of this file.
1 /*
2  * Copyright 2012-2019 CNRS-UM LIRMM, CNRS-AIST JRL
3  */
4 
5 #pragma once
6 
7 // includes
8 // std
9 #include <stdexcept>
10 #include <unordered_map>
11 #include <vector>
12 
13 // SpaceVecAlg
14 #include <SpaceVecAlg/SpaceVecAlg>
15 
16 // RBDyn
17 #include <rbdyn/config.hh>
18 
19 #include "Body.h"
20 #include "Joint.h"
21 
22 namespace rbd
23 {
24 
29 class RBDYN_DLLAPI MultiBody
30 {
31 public:
32  MultiBody();
33 
42  MultiBody(std::vector<Body> bodies,
43  std::vector<Joint> joints,
44  std::vector<int> pred,
45  std::vector<int> succ,
46  std::vector<int> parent,
47  std::vector<sva::PTransformd> Xt);
48 
50  int nrBodies() const
51  {
52  return static_cast<int>(bodies_.size());
53  }
54 
56  int nrJoints() const
57  {
58  return static_cast<int>(joints_.size());
59  }
60 
62  const std::vector<Body> & bodies() const
63  {
64  return bodies_;
65  }
66 
68  void bodies(std::vector<Body> b)
69  {
70  bodies_ = std::move(b);
71  }
72 
74  const Body & body(int num) const
75  {
76  return bodies_[static_cast<std::size_t>(num)];
77  }
78 
80  void body(int num, const Body & b)
81  {
82  bodies_[static_cast<std::size_t>(num)] = b;
83  }
84 
86  const std::vector<Joint> & joints() const
87  {
88  return joints_;
89  }
90 
92  const Joint & joint(int num) const
93  {
94  return joints_[static_cast<std::size_t>(num)];
95  }
96 
98  const std::vector<int> & predecessors() const
99  {
100  return pred_;
101  }
102 
104  int predecessor(int num) const
105  {
106  return pred_[static_cast<std::size_t>(num)];
107  }
108 
110  const std::vector<int> & successors() const
111  {
112  return succ_;
113  }
114 
116  int successor(int num) const
117  {
118  return succ_[static_cast<std::size_t>(num)];
119  }
120 
122  const std::vector<int> & parents() const
123  {
124  return parent_;
125  }
126 
128  int parent(int num) const
129  {
130  return parent_[static_cast<std::size_t>(num)];
131  }
132 
134  const std::vector<sva::PTransformd> & transforms() const
135  {
136  return Xt_;
137  }
138 
140  void transforms(std::vector<sva::PTransformd> Xt)
141  {
142  Xt_ = std::move(Xt);
143  }
144 
146  const sva::PTransformd & transform(int num) const
147  {
148  return Xt_[static_cast<std::size_t>(num)];
149  }
150 
152  void transform(int num, const sva::PTransformd & Xt)
153  {
154  Xt_[static_cast<std::size_t>(num)] = Xt;
155  }
156 
158  int bodyIndexByName(const std::string & name) const
159  {
160  return bodyNameToInd_.find(name)->second;
161  }
162 
164  int jointIndexByName(const std::string & name) const
165  {
166  return jointNameToInd_.find(name)->second;
167  }
168 
170  const std::unordered_map<std::string, int> & bodyIndexByName() const
171  {
172  return bodyNameToInd_;
173  }
174 
176  const std::unordered_map<std::string, int> & jointIndexByName() const
177  {
178  return jointNameToInd_;
179  }
180 
182  int jointPosInParam(int i) const
183  {
184  return jointPosInParam_[static_cast<std::size_t>(i)];
185  }
186 
188  int jointPosInDof(int i) const
189  {
190  return jointPosInDof_[static_cast<std::size_t>(i)];
191  }
192 
194  const std::vector<int> & jointsPosInParam() const
195  {
196  return jointPosInParam_;
197  }
198 
200  const std::vector<int> & jointsPosInDof() const
201  {
202  return jointPosInDof_;
203  }
204 
206  int nrParams() const
207  {
208  return nrParams_;
209  }
210 
212  int nrDof() const
213  {
214  return nrDof_;
215  }
216 
217  // safe accessors version for python binding
218 
222  void sBodies(std::vector<Body> b)
223  {
224  if(b.size() != bodies_.size())
225  {
226  std::ostringstream str;
227  str << "bodies vector size mismatch: expected size " << bodies_.size() << " gived " << b.size();
228  throw std::runtime_error(str.str());
229  }
230  bodies(b);
231  }
232 
236  const Body & sBody(int num) const
237  {
238  return bodies_.at(static_cast<std::size_t>(num));
239  }
240 
244  void sBody(int num, const Body & b)
245  {
246  bodies_.at(static_cast<std::size_t>(num)) = b;
247  }
248 
252  const Joint & sJoint(int num) const
253  {
254  return joints_.at(static_cast<std::size_t>(num));
255  }
256 
260  int sPredecessor(int num) const
261  {
262  return pred_.at(static_cast<std::size_t>(num));
263  }
264 
268  int sSuccessor(int num) const
269  {
270  return succ_.at(static_cast<std::size_t>(num));
271  }
272 
276  int sParent(int num) const
277  {
278  return parent_.at(static_cast<std::size_t>(num));
279  }
280 
284  void sTransforms(std::vector<sva::PTransformd> Xt)
285  {
286  if(Xt.size() != Xt_.size())
287  {
288  std::ostringstream str;
289  str << "transform vector size mismatch: expected size " << Xt_.size() << " gived " << Xt.size();
290  throw std::runtime_error(str.str());
291  }
292  transforms(Xt);
293  }
294 
298  const sva::PTransformd & sTransform(int num) const
299  {
300  return Xt_.at(static_cast<std::size_t>(num));
301  }
302 
306  void sTransform(int num, const sva::PTransformd & Xt)
307  {
308  Xt_.at(static_cast<std::size_t>(num)) = Xt;
309  }
310 
314  int sJointPosInParam(int i) const
315  {
316  return jointPosInParam_.at(static_cast<std::size_t>(i));
317  }
318 
322  int sJointPosInDof(int i) const
323  {
324  return jointPosInDof_.at(static_cast<std::size_t>(i));
325  }
326 
331  int sBodyIndexByName(const std::string & name) const
332  {
333  return bodyNameToInd_.at(name);
334  }
335 
340  int sJointIndexByName(const std::string & name) const
341  {
342  return jointNameToInd_.at(name);
343  }
344 
345 protected:
346  std::vector<Body> bodies_;
347  std::vector<Joint> joints_;
348 
349  std::vector<int> pred_;
350  std::vector<int> succ_;
351  std::vector<int> parent_;
353  std::vector<sva::PTransformd> Xt_;
354 
355  std::unordered_map<std::string, int> bodyNameToInd_;
356  std::unordered_map<std::string, int> jointNameToInd_;
357 
359  std::vector<int> jointPosInParam_;
361  std::vector<int> jointPosInDof_;
362 
364  int nrDof_;
365 };
366 
367 } // namespace rbd
rbd::MultiBody::parent_
std::vector< int > parent_
Definition: MultiBody.h:351
rbd::MultiBody::sSuccessor
int sSuccessor(int num) const
Definition: MultiBody.h:268
rbd::MultiBody::jointsPosInParam
const std::vector< int > & jointsPosInParam() const
Definition: MultiBody.h:194
rbd::MultiBody::jointPosInParam
int jointPosInParam(int i) const
Definition: MultiBody.h:182
rbd::MultiBody::sBodies
void sBodies(std::vector< Body > b)
Definition: MultiBody.h:222
rbd::MultiBody::joints_
std::vector< Joint > joints_
Definition: MultiBody.h:347
rbd::MultiBody::sJointPosInParam
int sJointPosInParam(int i) const
Definition: MultiBody.h:314
rbd::MultiBody::nrBodies
int nrBodies() const
Definition: MultiBody.h:50
rbd::MultiBody::transform
void transform(int num, const sva::PTransformd &Xt)
Set the transformation from the body base to joint num.
Definition: MultiBody.h:152
rbd::MultiBody::body
void body(int num, const Body &b)
Set the body num in bodies list.
Definition: MultiBody.h:80
rbd::MultiBody
Definition: MultiBody.h:29
rbd::MultiBody::nrParams_
int nrParams_
Definition: MultiBody.h:363
rbd::MultiBody::predecessors
const std::vector< int > & predecessors() const
Definition: MultiBody.h:98
rbd::MultiBody::bodyIndexByName
int bodyIndexByName(const std::string &name) const
Definition: MultiBody.h:158
rbd::MultiBody::body
const Body & body(int num) const
Definition: MultiBody.h:74
Joint.h
rbd::MultiBody::bodies
const std::vector< Body > & bodies() const
Definition: MultiBody.h:62
rbd::Joint
Definition: Joint.h:35
rbd::MultiBody::parent
int parent(int num) const
Definition: MultiBody.h:128
rbd::MultiBody::bodyIndexByName
const std::unordered_map< std::string, int > & bodyIndexByName() const
Definition: MultiBody.h:170
rbd::MultiBody::joint
const Joint & joint(int num) const
Definition: MultiBody.h:92
rbd::MultiBody::bodyNameToInd_
std::unordered_map< std::string, int > bodyNameToInd_
Definition: MultiBody.h:355
rbd::MultiBody::sTransforms
void sTransforms(std::vector< sva::PTransformd > Xt)
Definition: MultiBody.h:284
rbd::MultiBody::nrParams
int nrParams() const
Definition: MultiBody.h:206
rbd::MultiBody::nrDof
int nrDof() const
Definition: MultiBody.h:212
rbd::MultiBody::sJoint
const Joint & sJoint(int num) const
Definition: MultiBody.h:252
rbd::MultiBody::sTransform
void sTransform(int num, const sva::PTransformd &Xt)
Definition: MultiBody.h:306
rbd::MultiBody::sBodyIndexByName
int sBodyIndexByName(const std::string &name) const
Definition: MultiBody.h:331
rbd::MultiBody::jointIndexByName
const std::unordered_map< std::string, int > & jointIndexByName() const
Definition: MultiBody.h:176
rbd::MultiBody::bodies
void bodies(std::vector< Body > b)
Set bodies of the multibody system.
Definition: MultiBody.h:68
rbd::MultiBody::joints
const std::vector< Joint > & joints() const
Definition: MultiBody.h:86
rbd::MultiBody::sParent
int sParent(int num) const
Definition: MultiBody.h:276
rbd::MultiBody::transform
const sva::PTransformd & transform(int num) const
Definition: MultiBody.h:146
rbd::MultiBody::nrJoints
int nrJoints() const
Definition: MultiBody.h:56
rbd::MultiBody::successors
const std::vector< int > & successors() const
Definition: MultiBody.h:110
rbd::MultiBody::sJointIndexByName
int sJointIndexByName(const std::string &name) const
Definition: MultiBody.h:340
rbd::MultiBody::jointIndexByName
int jointIndexByName(const std::string &name) const
Definition: MultiBody.h:164
rbd
Definition: common.h:20
rbd::MultiBody::succ_
std::vector< int > succ_
Definition: MultiBody.h:350
rbd::MultiBody::sTransform
const sva::PTransformd & sTransform(int num) const
Definition: MultiBody.h:298
rbd::MultiBody::successor
int successor(int num) const
Definition: MultiBody.h:116
rbd::MultiBody::jointPosInParam_
std::vector< int > jointPosInParam_
Position of joint i in parameter vector.
Definition: MultiBody.h:359
rbd::MultiBody::sBody
const Body & sBody(int num) const
Definition: MultiBody.h:236
Body.h
rbd::MultiBody::sJointPosInDof
int sJointPosInDof(int i) const
Definition: MultiBody.h:322
rbd::MultiBody::sBody
void sBody(int num, const Body &b)
Definition: MultiBody.h:244
rbd::MultiBody::transforms
const std::vector< sva::PTransformd > & transforms() const
Definition: MultiBody.h:134
rbd::MultiBody::predecessor
int predecessor(int num) const
Definition: MultiBody.h:104
rbd::MultiBody::sPredecessor
int sPredecessor(int num) const
Definition: MultiBody.h:260
rbd::Body
Definition: Body.h:20
rbd::MultiBody::nrDof_
int nrDof_
Definition: MultiBody.h:364
rbd::MultiBody::jointPosInDof_
std::vector< int > jointPosInDof_
Position of joint i in dof vector (velocity, acceleration...).
Definition: MultiBody.h:361
rbd::MultiBody::pred_
std::vector< int > pred_
Definition: MultiBody.h:349
rbd::MultiBody::transforms
void transforms(std::vector< sva::PTransformd > Xt)
Definition: MultiBody.h:140
rbd::MultiBody::parents
const std::vector< int > & parents() const
Definition: MultiBody.h:122
rbd::MultiBody::jointNameToInd_
std::unordered_map< std::string, int > jointNameToInd_
Definition: MultiBody.h:356
rbd::MultiBody::jointPosInDof
int jointPosInDof(int i) const
Definition: MultiBody.h:188
rbd::MultiBody::Xt_
std::vector< sva::PTransformd > Xt_
Transformation from the body base to joint i.
Definition: MultiBody.h:353
rbd::MultiBody::jointsPosInDof
const std::vector< int > & jointsPosInDof() const
Definition: MultiBody.h:200
rbd::MultiBody::bodies_
std::vector< Body > bodies_
Definition: MultiBody.h:346