18 #ifndef __se3_aba_hxx__ 19 #define __se3_aba_hxx__ 21 #include "pinocchio/spatial/act-on-set.hpp" 22 #include "pinocchio/multibody/visitor.hpp" 23 #include "pinocchio/algorithm/check.hpp" 31 typedef boost::fusion::vector<
const se3::Model &,
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)
47 const Model::JointIndex & i = jmodel.id();
48 jmodel.calc(jdata.derived(),q,v);
50 const Model::Index & parent = model.
parents[i];
53 data.
v[i] = jdata.v();
55 data.
v[i] += data.
liMi[i].actInv(data.
v[parent]);
57 data.
a[i] = jdata.c() + (data.
v[i] ^ jdata.v());
67 typedef boost::fusion::vector<
const Model &,
72 template<
typename Jo
intModel>
78 const Model::JointIndex & i = jmodel.id();
79 const Model::Index & parent = model.
parents[i];
80 Inertia::Matrix6 & Ia = data.
Yaba[i];
82 jmodel.jointVelocitySelector(data.
u) -= jdata.S().transpose()*data.
f[i];
83 jmodel.calc_aba(jdata.derived(), Ia, parent > 0);
88 pa.
toVector() += Ia * data.
a[i].toVector() + jdata.UDinv() * jmodel.jointVelocitySelector(data.
u);
89 data.
Yaba[parent] += SE3actOn(data.
liMi[i], Ia);
90 data.
f[parent] += data.
liMi[i].act(pa);
118 inline static Inertia::Matrix6 SE3actOn(
const SE3 & M,
const Inertia::Matrix6 & I)
120 typedef Inertia::Matrix6 Matrix6;
121 typedef SE3::Matrix3 Matrix3;
122 typedef SE3::Vector3 Vector3;
123 typedef Eigen::Block<const Matrix6,3,3> constBlock3;
124 typedef Eigen::Block<Matrix6,3,3> Block3;
126 const constBlock3 & Ai = I.block<3,3> (Inertia::LINEAR, Inertia::LINEAR);
127 const constBlock3 & Bi = I.block<3,3> (Inertia::LINEAR, Inertia::ANGULAR);
128 const constBlock3 & Di = I.block<3,3> (Inertia::ANGULAR, Inertia::ANGULAR);
130 const Matrix3 & R = M.rotation();
131 const Vector3 & t = M.translation();
134 Block3 Ao = res.block<3,3> (Inertia::LINEAR, Inertia::LINEAR);
135 Block3 Bo = res.block<3,3> (Inertia::LINEAR, Inertia::ANGULAR);
136 Block3 Co = res.block<3,3> (Inertia::ANGULAR, Inertia::LINEAR);
137 Block3 Do = res.block<3,3> (Inertia::ANGULAR, Inertia::ANGULAR);
140 Ao.noalias() = Do*R.transpose();
143 Bo.noalias() = Do*R.transpose();
146 Do.noalias() = Co*R.transpose();
148 Do.row(0) += t.cross(Bo.col(0));
149 Do.row(1) += t.cross(Bo.col(1));
150 Do.row(2) += t.cross(Bo.col(2));
152 Co.col(0) = t.cross(Ao.col(0));
153 Co.col(1) = t.cross(Ao.col(1));
154 Co.col(2) = t.cross(Ao.col(2));
155 Co += Bo.transpose();
158 Do.col(0) += t.cross(Bo.col(0));
159 Do.col(1) += t.cross(Bo.col(1));
160 Do.col(2) += t.cross(Bo.col(2));
167 typedef boost::fusion::vector<
const se3::Model &,
173 template<
typename Jo
intModel>
176 const se3::Model & model,
179 const Model::JointIndex & i = jmodel.id();
180 const Model::Index & parent = model.
parents[i];
182 data.
a[i] += data.
liMi[i].actInv(data.
a[parent]);
183 jmodel.jointVelocitySelector(data.
ddq).noalias() =
184 jdata.Dinv() * jmodel.jointVelocitySelector(data.
u) - jdata.UDinv().transpose() * data.
a[i].toVector();
186 data.
a[i] += jdata.S() * jmodel.jointVelocitySelector(data.
ddq);
191 inline const Eigen::VectorXd &
194 const Eigen::VectorXd & q,
195 const Eigen::VectorXd & v,
196 const Eigen::VectorXd & tau)
198 assert(model.
check(data) &&
"data is not consistent with model.");
204 for(Model::Index i=1;i<(Model::Index)model.
njoints;++i)
207 AbaForwardStep1::ArgsType(model,data,q,v));
210 for( Model::Index i=(Model::Index)model.
njoints-1;i>0;--i )
213 AbaBackwardStep::ArgsType(model,data));
216 for(Model::Index i=1;i<(Model::Index)model.
njoints;++i)
219 AbaForwardStep2::ArgsType(model,data));
225 inline const Eigen::VectorXd &
228 const Eigen::VectorXd & q,
229 const Eigen::VectorXd & v,
230 const Eigen::VectorXd & tau,
234 assert(model.
check(data) &&
"data is not consistent with model.");
240 for(Model::Index i=1;i<(Model::Index)model.
njoints;++i)
243 AbaForwardStep1::ArgsType(model,data,q,v));
244 data.
f[i] -= fext[i];
247 for( Model::Index i=(Model::Index)model.
njoints-1;i>0;--i )
250 AbaBackwardStep::ArgsType(model,data));
253 for(Model::Index i=1;i<(Model::Index)model.
njoints;++i)
256 AbaForwardStep2::ArgsType(model,data));
264 typedef boost::fusion::vector<
const se3::Model &,
266 const Eigen::VectorXd &
271 template<
typename Jo
intModel>
274 const se3::Model & model,
276 const Eigen::VectorXd & q)
278 const Model::JointIndex & i = jmodel.id();
279 jmodel.calc(jdata.derived(),q);
281 const Model::Index & parent = model.
parents[i];
285 data.
oMi[i] = data.
oMi[parent] * data.
liMi[i];
290 ColsBlock J_cols = jmodel.jointCols(data.
J);
291 J_cols = data.
oMi[i].act(jdata.S());
300 typedef boost::fusion::vector<
const Model &,
305 template<
typename Jo
intModel>
311 const Model::JointIndex & i = jmodel.id();
312 const Model::Index & parent = model.
parents[i];
313 Inertia::Matrix6 & Ia = data.
Yaba[i];
314 Data::RowMatrixXd & Minv = data.
Minv;
318 jmodel.calc_aba(jdata.derived(), Ia, parent > 0);
322 ColsBlock U_cols = jmodel.jointCols(data.
IS);
323 forceSet::se3Action(data.
oMi[i],jdata.U(),U_cols);
325 Minv.block(jmodel.idx_v(),jmodel.idx_v(),jmodel.nv(),jmodel.nv()) = jdata.Dinv();
326 const int nv_children = data.
nvSubtree[i] - jmodel.nv();
329 ColsBlock J_cols = jmodel.jointCols(data.
J);
330 ColsBlock SDinv_cols = jmodel.jointCols(data.
SDinv);
331 SDinv_cols.noalias() = J_cols * jdata.Dinv();
333 Minv.block(jmodel.idx_v(),jmodel.idx_v()+jmodel.nv(),jmodel.nv(),nv_children).noalias()
334 = -SDinv_cols.transpose() * Fcrb.middleCols(jmodel.idx_v()+jmodel.nv(),nv_children);
338 FcrbTmp.leftCols(data.
nvSubtree[i]).noalias()
339 = U_cols * Minv.block(jmodel.idx_v(),jmodel.idx_v(),jmodel.nv(),data.
nvSubtree[i]);
340 Fcrb.middleCols(jmodel.idx_v(),data.
nvSubtree[i]) += FcrbTmp.leftCols(data.
nvSubtree[i]);
345 Fcrb.middleCols(jmodel.idx_v(),data.
nvSubtree[i]).noalias()
346 = U_cols * Minv.block(jmodel.idx_v(),jmodel.idx_v(),jmodel.nv(),data.
nvSubtree[i]);
350 data.
Yaba[parent] += AbaBackwardStep::SE3actOn(data.
liMi[i], Ia);
356 typedef boost::fusion::vector<
const se3::Model &,
362 template<
typename Jo
intModel>
365 const se3::Model & model,
368 const Model::JointIndex & i = jmodel.id();
369 const Model::Index & parent = model.
parents[i];
370 Data::RowMatrixXd & Minv = data.
Minv;
374 ColsBlock UDinv_cols = jmodel.jointCols(data.
UDinv);
375 forceSet::se3Action(data.
oMi[i],jdata.UDinv(),UDinv_cols);
376 ColsBlock J_cols = jmodel.jointCols(data.
J);
380 FcrbTmp.topRows(jmodel.nv()).rightCols(model.
nv - jmodel.idx_v()).noalias()
381 = UDinv_cols.transpose() * data.
Fcrb[parent].rightCols(model.
nv - jmodel.idx_v());
382 Minv.middleRows(jmodel.idx_v(),jmodel.nv()).rightCols(model.
nv - jmodel.idx_v())
383 -= FcrbTmp.topRows(jmodel.nv()).rightCols(model.
nv - jmodel.idx_v());
386 data.
Fcrb[i].rightCols(model.
nv - jmodel.idx_v()).noalias() = J_cols * Minv.middleRows(jmodel.idx_v(),jmodel.nv()).rightCols(model.
nv - jmodel.idx_v());
388 data.
Fcrb[i].rightCols(model.
nv - jmodel.idx_v()) += data.
Fcrb[parent].rightCols(model.
nv - jmodel.idx_v());
393 inline const Data::RowMatrixXd &
396 const Eigen::VectorXd & q)
398 assert(model.
check(data) &&
"data is not consistent with model.");
400 for(Model::Index i=1;i<(Model::Index)model.
njoints;++i)
402 computeMinverseForwardStep1::run(model.
joints[i],data.
joints[i],
403 computeMinverseForwardStep1::ArgsType(model,data,q));
406 data.
Fcrb[0].setZero();
407 for( Model::Index i=(Model::Index)model.
njoints-1;i>0;--i )
409 computeMinverseBackwardStep::run(model.
joints[i],data.
joints[i],
410 computeMinverseBackwardStep::ArgsType(model,data));
413 for(Model::Index i=1;i<(Model::Index)model.
njoints;++i)
415 computeMinverseForwardStep2::run(model.
joints[i],data.
joints[i],
416 computeMinverseForwardStep2::ArgsType(model,data));
429 inline bool ABAChecker::checkModel_impl(
const Model& model )
const 431 for(JointIndex j=1;int(j)<model.
njoints;j++)
432 if( (model.
inertias[j].mass () < 1e-5)
433 || (model.
inertias[j].inertia().data()[0] < 1e-5)
434 || (model.
inertias[j].inertia().data()[3] < 1e-5)
435 || (model.
inertias[j].inertia().data()[5] < 1e-5) )
444 #endif // ifndef __se3_aba_hxx__ container::aligned_vector< Motion > a
Vector of joint accelerations expressed at the centers of the joints.
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)
Eigen::VectorXd u
Intermediate quantity corresponding to apparent torque [ABA].
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef Eigen::Matrix< double, 6, Eigen::Dynamic > Matrix6x
The 6d jacobian type (temporary)
JointModelVector joints
Model of joint i, encapsulated in a JointModelAccessor.
const Eigen::VectorXd & aba(const Model &model, Data &data, const Eigen::VectorXd &q, const Eigen::VectorXd &v, const Eigen::VectorXd &tau)
The Articulated-Body algorithm. It computes the forward dynamics, aka the joint accelerations given t...
Matrix6x J
Jacobian of joint placements.
Eigen::VectorXd ddq
The joint accelerations computed from ABA.
std::vector< JointIndex > parents
Joint parent of joint i, denoted li (li==parents[i]).
Matrix6x UDinv
Used in computeMinverse.
Matrix6x SDinv
Used in computeMinverse.
container::aligned_vector< Inertia::Matrix6 > Yaba
Inertia matrix of the subtree expressed as dense matrix [ABA].
container::aligned_vector< Matrix6x > Fcrb
Spatial forces set, used in CRBA and CCRBA.
Matrix6x IS
Used in computeMinverse.
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.
RowMatrixXd Minv
The inverse of the joint space inertia matrix (a square matrix of dim model.nv).
container::aligned_vector< Force > f
Vector of body forces expressed in the local frame of the joint. For each body, the force represents ...
Specialization of an std::vector with an aligned allocator. This specialization might be used when th...
ToVectorConstReturnType toVector() const
Return the force as an Eigen vector.
container::aligned_vector< Motion > v
Vector of joint velocities expressed at the centers of the joints.
const Data::RowMatrixXd & computeMinverse(const Model &model, Data &data, const Eigen::VectorXd &q)
Computes the inverse of the joint space inertia matrix using Articulated Body formulation.
int njoints
Number of joints.