Loading...
Searching...
No Matches
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
22namespace rbd
23{
24
29class RBDYN_DLLAPI MultiBody
30{
31public:
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
223 void setJointRotorInertia(int index, double Ir)
224 {
225 joints_[static_cast<std::size_t>(index)].setRotorInertia(Ir);
226 }
227
234 void setJointGearRatio(int index, double gr)
235 {
236 joints_[static_cast<std::size_t>(index)].setGearRatio(gr);
237 }
238
239 // safe accessors version for python binding
240
244 void sBodies(std::vector<Body> b)
245 {
246 if(b.size() != bodies_.size())
247 {
248 std::ostringstream str;
249 str << "bodies vector size mismatch: expected size " << bodies_.size() << " gived " << b.size();
250 throw std::runtime_error(str.str());
251 }
252 bodies(b);
253 }
254
258 const Body & sBody(int num) const
259 {
260 return bodies_.at(static_cast<std::size_t>(num));
261 }
262
266 void sBody(int num, const Body & b)
267 {
268 bodies_.at(static_cast<std::size_t>(num)) = b;
269 }
270
274 const Joint & sJoint(int num) const
275 {
276 return joints_.at(static_cast<std::size_t>(num));
277 }
278
282 int sPredecessor(int num) const
283 {
284 return pred_.at(static_cast<std::size_t>(num));
285 }
286
290 int sSuccessor(int num) const
291 {
292 return succ_.at(static_cast<std::size_t>(num));
293 }
294
298 int sParent(int num) const
299 {
300 return parent_.at(static_cast<std::size_t>(num));
301 }
302
306 void sTransforms(std::vector<sva::PTransformd> Xt)
307 {
308 if(Xt.size() != Xt_.size())
309 {
310 std::ostringstream str;
311 str << "transform vector size mismatch: expected size " << Xt_.size() << " gived " << Xt.size();
312 throw std::runtime_error(str.str());
313 }
314 transforms(Xt);
315 }
316
320 const sva::PTransformd & sTransform(int num) const
321 {
322 return Xt_.at(static_cast<std::size_t>(num));
323 }
324
328 void sTransform(int num, const sva::PTransformd & Xt)
329 {
330 Xt_.at(static_cast<std::size_t>(num)) = Xt;
331 }
332
336 int sJointPosInParam(int i) const
337 {
338 return jointPosInParam_.at(static_cast<std::size_t>(i));
339 }
340
344 int sJointPosInDof(int i) const
345 {
346 return jointPosInDof_.at(static_cast<std::size_t>(i));
347 }
348
353 int sBodyIndexByName(const std::string & name) const
354 {
355 return bodyNameToInd_.at(name);
356 }
357
362 int sJointIndexByName(const std::string & name) const
363 {
364 return jointNameToInd_.at(name);
365 }
366
367protected:
368 std::vector<Body> bodies_;
369 std::vector<Joint> joints_;
370
371 std::vector<int> pred_;
372 std::vector<int> succ_;
373 std::vector<int> parent_;
375 std::vector<sva::PTransformd> Xt_;
376
377 std::unordered_map<std::string, int> bodyNameToInd_;
378 std::unordered_map<std::string, int> jointNameToInd_;
379
381 std::vector<int> jointPosInParam_;
383 std::vector<int> jointPosInDof_;
384
387};
388
389} // namespace rbd
Definition Body.h:21
Definition Joint.h:36
Definition MultiBody.h:30
int sSuccessor(int num) const
Definition MultiBody.h:290
const std::vector< int > & successors() const
Definition MultiBody.h:110
std::vector< sva::PTransformd > Xt_
Transformation from the body base to joint i.
Definition MultiBody.h:375
const Joint & joint(int num) const
Definition MultiBody.h:92
const sva::PTransformd & sTransform(int num) const
Definition MultiBody.h:320
int nrParams() const
Definition MultiBody.h:206
int jointPosInDof(int i) const
Definition MultiBody.h:188
int predecessor(int num) const
Definition MultiBody.h:104
void setJointGearRatio(int index, double gr)
Set Joint Gear Ratio.
Definition MultiBody.h:234
int sPredecessor(int num) const
Definition MultiBody.h:282
void bodies(std::vector< Body > b)
Set bodies of the multibody system.
Definition MultiBody.h:68
int nrDof_
Definition MultiBody.h:386
MultiBody(std::vector< Body > bodies, std::vector< Joint > joints, std::vector< int > pred, std::vector< int > succ, std::vector< int > parent, std::vector< sva::PTransformd > Xt)
const std::unordered_map< std::string, int > & bodyIndexByName() const
Definition MultiBody.h:170
const std::vector< int > & parents() const
Definition MultiBody.h:122
int parent(int num) const
Definition MultiBody.h:128
const std::vector< Body > & bodies() const
Definition MultiBody.h:62
std::vector< int > parent_
Definition MultiBody.h:373
void transform(int num, const sva::PTransformd &Xt)
Set the transformation from the body base to joint num.
Definition MultiBody.h:152
const Joint & sJoint(int num) const
Definition MultiBody.h:274
int sJointPosInDof(int i) const
Definition MultiBody.h:344
const Body & body(int num) const
Definition MultiBody.h:74
const std::vector< int > & jointsPosInDof() const
Definition MultiBody.h:200
std::vector< int > pred_
Definition MultiBody.h:371
void sBody(int num, const Body &b)
Definition MultiBody.h:266
int jointPosInParam(int i) const
Definition MultiBody.h:182
void sTransforms(std::vector< sva::PTransformd > Xt)
Definition MultiBody.h:306
std::vector< int > succ_
Definition MultiBody.h:372
int successor(int num) const
Definition MultiBody.h:116
int jointIndexByName(const std::string &name) const
Definition MultiBody.h:164
void body(int num, const Body &b)
Set the body num in bodies list.
Definition MultiBody.h:80
const std::unordered_map< std::string, int > & jointIndexByName() const
Definition MultiBody.h:176
const std::vector< int > & jointsPosInParam() const
Definition MultiBody.h:194
const std::vector< Joint > & joints() const
Definition MultiBody.h:86
void sBodies(std::vector< Body > b)
Definition MultiBody.h:244
int nrParams_
Definition MultiBody.h:385
int nrDof() const
Definition MultiBody.h:212
const std::vector< sva::PTransformd > & transforms() const
Definition MultiBody.h:134
const std::vector< int > & predecessors() const
Definition MultiBody.h:98
const Body & sBody(int num) const
Definition MultiBody.h:258
int nrBodies() const
Definition MultiBody.h:50
int sJointPosInParam(int i) const
Definition MultiBody.h:336
std::vector< Body > bodies_
Definition MultiBody.h:368
void transforms(std::vector< sva::PTransformd > Xt)
Definition MultiBody.h:140
void setJointRotorInertia(int index, double Ir)
Set Joint Rotor Inertia.
Definition MultiBody.h:223
const sva::PTransformd & transform(int num) const
Definition MultiBody.h:146
std::unordered_map< std::string, int > jointNameToInd_
Definition MultiBody.h:378
int bodyIndexByName(const std::string &name) const
Definition MultiBody.h:158
std::vector< int > jointPosInDof_
Position of joint i in dof vector (velocity, acceleration...).
Definition MultiBody.h:383
std::vector< Joint > joints_
Definition MultiBody.h:369
int sBodyIndexByName(const std::string &name) const
Definition MultiBody.h:353
int sParent(int num) const
Definition MultiBody.h:298
int sJointIndexByName(const std::string &name) const
Definition MultiBody.h:362
int nrJoints() const
Definition MultiBody.h:56
std::vector< int > jointPosInParam_
Position of joint i in parameter vector.
Definition MultiBody.h:381
std::unordered_map< std::string, int > bodyNameToInd_
Definition MultiBody.h:377
void sTransform(int num, const sva::PTransformd &Xt)
Definition MultiBody.h:328
Definition common.h:21