00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _taoABJoint_h
00024 #define _taoABJoint_h
00025
00026 #include "taoTypes.h"
00027 #include "taoDJoint.h"
00028 #include "deMath.h"
00029
00030 class taoDVar;
00031 class taoVarDOF1;
00032 class taoVarSpherical;
00033
00034 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00035
00042 class taoABJoint
00043 {
00044 public:
00045 taoABJoint(taoDJoint* joint = NULL)
00046 {
00047 _joint = joint;
00048 _C.zero();
00049 _Pa.zero();
00050 _localX.identity();
00051 _L.zero();
00052 }
00053
00054 virtual ~taoABJoint() {}
00055
00056 virtual deVector6& C() { return _C; }
00057 virtual deVector6& Pa() { return _Pa; }
00058 virtual deTransform& localX() { return _localX; }
00059 virtual deMatrix6& L() { return _L; }
00060
00061 virtual void update_localX(const deTransform& home, const deFrame& localFrame) = 0;
00062
00063
00064
00065 virtual void plusEq_SdQ(deVector6& V) = 0;
00066
00067
00068
00069
00070
00071
00072 virtual void plusEq_V_X_SdQ(deVector6& C, const deVector6& V) = 0;
00073
00074
00075
00076
00077 virtual void compute_Dinv_and_SbarT(const deMatrix6& Ia) = 0;
00078 virtual void minusEq_X_SbarT_St(deMatrix6& L, const deTransform& localX) = 0;
00079
00080 virtual void plusEq_X_SbarT_Tau(deVector6& Pah, const deTransform& localX) = 0;
00081
00082
00083 virtual void compute_ddQ(const deVector6& Pa, const deVector6& XAh_C) = 0;
00084 virtual void compute_ddQ_zeroTau(const deVector6& Pa, const deVector6& XAh_C) = 0;
00085
00086
00087 virtual void compute_ddQ_zeroTauPa(const deVector6& XAh_C) = 0;
00088 virtual void compute_Tau(const deVector6& F) = 0;
00089
00090 virtual void plusEq_SddQ(deVector6& A) = 0;
00091
00092 virtual void minusEq_SdQ_damping(deVector6& B, const deMatrix6& Ia) = 0;
00093 virtual void plusEq_S_Dinv_St(deMatrix6& Omega) = 0;
00094
00095
00096
00097 virtual void compute_Jg(const deTransform &globalX) = 0;
00098
00099 virtual void plusEq_Jg_ddQ(deVector6& Ag) = 0;
00100
00101 virtual void add2Tau_JgT_F(const deVector6& Fg) = 0;
00102
00103 virtual void plusEq_S_inertia_ddQ(deVector6& F, const deVector6& A) = 0;
00104
00105 virtual deFloat getDamping() { return _joint->getDamping(); }
00106 virtual deFloat getInertia() { return _joint->getInertia(); }
00107
00108 virtual taoDVar* getDVar() { return _joint->getDVar(); }
00109
00110 virtual void zeroTau() { _joint->zeroTau(); }
00111 virtual void addDQdelta() { _joint->addDQdelta(); }
00112 virtual void addQdelta() { _joint->addQdelta(); }
00113
00114 private:
00115 taoDJoint* _joint;
00116
00117 deVector6 _C;
00118 deVector6 _Pa;
00119 deTransform _localX;
00120 deMatrix6 _L;
00121 };
00122
00123 class taoABJointFixed : public taoABJoint
00124 {
00125 public:
00126 virtual void update_localX(const deTransform& home, const deFrame& localFrame) { localX().set(localFrame); }
00127 virtual void plusEq_SdQ(deVector6& V) {}
00128 virtual void plusEq_V_X_SdQ(deVector6& C, const deVector6& V) {}
00129 virtual void compute_Dinv_and_SbarT(const deMatrix6& Ia) {}
00130 virtual void minusEq_X_SbarT_St(deMatrix6& L, const deTransform& localX) {}
00131 virtual void plusEq_X_SbarT_Tau(deVector6& Pah, const deTransform& localX) {}
00132 virtual void compute_ddQ(const deVector6& Pa, const deVector6& XAh_C) {}
00133 virtual void compute_ddQ_zeroTau(const deVector6& Pa, const deVector6& XAh_C) {}
00134 virtual void compute_ddQ_zeroTauPa(const deVector6& XAh_C) {}
00135 virtual void compute_Tau(const deVector6& F) {}
00136
00137 virtual void plusEq_SddQ(deVector6& A) {}
00138 virtual void minusEq_SdQ_damping(deVector6& B, const deMatrix6& Ia) {}
00139 virtual void plusEq_S_Dinv_St(deMatrix6& Omega) {}
00140
00141 virtual void compute_Jg(const deTransform &globalX) {}
00142 virtual void plusEq_Jg_ddQ(deVector6& Ag) {}
00143 virtual void add2Tau_JgT_F(const deVector6& Fg) {}
00144
00145 virtual void plusEq_S_inertia_ddQ(deVector6& F, const deVector6& A) {}
00146
00147 virtual void zeroTau() {}
00148 virtual void addDQdelta() {}
00149 virtual void addQdelta() {}
00150 };
00151
00152 class taoABJointSpherical : public taoABJoint
00153 {
00154 public:
00155 taoABJointSpherical(taoDJoint* joint) : taoABJoint(joint)
00156 {
00157 _SbarT[0].zero();
00158 _SbarT[1].zero();
00159 _Dinv.zero();
00160 _Jg[0].zero();
00161 _Jg[1].zero();
00162 }
00163 virtual void update_localX(const deTransform& home, const deFrame& localFrame);
00164 virtual void plusEq_SdQ(deVector6& V);
00165 virtual void plusEq_V_X_SdQ(deVector6& C, const deVector6& V);
00166 virtual void compute_Dinv_and_SbarT(const deMatrix6& Ia);
00167 virtual void minusEq_X_SbarT_St(deMatrix6& L, const deTransform& localX);
00168 virtual void plusEq_X_SbarT_Tau(deVector6& Pah, const deTransform& localX);
00169 virtual void compute_ddQ(const deVector6& Pa, const deVector6& XAh_C);
00170 virtual void compute_ddQ_zeroTau(const deVector6& Pa, const deVector6& XAh_C);
00171 virtual void compute_ddQ_zeroTauPa(const deVector6& XAh_C);
00172 virtual void compute_Tau(const deVector6& F);
00173
00174 virtual void plusEq_SddQ(deVector6& A);
00175 virtual void minusEq_SdQ_damping(deVector6& B, const deMatrix6& Ia);
00176 virtual void plusEq_S_Dinv_St(deMatrix6& Omega);
00177
00178 virtual void compute_Jg(const deTransform &globalX);
00179 virtual void plusEq_Jg_ddQ(deVector6& Ag);
00180 virtual void add2Tau_JgT_F(const deVector6& Fg);
00181
00182 virtual void plusEq_S_inertia_ddQ(deVector6& F, const deVector6& A);
00183
00184 virtual taoVarSpherical* getVarSpherical() { return (taoVarSpherical*)getDVar(); }
00185
00186 virtual deMatrix3* Jg() { return _Jg; }
00187
00188 private:
00189 deMatrix3 _SbarT[2];
00190 deMatrix3 _Dinv;
00191 deMatrix3 _Jg[2];
00192 };
00193
00194 class taoABJointDOF1 : public taoABJoint
00195 {
00196 public:
00197 taoABJointDOF1(taoDJoint* joint) : taoABJoint(joint)
00198 {
00199 _S.zero();
00200 _SbarT.zero();
00201 _Dinv = 0;
00202 _Jg.zero();
00203 }
00204 virtual void update_localX(const deTransform& home, const deFrame& localFrame);
00205 virtual void plusEq_SdQ(deVector6& V);
00206 virtual void plusEq_V_X_SdQ(deVector6& C, const deVector6& V);
00207 virtual void compute_Dinv_and_SbarT(const deMatrix6& Ia);
00208 virtual void minusEq_X_SbarT_St(deMatrix6& L, const deTransform& localX);
00209 virtual void plusEq_X_SbarT_Tau(deVector6& Pah, const deTransform& localX);
00210 virtual void compute_ddQ(const deVector6& Pa, const deVector6& XAh_C);
00211 virtual void compute_ddQ_zeroTau(const deVector6& Pa, const deVector6& XAh_C);
00212 virtual void compute_ddQ_zeroTauPa(const deVector6& XAh_C);
00213 virtual void compute_Tau(const deVector6& F);
00214
00215 virtual void plusEq_SddQ(deVector6& A);
00216 virtual void minusEq_SdQ_damping(deVector6& B, const deMatrix6& Ia);
00217 virtual void plusEq_S_Dinv_St(deMatrix6& Omega);
00218
00219 virtual void compute_Jg(const deTransform &globalX);
00220 virtual void plusEq_Jg_ddQ(deVector6& Ag);
00221 virtual void add2Tau_JgT_F(const deVector6& Fg);
00222
00223 virtual void plusEq_S_inertia_ddQ(deVector6& F, const deVector6& A);
00224
00225 virtual taoVarDOF1* getVarDOF1() { return (taoVarDOF1*)getDVar(); }
00226
00227 virtual deVector6& S() { return _S; }
00228
00229 virtual deVector6& Jg() { return _Jg; }
00230
00231 private:
00232 deVector6 _S;
00233 deVector6 _SbarT;
00234 deFloat _Dinv;
00235 deVector6 _Jg;
00236 };
00237
00238 class taoABJointPrismatic : public taoABJointDOF1
00239 {
00240 public:
00241 taoABJointPrismatic(taoAxis axis, taoDJoint* joint) : taoABJointDOF1(joint)
00242 {
00243 deVector6 unit;
00244 unit.zero();
00245 unit[0][axis] = 1;
00246 S() = unit;
00247 }
00248
00249 taoABJointPrismatic(const deVector3& axis, taoDJoint* joint) : taoABJointDOF1(joint)
00250 {
00251 deVector6 unit;
00252 unit.zero();
00253 unit[0] = axis;
00254 unit[0].normalize();
00255 S() = unit;
00256 }
00257 };
00258
00259 class taoABJointRevolute : public taoABJointDOF1
00260 {
00261 public:
00262 taoABJointRevolute(taoAxis axis, taoDJoint* joint) : taoABJointDOF1(joint)
00263 {
00264 deVector6 unit;
00265 unit.zero();
00266 unit[1][axis] = 1;
00267 S() = unit;
00268 }
00269
00270 taoABJointRevolute(const deVector3& axis, taoDJoint* joint) : taoABJointDOF1(joint)
00271 {
00272 deVector6 unit;
00273 unit.zero();
00274 unit[1] = axis;
00275 unit[1].normalize();
00276 S() = unit;
00277 }
00278 };
00279
00280 #endif // DOXYGEN_SHOULD_SKIP_THIS
00281
00282 #endif // _taoABJoint_h
00283