18 #ifndef __se3_rnea_hxx__ 19 #define __se3_rnea_hxx__ 23 #include "pinocchio/multibody/visitor.hpp" 24 #include "pinocchio/algorithm/check.hpp" 30 typedef boost::fusion::vector<
const se3::Model &,
32 const Eigen::VectorXd &,
33 const Eigen::VectorXd &,
34 const Eigen::VectorXd &
39 template<
typename Jo
intModel>
42 const se3::Model & model,
44 const Eigen::VectorXd & q,
45 const Eigen::VectorXd & v,
46 const Eigen::VectorXd & a)
48 const Model::JointIndex & i = jmodel.id();
49 const Model::JointIndex & parent = model.
parents[i];
51 jmodel.calc(jdata.derived(),q,v);
55 data.
v[i] = jdata.v();
56 if(parent>0) data.
v[i] += data.
liMi[i].actInv(data.
v[parent]);
58 data.
a_gf[i] = jdata.S()*jmodel.jointVelocitySelector(a) + jdata.c() + (data.
v[i] ^ jdata.v()) ;
68 typedef boost::fusion::vector<
const Model &,
74 template<
typename Jo
intModel>
80 const Model::JointIndex & i = jmodel.id();
81 const Model::JointIndex & parent = model.
parents[i];
83 jmodel.jointVelocitySelector(data.
tau) = jdata.S().transpose()*data.
f[i];
84 if(parent>0) data.
f[parent] += data.
liMi[i].act(data.
f[i]);
88 inline const Eigen::VectorXd&
90 const Eigen::VectorXd & q,
91 const Eigen::VectorXd & v,
92 const Eigen::VectorXd & a)
94 assert(model.
check(data) &&
"data is not consistent with model.");
99 for( Model::JointIndex i=1;i<(Model::JointIndex)model.
njoints;++i )
102 RneaForwardStep::ArgsType(model,data,q,v,a));
105 for( Model::JointIndex i=(Model::JointIndex)model.
njoints-1;i>0;--i )
108 RneaBackwardStep::ArgsType(model,data));
114 inline const Eigen::VectorXd &
116 const Eigen::VectorXd & q,
117 const Eigen::VectorXd & v,
118 const Eigen::VectorXd & a,
121 assert(fext.size() == model.
joints.size());
122 assert(model.
check(data) &&
"data is not consistent with model.");
127 for( Model::JointIndex i=1;i<(Model::JointIndex)model.
njoints;++i )
130 RneaForwardStep::ArgsType(model,data,q,v,a));
131 data.
f[i] -= fext[i];
134 for( Model::JointIndex i=(Model::JointIndex)model.
njoints-1;i>0;--i )
137 RneaBackwardStep::ArgsType(model,data));
145 typedef boost::fusion::vector<
const se3::Model &,
147 const Eigen::VectorXd &,
148 const Eigen::VectorXd &
153 template<
typename Jo
intModel>
156 const se3::Model & model,
158 const Eigen::VectorXd & q,
159 const Eigen::VectorXd & v)
161 const Model::JointIndex & i = jmodel.id();
162 const Model::JointIndex & parent = model.
parents[i];
164 jmodel.calc(jdata.derived(),q,v);
168 data.
v[i] = jdata.v();
169 if(parent>0) data.
v[i] += data.
liMi[i].actInv(data.
v[parent]);
171 data.
a_gf[i] = jdata.c() + (data.
v[i] ^ jdata.v());
181 typedef boost::fusion::vector<
const Model &,
187 template<
typename Jo
intModel>
193 const Model::JointIndex & i = jmodel.id();
194 const Model::JointIndex & parent = model.
parents[i];
196 jmodel.jointVelocitySelector(data.
nle) = jdata.S().transpose()*data.
f[i];
197 if(parent>0) data.
f[parent] += data.
liMi[i].act(data.
f[i]);
201 inline const Eigen::VectorXd &
203 const Eigen::VectorXd & q,
204 const Eigen::VectorXd & v)
206 assert(model.
check(data) &&
"data is not consistent with model.");
208 data.
v[0].setZero ();
211 for(
size_t i=1;i<(size_t) model.
njoints;++i )
214 NLEForwardStep::ArgsType(model,data,q,v));
217 for(
size_t i=(
size_t) (model.
njoints-1);i>0;--i )
220 NLEBackwardStep::ArgsType(model,data));
228 typedef boost::fusion::vector<
const se3::Model &,
230 const Eigen::VectorXd &
235 template<
typename Jo
intModel>
238 const se3::Model & model,
240 const Eigen::VectorXd & q)
242 const Model::JointIndex & i = jmodel.id();
243 const Model::JointIndex & parent = model.
parents[i];
245 jmodel.calc(jdata.derived(),q);
249 data.
a_gf[i] = data.
liMi[i].actInv(data.
a_gf[(
size_t) parent]);
257 typedef boost::fusion::vector<
const Model &,
263 template<
typename Jo
intModel>
269 const Model::JointIndex & i = jmodel.id();
270 const Model::JointIndex & parent = model.
parents[i];
272 jmodel.jointVelocitySelector(data.
g) = jdata.S().transpose()*data.
f[i];
273 if(parent>0) data.
f[(size_t) parent] += data.
liMi[i].act(data.
f[i]);
277 inline const Eigen::VectorXd &
279 const Eigen::VectorXd & q)
281 assert(model.
check(data) &&
"data is not consistent with model.");
285 for(
size_t i=1;i<(size_t) model.
njoints;++i)
287 computeGeneralizedGravityForwardStep::run(model.
joints[i],data.
joints[i],
288 computeGeneralizedGravityForwardStep::ArgsType(model,data,q));
291 for(
size_t i=(
size_t) (model.
njoints-1);i>0;--i)
293 computeGeneralizedGravityBackwardStep::run(model.
joints[i],data.
joints[i],
294 computeGeneralizedGravityBackwardStep::ArgsType(model,data));
302 typedef boost::fusion::vector<
const se3::Model &,
304 const Eigen::VectorXd &,
305 const Eigen::VectorXd &
310 template<
typename Jo
intModel>
313 const se3::Model & model,
315 const Eigen::VectorXd & q,
316 const Eigen::VectorXd & v)
318 const Model::JointIndex & i = jmodel.id();
319 const Model::JointIndex & parent = model.
parents[i];
321 jmodel.calc(jdata.derived(),q,v);
324 if(parent>0) data.
oMi[i] = data.
oMi[parent] * data.
liMi[i];
325 else data.
oMi[i] = data.
liMi[i];
330 data.
v[i] = jdata.v();
331 if(parent>0) data.
v[i] += data.
liMi[i].actInv(data.
v[parent]);
332 data.
ov[i] = data.
oMi[i].act(data.
v[i]);
336 ColsBlock Jcols = jmodel.jointCols(data.
J);
337 Jcols = data.
oMi[i].act(jdata.S());
340 ColsBlock dJcols = jmodel.jointCols(data.
dJ);
341 motionSet::motionAction(data.
ov[i],Jcols,dJcols);
351 typedef boost::fusion::vector<
const Model &,
357 template<
typename Jo
intModel>
362 const Model::JointIndex & i = jmodel.id();
363 const Model::JointIndex & parent = model.
parents[i];
364 Data::RowMatrix6 & M6tmpR = data.
M6tmpR;
367 ColsBlock dJcols = jmodel.jointCols(data.
dJ);
368 ColsBlock Jcols = jmodel.jointCols(data.
J);
370 motionSet::inertiaAction(data.
oYcrb[i],dJcols,jmodel.jointCols(data.
dFdv));
371 jmodel.jointCols(data.
dFdv) += data.
vxI[i] * Jcols;
373 data.
C.block(jmodel.idx_v(),jmodel.idx_v(),jmodel.nv(),data.
nvSubtree[i]).noalias()
374 = Jcols.transpose()*data.
dFdv.middleCols(jmodel.idx_v(),data.
nvSubtree[i]);
376 lhsInertiaMult(data.
oYcrb[i],Jcols.transpose(),M6tmpR.topRows(jmodel.nv()));
378 data.
C.middleRows(jmodel.idx_v(),jmodel.nv()).col(j).noalias() = M6tmpR.topRows(jmodel.nv()) * data.
dJ.col(j);
380 M6tmpR.topRows(jmodel.nv()).noalias() = Jcols.transpose() * data.
vxI[i];
382 data.
C.middleRows(jmodel.idx_v(),jmodel.nv()).col(j) += M6tmpR.topRows(jmodel.nv()) * data.
J.col(j);
387 data.
vxI[parent] += data.
vxI[i];
392 template<
typename Min,
typename Mout>
393 static void lhsInertiaMult(
const Inertia & Y,
394 const Eigen::MatrixBase<Min> & J,
395 const Eigen::MatrixBase<Mout> & F)
397 Mout & F_ =
const_cast<Mout &
>(F.derived());
398 motionSet::inertiaAction(Y,J.derived().transpose(),F_.transpose());
402 inline const Eigen::MatrixXd &
404 const Eigen::VectorXd & q,
405 const Eigen::VectorXd & v)
407 assert(model.
check(data) &&
"data is not consistent with model.");
408 assert(q.size() == model.
nq);
409 assert(v.size() == model.
nv);
411 for(
size_t i=1;i<(size_t) model.
njoints;++i)
413 CoriolisMatrixForwardStep::run(model.
joints[i],data.
joints[i],
414 CoriolisMatrixForwardStep::ArgsType(model,data,q,v));
417 for(
size_t i=(
size_t) (model.
njoints-1);i>0;--i)
419 CoriolisMatrixBackwardStep::run(model.
joints[i],
420 CoriolisMatrixBackwardStep::ArgsType(model,data));
430 #endif // ifndef __se3_rnea_hxx__ Eigen::VectorXd tau
Vector of joint torques (dim model.nv).
int nq
Dimension of the configuration vector representation.
int nv
Dimension of the velocity vector space.
container::aligned_vector< SE3 > jointPlacements
Placement (SE3) of the input of joint i regarding to the parent joint output li.
std::vector< int > nvSubtree
Dimension of the subtree motion space (for CRBA)
static void vxi(const Motion &v, const InertiaTpl< double, _Options > &I, const Eigen::MatrixBase< M6 > &Iout)
Time variation operator. It computes the time derivative of an inertia I corresponding to the formula...
container::aligned_vector< Inertia > oYcrb
Inertia quantities expressed in the world frame.
const Eigen::VectorXd & rnea(const Model &model, Data &data, const Eigen::VectorXd &q, const Eigen::VectorXd &v, const Eigen::VectorXd &a)
The Recursive Newton-Euler algorithm. It computes the inverse dynamics, aka the joint torques accordi...
Eigen::VectorXd g
Vector of generalized gravity (dim model.nv).
JointModelVector joints
Model of joint i, encapsulated in a JointModelAccessor.
container::aligned_vector< Inertia::Matrix6 > vxI
Right variation of the inertia matrix.
Matrix6x J
Jacobian of joint placements.
Matrix6x dFdv
Variation of the forceset with respect to the joint velocity.
std::vector< JointIndex > parents
Joint parent of joint i, denoted li (li==parents[i]).
const Eigen::VectorXd & nonLinearEffects(const Model &model, Data &data, const Eigen::VectorXd &q, const Eigen::VectorXd &v)
Computes the non-linear effects (Corriolis, centrifual and gravitationnal effects), also called the bias terms of the Lagrangian dynamics:
container::aligned_vector< Motion > ov
Vector of joint velocities expressed at the origin.
Eigen::VectorXd nle
Vector of Non Linear Effects (dim model.nv). It corresponds to concatenation of the Coriolis...
Matrix6x dJ
Derivative of the Jacobian with respect to the time.
container::aligned_vector< Motion > a_gf
Vector of joint accelerations due to the gravity field.
JointDataVector joints
Vector of se3::JointData associated to the se3::JointModel stored in model, encapsulated in JointData...
Motion gravity
Spatial gravity of the model.
container::aligned_vector< SE3 > liMi
Vector of relative joint placements (wrt the body parent).
container::aligned_vector< SE3 > oMi
Vector of absolute joint placements (wrt the world).
bool check(const AlgorithmCheckerBase< D > &checker=AlgorithmCheckerBase< D >()) const
container::aligned_vector< Inertia > inertias
Spatial inertias of the body i expressed in the supporting joint frame i.
container::aligned_vector< Force > f
Vector of body forces expressed in the local frame of the joint. For each body, the force represents ...
const Eigen::MatrixXd & computeCoriolisMatrix(const Model &model, Data &data, const Eigen::VectorXd &q, const Eigen::VectorXd &v)
Computes the Coriolis Matrix of the Lagrangian dynamics:
RowMatrix6 M6tmpR
Temporary for derivative algorithms.
std::vector< int > parents_fromRow
First previous non-zero row in M (used in Cholesky Decomposition).
Specialization of an std::vector with an aligned allocator. This specialization might be used when th...
container::aligned_vector< Motion > v
Vector of joint velocities expressed at the centers of the joints.
int njoints
Number of joints.
const Eigen::VectorXd & computeGeneralizedGravity(const Model &model, Data &data, const Eigen::VectorXd &q)
Computes the generalized gravity contribution of the Lagrangian dynamics:
Eigen::MatrixXd C
The Coriolis matrix (a square matrix of dim model.nv).