00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00029 #ifndef JOINT_H
00030
00031 #include <list>
00032 #include <vector>
00033
00034 #include "mytools.h"
00035 #include "matvec3D.h"
00036
00037 class KinematicChain;
00038 class DynJoint;
00039 class Robot;
00040 class Matrix;
00041
00042 class SoTransform;
00043 class TiXmlElement;
00044
00045 enum JointT {REVOLUTE,PRISMATIC};
00046
00048
00058 class DHTransform {
00059
00061 vec3 dtrans;
00062
00064 vec3 atrans;
00065
00067 transf tr4TimesTr3;
00068
00070 transf tr2;
00071
00073 transf tr1;
00074
00076 transf tran;
00077
00079 double theta;
00080
00082 double d;
00083
00085 double a;
00086
00088 double alpha;
00089
00091 void computeTran();
00092
00093 public:
00094 DHTransform(double thval=0.0,double dval=0.0,double aval=0.0,
00095 double alval=0.0);
00096 DHTransform( const DHTransform *d ){
00097 memcpy( this, d, sizeof(DHTransform));
00098 }
00099
00101 double getD() const {return d;}
00102
00104 double getTheta() const {return theta;}
00105
00107 double getA() const {return a;}
00108
00110 void setD(double q);
00111
00113 void setTheta(double q);
00114
00116 void setA(double q){a=q; computeTran();}
00117
00119 const transf& getTran() const {return tran;}
00120
00126 transf getTran(double thetaVal,double dVal) const
00127 {
00128 return tr4TimesTr3 * translate_transf(vec3(0,0,dVal)) *
00129 rotate_transf(thetaVal,vec3(0,0,1));
00130 }
00131
00132 };
00133
00135
00145 class Joint {
00146 protected:
00148 int DOFnum;
00149
00151 KinematicChain *owner;
00152
00154 int jointNum;
00155
00157 bool draggerAttached;
00158
00160 double dynamicsVal;
00161
00163 double velocity;
00164
00166 double minVal,maxVal;
00167
00169 double mCouplingRatio;
00170
00172 double c;
00173
00175 double f1;
00176
00178 double f0;
00179
00182 double mK;
00183
00185 double mRestVal;
00186
00188 vec3 worldAxis;
00189
00191 DHTransform *DH;
00192
00194 SoTransform *IVTran;
00195
00196 public:
00198 DynJoint *dynJoint;
00199
00202 Joint(KinematicChain *k) : DOFnum(0), owner(k), jointNum(-1), draggerAttached(false), dynamicsVal(0.0),
00203 velocity(0.0),minVal(0.0),maxVal(0.0),mCouplingRatio(1.0),c(0.0),f1(0.0),f0(0.0),mK(0.0),
00204 mRestVal(0.0), DH(NULL),
00205 IVTran(NULL), dynJoint(NULL) {IVTran = new SoTransform(); IVTran->ref();}
00206
00207 virtual ~Joint();
00208
00212 virtual int initJointFromXml(const TiXmlElement* root, int jnum) =0;
00213
00215 void cloneFrom(const Joint *original);
00216
00218 virtual int setVal(double q)=0;
00219
00221 void setMin(double min) {minVal = min;}
00222
00224 void setMax(double max) {maxVal = max;}
00225
00227 virtual void applyInternalWrench(double magnitude)=0;
00228
00230 virtual void applyPassiveInternalWrenches();
00231
00233 void setVelocity(double v) {velocity = v;}
00234
00236 void setDynamicsVal(double v) {dynamicsVal = v;}
00237
00240 void setWorldAxis(const vec3 &wa) {worldAxis = normalise(wa);}
00241
00243 void setDraggerAttached(bool b) {draggerAttached = b;}
00244
00246 void setSpringStiffness(double k) {mK = k;}
00247
00249 void setRestValue(double r){mRestVal = r;}
00250
00251
00252
00254 int getNum() const {return jointNum;}
00255
00257 int getChainNum() const;
00258
00260 virtual double getVal() const =0;
00261
00263 double getDisplacement() const {return getVal() - mRestVal;}
00264
00266 virtual JointT getType() const =0;
00267
00270 virtual transf getTran(double jointVal) const =0;
00271
00274 virtual transf getDynamicsTran() const =0;
00275
00277 int getDOFNum() const {return DOFnum;}
00278
00280 double getCouplingRatio() const {return mCouplingRatio;}
00281
00283 double getSpringStiffness() {return mK;}
00284
00286 double getOffset() const {return c;}
00287
00289 double getMin() const {return minVal;}
00290
00292 double getMax() const {return maxVal;}
00293
00295 double getVelocity() const {return velocity;}
00296
00300 double getFriction() const {
00301 return -f1 * velocity + (velocity<0 ? f0 : (velocity>0 ? -f0 : 0.0));
00302 }
00303
00307 double getSpringForce() const;
00308
00311 double getDynamicsVal() const {return dynamicsVal;}
00312
00314 transf const& getTran() const {return DH->getTran();}
00315
00317 vec3 const& getWorldAxis() const {return worldAxis;}
00318
00320 DHTransform *getDH() {return DH;}
00321
00324 SoTransform *getIVTran() const {return IVTran;}
00325
00327 static Matrix jacobian(const Joint *joint, const transf &jointTran,
00328 const transf &toTarget, bool worldCoords);
00329 };
00330
00331
00333
00336 class PrismaticJoint : public Joint {
00337
00338 public:
00339
00341 PrismaticJoint(KinematicChain *k) : Joint(k) {}
00342
00343 virtual int initJointFromXml(const TiXmlElement* root, int jnum);
00344
00345 virtual void applyInternalWrench(double magnitude);
00346
00347 virtual int setVal(double q);
00348
00350 virtual double getVal() const {return DH->getD() - c;}
00351
00353 virtual JointT getType() const {return PRISMATIC;}
00354
00355 transf getTran(double jointVal) const {
00356 return DH->getTran(DH->getTheta(),jointVal + c);
00357 }
00358
00359 transf getDynamicsTran() const {
00360 return DH->getTran(DH->getTheta(),dynamicsVal);
00361 }
00362
00363 };
00364
00366
00369 class RevoluteJoint : public Joint {
00370
00371 public:
00372
00374 RevoluteJoint(KinematicChain *k) : Joint(k) {}
00375
00376 virtual int initJointFromXml(const TiXmlElement* root, int jnum);
00377
00379 virtual double getVal() const {return DH->getTheta() - c;}
00380
00381 virtual void applyInternalWrench(double magnitude);
00382
00383 virtual int setVal(double q);
00384
00386 virtual JointT getType() const {return REVOLUTE;}
00387
00388
00389 transf getTran(double jointVal) const {
00390 return DH->getTran(jointVal + c,DH->getD());
00391 }
00392 transf getDynamicsTran() const {
00393 return DH->getTran(dynamicsVal,DH->getD());
00394 }
00395
00396 };
00397
00398 #define JOINT_H
00399 #endif