Loading...
Searching...
No Matches
MultiBodyConfig.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 <vector>
11
12// sva
13#include <SpaceVecAlg/SpaceVecAlg>
14
15// RBDyn
16#include <rbdyn/config.hh>
17
18#include "MultiBody.h"
19
20namespace rbd
21{
22
23struct RBDYN_DLLAPI MultiBodyConfig
24{
27
29 void zero(const MultiBody & mb);
30
32 std::vector<std::vector<double>> q;
33
35 std::vector<std::vector<double>> alpha;
36
38 std::vector<std::vector<double>> alphaD;
39
41 std::vector<sva::ForceVecd> force;
42
44 std::vector<sva::PTransformd> jointConfig;
45
47 std::vector<sva::MotionVecd> jointVelocity;
48
50 std::vector<std::vector<double>> jointTorque;
51
53 std::vector<Eigen::Matrix<double, 6, Eigen::Dynamic>> motionSubspace;
54
56 std::vector<sva::PTransformd> bodyPosW;
57
59 std::vector<sva::PTransformd> parentToSon;
60
62 std::vector<sva::MotionVecd> bodyVelW;
63
65 std::vector<sva::MotionVecd> bodyVelB;
66
68 std::vector<sva::MotionVecd> bodyAccB;
69
71 Eigen::Vector3d gravity;
72
73 // python binding function
74
75 std::vector<Eigen::MatrixXd> python_motionSubspace();
76 void python_motionSubspace(const std::vector<Eigen::MatrixXd> & v);
77};
78
83class RBDYN_DLLAPI ConfigConverter
84{
85public:
86 ConfigConverter(const MultiBody & from, const MultiBody & to);
87
88 void convert(const MultiBodyConfig & from, MultiBodyConfig & to) const;
89
94 template<typename T>
95 void convertJoint(const std::vector<T> & from, std::vector<T> & to) const;
96
97 template<typename T>
98 std::vector<T> convertJoint(const std::vector<T> & from) const;
99
100 // safe version for python binding
101
105 static ConfigConverter * sConstructor(const MultiBody & from, const MultiBody & to);
106
110 void sConvert(const MultiBodyConfig & from, MultiBodyConfig & to) const;
111
115 template<typename T>
116 void sConvertJoint(const std::vector<T> & from, std::vector<T> & to) const;
117
118private:
119 std::vector<int> jInd_;
120 std::vector<int> bInd_;
121};
122
128RBDYN_DLLAPI void paramToVector(const std::vector<std::vector<double>> & v, Eigen::Ref<Eigen::VectorXd> e);
129
134RBDYN_DLLAPI void sParamToVector(const std::vector<std::vector<double>> & v, Eigen::Ref<Eigen::VectorXd> e);
135
142RBDYN_DLLAPI Eigen::VectorXd paramToVector(const MultiBody & mb, const std::vector<std::vector<double>> & v);
143
148RBDYN_DLLAPI Eigen::VectorXd sParamToVector(const MultiBody & mb, const std::vector<std::vector<double>> & v);
149
156RBDYN_DLLAPI Eigen::VectorXd dofToVector(const MultiBody & mb, const std::vector<std::vector<double>> & v);
157
162RBDYN_DLLAPI Eigen::VectorXd sDofToVector(const MultiBody & mb, const std::vector<std::vector<double>> & v);
163
169RBDYN_DLLAPI void vectorToParam(const Eigen::Ref<const Eigen::VectorXd> & e, std::vector<std::vector<double>> & v);
170
175RBDYN_DLLAPI void sVectorToParam(const Eigen::Ref<const Eigen::VectorXd> & e, std::vector<std::vector<double>> & v);
176
183RBDYN_DLLAPI std::vector<std::vector<double>> vectorToParam(const MultiBody & mb, const Eigen::VectorXd & e);
184
189RBDYN_DLLAPI std::vector<std::vector<double>> sVectorToParam(const MultiBody & mb, const Eigen::VectorXd & e);
190
197RBDYN_DLLAPI std::vector<std::vector<double>> vectorToDof(const MultiBody & mb, const Eigen::VectorXd & e);
198
203RBDYN_DLLAPI std::vector<std::vector<double>> sVectorToDof(const MultiBody & mb, const Eigen::VectorXd & e);
204
206template<typename T>
207void checkMatchBodiesVector(const MultiBody & mb, const std::vector<T> & vec, const std::string & name);
208
210template<typename T>
211void checkMatchJointsVector(const MultiBody & mb, const std::vector<T> & vec, const std::string & name);
212
214RBDYN_DLLAPI void checkMatchBodyPos(const MultiBody & mb, const MultiBodyConfig & mbc);
215
217RBDYN_DLLAPI void checkMatchParentToSon(const MultiBody & mb, const MultiBodyConfig & mbc);
218
221RBDYN_DLLAPI void checkMatchBodyVel(const MultiBody & mb, const MultiBodyConfig & mbc);
222
224RBDYN_DLLAPI void checkMatchBodyAcc(const MultiBody & mb, const MultiBodyConfig & mbc);
225
227RBDYN_DLLAPI void checkMatchJointConf(const MultiBody & mb, const MultiBodyConfig & mbc);
228
230RBDYN_DLLAPI void checkMatchJointVelocity(const MultiBody & mb, const MultiBodyConfig & mbc);
231
233RBDYN_DLLAPI void checkMatchJointTorque(const MultiBody & mb, const MultiBodyConfig & mbc);
234
236RBDYN_DLLAPI void checkMatchMotionSubspace(const MultiBody & mb, const MultiBodyConfig & mbc);
237
239RBDYN_DLLAPI void checkMatchQ(const MultiBody & mb, const MultiBodyConfig & mbc);
240
242RBDYN_DLLAPI void checkMatchAlpha(const MultiBody & mb, const MultiBodyConfig & mbc);
243
245RBDYN_DLLAPI void checkMatchAlphaD(const MultiBody & mb, const MultiBodyConfig & mbc);
246
248RBDYN_DLLAPI void checkMatchForce(const MultiBody & mb, const MultiBodyConfig & mbc);
249
250template<typename T>
251void checkMatchBodiesVector(const MultiBody & mb, const std::vector<T> & vec, const std::string & name)
252{
253 if(int(vec.size()) != mb.nrBodies())
254 {
255 std::ostringstream str;
256 str << name << " size mismatch: expected size " << mb.nrBodies() << " gived " << vec.size();
257 throw std::domain_error(str.str());
258 }
259}
260
261template<typename T>
262void checkMatchJointsVector(const MultiBody & mb, const std::vector<T> & vec, const std::string & name)
263{
264 if(int(vec.size()) != mb.nrJoints())
265 {
266 std::ostringstream str;
267 str << name << " size mismatch: expected size " << mb.nrJoints() << " gived " << vec.size();
268 throw std::domain_error(str.str());
269 }
270}
271
272template<typename T>
273inline void ConfigConverter::convertJoint(const std::vector<T> & from, std::vector<T> & to) const
274{
275 for(std::size_t i = 0; i < jInd_.size(); ++i)
276 {
277 to[static_cast<size_t>(jInd_[i])] = from[i + 1];
278 }
279}
280
281template<typename T>
282inline void ConfigConverter::sConvertJoint(const std::vector<T> & from, std::vector<T> & to) const
283{
284 if(from.size() != to.size())
285 {
286 throw std::domain_error("from and to vector must have the same size");
287 }
288
289 convertJoint(from, to);
290}
291
292template<typename T>
293inline std::vector<T> ConfigConverter::convertJoint(const std::vector<T> & from) const
294{
295 std::vector<T> to(from.size());
296 for(std::size_t i = 0; i < jInd_.size(); ++i)
297 {
298 to[static_cast<size_t>(jInd_[i])] = from[i + 1];
299 }
300
301 return to;
302}
303
304} // namespace rbd
Definition MultiBodyConfig.h:84
void sConvert(const MultiBodyConfig &from, MultiBodyConfig &to) const
ConfigConverter(const MultiBody &from, const MultiBody &to)
static ConfigConverter * sConstructor(const MultiBody &from, const MultiBody &to)
void convertJoint(const std::vector< T > &from, std::vector< T > &to) const
Definition MultiBodyConfig.h:273
void convert(const MultiBodyConfig &from, MultiBodyConfig &to) const
void sConvertJoint(const std::vector< T > &from, std::vector< T > &to) const
Definition MultiBodyConfig.h:282
Definition MultiBody.h:30
int nrBodies() const
Definition MultiBody.h:50
int nrJoints() const
Definition MultiBody.h:56
Definition common.h:21
RBDYN_DLLAPI std::vector< std::vector< double > > sVectorToDof(const MultiBody &mb, const Eigen::VectorXd &e)
RBDYN_DLLAPI void checkMatchMotionSubspace(const MultiBody &mb, const MultiBodyConfig &mbc)
RBDYN_DLLAPI void checkMatchQ(const MultiBody &mb, const MultiBodyConfig &mbc)
RBDYN_DLLAPI Eigen::VectorXd sDofToVector(const MultiBody &mb, const std::vector< std::vector< double > > &v)
RBDYN_DLLAPI void checkMatchBodyAcc(const MultiBody &mb, const MultiBodyConfig &mbc)
void checkMatchJointsVector(const MultiBody &mb, const std::vector< T > &vec, const std::string &name)
Definition MultiBodyConfig.h:262
RBDYN_DLLAPI void checkMatchAlphaD(const MultiBody &mb, const MultiBodyConfig &mbc)
RBDYN_DLLAPI void vectorToParam(const Eigen::Ref< const Eigen::VectorXd > &e, std::vector< std::vector< double > > &v)
RBDYN_DLLAPI void checkMatchAlpha(const MultiBody &mb, const MultiBodyConfig &mbc)
RBDYN_DLLAPI void checkMatchForce(const MultiBody &mb, const MultiBodyConfig &mbc)
RBDYN_DLLAPI void checkMatchBodyVel(const MultiBody &mb, const MultiBodyConfig &mbc)
void checkMatchBodiesVector(const MultiBody &mb, const std::vector< T > &vec, const std::string &name)
Definition MultiBodyConfig.h:251
RBDYN_DLLAPI void sVectorToParam(const Eigen::Ref< const Eigen::VectorXd > &e, std::vector< std::vector< double > > &v)
RBDYN_DLLAPI void checkMatchBodyPos(const MultiBody &mb, const MultiBodyConfig &mbc)
RBDYN_DLLAPI void sParamToVector(const std::vector< std::vector< double > > &v, Eigen::Ref< Eigen::VectorXd > e)
RBDYN_DLLAPI Eigen::VectorXd dofToVector(const MultiBody &mb, const std::vector< std::vector< double > > &v)
RBDYN_DLLAPI void checkMatchJointConf(const MultiBody &mb, const MultiBodyConfig &mbc)
RBDYN_DLLAPI void checkMatchParentToSon(const MultiBody &mb, const MultiBodyConfig &mbc)
RBDYN_DLLAPI void checkMatchJointTorque(const MultiBody &mb, const MultiBodyConfig &mbc)
RBDYN_DLLAPI std::vector< std::vector< double > > vectorToDof(const MultiBody &mb, const Eigen::VectorXd &e)
RBDYN_DLLAPI void checkMatchJointVelocity(const MultiBody &mb, const MultiBodyConfig &mbc)
RBDYN_DLLAPI void paramToVector(const std::vector< std::vector< double > > &v, Eigen::Ref< Eigen::VectorXd > e)
Definition MultiBodyConfig.h:24
Eigen::Vector3d gravity
gravity acting on the multibody.
Definition MultiBodyConfig.h:71
void zero(const MultiBody &mb)
Set the multibody at zero configuration.
std::vector< sva::MotionVecd > bodyAccB
Bodies acceleration in Body coordinate.
Definition MultiBodyConfig.h:68
std::vector< sva::MotionVecd > bodyVelW
Bodies speed in world coordinate.
Definition MultiBodyConfig.h:62
std::vector< std::vector< double > > alphaD
Generalized acceleration variable.
Definition MultiBodyConfig.h:38
std::vector< sva::PTransformd > jointConfig
Joints configuration (Xj).
Definition MultiBodyConfig.h:44
MultiBodyConfig()
Definition MultiBodyConfig.h:25
void python_motionSubspace(const std::vector< Eigen::MatrixXd > &v)
std::vector< sva::PTransformd > parentToSon
Transformation from parent(i) to i in body coordinate (Xj*Xt).
Definition MultiBodyConfig.h:59
std::vector< Eigen::Matrix< double, 6, Eigen::Dynamic > > motionSubspace
Motion subspace (Xj.j.subspace).
Definition MultiBodyConfig.h:53
std::vector< sva::PTransformd > bodyPosW
Bodies transformation in world coordinate.
Definition MultiBodyConfig.h:56
std::vector< std::vector< double > > jointTorque
Joints torque.
Definition MultiBodyConfig.h:50
std::vector< sva::MotionVecd > bodyVelB
Bodies speed in Body coordinate.
Definition MultiBodyConfig.h:65
std::vector< std::vector< double > > q
Generalized position variable.
Definition MultiBodyConfig.h:32
MultiBodyConfig(const MultiBody &mb)
std::vector< sva::ForceVecd > force
Total external force acting on each body in world coordinate.
Definition MultiBodyConfig.h:41
std::vector< std::vector< double > > alpha
Generalized speed variable.
Definition MultiBodyConfig.h:35
std::vector< sva::MotionVecd > jointVelocity
Joints velocity (Xj*j.motion()).
Definition MultiBodyConfig.h:47
std::vector< Eigen::MatrixXd > python_motionSubspace()