taoABJoint.h

Go to the documentation of this file.
00001 /* Copyright (c) 2005 Arachi, Inc. and Stanford University.
00002  *
00003  * Permission is hereby granted, free of charge, to any person obtaining
00004  * a copy of this software and associated documentation files (the
00005  * "Software"), to deal in the Software without restriction, including
00006  * without limitation the rights to use, copy, modify, merge, publish,
00007  * distribute, sublicense, and/or sell copies of the Software, and to
00008  * permit persons to whom the Software is furnished to do so, subject
00009  * to the following conditions:
00010  *
00011  * The above copyright notice and this permission notice shall be included
00012  * in all copies or substantial portions of the Software.
00013  *
00014  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00015  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00016  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
00017  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
00018  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
00019  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
00020  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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         // Vi = hXi^T Vh + Si dqi;
00063         // xform = [R 0; dxR R]
00064         // xformT = [ Rt -Rtdx; 0 Rt ]
00065         virtual void plusEq_SdQ(deVector6& V) = 0;
00066         // Ci = Wi X Vi - Xt (Wh X Vh) + Vi X Si dqi
00067         // V X = [v0 ; v1] X = [ v1x , v0x ; 0 , v1x]
00068         // WxV = [ 0 ; v1 ] x [ v0 ; v1 ]
00069         //     = [ v1x , 0 ; 0 , v1x ] [ v0 ; v1 ] = [v1 x v0 ;v1 x v1] = [ v1 x v0 ; 0 ]
00070         //     = [ wxv ; 0 ]
00071         // Xt * WxV = [ Rt -Rtdx; 0 Rt ] [ wxv ; 0 ] = [ Rt WxV ; 0 ]
00072         virtual void plusEq_V_X_SdQ(deVector6& C, const deVector6& V) = 0;
00073         // Dinv = inv(St Ia S)
00074         // SbarT = Ia S Dinv
00075         // hLi = hXi [ 1 - Si Sbari ]^T = hXi [1 - Sbari^T Si^T] = X - X SbarT St
00076         // Lt = [1 - S Sbar] Xt
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         // Pah = Ph - Fexth + sum [ Li (Iai Ci + Pai) + X SbarTi taui ]
00080         virtual void plusEq_X_SbarT_Tau(deVector6& Pah, const deTransform& localX) = 0;
00081         // ddQ = Dinv*(tau - St*Pa) - Sbar*(X Ah + Ci)
00082         // Ai = (hXi^T Ah + Ci) + Si ddqi;
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         // d dQ = Dinv*(- St*Ya) - Sbar*(X dVh)
00086         // dVi = (hXi^T dVh) + Si d dqi;
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         // 0Jn = Jn = iXn^T Si = 0Xi^(-T) Si
00096         // where 0Xi^(-T) = [ R rxR; 0 R ]
00097         virtual void compute_Jg(const deTransform &globalX) = 0;
00098         // Ag += Jg * ddQ
00099         virtual void plusEq_Jg_ddQ(deVector6& Ag) = 0;
00100         // Tau += JgT * F
00101         virtual void add2Tau_JgT_F(const deVector6& Fg) = 0;
00102         // F += S * inertia * A
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 

Generated on Sun Apr 9 22:12:43 2006 for TAO by  doxygen 1.4.6-NO