diff --git a/include/sot-dynamic-pinocchio/dynamic-pinocchio.h b/include/sot-dynamic-pinocchio/dynamic-pinocchio.h index 7a11113915d7ae1a4d58408b2e87d09edd044456..4038c6df716b754fef04a04e04a3bf92adfb6b16 100644 --- a/include/sot-dynamic-pinocchio/dynamic-pinocchio.h +++ b/include/sot-dynamic-pinocchio/dynamic-pinocchio.h @@ -138,8 +138,14 @@ class SOTDYNAMIC_EXPORT DynamicPinocchio dg::SignalPtr<dg::Vector,int> freeFlyerAccelerationSIN; dg::SignalTimeDependent<Dummy,int> newtonEulerSINTERN; + dg::SignalTimeDependent<Dummy,int> jacobiansSINTERN; + dg::SignalTimeDependent<Dummy,int> forwardKinematicsSINTERN; + dg::SignalTimeDependent<Dummy,int> ccrbaSINTERN; int& computeNewtonEuler( int& dummy,int time ); + int& computeForwardKinematics( int& dummy,int time ); + int& computeCcrba( int& dummy,int time ); + int& computeJacobians( int& dummy,int time ); dg::SignalTimeDependent<dg::Vector,int> zmpSOUT; dg::SignalTimeDependent<dg::Matrix,int> JcomSOUT; diff --git a/src/sot-dynamic-pinocchio.cpp b/src/sot-dynamic-pinocchio.cpp index aca5f58ca6b7f245ca15cf3738c07a770b7c5530..3d589a432df05b050d3046ade35dbf6dc182f3e5 100644 --- a/src/sot-dynamic-pinocchio.cpp +++ b/src/sot-dynamic-pinocchio.cpp @@ -59,23 +59,33 @@ DynamicPinocchio( const std::string & name) <<jointVelocitySIN<<freeFlyerVelocitySIN <<jointAccelerationSIN<<freeFlyerAccelerationSIN, "sotDynamic("+name+")::intern(dummy)::newtoneuler" ) - + ,jacobiansSINTERN( boost::bind(&DynamicPinocchio::computeJacobians,this,_1, _2), + jointPositionSIN<<freeFlyerPositionSIN, + "sotDynamic("+name+")::intern(dummy)::computeJacobians" ) + ,forwardKinematicsSINTERN( boost::bind(&DynamicPinocchio::computeForwardKinematics,this,_1, _2), + jointPositionSIN<<freeFlyerPositionSIN + <<jointVelocitySIN<<freeFlyerVelocitySIN + <<jointAccelerationSIN<<freeFlyerAccelerationSIN, + "sotDynamic("+name+")::intern(dummy)::computeForwardKinematics" ) + ,ccrbaSINTERN( boost::bind(&DynamicPinocchio::computeCcrba,this,_1,_2), + jointPositionSIN<<freeFlyerPositionSIN + <<jointVelocitySIN<<freeFlyerVelocitySIN, + "sotDynamic("+name+")::intern(dummy)::computeCcrba" ) ,zmpSOUT( boost::bind(&DynamicPinocchio::computeZmp,this,_1,_2), newtonEulerSINTERN, "sotDynamic("+name+")::output(vector)::zmp" ) ,JcomSOUT( boost::bind(&DynamicPinocchio::computeJcom,this,_1,_2), - newtonEulerSINTERN, + jointPositionSIN<<freeFlyerPositionSIN, "sotDynamic("+name+")::output(matrix)::Jcom" ) ,comSOUT( boost::bind(&DynamicPinocchio::computeCom,this,_1,_2), - newtonEulerSINTERN, + forwardKinematicsSINTERN, "sotDynamic("+name+")::output(vector)::com" ) ,inertiaSOUT( boost::bind(&DynamicPinocchio::computeInertia,this,_1,_2), - newtonEulerSINTERN, + jointPositionSIN<<freeFlyerPositionSIN, "sotDynamic("+name+")::output(matrix)::inertia" ) ,footHeightSOUT( boost::bind(&DynamicPinocchio::computeFootHeight,this,_1,_2), - newtonEulerSINTERN, + jointPositionSIN<<freeFlyerPositionSIN, "sotDynamic("+name+")::output(double)::footHeight" ) - ,upperJlSOUT( boost::bind(&DynamicPinocchio::getUpperPositionLimits,this,_1,_2), sotNOSIGNAL, "sotDynamic("+name+")::output(vector)::upperJl" ) @@ -98,10 +108,10 @@ DynamicPinocchio( const std::string & name) inertiaSOUT << gearRatioSOUT << inertiaRotorSOUT, "sotDynamic("+name+")::output(matrix)::inertiaReal" ) ,MomentaSOUT( boost::bind(&DynamicPinocchio::computeMomenta,this,_1,_2), - inertiaSOUT, + ccrbaSINTERN, "sotDynamic("+name+")::output(vector)::momenta" ) ,AngularMomentumSOUT( boost::bind(&DynamicPinocchio::computeAngularMomentum,this,_1,_2), - inertiaSOUT, + ccrbaSINTERN, "sotDynamic("+name+")::output(vector)::angularmomentum" ) ,dynamicDriftSOUT( boost::bind(&DynamicPinocchio::computeTorqueDrift,this,_1,_2), newtonEulerSINTERN, @@ -433,14 +443,14 @@ createJacobianSignal( const std::string& signame, const std::string& jointName ) long int frameId = m_model->getFrameId(jointName); sig = new dg::SignalTimeDependent< dg::Matrix,int > ( boost::bind(&DynamicPinocchio::computeGenericJacobian,this,true,frameId,_1,_2), - newtonEulerSINTERN, + jacobiansSINTERN, "sotDynamic("+name+")::output(matrix)::"+signame ); } else if(m_model->existJointName(jointName)) { long int jointId = m_model->getJointId(jointName); sig = new dg::SignalTimeDependent< dg::Matrix,int > ( boost::bind(&DynamicPinocchio::computeGenericJacobian,this,false,jointId,_1,_2), - newtonEulerSINTERN, + jacobiansSINTERN, "sotDynamic("+name+")::output(matrix)::"+signame ); } else SOT_THROW ExceptionDynamic(ExceptionDynamic::GENERIC, @@ -462,14 +472,14 @@ createEndeffJacobianSignal( const std::string& signame, const std::string& joint long int frameId = m_model->getFrameId(jointName); sig = new dg::SignalTimeDependent< dg::Matrix,int > ( boost::bind(&DynamicPinocchio::computeGenericEndeffJacobian,this,true,frameId,_1,_2), - newtonEulerSINTERN, + jacobiansSINTERN, "sotDynamic("+name+")::output(matrix)::"+signame ); } else if(m_model->existJointName(jointName)) { long int jointId = m_model->getJointId(jointName); sig = new dg::SignalTimeDependent< dg::Matrix,int > ( boost::bind(&DynamicPinocchio::computeGenericEndeffJacobian,this,false,jointId,_1,_2), - newtonEulerSINTERN, + jacobiansSINTERN, "sotDynamic("+name+")::output(matrix)::"+signame ); } else SOT_THROW ExceptionDynamic(ExceptionDynamic::GENERIC, @@ -490,14 +500,14 @@ createPositionSignal( const std::string& signame, const std::string& jointName) long int frameId = m_model->getFrameId(jointName); sig = new dg::SignalTimeDependent< MatrixHomogeneous,int > ( boost::bind(&DynamicPinocchio::computeGenericPosition,this,true,frameId,_1,_2), - newtonEulerSINTERN, + forwardKinematicsSINTERN, "sotDynamic("+name+")::output(matrixHomo)::"+signame ); } else if(m_model->existJointName(jointName)) { long int jointId = m_model->getJointId(jointName); sig = new dg::SignalTimeDependent< MatrixHomogeneous,int > ( boost::bind(&DynamicPinocchio::computeGenericPosition,this,false,jointId,_1,_2), - newtonEulerSINTERN, + forwardKinematicsSINTERN, "sotDynamic("+name+")::output(matrixHomo)::"+signame ); } else SOT_THROW ExceptionDynamic(ExceptionDynamic::GENERIC, @@ -519,7 +529,7 @@ createVelocitySignal( const std::string& signame,const std::string& jointName ) SignalTimeDependent< dg::Vector,int > * sig = new SignalTimeDependent< dg::Vector,int > ( boost::bind(&DynamicPinocchio::computeGenericVelocity,this,jointId,_1,_2), - newtonEulerSINTERN, + forwardKinematicsSINTERN, "sotDynamic("+name+")::output(dg::Vector)::"+signame ); genericSignalRefs.push_back( sig ); signalRegistration( *sig ); @@ -537,7 +547,7 @@ createAccelerationSignal( const std::string& signame, const std::string& jointNa dg::SignalTimeDependent< dg::Vector,int > * sig = new dg::SignalTimeDependent< dg::Vector,int > ( boost::bind(&DynamicPinocchio::computeGenericAcceleration,this,jointId,_1,_2), - newtonEulerSINTERN, + forwardKinematicsSINTERN, "sotDynamic("+name+")::output(matrixHomo)::"+signame ); genericSignalRefs.push_back( sig ); @@ -547,9 +557,6 @@ createAccelerationSignal( const std::string& signame, const std::string& jointNa return *sig; } - - - void DynamicPinocchio:: destroyJacobianSignal( const std::string& signame ) { @@ -680,24 +687,57 @@ dg::Vector& DynamicPinocchio::computeZmp( dg::Vector& res,int time ) } //In world coordinates + + +//Updates the jacobian matrix in m_data +int& DynamicPinocchio::computeJacobians(int& dummy, int time) { + sotDEBUGIN(25); + se3::computeJacobians(*m_model,*m_data, this->getPinocchioPos(time)); + sotDEBUG(25)<<"Jacobians updated"<<std::endl; + sotDEBUGOUT(25); + return dummy; +} + +int& DynamicPinocchio::computeForwardKinematics(int& dummy, int time) { + sotDEBUGIN(25); + se3::forwardKinematics(*m_model, *m_data, + this->getPinocchioPos(time), + this->getPinocchioVel(time), + this->getPinocchioAcc(time)); + sotDEBUG(25)<<"Kinematics updated"<<std::endl; + sotDEBUGOUT(25); + return dummy; +} + +int& DynamicPinocchio::computeCcrba(int& dummy, int time) { + sotDEBUGIN(25); + se3::ccrba(*m_model,*m_data, + this->getPinocchioPos(time), + this->getPinocchioVel(time)); + sotDEBUG(25)<<"Inertia and Momentum updated"<<std::endl; + sotDEBUGOUT(25); + return dummy; +} + dg::Matrix& DynamicPinocchio:: computeGenericJacobian(bool isFrame, int jointId, dg::Matrix& res,int time ) { sotDEBUGIN(25); assert(m_model); assert(m_data); - newtonEulerSINTERN(time); - res.resize(6,m_model->nv); - se3::computeJacobians(*m_model,*m_data,this->getPinocchioPos(time)); + if(res.rows()!=6 && res.cols()!=m_model->nv) + res.resize(6,m_model->nv); + jacobiansSINTERN(time); - se3::Data::Matrix6x m_output = Eigen::MatrixXd::Zero(6,m_model->nv); - //Computes Jacobian in world coordinates. + //TODO: Find a way to remove tmp object + se3::Data::Matrix6x tmp = Eigen::MatrixXd::Zero(6,m_model->nv); + //Computes Jacobian in world coordinates. if(isFrame){ - se3::framesForwardKinematics(*m_model,*m_data); - se3::getFrameJacobian<false>(*m_model,*m_data,(se3::Model::Index)jointId,m_output); + //se3::framesForwardKinematics(*m_model,*m_data); + se3::getFrameJacobian<false>(*m_model,*m_data,(se3::Model::Index)jointId,tmp); } - else se3::getJacobian<false>(*m_model,*m_data,(se3::Model::Index)jointId,m_output); - res = m_output; + else se3::getJacobian<false>(*m_model,*m_data,(se3::Model::Index)jointId,tmp); + res = tmp; sotDEBUGOUT(25); return res; } @@ -708,23 +748,29 @@ computeGenericEndeffJacobian(bool isFrame, int jointId,dg::Matrix& res,int time sotDEBUGIN(25); assert(m_model); assert(m_data); - newtonEulerSINTERN(time); - res.resize(6,m_model->nv); - //In local coordinates. - se3::computeJacobians(*m_model,*m_data,this->getPinocchioPos(time)); - se3::Data::Matrix6x m_output = Eigen::MatrixXd::Zero(6,m_model->nv); - std::string temp; + if(res.rows()!=6 && res.cols()!=m_model->nv) + res.resize(6,m_model->nv); + jacobiansSINTERN(time); + + //TODO: Find a way to remove tmp object + se3::Data::Matrix6x tmp = Eigen::MatrixXd::Zero(6,m_model->nv); + //std::string temp; if(isFrame){ - se3::framesForwardKinematics(*m_model,*m_data); - se3::getFrameJacobian<true>(*m_model,*m_data,(se3::Model::Index)jointId,m_output); - temp = m_model->frames.at((se3::Model::Index)jointId).name; + //se3::framesForwardKinematics(*m_model,*m_data); + se3::getFrameJacobian<true>(*m_model,*m_data,(se3::Model::Index)jointId,tmp); + sotDEBUG(25) << "EndEffJacobian for " + << m_model->frames.at((se3::Model::Index)jointId).name + <<" is "<<tmp<<std::endl; } else { - temp = m_model->getJointName((se3::Model::Index)jointId); - se3::getJacobian<true>(*m_model,*m_data,(se3::Model::Index)jointId,m_output); + //temp = m_model->getJointName((se3::Model::Index)jointId); + se3::getJacobian<true>(*m_model,*m_data,(se3::Model::Index)jointId,tmp); + sotDEBUG(25) << "EndEffJacobian for " + << m_model->getJointName((se3::Model::Index)jointId) + <<" is "<<tmp<<std::endl; } - res = m_output; - sotDEBUG(25) << "EndEffJacobian for "<<temp<<" is "<<m_output<<std::endl; + res = tmp; + sotDEBUGOUT(25); return res; } @@ -734,8 +780,8 @@ computeGenericPosition(bool isFrame, int jointId, MatrixHomogeneous& res, int ti { sotDEBUGIN(25); assert(m_data); - newtonEulerSINTERN(time); std::string temp; + forwardKinematicsSINTERN(time); if(isFrame){ se3::framesForwardKinematics(*m_model,*m_data); res.matrix()= m_data->oMf[jointId].toHomogeneousMatrix(); @@ -755,9 +801,9 @@ computeGenericVelocity( int jointId, dg::Vector& res,int time ) { sotDEBUGIN(25); assert(m_data); - newtonEulerSINTERN(time); res.resize(6); - se3::Motion aRV = m_data->v[jointId]; + forwardKinematicsSINTERN(time); + const se3::Motion& aRV = m_data->v[jointId]; res<<aRV.linear(),aRV.angular(); sotDEBUGOUT(25); return res; @@ -768,9 +814,9 @@ computeGenericAcceleration( int jointId ,dg::Vector& res,int time ) { sotDEBUGIN(25); assert(m_data); - newtonEulerSINTERN(time); res.resize(6); - se3::Motion aRA = m_data->a[jointId]; + forwardKinematicsSINTERN(time); + const se3::Motion& aRA = m_data->a[jointId]; res<<aRA.linear(),aRA.angular(); sotDEBUGOUT(25); return res; @@ -783,10 +829,9 @@ computeNewtonEuler( int& dummy,int time ) assert(m_model); assert(m_data); - - const Eigen::VectorXd q=getPinocchioPos(time); - const Eigen::VectorXd v=getPinocchioVel(time); - const Eigen::VectorXd a=getPinocchioAcc(time); + const Eigen::VectorXd& q=getPinocchioPos(time); + const Eigen::VectorXd& v=getPinocchioVel(time); + const Eigen::VectorXd& a=getPinocchioAcc(time); se3::rnea(*m_model,*m_data,q,v,a); sotDEBUG(1)<< "pos = " <<q <<std::endl; @@ -802,8 +847,7 @@ computeJcom( dg::Matrix& Jcom,int time ) { sotDEBUGIN(25); - newtonEulerSINTERN(time); - const Eigen::VectorXd q=getPinocchioPos(time); + const Eigen::VectorXd& q=getPinocchioPos(time); Jcom = se3::jacobianCenterOfMass(*m_model, *m_data, q, false); @@ -816,9 +860,9 @@ computeCom( dg::Vector& com,int time ) { sotDEBUGIN(25); - newtonEulerSINTERN(time); - const Eigen::VectorXd q=getPinocchioPos(time); - com = se3::centerOfMass(*m_model,*m_data,q,false,true); + const Eigen::VectorXd& q=getPinocchioPos(time); + forwardKinematicsSINTERN(time); + com = se3::centerOfMass(*m_model,*m_data,q,false,false); sotDEBUGOUT(25); return com; } @@ -827,12 +871,10 @@ dg::Matrix& DynamicPinocchio:: computeInertia( dg::Matrix& res,int time ) { sotDEBUGIN(25); - newtonEulerSINTERN(time); - //TODO: USE CCRBA - dg::Matrix upperInertiaMatrix = se3::crba(*m_model, - *m_data,this->getPinocchioPos(time)); - res = upperInertiaMatrix; - res.triangularView<Eigen::StrictlyLower>() = upperInertiaMatrix.transpose().triangularView<Eigen::StrictlyLower>(); + res = se3::crba(*m_model, + *m_data,this->getPinocchioPos(time)); + res.triangularView<Eigen::StrictlyLower>() = + res.transpose().triangularView<Eigen::StrictlyLower>(); sotDEBUGOUT(25); return res; } @@ -860,7 +902,6 @@ computeFootHeight (double &res , int time) //Ankle position in local foot frame //TODO: Confirm that it is in the foot frame sotDEBUGIN(25); - newtonEulerSINTERN(time); if(!m_model->existJointName("r_sole_joint")) { SOT_THROW ExceptionDynamic(ExceptionDynamic::GENERIC, "Robot has no joint corresponding to rigthFoot"); @@ -887,7 +928,7 @@ dg::Vector& DynamicPinocchio:: computeMomenta(dg::Vector & Momenta, int time) { sotDEBUGIN(25); - inertiaSOUT(time); + ccrbaSINTERN(time); if (Momenta.size()!=6) Momenta.resize(6); @@ -901,7 +942,7 @@ dg::Vector& DynamicPinocchio:: computeAngularMomentum(dg::Vector & Momenta, int time) { sotDEBUGIN(25); - inertiaSOUT(time); + ccrbaSINTERN(time); if (Momenta.size()!=3) Momenta.resize(3);