18 #ifndef __se3_jacobian_hxx__ 19 #define __se3_jacobian_hxx__ 21 #include "pinocchio/multibody/visitor.hpp" 22 #include "pinocchio/algorithm/check.hpp" 30 typedef boost::fusion::vector <
const se3::Model &,
32 const Eigen::VectorXd &
37 template<
typename Jo
intModel>
40 const se3::Model & model,
42 const Eigen::VectorXd & q)
44 const Model::JointIndex & i = (Model::JointIndex) jmodel.id();
45 const Model::JointIndex & parent = model.
parents[i];
47 jmodel.calc(jdata.derived(),q);
50 if(parent>0) data.
oMi[i] = data.
oMi[parent]*data.
liMi[i];
51 else data.
oMi[i] = data.
liMi[i];
53 jmodel.jointCols(data.
J) = data.
oMi[i].act(jdata.S());
60 const Eigen::VectorXd & q)
62 assert(model.
check(data) &&
"data is not consistent with model.");
64 for( Model::JointIndex i=1; i< (Model::JointIndex) model.
njoints;++i )
66 JointJacobiansForwardStep::run(model.
joints[i],data.
joints[i],
67 JointJacobiansForwardStep::ArgsType(model,data,q));
75 typedef boost::fusion::vector<se3::Data &> ArgsType;
79 template<
typename Jo
intModel>
84 const Model::JointIndex & i = (Model::JointIndex) jmodel.id();
86 jmodel.jointCols(data.
J) = data.
oMi[i].act(jdata.S());
94 assert(model.
check(data) &&
"data is not consistent with model.");
96 for( Model::JointIndex i=1; i< (Model::JointIndex) model.
njoints;++i )
98 JointJacobiansForwardStep2::run(model.
joints[i],data.
joints[i],
99 JointJacobiansForwardStep2::ArgsType(data));
108 template<ReferenceFrame rf>
111 const Model::JointIndex jointId,
114 assert( J.rows() == data.
J.rows() );
115 assert( J.cols() == data.
J.cols() );
116 assert(model.
check(data) &&
"data is not consistent with model.");
118 const SE3 & oMjoint = data.
oMi[jointId];
122 if(rf == WORLD) J.col(j) = data.
J.col(j);
123 else J.col(j) = oMjoint.actInv(
Motion(data.
J.col(j))).toVector();
130 typedef boost::fusion::vector<
const se3::Model &,
132 const Eigen::VectorXd &,
138 template<
typename Jo
intModel>
141 const se3::Model & model,
143 const Eigen::VectorXd & q,
146 const Model::JointIndex & i = (Model::JointIndex) jmodel.id();
147 const Model::JointIndex & parent = model.
parents[i];
149 jmodel.calc(jdata.derived(),q);
154 jmodel.jointCols(J) = data.
iMf[i].inverse().act(jdata.S());
160 const Eigen::VectorXd & q,
161 const Model::JointIndex jointId,
164 assert(model.
check(data) &&
"data is not consistent with model.");
166 data.
iMf[jointId].setIdentity();
167 for( Model::JointIndex i=jointId;i>0;i=model.
parents[i] )
169 JointJacobianForwardStep::run(model.
joints[i],data.
joints[i],
170 JointJacobianForwardStep::ArgsType(model,data,q,J));
176 typedef boost::fusion::vector <
const se3::Model &,
178 const Eigen::VectorXd &,
179 const Eigen::VectorXd &
184 template<
typename Jo
intModel>
187 const se3::Model & model,
189 const Eigen::VectorXd & q,
190 const Eigen::VectorXd & v)
192 const Model::JointIndex & i = (Model::JointIndex) jmodel.id();
193 const Model::JointIndex & parent = model.
parents[i];
198 jmodel.calc(jdata.derived(),q,v);
205 oMi = data.
oMi[parent]*data.
liMi[i];
206 vJ += data.
liMi[i].actInv(data.
v[parent]);
213 jmodel.jointCols(data.
J) = oMi.
act(jdata.S());
216 data.
ov[i] = oMi.
act(vJ);
219 ColsBlock dJcols = jmodel.jointCols(data.
dJ);
220 ColsBlock Jcols = jmodel.jointCols(data.
J);
222 motionSet::motionAction(data.
ov[i],Jcols,dJcols);
230 const Eigen::VectorXd & q,
231 const Eigen::VectorXd & v)
233 assert(model.
check(data) &&
"data is not consistent with model.");
235 for(Model::JointIndex i=1; i< (Model::JointIndex) model.
njoints;++i)
237 JointJacobiansTimeVariationForwardStep::run(model.
joints[i],data.
joints[i],
238 JointJacobiansTimeVariationForwardStep::ArgsType(model,data,q,v));
244 template<ReferenceFrame rf>
247 const Model::JointIndex jointId,
250 assert( dJ.rows() == data.
dJ.rows() );
251 assert( dJ.cols() == data.
dJ.cols() );
252 assert(model.
check(data) &&
"data is not consistent with model.");
254 const SE3 & oMjoint = data.
oMi[jointId];
258 if(rf == WORLD) dJ.col(j) = data.
dJ.col(j);
259 else dJ.col(j) = oMjoint.actInv(
Motion(data.
dJ.col(j))).toVector();
268 #endif // ifndef __se3_jacobian_hxx__
void getJointJacobianTimeVariation(const Model &model, const Data &data, const Model::JointIndex jointId, Data::Matrix6x &dJ)
Computes the Jacobian time variation of a specific joint frame expressed either in the world frame (r...
container::aligned_vector< SE3 > jointPlacements
Placement (SE3) of the input of joint i regarding to the parent joint output li.
container::aligned_vector< SE3 > iMf
Vector of joint placements wrt to algorithm end effector.
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.
Matrix6x J
Jacobian of joint placements.
std::vector< JointIndex > parents
Joint parent of joint i, denoted li (li==parents[i]).
int nv(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointNvVisitor to get the dimension of the joint tangent space...
container::aligned_vector< Motion > ov
Vector of joint velocities expressed at the origin.
const Data::Matrix6x & computeJointJacobiansTimeVariation(const Model &model, Data &data, const Eigen::VectorXd &q, const Eigen::VectorXd &v)
Computes the full model Jacobian variations with respect to time. It corresponds to dJ/dt which depen...
Matrix6x dJ
Derivative of the Jacobian with respect to the time.
JointDataVector joints
Vector of se3::JointData associated to the se3::JointModel stored in model, encapsulated in JointData...
void getJointJacobian(const Model &model, const Data &data, const Model::JointIndex jointId, Data::Matrix6x &J)
Computes the Jacobian of a specific joint frame expressed either in the world (rf = WORLD) frame or i...
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).
int idx_v(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointIdxVVisitor to get the index in the full model tangent space c...
bool check(const AlgorithmCheckerBase< D > &checker=AlgorithmCheckerBase< D >()) const
internal::SE3GroupAction< D >::ReturnType act(const D &d) const
ay = aXb.act(by)
void jointJacobian(const Model &model, Data &data, const Eigen::VectorXd &q, const Model::JointIndex jointId, Data::Matrix6x &J)
Computes the Jacobian of a specific joint frame expressed in the local frame of the joint and store t...
std::vector< int > parents_fromRow
First previous non-zero row in M (used in Cholesky Decomposition).
const Data::Matrix6x & computeJointJacobians(const Model &model, Data &data, const Eigen::VectorXd &q)
Computes the full model Jacobian, i.e. the stack of all motion subspace expressed in the world frame...
container::aligned_vector< Motion > v
Vector of joint velocities expressed at the centers of the joints.
int njoints
Number of joints.