00001 #ifndef _taoControlJt_h 00002 #define _taoControlJt_h 00003 00004 #include "taoTypes.h" 00005 #include "taoJoint.h" 00006 #include "taoControl.h" 00007 #include "deMath.h" 00008 00009 class taoJoint; 00010 class taoDNode; 00011 class taoNodeRoot; 00012 00020 class taoJCParam 00021 { 00022 friend class taoControlJt; 00023 public: 00024 taoJCParam(taoJoint* joint) 00025 { 00026 _joint = joint; 00027 _controlOn = 1; 00028 _useGlobalGains = 1; 00029 _goalVelocityAuto = 0; 00030 _jtLimitSoftOn = 0; 00031 _jlU = 0; 00032 _jlL = 0; 00033 _kpU = 0; 00034 _kvU = 0; 00035 _kpL = 0; 00036 _kvL = 0; 00037 _kp = 0; 00038 _kv = 0; 00039 reset(-1); 00040 } 00041 00042 taoDVar* getDVar() { return _joint->getDVar(); } 00043 00044 virtual void reset(deFloat time) { _tg = time; _tgo = time; } 00045 virtual void moveGoal2Old() {} 00046 00047 virtual void PDLaw(taoJCParam* jcpRoot, deFloat s, deFloat periodInv) {} 00048 virtual void ZeroLaw() {} 00049 virtual void addJointLimitSoft() {} 00050 00051 virtual void setGoalPosition(deFrame* goal) {} 00052 00053 deInt& controlOn() { return _controlOn; } 00054 deInt& useGlobalGains() { return _useGlobalGains; } 00055 deInt& goalVelocityAuto() { return _goalVelocityAuto; } 00056 deInt& jtLimitSoftOn() { return _jtLimitSoftOn; } 00057 deFloat& jlU() { return _jlU; } 00058 deFloat& jlL() { return _jlL; } 00059 deFloat& kpU() { return _kpU; } 00060 deFloat& kvU() { return _kvU; } 00061 deFloat& kpL() { return _kpL; } 00062 deFloat& kvL() { return _kvL; } 00063 deFloat& kp() { return _kp; } 00064 deFloat& kv() { return _kv; } 00065 00066 protected: 00067 deInt _controlOn; 00068 deInt _useGlobalGains; 00069 deInt _goalVelocityAuto; 00070 deInt _jtLimitSoftOn; 00071 deFloat _jlU; 00072 deFloat _jlL; 00073 deFloat _kpU; 00074 deFloat _kvU; 00075 deFloat _kpL; 00076 deFloat _kvL; 00077 deFloat _kp; 00078 deFloat _kv; 00079 00080 protected: 00081 taoJoint* _joint; 00082 deFloat _tg; 00083 deFloat _tgo; 00084 }; 00085 00093 class taoJCParamSpherical : public taoJCParam 00094 { 00095 public: 00096 taoJCParamSpherical(taoJoint* j) : taoJCParam(j) { reset(0); } 00097 virtual void reset(deFloat time) 00098 { 00099 taoJCParam::reset(time); 00100 _Qo.identity(); 00101 _dQo.zero(); 00102 _Qg.identity(); 00103 _Qgo.identity(); 00104 _dQg.zero(); 00105 } 00106 taoVarSpherical* getVarSpherical() { return (taoVarSpherical*)getDVar(); } 00107 00108 virtual void moveGoal2Old() { _tgo = _tg; _Qgo = _Qg; } 00109 00110 virtual void PDLaw(taoJCParam* jcpRoot, deFloat s, deFloat periodInv); 00111 virtual void ZeroLaw(); 00112 00113 virtual void addJointLimitSoft(); 00114 00115 virtual void setGoalPosition(deFrame* goal); 00116 00117 deQuaternion& Qg() { return _Qg; } 00118 deVector3& dQg() { return _dQg; } 00119 00120 private: 00121 deQuaternion _Qo; 00122 deVector3 _dQo; 00123 deQuaternion _Qg; 00124 deQuaternion _Qgo; 00125 deVector3 _dQg; 00126 }; 00127 00135 class taoJCParamDOF1 : public taoJCParam 00136 { 00137 public: 00138 taoJCParamDOF1(taoJoint* j) : taoJCParam(j) { reset(0); } 00139 virtual void reset(deFloat time) 00140 { 00141 taoJCParam::reset(time); 00142 _Qo = 0; 00143 _dQo = 0; 00144 _Qg = 0; 00145 _Qgo = 0; 00146 _dQg = 0; 00147 } 00148 taoVarDOF1* getVarDOF1() { return (taoVarDOF1*)getDVar(); } 00149 00150 virtual void moveGoal2Old() { _tgo = _tg; _Qgo = _Qg; } 00151 00152 virtual void PDLaw(taoJCParam* jcpRoot, deFloat s, deFloat periodInv); 00153 virtual void ZeroLaw(); 00154 00155 virtual void addJointLimitSoft(); 00156 00157 virtual void setGoalPosition(deFrame* goal) {} 00158 00159 deFloat& Qg() { return _Qg; } 00160 deFloat& dQg() { return _dQg; } 00161 00162 protected: 00163 deFloat _Qo; 00164 deFloat _dQo; 00165 deFloat _Qg; 00166 deFloat _Qgo; 00167 deFloat _dQg; 00168 }; 00169 00177 class taoJCParamPrismatic : public taoJCParamDOF1 00178 { 00179 public: 00180 taoJCParamPrismatic(taoJoint* j) : taoJCParamDOF1(j) {} 00181 virtual void setGoalPosition(deFrame* goal); 00182 }; 00183 00191 class taoJCParamRevolute : public taoJCParamDOF1 00192 { 00193 public: 00194 taoJCParamRevolute(taoJoint* j) : taoJCParamDOF1(j) {} 00195 virtual void setGoalPosition(deFrame* goal); 00196 }; 00197 00206 class taoControlJt : public taoControl 00207 { 00208 public: 00212 taoControlJt(taoNodeRoot* root); 00213 00214 virtual ~taoControlJt(); 00215 virtual void deleteParamTree(taoDNode* node); 00216 00217 virtual deFloat time() { return _time; } 00218 virtual void reset(deFloat time); 00219 00220 virtual void control(deFloat time); 00221 00223 00227 virtual void setGoalPosition(taoDNode* node, deFrame* F, deFloat timestamp); 00228 00229 virtual taoControlJt* getControlJt() { return this; } 00230 00231 virtual taoJCParam* taoControlJt::createJCParam(taoJoint* joint); 00232 00233 virtual void jointForceTree(taoDNode* node); 00234 virtual void zeroTorqueControlOffTree(taoDNode* node); 00235 00236 void resetParamTree(taoDNode* node); 00237 00238 taoNodeRoot* root() { return _root; } 00239 00240 taoJCParam* jcpGlobal() { return _jcpGlobal; } 00241 deInt& doDynamicControl() { return _doDynamicControl; } 00242 deInt& includeG() { return _includeG; } 00243 taoControlType& controlLawType() { return _controlLawType; } 00244 00245 private: 00246 deFloat _time; 00247 taoNodeRoot* _root; 00248 00249 taoJCParam* _jcpGlobal; 00250 deInt _doDynamicControl; 00251 deInt _includeG; 00252 taoControlType _controlLawType; 00253 00254 private: 00255 void _PDLaw(taoDNode* node); 00256 void _ZeroLaw(taoDNode* node); 00257 void _FloatLaw(taoDNode* node); 00258 00259 void _NewParamTree(taoDNode* node); 00260 }; 00261 00262 #endif // _taoControlJt_h