18 #ifndef __se3_rnea_derivatives_hxx__ 19 #define __se3_rnea_derivatives_hxx__ 21 #include "pinocchio/multibody/visitor.hpp" 22 #include "pinocchio/algorithm/check.hpp" 29 typedef boost::fusion::vector<
const se3::Model &,
31 const Eigen::VectorXd &
36 template<
typename Jo
intModel>
39 const se3::Model & model,
41 const Eigen::VectorXd & q)
43 const Model::JointIndex & i = jmodel.id();
44 const Model::JointIndex & parent = model.
parents[i];
47 jmodel.calc(jdata.derived(),q);
60 ColsBlock J_cols = jmodel.jointCols(data.
J);
61 ColsBlock dAdq_cols = jmodel.jointCols(data.
dAdq);
62 J_cols = data.
oMi[i].act(jdata.S());
63 motionSet::motionAction(oa,J_cols,dAdq_cols);
71 typedef boost::fusion::vector<
const Model &,
78 template<
typename Jo
intModel>
82 Eigen::MatrixXd & gravity_partial_dq)
84 const Model::JointIndex & i = jmodel.id();
85 const Model::JointIndex & parent = model.
parents[i];
86 Data::RowMatrix6 & M6tmpR = data.
M6tmpR;
91 ColsBlock J_cols = jmodel.jointCols(data.
J);
92 ColsBlock dAdq_cols = jmodel.jointCols(data.
dAdq);
93 ColsBlock dFdq_cols = jmodel.jointCols(data.
dFdq);
95 motionSet::inertiaAction(data.
oYcrb[i],dAdq_cols,dFdq_cols);
97 gravity_partial_dq.block(jmodel.idx_v(),jmodel.idx_v(),jmodel.nv(),data.
nvSubtree[i]).noalias()
98 = J_cols.transpose()*data.
dFdq.middleCols(jmodel.idx_v(),data.
nvSubtree[i]);
100 data.
of[i] = data.
oYcrb[i] * oa;
101 motionSet::act<ADDTO>(J_cols,data.
of[i],dFdq_cols);
103 lhsInertiaMult(data.
oYcrb[i],J_cols.transpose(),M6tmpR.topRows(jmodel.nv()));
105 gravity_partial_dq.middleRows(jmodel.idx_v(),jmodel.nv()).col(j).noalias() = M6tmpR.topRows(jmodel.nv()) * data.
dAdq.col(j);
107 jmodel.jointVelocitySelector(data.
g).noalias() = J_cols.transpose()*data.
of[i].toVector();
114 template<
typename Min,
typename Mout>
115 static void lhsInertiaMult(
const Inertia & Y,
116 const Eigen::MatrixBase<Min> & J,
117 const Eigen::MatrixBase<Mout> & F)
119 Mout & F_ =
const_cast<Mout &
>(F.derived());
120 motionSet::inertiaAction(Y,J.derived().transpose(),F_.transpose());
126 const Eigen::VectorXd & q,
127 Eigen::MatrixXd & gravity_partial_dq)
129 assert(q.size() == model.
nq &&
"The configuration vector is not of right size");
130 assert(gravity_partial_dq.cols() == model.
nv);
131 assert(gravity_partial_dq.rows() == model.
nv);
132 assert(model.
check(data) &&
"data is not consistent with model.");
136 for(Model::JointIndex i=1; i<(Model::JointIndex) model.
njoints; ++i)
138 computeGeneralizedGravityDerivativeForwardStep::run(model.
joints[i],data.
joints[i],
139 computeGeneralizedGravityDerivativeForwardStep::ArgsType(model,data,q));
142 for(
size_t i=(
size_t) (model.
njoints-1);i>0;--i)
144 computeGeneralizedGravityDerivativeBackwardStep::run(model.
joints[i],
145 computeGeneralizedGravityDerivativeBackwardStep::ArgsType(model,data,gravity_partial_dq));
151 typedef boost::fusion::vector<
const se3::Model &,
153 const Eigen::VectorXd &,
154 const Eigen::VectorXd &,
155 const Eigen::VectorXd &
160 template<
typename Jo
intModel>
163 const se3::Model & model,
165 const Eigen::VectorXd & q,
166 const Eigen::VectorXd & v,
167 const Eigen::VectorXd & a)
169 const Model::JointIndex & i = jmodel.id();
170 const Model::JointIndex & parent = model.
parents[i];
174 jmodel.calc(jdata.derived(),q,v);
178 data.
v[i] = jdata.v();
182 data.
oMi[i] = data.
oMi[parent] * data.
liMi[i];
183 data.
v[i] += data.
liMi[i].actInv(data.
v[parent]);
188 data.
a[i] = jdata.S() * jmodel.jointVelocitySelector(a) + jdata.c() + (data.
v[i] ^ jdata.v());
191 data.
a[i] += data.
liMi[i].actInv(data.
a[parent]);
195 ov = data.
oMi[i].act(data.
v[i]);
196 oa = data.
oMi[i].act(data.
a[i]) + data.
oa[0];
198 data.
oh[i] = data.
oYcrb[i] * ov;
199 data.
of[i] = data.
oYcrb[i] * oa + ov.cross(data.
oh[i]);
202 ColsBlock J_cols = jmodel.jointCols(data.
J);
203 ColsBlock dJ_cols = jmodel.jointCols(data.
dJ);
204 ColsBlock dVdq_cols = jmodel.jointCols(data.
dVdq);
205 ColsBlock dAdq_cols = jmodel.jointCols(data.
dAdq);
206 ColsBlock dAdv_cols = jmodel.jointCols(data.
dAdv);
208 J_cols = data.
oMi[i].act(jdata.S());
209 motionSet::motionAction(ov,J_cols,dJ_cols);
210 motionSet::motionAction(data.
oa[parent],J_cols,dAdq_cols);
214 motionSet::motionAction(data.
ov[parent],J_cols,dVdq_cols);
215 motionSet::motionAction<ADDTO>(data.
ov[parent],dVdq_cols,dAdq_cols);
216 dAdv_cols += dVdq_cols;
224 addForceCrossMatrix(data.
oh[i],data.
doYcrb[i]);
227 template<
typename ForceDerived,
typename M6>
230 M6 & mout_ =
const_cast<Eigen::MatrixBase<M6> &
>(mout).derived();
231 typedef Eigen::Matrix<typename M6::Scalar,3,3,EIGEN_PLAIN_TYPE(M6)::Options> M3;
233 mout_.template block<3,3>(Force::LINEAR,Force::ANGULAR) -= fx;
234 mout_.template block<3,3>(Force::ANGULAR,Force::LINEAR) -= fx;
235 mout_.template block<3,3>(Force::ANGULAR,Force::ANGULAR) -=
skew(f.
angular());
242 typedef boost::fusion::vector<
const Model &,
251 template<
typename Jo
intModel>
255 Eigen::MatrixXd & rnea_partial_dq,
256 Eigen::MatrixXd & rnea_partial_dv,
257 Eigen::MatrixXd & rnea_partial_da)
259 const Model::JointIndex & i = jmodel.id();
260 const Model::JointIndex & parent = model.
parents[i];
261 Data::RowMatrix6 & M6tmpR = data.
M6tmpR;
265 ColsBlock J_cols = jmodel.jointCols(data.
J);
266 ColsBlock dVdq_cols = jmodel.jointCols(data.
dVdq);
267 ColsBlock dAdq_cols = jmodel.jointCols(data.
dAdq);
268 ColsBlock dAdv_cols = jmodel.jointCols(data.
dAdv);
269 ColsBlock dFdq_cols = jmodel.jointCols(data.
dFdq);
270 ColsBlock dFdv_cols = jmodel.jointCols(data.
dFdv);
271 ColsBlock dFda_cols = jmodel.jointCols(data.
dFda);
274 jmodel.jointVelocitySelector(data.
tau).noalias() = J_cols.transpose()*data.
of[i].toVector();
277 motionSet::inertiaAction(data.
oYcrb[i],J_cols,dFda_cols);
278 rnea_partial_da.block(jmodel.idx_v(),jmodel.idx_v(),jmodel.nv(),data.
nvSubtree[i]).noalias()
279 = J_cols.transpose()*data.
dFda.middleCols(jmodel.idx_v(),data.
nvSubtree[i]);
282 motionSet::inertiaAction(data.
oYcrb[i],dAdv_cols,dFdv_cols);
283 dFdv_cols += data.
doYcrb[i] * J_cols;
285 rnea_partial_dv.block(jmodel.idx_v(),jmodel.idx_v(),jmodel.nv(),data.
nvSubtree[i]).noalias()
286 = J_cols.transpose()*data.
dFdv.middleCols(jmodel.idx_v(),data.
nvSubtree[i]);
289 motionSet::inertiaAction(data.
oYcrb[i],dAdq_cols,dFdq_cols);
291 dFdq_cols += data.
doYcrb[i] * dVdq_cols;
293 rnea_partial_dq.block(jmodel.idx_v(),jmodel.idx_v(),jmodel.nv(),data.
nvSubtree[i]).noalias()
294 = J_cols.transpose()*data.
dFdq.middleCols(jmodel.idx_v(),data.
nvSubtree[i]);
296 motionSet::act<ADDTO>(J_cols,data.
of[i],dFdq_cols);
300 lhsInertiaMult(data.
oYcrb[i],J_cols.transpose(),M6tmpR.topRows(jmodel.nv()));
302 rnea_partial_dq.middleRows(jmodel.idx_v(),jmodel.nv()).col(j).noalias() = M6tmpR.topRows(jmodel.nv()) * data.
dAdq.col(j);
304 rnea_partial_dv.middleRows(jmodel.idx_v(),jmodel.nv()).col(j).noalias() = M6tmpR.topRows(jmodel.nv()) * data.
dAdv.col(j);
306 M6tmpR.topRows(jmodel.nv()).noalias() = J_cols.transpose() * data.
doYcrb[i];
308 rnea_partial_dq.middleRows(jmodel.idx_v(),jmodel.nv()).col(j) += M6tmpR.topRows(jmodel.nv()) * data.
dVdq.col(j);
310 rnea_partial_dv.middleRows(jmodel.idx_v(),jmodel.nv()).col(j) += M6tmpR.topRows(jmodel.nv()) * data.
J.col(j);
317 data.
of[parent] += data.
of[i];
321 template<
typename Min,
typename Mout>
322 static void lhsInertiaMult(
const Inertia & Y,
323 const Eigen::MatrixBase<Min> & J,
324 const Eigen::MatrixBase<Mout> & F)
326 Mout & F_ =
const_cast<Mout &
>(F.derived());
327 motionSet::inertiaAction(Y,J.derived().transpose(),F_.transpose());
333 const Eigen::VectorXd & q,
334 const Eigen::VectorXd & v,
335 const Eigen::VectorXd & a,
336 Eigen::MatrixXd & rnea_partial_dq,
337 Eigen::MatrixXd & rnea_partial_dv,
338 Eigen::MatrixXd & rnea_partial_da)
340 assert(q.size() == model.
nq &&
"The joint configuration vector is not of right size");
341 assert(v.size() == model.
nv &&
"The joint velocity vector is not of right size");
342 assert(a.size() == model.
nv &&
"The joint acceleration vector is not of right size");
343 assert(rnea_partial_dq.cols() == model.
nv);
344 assert(rnea_partial_dq.rows() == model.
nv);
345 assert(rnea_partial_dv.cols() == model.
nv);
346 assert(rnea_partial_dv.rows() == model.
nv);
347 assert(rnea_partial_da.cols() == model.
nv);
348 assert(rnea_partial_da.rows() == model.
nv);
349 assert(model.
check(data) &&
"data is not consistent with model.");
353 for(Model::JointIndex i=1; i<(Model::JointIndex) model.
njoints; ++i)
355 computeRNEADerivativesForwardStep::run(model.
joints[i],data.
joints[i],
356 computeRNEADerivativesForwardStep::ArgsType(model,data,q,v,a));
359 for(
size_t i=(
size_t) (model.
njoints-1);i>0;--i)
361 computeRNEADerivativesBackwardStep::run(model.
joints[i],
362 computeRNEADerivativesBackwardStep::ArgsType(model,data,rnea_partial_dq,rnea_partial_dv,rnea_partial_da));
369 #endif // ifndef __se3_rnea_derivatives_hxx__ Eigen::VectorXd tau
Vector of joint torques (dim model.nv).
container::aligned_vector< Force > oh
Vector of spatial momenta expressed in the world frame.
container::aligned_vector< Motion > a
Vector of joint accelerations expressed at the centers of the joints.
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)
container::aligned_vector< Inertia > oYcrb
Inertia quantities expressed in the world frame.
Eigen::VectorXd g
Vector of generalized gravity (dim model.nv).
Matrix6x dAdq
Variation of the spatial acceleration set with respect to the joint configuration.
JointModelVector joints
Model of joint i, encapsulated in a JointModelAccessor.
ConstAngularType angular() const
Return the angular part of the force vector.
void skew(const Eigen::MatrixBase< Vector3 > &v, const Eigen::MatrixBase< Matrix3 > &M)
Computes the skew representation of a given 3d vector, i.e. the antisymmetric matrix representation o...
Matrix6x J
Jacobian of joint placements.
container::aligned_vector< Motion > oa
Vector of joint accelerations expressed at the origin.
container::aligned_vector< Inertia::Matrix6 > doYcrb
Time variation of the inertia quantities expressed in the world frame.
Matrix6x dVdq
Variation of the spatial velocity set with respect to the joint configuration.
Matrix6x dFdv
Variation of the forceset with respect to the joint velocity.
void computeGeneralizedGravityDerivatives(const Model &model, Data &data, const Eigen::VectorXd &q, Eigen::MatrixXd &gravity_partial_dq)
Computes the derivative of the generalized gravity contribution with respect to the joint configurati...
ConstLinearType linear() const
Return the linear part of the force vector.
container::aligned_vector< Force > of
Vector of body forces expressed in the world frame. For each body, the force represents the sum of al...
std::vector< JointIndex > parents
Joint parent of joint i, denoted li (li==parents[i]).
Matrix6x dAdv
Variation of the spatial acceleration set with respect to the joint velocity.
Matrix6x dFdq
Variation of the forceset with respect to the joint configuration.
container::aligned_vector< Motion > ov
Vector of joint velocities expressed at the origin.
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.
RowMatrix6 M6tmpR
Temporary for derivative algorithms.
std::vector< int > parents_fromRow
First previous non-zero row in M (used in Cholesky Decomposition).
container::aligned_vector< Motion > v
Vector of joint velocities expressed at the centers of the joints.
int njoints
Number of joints.
Matrix6x dFda
Variation of the forceset with respect to the joint acceleration.
void computeRNEADerivatives(const Model &model, Data &data, const Eigen::VectorXd &q, const Eigen::VectorXd &v, const Eigen::VectorXd &a, Eigen::MatrixXd &rnea_partial_dq, Eigen::MatrixXd &rnea_partial_dv, Eigen::MatrixXd &rnea_partial_da)
Computes the derivatives of the Recursive Newton Euler Algorithms with respect to the joint configura...