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.