SCL  1.0
Standard Control Library : Control, dynamics, physics, and simulation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Macros Groups Pages
taoABJoint.h
1 /* Copyright (c) 2005 Arachi, Inc. and Stanford University. All rights reserved.
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining
4  * a copy of this software and associated documentation files (the
5  * "Software"), to deal in the Software without restriction, including
6  * without limitation the rights to use, copy, modify, merge, publish,
7  * distribute, sublicense, and/or sell copies of the Software, and to
8  * permit persons to whom the Software is furnished to do so, subject
9  * to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included
12  * in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21  */
22 
26 #ifndef _taoABJoint_h
27 #define _taoABJoint_h
28 
29 #include "taoTypes.h"
30 #include "taoDJoint.h"
31 #include <tao/matrix/TaoDeMath.h>
32 
33 class taoDVar;
34 class taoVarDOF1;
35 class taoVarSpherical;
36 
37 #ifndef DOXYGEN_SHOULD_SKIP_THIS
38 
46 {
47 public:
48  taoABJoint(taoDJoint* joint = NULL)
49  {
50  _joint = joint;
51  _C.zero();
52  _Pa.zero();
53  _localX.identity();
54  _L.zero();
55  }
56 
57  virtual ~taoABJoint() {}
58 
59  virtual deVector6& C() { return _C; }
60  virtual deVector6& Pa() { return _Pa; }
61  virtual deTransform& localX() { return _localX; }
62  virtual deMatrix6& L() { return _L; }
63 
64  virtual void update_localX(const deTransform& home, const deFrame& localFrame) = 0;
65 
66  // Vi = hXi^T Vh + Si dqi;
67  // xform = [R 0; dxR R]
68  // xformT = [ Rt -Rtdx; 0 Rt ]
69  virtual void plusEq_SdQ(deVector6& V) = 0;
70 
71  // Ci = Wi X Vi - Xt (Wh X Vh) + Vi X Si dqi
72  // V X = [v0 ; v1] X = [ v1x , v0x ; 0 , v1x]
73  // WxV = [ 0 ; v1 ] x [ v0 ; v1 ]
74  // = [ v1x , 0 ; 0 , v1x ] [ v0 ; v1 ] = [v1 x v0 ;v1 x v1] = [ v1 x v0 ; 0 ]
75  // = [ wxv ; 0 ]
76  // Xt * WxV = [ Rt -Rtdx; 0 Rt ] [ wxv ; 0 ] = [ Rt WxV ; 0 ]
77  virtual void plusEq_V_X_SdQ(deVector6& C, const deVector6& V) = 0;
78 
79  // Dinv = inv(St Ia S)
80  // SbarT = Ia S Dinv
81  // hLi = hXi [ 1 - Si Sbari ]^T = hXi [1 - Sbari^T Si^T] = X - X SbarT St
82  // Lt = [1 - S Sbar] Xt
83  virtual void compute_Dinv_and_SbarT(const deMatrix6& Ia) = 0;
84 
85  virtual void minusEq_X_SbarT_St(deMatrix6& L, const deTransform& localX) = 0;
86 
87  // Pah = Ph - Fexth + sum [ Li (Iai Ci + Pai) + X SbarTi taui ]
88  virtual void plusEq_X_SbarT_Tau(deVector6& Pah, const deTransform& localX) = 0;
89 
90  // ddQ = Dinv*(tau - St*Pa) - Sbar*(X Ah + Ci)
91  // Ai = (hXi^T Ah + Ci) + Si ddqi;
92  virtual void compute_ddQ(const deVector6& Pa, const deVector6& XAh_C) = 0;
93 
94  virtual void compute_ddQ_zeroTau(const deVector6& Pa, const deVector6& XAh_C) = 0;
95 
96  // d dQ = Dinv*(- St*Ya) - Sbar*(X dVh)
97  // dVi = (hXi^T dVh) + Si d dqi;
98  virtual void compute_ddQ_zeroTauPa(const deVector6& XAh_C) = 0;
99 
100  virtual void compute_Tau(const deVector6& F) = 0;
101 
102  virtual void plusEq_SddQ(deVector6& A) = 0;
103 
104  virtual void minusEq_SdQ_damping(deVector6& B, const deMatrix6& Ia) = 0;
105 
106  virtual void plusEq_S_Dinv_St(deMatrix6& Omega) = 0;
107 
108  // 0Jn = Jn = iXn^T Si = 0Xi^(-T) Si
109  // where 0Xi^(-T) = [ R rxR; 0 R ]
110  virtual void compute_Jg(const deTransform &globalX) = 0;
111 
112  // Ag += Jg * ddQ
113  virtual void plusEq_Jg_ddQ(deVector6& Ag) = 0;
114 
115  // Tau += JgT * F
116  virtual void add2Tau_JgT_F(const deVector6& Fg) = 0;
117 
118  // F += S * inertia * A
119  virtual void plusEq_S_inertia_ddQ(deVector6& F, const deVector6& A) = 0;
120 
121  virtual deFloat getDamping() { return _joint->getDamping(); }
122 
123  virtual deFloat getInertia() { return _joint->getInertia(); }
124 
125  virtual taoDVar* getDVar() { return _joint->getDVar(); }
126 
127  virtual void zeroTau() { _joint->zeroTau(); }
128 
129  virtual void addDQdelta() { _joint->addDQdelta(); }
130 
131  virtual void addQdelta() { _joint->addQdelta(); }
132 
133 private:
134  taoDJoint* _joint;
135 
136  deVector6 _C;
137  deVector6 _Pa;
138  deTransform _localX;
139  deMatrix6 _L;
140 };
141 
143 {
144 public:
145  virtual void update_localX(const deTransform& home, const deFrame& localFrame) { localX().set(localFrame); }
146  virtual void plusEq_SdQ(deVector6& V) {}
147  virtual void plusEq_V_X_SdQ(deVector6& C, const deVector6& V) {}
148  virtual void compute_Dinv_and_SbarT(const deMatrix6& Ia) {}
149  virtual void minusEq_X_SbarT_St(deMatrix6& L, const deTransform& localX) {}
150  virtual void plusEq_X_SbarT_Tau(deVector6& Pah, const deTransform& localX) {}
151  virtual void compute_ddQ(const deVector6& Pa, const deVector6& XAh_C) {}
152  virtual void compute_ddQ_zeroTau(const deVector6& Pa, const deVector6& XAh_C) {}
153  virtual void compute_ddQ_zeroTauPa(const deVector6& XAh_C) {}
154  virtual void compute_Tau(const deVector6& F) {}
155 
156  virtual void plusEq_SddQ(deVector6& A) {}
157  virtual void minusEq_SdQ_damping(deVector6& B, const deMatrix6& Ia) {}
158  virtual void plusEq_S_Dinv_St(deMatrix6& Omega) {}
159 
160  virtual void compute_Jg(const deTransform &globalX) {}
161  virtual void plusEq_Jg_ddQ(deVector6& Ag) {}
162  virtual void add2Tau_JgT_F(const deVector6& Fg) {}
163 
164  virtual void plusEq_S_inertia_ddQ(deVector6& F, const deVector6& A) {}
165 
166  virtual void zeroTau() {}
167  virtual void addDQdelta() {}
168  virtual void addQdelta() {}
169 };
170 
172 {
173 public:
174  taoABJointSpherical(taoDJoint* joint) : taoABJoint(joint)
175  {
176  _SbarT[0].zero();
177  _SbarT[1].zero();
178  _Dinv.zero();
179  _Jg[0].zero();
180  _Jg[1].zero();
181  }
182  virtual void update_localX(const deTransform& home, const deFrame& localFrame);
183  virtual void plusEq_SdQ(deVector6& V);
184  virtual void plusEq_V_X_SdQ(deVector6& C, const deVector6& V);
185  virtual void compute_Dinv_and_SbarT(const deMatrix6& Ia);
186  virtual void minusEq_X_SbarT_St(deMatrix6& L, const deTransform& localX);
187  virtual void plusEq_X_SbarT_Tau(deVector6& Pah, const deTransform& localX);
188  virtual void compute_ddQ(const deVector6& Pa, const deVector6& XAh_C);
189  virtual void compute_ddQ_zeroTau(const deVector6& Pa, const deVector6& XAh_C);
190  virtual void compute_ddQ_zeroTauPa(const deVector6& XAh_C);
191  virtual void compute_Tau(const deVector6& F);
192 
193  virtual void plusEq_SddQ(deVector6& A);
194  virtual void minusEq_SdQ_damping(deVector6& B, const deMatrix6& Ia);
195  virtual void plusEq_S_Dinv_St(deMatrix6& Omega);
196 
197  virtual void compute_Jg(const deTransform &globalX);
198  virtual void plusEq_Jg_ddQ(deVector6& Ag);
199  virtual void add2Tau_JgT_F(const deVector6& Fg);
200 
201  virtual void plusEq_S_inertia_ddQ(deVector6& F, const deVector6& A);
202 
203  virtual taoVarSpherical* getVarSpherical() { return (taoVarSpherical*)getDVar(); }
204 
205  virtual deMatrix3* Jg() { return _Jg; }
206 
207 private:
208  deMatrix3 _SbarT[2];
209  deMatrix3 _Dinv;
210  deMatrix3 _Jg[2];
211 };
212 
214 {
215 public:
216  taoABJointDOF1(taoDJoint* joint) : taoABJoint(joint)
217  {
218  _S.zero();
219  _SbarT.zero();
220  _Dinv = 0;
221  _Jg.zero();
222  }
223  virtual void update_localX(const deTransform& home, const deFrame& localFrame);
224  virtual void plusEq_SdQ(deVector6& V);
225  virtual void plusEq_V_X_SdQ(deVector6& C, const deVector6& V);
226  virtual void compute_Dinv_and_SbarT(const deMatrix6& Ia);
227  virtual void minusEq_X_SbarT_St(deMatrix6& L, const deTransform& localX);
228  virtual void plusEq_X_SbarT_Tau(deVector6& Pah, const deTransform& localX);
229  virtual void compute_ddQ(const deVector6& Pa, const deVector6& XAh_C);
230  virtual void compute_ddQ_zeroTau(const deVector6& Pa, const deVector6& XAh_C);
231  virtual void compute_ddQ_zeroTauPa(const deVector6& XAh_C);
232  virtual void compute_Tau(const deVector6& F);
233 
234  virtual void plusEq_SddQ(deVector6& A);
235  virtual void minusEq_SdQ_damping(deVector6& B, const deMatrix6& Ia);
236  virtual void plusEq_S_Dinv_St(deMatrix6& Omega);
237 
238  virtual void compute_Jg(const deTransform &globalX);
239  virtual void plusEq_Jg_ddQ(deVector6& Ag);
240  virtual void add2Tau_JgT_F(const deVector6& Fg);
241 
242  virtual void plusEq_S_inertia_ddQ(deVector6& F, const deVector6& A);
243 
244  virtual taoVarDOF1* getVarDOF1() { return (taoVarDOF1*)getDVar(); }
245 
246  virtual deVector6& S() { return _S; }
247 
248  virtual deVector6& Jg() { return _Jg; }
249 
250 private:
256  // NOTE TODO : What is this?
257  deVector6 _SbarT;
258  // NOTE TODO : What is this?
259  deFloat _Dinv;
262 };
263 
265 {
266 public:
267  taoABJointPrismatic(taoJointType axis, taoDJoint* joint) : taoABJointDOF1(joint)
268  {
269  deVector6 unit;
270  unit.zero();
271  unit[0][axis] = 1;
272  S() = unit;
273  }
274 
275  taoABJointPrismatic(const deVector3& axis, taoDJoint* joint) : taoABJointDOF1(joint)
276  {
277  deVector6 unit;
278  unit.zero();
279  unit[0] = axis;
280  unit[0].normalize();
281  S() = unit;
282  }
283 };
284 
286 {
287 public:
288  taoABJointRevolute(taoJointType axis, taoDJoint* joint) : taoABJointDOF1(joint)
289  {
290  deVector6 unit;
291  unit.zero();
292  unit[1][axis] = 1;
293  S() = unit;
294  }
295 
296  taoABJointRevolute(const deVector3& axis, taoDJoint* joint) : taoABJointDOF1(joint)
297  {
298  deVector6 unit;
299  unit.zero();
300  unit[1] = axis;
301  unit[1].normalize();
302  S() = unit;
303  }
304 };
305 
306 #endif // DOXYGEN_SHOULD_SKIP_THIS
307 
308 #endif // _taoABJoint_h
309 
3x1 vector classThis is a C++ wrapper class of deVector3f.
Definition: TaoDeVector3.h:32
1-DOF joint variable class for articulated bodyThis provides joint variables necessary for articulate...
Definition: taoVar.h:53
abstract joint class for articulated bodyThis class should be used as a base class and implemented ac...
Definition: taoDJoint.h:43
Definition: taoABJoint.h:285
DE_MATH_API void set(const deFrame &f)
this = f
Definition: TaoDeTransformInl.h:59
Articulated body joint classThis class provides joint for articulated body.
Definition: taoABJoint.h:45
6x1 vector classThis class consists of two 3x1 vectors.
Definition: TaoDeVector6.h:33
spherical joint variable class for articulated bodyThis provides joint variables necessary for articu...
Definition: taoVar.h:68
Definition: taoABJoint.h:142
DE_MATH_API void zero()
this = zero matrix
Definition: TaoDeMatrix3Inl.h:29
Transformation class using rotational matrixThis class consists of a matrix for rotation and a vector...
Definition: TaoDeTransform.h:32
DE_MATH_API void zero()
this = zero matrix
Definition: TaoDeMatrix6Inl.h:36
virtual void update_localX(const deTransform &home, const deFrame &localFrame)
Definition: taoABJoint.cpp:29
DE_MATH_API void zero()
this = zero vector
Definition: TaoDeVector6Inl.h:36
Transformation class using quaternionThis class consists of a quaternion for rotation and a vector fo...
Definition: TaoDeFrame.h:36
6x6 matrix classThis class consists of four 3x3 matrices.
Definition: TaoDeMatrix6.h:33
abstract joint variable class for articulated bodyThis class should be used as a base class and imple...
Definition: taoVar.h:42
deVector6 _S
Definition: taoABJoint.h:255
deVector6 _Jg
Definition: taoABJoint.h:261
3x3 matrix classThis is a C++ wrapper class of deMatrix3f.
Definition: TaoDeMatrix3.h:33
Definition: taoABJoint.h:171
Definition: taoABJoint.h:213
DE_MATH_API void identity()
this = identity matrix
Definition: TaoDeTransformInl.h:31
Definition: taoABJoint.h:264