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 
20 namespace rbd
21 {
22 
23 struct RBDYN_DLLAPI MultiBodyConfig
24 {
26  MultiBodyConfig(const MultiBody & mb);
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 
83 class RBDYN_DLLAPI ConfigConverter
84 {
85 public:
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 
118 private:
119  std::vector<int> jInd_;
120  std::vector<int> bInd_;
121 };
122 
128 RBDYN_DLLAPI void paramToVector(const std::vector<std::vector<double>> & v, Eigen::Ref<Eigen::VectorXd> e);
129 
134 RBDYN_DLLAPI void sParamToVector(const std::vector<std::vector<double>> & v, Eigen::Ref<Eigen::VectorXd> e);
135 
142 RBDYN_DLLAPI Eigen::VectorXd paramToVector(const MultiBody & mb, const std::vector<std::vector<double>> & v);
143 
148 RBDYN_DLLAPI Eigen::VectorXd sParamToVector(const MultiBody & mb, const std::vector<std::vector<double>> & v);
149 
156 RBDYN_DLLAPI Eigen::VectorXd dofToVector(const MultiBody & mb, const std::vector<std::vector<double>> & v);
157 
162 RBDYN_DLLAPI Eigen::VectorXd sDofToVector(const MultiBody & mb, const std::vector<std::vector<double>> & v);
163 
169 RBDYN_DLLAPI void vectorToParam(const Eigen::Ref<const Eigen::VectorXd> & e, std::vector<std::vector<double>> & v);
170 
175 RBDYN_DLLAPI void sVectorToParam(const Eigen::Ref<const Eigen::VectorXd> & e, std::vector<std::vector<double>> & v);
176 
183 RBDYN_DLLAPI std::vector<std::vector<double>> vectorToParam(const MultiBody & mb, const Eigen::VectorXd & e);
184 
189 RBDYN_DLLAPI std::vector<std::vector<double>> sVectorToParam(const MultiBody & mb, const Eigen::VectorXd & e);
190 
197 RBDYN_DLLAPI std::vector<std::vector<double>> vectorToDof(const MultiBody & mb, const Eigen::VectorXd & e);
198 
203 RBDYN_DLLAPI std::vector<std::vector<double>> sVectorToDof(const MultiBody & mb, const Eigen::VectorXd & e);
204 
206 template<typename T>
207 void checkMatchBodiesVector(const MultiBody & mb, const std::vector<T> & vec, const std::string & name);
208 
210 template<typename T>
211 void checkMatchJointsVector(const MultiBody & mb, const std::vector<T> & vec, const std::string & name);
212 
214 RBDYN_DLLAPI void checkMatchBodyPos(const MultiBody & mb, const MultiBodyConfig & mbc);
215 
217 RBDYN_DLLAPI void checkMatchParentToSon(const MultiBody & mb, const MultiBodyConfig & mbc);
218 
221 RBDYN_DLLAPI void checkMatchBodyVel(const MultiBody & mb, const MultiBodyConfig & mbc);
222 
224 RBDYN_DLLAPI void checkMatchBodyAcc(const MultiBody & mb, const MultiBodyConfig & mbc);
225 
227 RBDYN_DLLAPI void checkMatchJointConf(const MultiBody & mb, const MultiBodyConfig & mbc);
228 
230 RBDYN_DLLAPI void checkMatchJointVelocity(const MultiBody & mb, const MultiBodyConfig & mbc);
231 
233 RBDYN_DLLAPI void checkMatchJointTorque(const MultiBody & mb, const MultiBodyConfig & mbc);
234 
236 RBDYN_DLLAPI void checkMatchMotionSubspace(const MultiBody & mb, const MultiBodyConfig & mbc);
237 
239 RBDYN_DLLAPI void checkMatchQ(const MultiBody & mb, const MultiBodyConfig & mbc);
240 
242 RBDYN_DLLAPI void checkMatchAlpha(const MultiBody & mb, const MultiBodyConfig & mbc);
243 
245 RBDYN_DLLAPI void checkMatchAlphaD(const MultiBody & mb, const MultiBodyConfig & mbc);
246 
248 RBDYN_DLLAPI void checkMatchForce(const MultiBody & mb, const MultiBodyConfig & mbc);
249 
250 template<typename T>
251 void 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 
261 template<typename T>
262 void 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 
272 template<typename T>
273 inline 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 
281 template<typename T>
282 inline 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 
292 template<typename T>
293 inline 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
rbd::MultiBodyConfig::force
std::vector< sva::ForceVecd > force
Total external force acting on each body in world coordinate.
Definition: MultiBodyConfig.h:41
rbd::MultiBodyConfig::motionSubspace
std::vector< Eigen::Matrix< double, 6, Eigen::Dynamic > > motionSubspace
Motion subspace (Xj.j.subspace).
Definition: MultiBodyConfig.h:53
rbd::checkMatchJointsVector
void checkMatchJointsVector(const MultiBody &mb, const std::vector< T > &vec, const std::string &name)
Definition: MultiBodyConfig.h:262
rbd::ConfigConverter
Definition: MultiBodyConfig.h:83
rbd::sParamToVector
RBDYN_DLLAPI void sParamToVector(const std::vector< std::vector< double >> &v, Eigen::Ref< Eigen::VectorXd > e)
rbd::checkMatchAlphaD
RBDYN_DLLAPI void checkMatchAlphaD(const MultiBody &mb, const MultiBodyConfig &mbc)
rbd::checkMatchBodyVel
RBDYN_DLLAPI void checkMatchBodyVel(const MultiBody &mb, const MultiBodyConfig &mbc)
rbd::MultiBodyConfig::jointConfig
std::vector< sva::PTransformd > jointConfig
Joints configuration (Xj).
Definition: MultiBodyConfig.h:44
rbd::MultiBodyConfig::parentToSon
std::vector< sva::PTransformd > parentToSon
Transformation from parent(i) to i in body coordinate (Xj*Xt).
Definition: MultiBodyConfig.h:59
rbd::ConfigConverter::convertJoint
void convertJoint(const std::vector< T > &from, std::vector< T > &to) const
Definition: MultiBodyConfig.h:273
rbd::checkMatchMotionSubspace
RBDYN_DLLAPI void checkMatchMotionSubspace(const MultiBody &mb, const MultiBodyConfig &mbc)
rbd::sDofToVector
RBDYN_DLLAPI Eigen::VectorXd sDofToVector(const MultiBody &mb, const std::vector< std::vector< double >> &v)
rbd::sVectorToDof
RBDYN_DLLAPI std::vector< std::vector< double > > sVectorToDof(const MultiBody &mb, const Eigen::VectorXd &e)
rbd::MultiBody::nrBodies
int nrBodies() const
Definition: MultiBody.h:50
rbd::dofToVector
RBDYN_DLLAPI Eigen::VectorXd dofToVector(const MultiBody &mb, const std::vector< std::vector< double >> &v)
rbd::MultiBody
Definition: MultiBody.h:29
rbd::vectorToDof
RBDYN_DLLAPI std::vector< std::vector< double > > vectorToDof(const MultiBody &mb, const Eigen::VectorXd &e)
rbd::MultiBodyConfig::gravity
Eigen::Vector3d gravity
gravity acting on the multibody.
Definition: MultiBodyConfig.h:71
rbd::MultiBodyConfig::bodyVelB
std::vector< sva::MotionVecd > bodyVelB
Bodies speed in Body coordinate.
Definition: MultiBodyConfig.h:65
rbd::checkMatchJointConf
RBDYN_DLLAPI void checkMatchJointConf(const MultiBody &mb, const MultiBodyConfig &mbc)
rbd::checkMatchAlpha
RBDYN_DLLAPI void checkMatchAlpha(const MultiBody &mb, const MultiBodyConfig &mbc)
rbd::MultiBodyConfig::alphaD
std::vector< std::vector< double > > alphaD
Generalized acceleration variable.
Definition: MultiBodyConfig.h:38
rbd::MultiBodyConfig::jointTorque
std::vector< std::vector< double > > jointTorque
Joints torque.
Definition: MultiBodyConfig.h:50
rbd::ConfigConverter::sConvertJoint
void sConvertJoint(const std::vector< T > &from, std::vector< T > &to) const
Definition: MultiBodyConfig.h:282
rbd::MultiBody::nrJoints
int nrJoints() const
Definition: MultiBody.h:56
rbd::MultiBodyConfig::bodyPosW
std::vector< sva::PTransformd > bodyPosW
Bodies transformation in world coordinate.
Definition: MultiBodyConfig.h:56
rbd::MultiBodyConfig::jointVelocity
std::vector< sva::MotionVecd > jointVelocity
Joints velocity (Xj*j.motion()).
Definition: MultiBodyConfig.h:47
rbd
Definition: common.h:20
rbd::checkMatchQ
RBDYN_DLLAPI void checkMatchQ(const MultiBody &mb, const MultiBodyConfig &mbc)
rbd::checkMatchParentToSon
RBDYN_DLLAPI void checkMatchParentToSon(const MultiBody &mb, const MultiBodyConfig &mbc)
rbd::MultiBodyConfig::MultiBodyConfig
MultiBodyConfig()
Definition: MultiBodyConfig.h:25
rbd::sVectorToParam
RBDYN_DLLAPI void sVectorToParam(const Eigen::Ref< const Eigen::VectorXd > &e, std::vector< std::vector< double >> &v)
rbd::MultiBodyConfig
Definition: MultiBodyConfig.h:23
MultiBody.h
rbd::checkMatchJointTorque
RBDYN_DLLAPI void checkMatchJointTorque(const MultiBody &mb, const MultiBodyConfig &mbc)
rbd::MultiBodyConfig::alpha
std::vector< std::vector< double > > alpha
Generalized speed variable.
Definition: MultiBodyConfig.h:35
rbd::MultiBodyConfig::bodyAccB
std::vector< sva::MotionVecd > bodyAccB
Bodies acceleration in Body coordinate.
Definition: MultiBodyConfig.h:68
rbd::vectorToParam
RBDYN_DLLAPI void vectorToParam(const Eigen::Ref< const Eigen::VectorXd > &e, std::vector< std::vector< double >> &v)
rbd::MultiBodyConfig::q
std::vector< std::vector< double > > q
Generalized position variable.
Definition: MultiBodyConfig.h:32
rbd::checkMatchForce
RBDYN_DLLAPI void checkMatchForce(const MultiBody &mb, const MultiBodyConfig &mbc)
rbd::MultiBodyConfig::bodyVelW
std::vector< sva::MotionVecd > bodyVelW
Bodies speed in world coordinate.
Definition: MultiBodyConfig.h:62
rbd::checkMatchBodyAcc
RBDYN_DLLAPI void checkMatchBodyAcc(const MultiBody &mb, const MultiBodyConfig &mbc)
rbd::paramToVector
RBDYN_DLLAPI void paramToVector(const std::vector< std::vector< double >> &v, Eigen::Ref< Eigen::VectorXd > e)
rbd::checkMatchBodiesVector
void checkMatchBodiesVector(const MultiBody &mb, const std::vector< T > &vec, const std::string &name)
Definition: MultiBodyConfig.h:251
rbd::checkMatchBodyPos
RBDYN_DLLAPI void checkMatchBodyPos(const MultiBody &mb, const MultiBodyConfig &mbc)
rbd::checkMatchJointVelocity
RBDYN_DLLAPI void checkMatchJointVelocity(const MultiBody &mb, const MultiBodyConfig &mbc)