Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "chaindynparam.hpp"
00023 #include "frames_io.hpp"
00024 #include <iostream>
00025
00026 namespace KDL {
00027
00028 ChainDynParam::ChainDynParam(const Chain& _chain, Vector _grav):
00029 chain(_chain),
00030 nr(0),
00031 nj(chain.getNrOfJoints()),
00032 ns(chain.getNrOfSegments()),
00033 grav(_grav),
00034 jntarraynull(nj),
00035 chainidsolver_coriolis( chain, Vector::Zero()),
00036 chainidsolver_gravity( chain, grav),
00037 wrenchnull(ns,Wrench::Zero()),
00038 X(ns),
00039 S(ns),
00040 Ic(ns)
00041 {
00042 ag=-Twist(grav,Vector::Zero());
00043 }
00044
00045 void ChainDynParam::updateInternalDataStructures() {
00046 nj = chain.getNrOfJoints();
00047 ns = chain.getNrOfSegments();
00048 jntarraynull.resize(nj);
00049 chainidsolver_coriolis.updateInternalDataStructures();
00050 chainidsolver_gravity.updateInternalDataStructures();
00051 wrenchnull.resize(ns,Wrench::Zero());
00052 X.resize(ns);
00053 S.resize(ns);
00054 Ic.resize(ns);
00055 }
00056
00057
00058
00059 int ChainDynParam::JntToMass(const JntArray &q, JntSpaceInertiaMatrix& H)
00060 {
00061 if(nj != chain.getNrOfJoints() || ns != chain.getNrOfSegments())
00062 return (error = E_NOT_UP_TO_DATE);
00063
00064 if(q.rows()!=nj || H.rows()!=nj || H.columns()!=nj )
00065 return (error = E_SIZE_MISMATCH);
00066 unsigned int k=0;
00067 double q_;
00068
00069
00070 for(unsigned int i=0;i<ns;i++)
00071 {
00072
00073 Ic[i]=chain.getSegment(i).getInertia();
00074 if(chain.getSegment(i).getJoint().getType()!=Joint::None)
00075 {
00076 q_=q(k);
00077 k++;
00078 }
00079 else
00080 {
00081 q_=0.0;
00082 }
00083 X[i]=chain.getSegment(i).pose(q_);
00084 S[i]=X[i].M.Inverse(chain.getSegment(i).twist(q_,1.0));
00085 }
00086
00087 int j,l;
00088 k=nj-1;
00089 for(int i=ns-1;i>=0;i--)
00090 {
00091
00092 if(i!=0)
00093 {
00094
00095 Ic[i-1]=Ic[i-1]+X[i]*Ic[i];
00096 }
00097
00098 F=Ic[i]*S[i];
00099 if(chain.getSegment(i).getJoint().getType()!=Joint::None)
00100 {
00101 H(k,k)=dot(S[i],F);
00102 H(k,k)+=chain.getSegment(i).getJoint().getInertia();
00103 j=k;
00104 l=i;
00105 while(l!=0)
00106 {
00107
00108 F=X[l]*F;
00109 l--;
00110
00111 if(chain.getSegment(l).getJoint().getType()!=Joint::None)
00112 {
00113 j--;
00114 H(k,j)=dot(F,S[l]);
00115 H(j,k)=H(k,j);
00116 }
00117 }
00118 k--;
00119 }
00120
00121 }
00122 return (error = E_NOERROR);
00123 }
00124
00125
00126 int ChainDynParam::JntToCoriolis(const JntArray &q, const JntArray &q_dot, JntArray &coriolis)
00127 {
00128
00129 SetToZero(jntarraynull);
00130
00131
00132
00133 return chainidsolver_coriolis.CartToJnt(q, q_dot, jntarraynull, wrenchnull, coriolis);
00134
00135 }
00136
00137
00138 int ChainDynParam::JntToGravity(const JntArray &q,JntArray &gravity)
00139 {
00140
00141
00142
00143 SetToZero(jntarraynull);
00144
00145 return chainidsolver_gravity.CartToJnt(q, jntarraynull, jntarraynull, wrenchnull, gravity);
00146 }
00147
00148 ChainDynParam::~ChainDynParam()
00149 {
00150 }
00151
00152
00153 }