12 #include <boost/filesystem.hpp> 13 #include <boost/format.hpp> 14 #include <boost/version.hpp> 15 #include <pinocchio/algorithm/center-of-mass.hpp> 16 #include <pinocchio/algorithm/centroidal.hpp> 17 #include <pinocchio/algorithm/crba.hpp> 18 #include <pinocchio/algorithm/jacobian.hpp> 19 #include <pinocchio/algorithm/kinematics.hpp> 20 #include <pinocchio/fwd.hpp> 21 #include <pinocchio/multibody/model.hpp> 22 #include <pinocchio/spatial/motion.hpp> 25 #include "../src/dynamic-command.h" 30 const std::string dg::sot::DynamicPinocchio::CLASS_NAME =
"DynamicPinocchio";
39 NULL,
"sotDynamicPinocchio(" + name +
")::input(vector)::position"),
41 NULL,
"sotDynamicPinocchio(" + name +
")::input(vector)::ffposition"),
43 NULL,
"sotDynamicPinocchio(" + name +
")::input(vector)::velocity"),
45 NULL,
"sotDynamicPinocchio(" + name +
")::input(vector)::ffvelocity"),
46 jointAccelerationSIN(NULL,
"sotDynamicPinocchio(" + name +
47 ")::input(vector)::acceleration"),
48 freeFlyerAccelerationSIN(NULL,
"sotDynamicPinocchio(" + name +
49 ")::input(vector)::ffacceleration")
54 jointPositionSIN << freeFlyerPositionSIN,
55 "sotDynamicPinocchio(" + name +
")::intern(dummy)::pinocchioPos"),
58 jointVelocitySIN << freeFlyerVelocitySIN,
59 "sotDynamicPinocchio(" + name +
")::intern(dummy)::pinocchioVel"),
62 jointAccelerationSIN << freeFlyerAccelerationSIN,
63 "sotDynamicPinocchio(" + name +
")::intern(dummy)::pinocchioAcc")
68 pinocchioPosSINTERN << pinocchioVelSINTERN << pinocchioAccSINTERN,
69 "sotDynamicPinocchio(" + name +
")::intern(dummy)::newtoneuler"),
73 "sotDynamicPinocchio(" + name +
")::intern(dummy)::computeJacobians"),
74 forwardKinematicsSINTERN(
77 pinocchioPosSINTERN << pinocchioVelSINTERN << pinocchioAccSINTERN,
78 "sotDynamicPinocchio(" + name +
79 ")::intern(dummy)::computeForwardKinematics"),
82 pinocchioPosSINTERN << pinocchioVelSINTERN,
83 "sotDynamicPinocchio(" + name +
")::intern(dummy)::computeCcrba"),
86 "sotDynamicPinocchio(" + name +
")::output(vector)::zmp"),
89 "sotDynamicPinocchio(" + name +
")::output(matrix)::Jcom"),
91 forwardKinematicsSINTERN,
92 "sotDynamicPinocchio(" + name +
")::output(vector)::com"),
95 "sotDynamicPinocchio(" + name +
")::output(matrix)::inertia"),
99 "sotDynamicPinocchio(" + name +
")::output(double)::footHeight"),
103 "sotDynamicPinocchio(" + name +
")::output(vector)::upperJl")
109 "sotDynamicPinocchio(" + name +
")::output(vector)::lowerJl")
115 "sotDynamicPinocchio(" + name +
")::output(vector)::upperVl")
121 "sotDynamicPinocchio(" + name +
")::output(vector)::upperTl")
124 inertiaRotorSOUT(
"sotDynamicPinocchio(" + name +
125 ")::output(matrix)::inertiaRotor"),
126 gearRatioSOUT(
"sotDynamicPinocchio(" + name +
127 ")::output(matrix)::gearRatio"),
130 inertiaSOUT << gearRatioSOUT << inertiaRotorSOUT,
131 "sotDynamicPinocchio(" + name +
")::output(matrix)::inertiaReal"),
134 "sotDynamicPinocchio(" + name +
")::output(vector)::momenta"),
138 "sotDynamicPinocchio(" + name +
")::output(vector)::angularmomentum"),
142 "sotDynamicPinocchio(" + name +
")::output(vector)::dynamicDrift") {
177 std::string docstring;
182 " Display the current robot configuration.\n" 190 " Get the dimension of the robot configuration.\n" 193 " an unsigned int: the dimension.\n" 198 using namespace ::dg::command;
203 " Create an operational point attached to a robot joint local " 207 " - a string: name of the operational point,\n" 208 " - a string: name the joint, or among (gaze, left-ankle, right " 210 " , left-wrist, right-wrist, waist, chest).\n" 218 "Create a jacobian (world frame) signal only for one joint.",
219 "string (signal name)",
"string (joint name)");
226 "Create a jacobian (endeff frame) signal only for one joint.",
227 "string (signal name)",
"string (joint name)");
229 "createJacobianEndEff",
235 "Create a jacobian (endeff frame) signal only for one joint. " 236 "The returned jacobian is placed at the joint position, but oriented " 237 "with the world axis.",
238 "string (signal name)",
"string (joint name)");
240 "createJacobianEndEffWorld",
246 "Create a position (matrix homo) signal only for one joint.",
247 "string (signal name)",
"string (joint name)");
254 docCommandVoid2(
"Create a velocity (vector) signal only for one joint.",
255 "string (signal name)",
"string (joint name)");
262 "Create an acceleration (vector) signal only for one joint.",
263 "string (signal name)",
"string (joint name)");
265 "createAcceleration",
270 " Return robot joint names.\n\n";
276 sotDEBUG(10) <<
"Dynamic class_name address" << &CLASS_NAME << std::endl;
326 int fillingIndex = 0;
330 if (*it - fillingIndex > 0) {
331 res.segment(fillingIndex, *it - fillingIndex) =
335 origIndex += *it - fillingIndex;
336 fillingIndex += *it - fillingIndex;
345 res(fillingIndex) = -std::numeric_limits<double>::max();
346 res(fillingIndex + 1) = -std::numeric_limits<double>::max();
347 res(fillingIndex + 2) = -std::numeric_limits<double>::max();
355 res.segment(fillingIndex,
m_model->
nv - fillingIndex) =
361 sotDEBUG(15) <<
"lowerLimit (" << res <<
")=" << std::endl;
373 int fillingIndex = 0;
377 if (*it - fillingIndex > 0) {
378 res.segment(fillingIndex, *it - fillingIndex) =
382 origIndex += *it - fillingIndex;
383 fillingIndex += *it - fillingIndex;
387 res(fillingIndex) = std::numeric_limits<double>::max();
388 res(fillingIndex + 1) = std::numeric_limits<double>::max();
389 res(fillingIndex + 2) = std::numeric_limits<double>::max();
395 res.segment(fillingIndex,
m_model->
nv - fillingIndex) =
401 sotDEBUG(15) <<
"upperLimit (" << res <<
")=" << std::endl;
414 sotDEBUG(15) <<
"upperVelocityLimit (" << res <<
")=" << std::endl;
438 qJoints.head<6>() = qFF;
442 int fillingIndex = 0;
446 if (*it - origIndex > 0) {
447 q.segment(fillingIndex, *it - origIndex) =
448 qJoints.segment(origIndex, *it - origIndex);
449 fillingIndex += *it - origIndex;
450 origIndex += *it - origIndex;
452 assert(*it == origIndex);
453 Eigen::Quaternion<double> temp =
454 Eigen::AngleAxisd(qJoints(origIndex + 2), Eigen::Vector3d::UnitZ()) *
455 Eigen::AngleAxisd(qJoints(origIndex + 1), Eigen::Vector3d::UnitY()) *
456 Eigen::AngleAxisd(qJoints(origIndex), Eigen::Vector3d::UnitX());
457 q(fillingIndex) = temp.x();
458 q(fillingIndex + 1) = temp.y();
459 q(fillingIndex + 2) = temp.z();
460 q(fillingIndex + 3) = temp.w();
464 if (qJoints.size() > origIndex)
465 q.segment(fillingIndex, qJoints.size() - origIndex) =
466 qJoints.tail(qJoints.size() - origIndex);
468 q.resize(qJoints.size());
472 sotDEBUG(15) <<
"Position out" << q << std::endl;
481 if (v.size() != vJoints.size() + vFF.size())
482 v.resize(vJoints.size() + vFF.size());
495 if (a.size() != aJoints.size() + aFF.size())
496 a.resize(aJoints.size() + aFF.size());
508 const std::string& jointName) {
518 "sotDynamicPinocchio(" +
name +
")::output(matrix)::" + signame);
525 "sotDynamicPinocchio(" +
name +
")::output(matrix)::" + signame);
529 "Robot has no joint corresponding to " + jointName);
539 const std::string& jointName,
540 const bool isLocal) {
549 isLocal, frameId, _1, _2),
551 "sotDynamicPinocchio(" +
name +
")::output(matrix)::" + signame);
556 false, isLocal, jointId, _1, _2),
558 "sotDynamicPinocchio(" +
name +
")::output(matrix)::" + signame);
562 "Robot has no joint corresponding to " + jointName);
571 const std::string& jointName) {
581 "sotDynamicPinocchio(" +
name +
")::output(matrixHomo)::" + signame);
588 "sotDynamicPinocchio(" +
name +
")::output(matrixHomo)::" + signame);
592 "Robot has no joint corresponding to " + jointName);
601 const std::string& signame,
const std::string& jointName) {
611 "sotDynamicPinocchio(" +
name +
")::output(dg::Vector)::" + signame);
621 const std::string& jointName) {
630 "sotDynamicPinocchio(" +
name +
")::output(dg::Vector)::" + signame);
642 bool deletable =
false;
646 if ((*iter) == sig) {
656 " (while trying to remove generic jac. signal <%s>).", signame.c_str());
664 bool deletable =
false;
669 if ((*iter) == sig) {
679 " (while trying to remove generic pos. signal <%s>).", signame.c_str());
689 bool deletable =
false;
693 if ((*iter) == sig) {
703 " (while trying to remove generic pos. signal <%s>).", signame.c_str());
713 bool deletable =
false;
717 if ((*iter) == sig) {
726 getName() +
":cannot destroy signal",
727 " (while trying to remove generic acc " 744 if (res.size() != 3) res.resize(3);
748 const pinocchio::Force::Vector3&
tau = ftau.
angular();
749 const pinocchio::Force::Vector3&
f = ftau.
linear();
750 res(0) = -tau[1] / f[2];
751 res(1) = tau[0] / f[2];
766 sotDEBUG(25) <<
"Jacobians updated" << std::endl;
778 sotDEBUG(25) <<
"Kinematics updated" << std::endl;
788 sotDEBUG(25) <<
"Inertia and Momentum updated" << std::endl;
800 if (res.rows() != 6 || res.cols() !=
m_model->
nv)
822 if (res.rows() != 6 || res.cols() !=
m_model->
nv)
829 bool changeFrame = !isLocal;
846 T.rotation() =
m_data->oMf[fid].rotation();
847 T.translation().setZero();
853 M.rotation() =
m_data->oMi[jid].rotation();
854 M.translation().setZero();
874 res.matrix() =
m_data->oMi[id].toHomogeneousMatrix();
878 <<
" with id: " <<
id <<
" position is " << res << std::endl;
916 sotDEBUG(1) <<
"pos = " << q << std::endl;
917 sotDEBUG(1) <<
"vel = " << v << std::endl;
918 sotDEBUG(1) <<
"acc = " << a << std::endl;
947 res.triangularView<Eigen::StrictlyLower>() =
948 res.transpose().triangularView<Eigen::StrictlyLower>();
962 for (
int i = 0;
i < gearRatio.size(); ++
i)
975 "Robot has no joint corresponding to rigthFoot");
978 Eigen::Vector3d anklePosInLocalRefFrame =
m_data->liMi[jointId].translation();
980 res = anklePosInLocalRefFrame(2);
998 if (Momenta.size() != 6) Momenta.resize(6);
1000 Momenta =
m_data->hg.toVector_impl();
1011 if (Momenta.size() != 3) Momenta.resize(3);
1012 Momenta =
m_data->hg.angular_impl();
1022 const std::string&
name) {
1028 }
catch (std::bad_cast e) {
1030 " (while getting signal <%s> of type matrix.",
1041 }
catch (std::bad_cast e) {
1043 " (while getting signal <%s> of type matrixHomo.",
1049 const std::string&
name) {
1055 }
catch (std::bad_cast e) {
1057 " (while getting signal <%s> of type Vector.",
1063 const std::string&
name) {
1069 }
catch (std::bad_cast e) {
1071 " (while getting signal <%s> of type Vector.",
1085 const std::string& jointName) {
1090 const std::string& signalName,
const std::string& jointName) {
1094 const std::string& signalName,
const std::string& jointName) {
1099 const std::string& signalName,
const std::string& jointName) {
1104 const std::string& jointName) {
1108 const std::string& jointName) {
1112 const std::string& signalName,
const std::string& jointName) {
dg::SignalPtr< dg::Vector, int > freeFlyerVelocitySIN
dg::SignalTimeDependent< Dummy, int > jacobiansSINTERN
dg::SignalTimeDependent< Dummy, int > newtonEulerSINTERN
const T & access(const Time &t1)
Eigen::Transform< double, 3, Eigen::Affine > SOT_CORE_EXPORT MatrixHomogeneous
void destroyVelocitySignal(const std::string &signame)
dg::SignalTimeDependent< dg::Matrix, int > JcomSOUT
const DataTpl< Scalar, Options, JointCollectionTpl >::Matrix3x & jacobianCenterOfMass(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q, const bool computeSubtreeComs=true)
const DataTpl< Scalar, Options, JointCollectionTpl >::MatrixXs & crba(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q)
int nq(const LieGroupGenericTpl< LieGroupCollection > &lg)
int & computeJacobians(int &dummy, const int &time)
pinocchio::Model * m_model
dg::Signal< dg::Vector, int > inertiaRotorSOUT
dg::SignalTimeDependent< dg::Vector, int > comSOUT
dg::Matrix & computeInertia(dg::Matrix &res, const int &time)
int idx_v(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
dg::Matrix & computeInertiaReal(dg::Matrix &res, const int &time)
dg::SignalTimeDependent< dg::Matrix, int > & createJacobianSignal(const std::string &signame, const std::string &)
SignalArray< int > sotNOSIGNAL(0)
bool existFrame(const std::string &name, const FrameType &type=(FrameType)(JOINT|FIXED_JOINT|BODY|OP_FRAME|SENSOR)) const
int & computeForwardKinematics(int &dummy, const int &time)
dg::SignalTimeDependent< MatrixHomogeneous, int > & createPositionSignal(const std::string &, const std::string &)
dg::Vector & computeAngularMomentum(dg::Vector &res, const int &time)
void signalRegistration(const SignalArray< int > &signals)
void destroyPositionSignal(const std::string &signame)
dg::SignalPtr< dg::Vector, int > freeFlyerPositionSIN
void destroyAccelerationSignal(const std::string &signame)
#define sotDEBUGOUT(level)
std::vector< std::string > names
void destroyJacobianSignal(const std::string &signame)
std::unique_ptr< pinocchio::Data > m_data
ConfigVectorType lowerPositionLimit
dg::SignalPtr< dg::Vector, int > jointVelocitySIN
void cmd_createJacobianWorldSignal(const std::string &sig, const std::string &j)
dg::SignalTimeDependent< dg::Matrix, int > inertiaSOUT
dg::SignalTimeDependent< dg::Vector, int > MomentaSOUT
dg::Matrix & computeGenericEndeffJacobian(const bool isFrame, const bool isLocal, const int jointId, dg::Matrix &res, const int &time)
This class provides an inverse dynamic model of the robot. More precisely it wraps the newton euler a...
dg::Vector & computeGenericVelocity(const int jointId, dg::Vector &res, const int &time)
dg::SignalTimeDependent< dg::Matrix, int > & createEndeffJacobianSignal(const std::string &signame, const std::string &, const bool isLocal=true)
dg::SignalTimeDependent< dg::Vector, int > pinocchioAccSINTERN
bool existJointName(const std::string &name) const
void getJointJacobian(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const DataTpl< Scalar, Options, JointCollectionTpl > &data, const typename ModelTpl< Scalar, Options, JointCollectionTpl >::JointIndex jointId, const ReferenceFrame rf, const Eigen::MatrixBase< Matrix6Like > &J)
dg::SignalTimeDependent< dg::Vector, int > dynamicDriftSOUT
#define sotDEBUGIN(level)
dynamicgraph::SignalArray_const< double > sig
void cmd_createOpPointSignals(const std::string &sig, const std::string &j)
ConstLinearType linear() const
ConstAngularType angular() const
dg::SignalTimeDependent< Dummy, int > ccrbaSINTERN
virtual ~DynamicPinocchio(void)
void setData(pinocchio::Data *) SOT_DYNAMIC_PINOCCHIO_DEPRECATED
dg::SignalPtr< dg::Vector, int > jointAccelerationSIN
dg::Vector & computeMomenta(dg::Vector &res, const int &time)
void cmd_createJacobianEndEffectorWorldSignal(const std::string &sig, const std::string &j)
dg::SignalTimeDependent< dg::Vector, int > lowerJlSOUT
ConstAngularType angular() const
dg::Vector & getLowerPositionLimits(dg::Vector &res, const int &) const
Get joint position lower limits.
dg::Vector & getPinocchioVel(dg::Vector &v, const int &time)
dg::Vector & getUpperPositionLimits(dg::Vector &res, const int &) const
Get joint position upper limits.
int & computeCcrba(int &dummy, const int &time)
void cmd_createVelocitySignal(const std::string &sig, const std::string &j)
void forwardKinematics(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q)
const DataTpl< Scalar, Options, JointCollectionTpl >::Matrix6x & ccrba(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q, const Eigen::MatrixBase< TangentVectorType > &v)
MatrixHomogeneous & computeGenericPosition(const bool isFrame, const int jointId, MatrixHomogeneous &res, const int &time)
dg::Vector & getUpperVelocityLimits(dg::Vector &res, const int &) const
Get joint velocity upper limits.
dg::Vector & computeGenericAcceleration(const int jointId, dg::Vector &res, const int &time)
dg::Vector & computeTorqueDrift(dg::Vector &res, const int &time)
dg::Signal< dg::Vector, int > gearRatioSOUT
dg::SignalTimeDependent< dg::Matrix, int > & jacobiansSOUT(const std::string &name)
dg::SignalTimeDependent< MatrixHomogeneous, int > & positionsSOUT(const std::string &name)
const DataTpl< Scalar, Options, JointCollectionTpl >::SE3 & updateFramePlacement(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const FrameIndex frame_id)
virtual const T & access(const Time &t)
dg::SignalTimeDependent< dg::Vector, int > & velocitiesSOUT(const std::string &name)
FrameIndex getFrameId(const std::string &name, const FrameType &type=(FrameType)(JOINT|FIXED_JOINT|BODY|OP_FRAME|SENSOR)) const
dg::Vector & getPinocchioAcc(dg::Vector &a, const int &time)
DynamicPinocchio(const std::string &name)
dg::SignalTimeDependent< double, int > footHeightSOUT
dg::SignalTimeDependent< dg::Vector, int > pinocchioVelSINTERN
dg::Vector & getMaxEffortLimits(dg::Vector &res, const int &) const
Get joint effort upper limits.
dg::SignalTimeDependent< dg::Vector, int > AngularMomentumSOUT
std::list< dg::SignalBase< int > * > genericSignalRefs
std::vector< int > sphericalJoints
void setModel(pinocchio::Model *)
ConstLinearType linear() const
int nv(const LieGroupGenericTpl< LieGroupCollection > &lg)
double & computeFootHeight(double &res, const int &time)
dg::SignalTimeDependent< dg::Vector, int > & createVelocitySignal(const std::string &, const std::string &)
TangentVectorType effortLimit
dg::SignalTimeDependent< dg::Vector, int > upperJlSOUT
dg::SignalTimeDependent< dg::Vector, int > upperTlSOUT
JointIndex getJointId(const std::string &name) const
dg::SignalTimeDependent< dg::Vector, int > & createAccelerationSignal(const std::string &, const std::string &)
const DataTpl< Scalar, Options, JointCollectionTpl >::Matrix6x & computeJointJacobians(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q)
dg::SignalTimeDependent< dg::Vector, int > & accelerationsSOUT(const std::string &name)
dg::Vector & computeZmp(dg::Vector &res, const int &time)
const DataTpl< Scalar, Options, JointCollectionTpl >::TangentVectorType & rnea(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q, const Eigen::MatrixBase< TangentVectorType1 > &v, const Eigen::MatrixBase< TangentVectorType2 > &a)
const std::string & getName() const
void cmd_createJacobianEndEffectorSignal(const std::string &sig, const std::string &j)
dg::SignalPtr< dg::Vector, int > freeFlyerAccelerationSIN
dg::SignalTimeDependent< dg::Vector, int > upperVlSOUT
dg::SignalTimeDependent< dg::Vector, int > zmpSOUT
dg::SignalTimeDependent< Dummy, int > forwardKinematicsSINTERN
dg::Vector & getPinocchioPos(dg::Vector &q, const int &time)
map of joints in construction. map: jointName -> (jointType,jointPosition (in parent frame)...
TangentVectorType velocityLimit
std::string docCommandVoid2(const std::string &doc, const std::string &type1, const std::string &type2)
const DataTpl< Scalar, Options, JointCollectionTpl >::Vector3 & centerOfMass(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q, const bool computeSubtreeComs=true)
void cmd_createAccelerationSignal(const std::string &sig, const std::string &j)
dg::Matrix & computeJcom(dg::Matrix &res, const int &time)
ConfigVectorType upperPositionLimit
dg::Matrix & computeGenericJacobian(const bool isFrame, const int jointId, dg::Matrix &res, const int &time)
void cmd_createPositionSignal(const std::string &sig, const std::string &j)
SignalBase< int > & getSignal(const std::string &signalName)
dg::SignalTimeDependent< dg::Matrix, int > inertiaRealSOUT
void signalDeregistration(const std::string &name)
static void se3Action(const SE3Tpl< Scalar, Options > &m, const Eigen::MatrixBase< Mat > &iV, Eigen::MatrixBase< MatRet > const &jV)
void addCommand(const std::string &name, command::Command *command)
dg::SignalTimeDependent< dg::Vector, int > pinocchioPosSINTERN
int & computeNewtonEuler(int &dummy, const int &time)
virtual bool needUpdate(const Time &t) const
CommandVoid2< E, T1, T2 > * makeCommandVoid2(E &entity, boost::function< void(const T1 &, const T2 &)> function, const std::string &docString)
dg::Vector & computeCom(dg::Vector &res, const int &time)
dg::SignalPtr< dg::Vector, int > jointPositionSIN