SCL  1.0
Standard Control Library : Control, dynamics, physics, and simulation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Macros Groups Pages
taoArticulatedBodyLink.hpp
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 _taoArticulatedBodyLink_h
27 #define _taoArticulatedBodyLink_h
28 
29 #include "taoABJoint.h"
30 #include <tao/matrix/TaoDeMath.h>
31 
32 #ifndef DOXYGEN_SHOULD_SKIP_THIS
33 
41 {
42 public:
43  taoArticulatedBodyLink() { velocity_.zero(); _A.zero(); _H.zero(), _Omega.zero(); }
44 
45  virtual ~taoArticulatedBodyLink() {}
46 
47  virtual void setFlag(deInt v) = 0;
48  virtual const deInt getFlag() const = 0;
49 
50  virtual deVector6* Pa() = 0;
51 
52  virtual const deMatrix6* I() const = 0;
53 
61  virtual deMatrix6* Omega() { return &_Omega; }
62  virtual deVector6* H() { return &_H; }
63 
65  virtual deVector6* getVelocity() { return &velocity_; }
66 
67  virtual deVector6* A() { return &_A; }
68 
69  // Ia = I
70  virtual void abInertiaInit(deMatrix6& Ia) {}
71 
72  // Ya = -Xc Yc
73  // = -[R , 0; dxR , R] [ y, 0]
74  // = [-Ry ; -dxRy]
75  virtual void impulseInit(const deVector3& point, const deVector3& impulse) {}
76 
77 
78  // Ii = Xc Ic Xtc
79  // = [ RMRt, -RMRt rx; rx RMRt, RIRt - rx RMRt rx]
80  // = [ M, -Mrx; rxM, RIRt - m rx rx]
81  virtual void setInertia(const deFloat* mass, const deVector3* centerOfMass, const deMatrix3* inertiaTensor) {}
82 
83  // Pi = Xc (Wc X Ic Vc) - Ii (Wi X Vi)
84  // = Xc (Wc X [mi vc; Ic wc]) -Ii (Wi X Vi)
85  virtual void biasForce(deVector6& P, const deVector6& V, const deVector3& WxV) {}
86 
87  // Dinv = inv(St Ia S)
88  // SbarT = Ia S Dinv
89  // hLi = hXi [ 1 - Si Sbari ]^T = hXi [1 - Sbari^T Si^T] = X - X SbarT St
90  // Lt = [1 - S Sbar] Xt
91  // Iah = Ih + sum [ Li Iai Lti ]
92  virtual void _abInertia(deMatrix6& Iah, const deMatrix6& L, const deMatrix6& Ia, const deTransform& X) {}
93 
94  // Pah = Ph - Fexth + sum [ Li (Iai Ci + Pai) + X SbarTi taui ]
95  virtual void _abBiasForce(deVector6& Pah, const deMatrix6& L, const deMatrix6& Ia, const deVector6& C, const deVector6& Pa) {}
96 
97  virtual void netForce(deVector6& F, const deVector6& A, const deVector6& P) {}
98 
99  // Pa -= Fext
100  virtual void externalForce(deVector6& Pa, const deVector6& G, const deVector6& Fext) {}
101 
102  virtual void updateLocalX(const deFrame& homeFrame, const deFrame& localFrame) {}
103 
104  virtual void getFrameLocal(deFrame& localFrame) {}
105 
106  virtual void abImpulse(deVector6& Yah, deInt propagate) {}
107 
108  // 0Je = Je = iXe^T Si = 0Xi^(-T) Si
109  // where 0Xi^(-T) = [ R rxR; 0 R ]
110  // since 0Re = identity
111  // and iXe^T = [(inv 0Xi) 0Xe]^T = (0Xe)^T * (0Xi)^(-T) = 0Xi ^(-T)
112  // since 0Xe = identity matrix <-- {e} = {0}
113  virtual void globalJacobian(const deFrame& globalFrame) {}
114 
115  // A += J * ddQ
116  virtual void plusEq_Jg_ddQ(deVector6& Ag) {}
117 
118  // Tau += Jt * F
119  virtual void add2Tau_JgT_F(const deVector6& Fg) {}
120 
121  // Gi = Xc Gc
122  // Gc = [ mi Rtci gi ; 0]
123  // gi = Rt gh
124  virtual void gravityForce(deVector6& Fext, deVector3& g, const deVector3& gh) = 0;
125 
126  // Vi = hXi^T Vh + Si dqi;
127  // xform = [R 0; dxR R]
128  // xformT = [ Rt -Rtdx; 0 Rt ]
129  // Ci = Wi X Vi - Xt (Wh X Vh) + Vi X Si dqi
130  // V X = [v0 ; v1] X = [ v1x , v0x ; 0 , v1x]
131  // WxV = [ 0 ; v1 ] x [ v0 ; v1 ]
132  // = [ v1x , 0 ; 0 , v1x ] [ v0 ; v1 ] = [v1 x v0 ;v1 x v1] = [ v1 x v0 ; 0 ]
133  // = [ wxv ; 0 ]
134  // Xt * WxV = [ Rt -Rtdx; 0 Rt ] [ wxv ; 0 ] = [ Rt WxV ; 0 ]
135  virtual void velocity(deVector6& V, deVector3& WxV, const deVector6& Vh, const deVector3& WhxVh) = 0;
136 
137  virtual void velocityOnly(deVector6& V, const deVector6& Vh) {}
138 
139  // Hi = hXi^T Hh + Ci
140  virtual void biasAcceleration(deVector6& H, const deVector6& Hh) = 0;
141 
142  // Vi = hXi^T Vh + Si dqi;
143  // E = 0.5 Vt I V
144  virtual deFloat kineticEnergy(deVector6& V, const deVector6& Vh) = 0;
145 
146  // E = mgh
147  virtual deFloat potentialEnergy(const deVector3& gh, const deFrame& globalFrame, const deFloat mass, const deVector3& centerOfMass) = 0;
148 
149 
150  // ddQ = Dinv*(tau - St*Pa) - Sbar*(X Ah + Ci)
151  // Ai = (hXi^T Ah + Ci) + Si ddqi;
152  virtual void acceleration(deVector6& A, const deVector6& Ah) {}
153 
154  virtual void accelerationOnly(deVector6& A, const deVector6& Ah) {}
155 
156  // ddQ = Dinv*(tau - St*Pa) - Sbar*(X Ah)
157  // Ai = (hXi^T Ah) + Si ddqi;
158  // d dQ = Dinv*(- St*Pa) - Sbar*(X dVh)
159  // dVi = (hXi^T dVh) + Si d dqi;
160  virtual void velocityDelta(deVector6& dV, const deVector6& dVh, const deInt dist) = 0;
161 
162  virtual void force(deVector6& Fh, deInt propagate) {}
163 
164  // C = Ph = 0
165  // Pah = - Fexth + sum [ Li (Pai) + X SbarTi taui ]
166  virtual void abBiasForceConfig(deVector6& Pah, deInt propagate) {}
167 
168  virtual void abInertiaDepend(deMatrix6& Iah, deVector6& Pah, deMatrix6& Ia, deInt propagate) {}
169 
170  // O = S Dinv St + Lt Oh L
171  virtual void osInertiaInv(deMatrix6& Oa, const deMatrix6& Oah) {}
172 
173  virtual void setABJoint(taoABJoint* joint, deInt i = 0) {}
174 
175  virtual taoABJoint* getABJoint(deInt i = 0) = 0;
176 
177  virtual void setNOJ(deInt n) {}
178 
179  virtual const deInt getNOJ() const = 0;
180 
181 private:
182  deVector6 velocity_;
183  deVector6 _A; // NOTE TODO : What is this?
184  deVector6 _H; // NOTE TODO : What is this?
185  deMatrix6 _Omega; // Op Sp Matrix inverse : diagonal terms
186 };
187 
189 {
190 public:
191  virtual const deInt getFlag() const { return 0; }
192  virtual void setFlag(deInt v) {}
193 
194  virtual deVector6* Pa() { return NULL; }
195  virtual const deMatrix6* I() const { return NULL; }
196 
197  virtual void gravityForce(deVector6& Fext, deVector3& g, const deVector3& gh) { g = gh; }
198  virtual void velocity(deVector6& V, deVector3& WxV, const deVector6& Vh, const deVector3& WhxVh) { WxV.crossMultiply(V[1], V[0]); }
199 
200  virtual void biasAcceleration(deVector6& H, const deVector6& Hh) { H.zero(); }
201  virtual deFloat kineticEnergy(deVector6& V, const deVector6& Vh) { return 0; }
202  virtual deFloat potentialEnergy(const deVector3& gh, const deFrame& globalFrame, const deFloat mass, const deVector3& centerOfMass) { return 0; }
203 
204  virtual void velocityDelta(deVector6& dV, const deVector6& dVh, const deInt dist) { dV.zero(); }
205 
206  virtual taoABJoint* getABJoint(deInt i = 0) { return NULL; }
207 
208  virtual const deInt getNOJ() const { return 0; }
209 };
210 
212 {
213 public:
215  {
216  _flag = 0;
217  _Ic.zero();
218  _I.zero();
219  }
220  virtual const deInt getFlag() const { return _flag; }
221  virtual void setFlag(deInt v) { _flag = v; }
222 
223  virtual const deMatrix3* Ic() const { return &_Ic; }
224  virtual const deMatrix6* I() const { return &_I;}
225 
226  virtual deVector6* Pa() { return &(getABJoint(getNOJ() - 1)->Pa()); }
227 
228  virtual void abInertiaInit(deMatrix6& Ia);
229  virtual void impulseInit(const deVector3& point, const deVector3& impulse);
230 
231  virtual void setInertia(const deFloat* mass, const deVector3* centerOfMass, const deMatrix3* inertiaTensor);
232  virtual void biasForce(deVector6& P, const deVector6& V, const deVector3& WxV);
233  virtual void _abInertia(deMatrix6& Iah, const deMatrix6& L, const deMatrix6& Ia, const deTransform& X);
234  virtual void _abBiasForce(deVector6& Pah, const deMatrix6& L, const deMatrix6& Ia, const deVector6& C, const deVector6& Pa);
235  virtual void externalForce(deVector6& Pa, const deVector6& G, const deVector6& Fext);
236  virtual deFloat kineticEnergy(deVector6& V, const deVector6& Vh);
237  virtual deFloat potentialEnergy(const deVector3& gh, const deFrame& globalFrame, const deFloat mass, const deVector3& centerOfMass);
238 
239  virtual void setABJoint(taoABJoint* joint, deInt i = 0) = 0;
240  virtual taoABJoint* getABJoint(deInt i = 0) = 0;
241 
242  virtual void setNOJ(deInt n) = 0;
243  virtual const deInt getNOJ() const = 0;
244 
245 private:
246  deInt _flag;
247  deMatrix3 _Ic;
248  deMatrix6 _I;
249 };
250 
252 {
253 public:
254  taoArticulatedBodyLinkNJoints1() : _joint(NULL) {}
255 
256  virtual void updateLocalX(const deFrame& homeFrame, const deFrame& localFrame);
257  virtual void getFrameLocal(deFrame& localFrame);
258  virtual void abImpulse(deVector6& Yah, deInt propagate);
259  virtual void globalJacobian(const deFrame& globalFrame);
260  virtual void plusEq_Jg_ddQ(deVector6& Ag);
261  virtual void add2Tau_JgT_F(const deVector6& Fg);
262 
263  virtual void gravityForce(deVector6& Fext, deVector3& g, const deVector3& gh);
264  virtual void velocity(deVector6& V, deVector3& WxV, const deVector6& Vh, const deVector3& WhxVh);
265  virtual void velocityOnly(deVector6& V, const deVector6& Vh);
266 
267  virtual void biasAcceleration(deVector6& H, const deVector6& Hh);
268  virtual void acceleration(deVector6& A, const deVector6& Ah);
269  virtual void accelerationOnly(deVector6& A, const deVector6& Ah);
270  virtual void velocityDelta(deVector6& dV, const deVector6& dVh, const deInt dist);
271 
272  virtual void netForce(deVector6& F, const deVector6& A, const deVector6& P);
273  virtual void force(deVector6& Fh, deInt propagate);
274 
275  virtual void abBiasForceConfig(deVector6& Pah, deInt propagate);
276  virtual void abInertiaDepend(deMatrix6& Iah, deVector6& Pah, deMatrix6& Ia, deInt propagate);
277  virtual void osInertiaInv(deMatrix6& Oa, const deMatrix6& Oah);
278 
279  virtual void setABJoint(taoABJoint* joint, deInt i = 0) { _joint = joint; }
280  virtual taoABJoint* getABJoint(deInt i = 0) { return _joint; }
281 
282  virtual void setNOJ(deInt n) {}
283  virtual const deInt getNOJ() const { return 1; }
284 
285  virtual ~taoArticulatedBodyLinkNJoints1() { delete _joint; }
286 
287 private:
288  taoABJoint* _joint;
289 };
290 
292 {
293 public:
294  taoArticulatedBodyLinkNJointsN() : _noj(0), _joint(NULL) {}
295 
296  virtual void updateLocalX(const deFrame& homeFrame, const deFrame& localFrame);
297  virtual void getFrameLocal(deFrame& localFrame);
298  virtual void abImpulse(deVector6& Yah, deInt propagate);
299  virtual void globalJacobian(const deFrame& globalFrame);
300  virtual void plusEq_Jg_ddQ(deVector6& Ag);
301  virtual void add2Tau_JgT_F(const deVector6& Fg);
302 
303  virtual void gravityForce(deVector6& Fext, deVector3& g, const deVector3& gh);
304  virtual void velocity(deVector6& V, deVector3& WxV, const deVector6& Vh, const deVector3& WhxVh);
305  virtual void velocityOnly(deVector6& V, const deVector6& Vh);
306 
307  virtual void biasAcceleration(deVector6& H, const deVector6& Hh);
308  virtual void acceleration(deVector6& A, const deVector6& Ah);
309  virtual void accelerationOnly(deVector6& A, const deVector6& Ah);
310  virtual void velocityDelta(deVector6& dV, const deVector6& dVh, const deInt dist);
311 
312  virtual void netForce(deVector6& F, const deVector6& A, const deVector6& P);
313  virtual void force(deVector6& Fh, deInt propagate);
314 
315  virtual void abBiasForceConfig(deVector6& Pah, deInt propagate);
316  virtual void abInertiaDepend(deMatrix6& Iah, deVector6& Pah, deMatrix6& Ia, deInt propagate);
317  virtual void osInertiaInv(deMatrix6& Oa, const deMatrix6& Oah);
318 
319  virtual void setABJoint(taoABJoint* joint, deInt i = 0) { _joint[i] = joint; }
320  virtual taoABJoint* getABJoint(deInt i = 0) { return _joint[i]; }
321 
322  virtual void setNOJ(deInt n) { _noj = n; _joint = new taoABJoint*[_noj]; }
323  virtual const deInt getNOJ() const { return _noj; }
324 
326  {
327  for (int i = 0; i < _noj; i++)
328  delete _joint[i];
329  delete[] _joint;
330  }
331 
332 private:
333  deInt _noj;
334  taoABJoint** _joint;
335 };
336 
337 #endif // DOXYGEN_SHOULD_SKIP_THIS
338 
339 #endif // taoArticulatedBodyLink.h
340 
3x1 vector classThis is a C++ wrapper class of deVector3f.
Definition: TaoDeVector3.h:32
virtual void abInertiaInit(deMatrix6 &Ia)
Definition: taoArticulatedBodyLink.cpp:31
Definition: taoArticulatedBodyLink.hpp:211
DE_MATH_API void crossMultiply(const deVector3 &v1, const deVector3 &v2)
this = v1 x v2
Definition: TaoDeVector3Inl.h:51
Definition: taoArticulatedBodyLink.hpp:188
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
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
Definition: taoArticulatedBodyLink.hpp:251
DE_MATH_API void zero()
this = zero matrix
Definition: TaoDeMatrix6Inl.h:36
DE_MATH_API void zero()
this = zero vector
Definition: TaoDeVector6Inl.h:36
Definition: taoArticulatedBodyLink.hpp:291
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
3x3 matrix classThis is a C++ wrapper class of deMatrix3f.
Definition: TaoDeMatrix3.h:33