MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
gimbal.cc
Go to the documentation of this file.
1 /* $Header: /var/cvs/mbdyn/mbdyn/mbdyn-1.0/mbdyn/struct/gimbal.cc,v 1.27 2017/01/12 14:46:43 masarati Exp $ */
2 /*
3  * MBDyn (C) is a multibody analysis code.
4  * http://www.mbdyn.org
5  *
6  * Copyright (C) 1996-2017
7  *
8  * Pierangelo Masarati <masarati@aero.polimi.it>
9  * Paolo Mantegazza <mantegazza@aero.polimi.it>
10  *
11  * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano
12  * via La Masa, 34 - 20156 Milano, Italy
13  * http://www.aero.polimi.it
14  *
15  * Changing this copyright notice is forbidden.
16  *
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation (version 2 of the License).
20  *
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25  * GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this program; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30  */
31 
32 /* Cerniera pilotata */
33 
34 #include "mbconfig.h" /* This goes first in every *.c,*.cc file */
35 
36 #include "dataman.h"
37 #include "gimbal.h"
38 #include "Rot.hh"
39 
40 /* GimbalRotationJoint - begin */
41 
42 /* Costruttore non banale */
44  const DofOwner* pDO,
45  const StructNode* pN1,
46  const StructNode* pN2,
47  const Mat3x3& R1,
48  const Mat3x3& R2,
49  const OrientationDescription& od,
50  flag fOut)
51 : Elem(uL, fOut),
52 Joint(uL, pDO, fOut),
53 pNode1(pN1), pNode2(pN2), R1h(R1), R2h(R2),
54 M(Zero3), dTheta(0.), dPhi(0.), od(od)
55 {
56  ASSERT(pNode1 != NULL);
57  ASSERT(pNode2 != NULL);
60 }
61 
62 
63 /* Distruttore */
65 {
66  NO_OP;
67 }
68 
69 
70 /* Contributo al file di restart */
71 std::ostream&
72 GimbalRotationJoint::Restart(std::ostream& out) const
73 {
74  Joint::Restart(out) << ", gimbal rotation, "
75  << pNode1->GetLabel() << ", reference, node, 1, ",
76  (R1h.GetVec(1)).Write(out, ", ")
77  << ", 2, ", (R1h.GetVec(2)).Write(out, ", ") << ", "
78  << pNode2->GetLabel() << ", reference, node, 1, ",
79  (R2h.GetVec(1)).Write(out, ", ")
80  << ", 2, ", (R2h.GetVec(2)).Write(out, ", ") << ';' << std::endl;
81  return out;
82 }
83 
84 
85 void
87 {
88  if (bToBeOutput()) {
89  Mat3x3 Ra(pNode1->GetRCurr());
90 
91  // TODO: allow to customize orientation description
93 
94  std::ostream& out = OH.Joints();
95 
96  Joint::Output(out, "Gimbal", GetLabel(),
97  Zero3, M, Zero3, Ra*M)
98  << " " << dTheta << " " << dPhi << " ";
99 
100  switch (od) {
101  case EULER_123:
102  out << MatR2EulerAngles123(R)*dRaDegr;
103  break;
104 
105  case EULER_313:
106  out << MatR2EulerAngles313(R)*dRaDegr;
107  break;
108 
109  case EULER_321:
110  out << MatR2EulerAngles321(R)*dRaDegr;
111  break;
112 
113  case ORIENTATION_VECTOR:
114  out << RotManip::VecRot(R);
115  break;
116 
117  case ORIENTATION_MATRIX:
118  out << R;
119  break;
120 
121  default:
122  /* impossible */
123  break;
124  }
125 
126  out << std::endl;
127  }
128 }
129 
130 
131 /* assemblaggio jacobiano */
134  doublereal dCoef,
135  const VectorHandler& /* XCurr */ ,
136  const VectorHandler& /* XPrimeCurr */ )
137 {
138  DEBUGCOUT("Entering GimbalRotationJoint::AssJac()" << std::endl);
139 
140  FullSubMatrixHandler& WM = WorkMat.SetFull();
141 
142  /* Dimensiona e resetta la matrice di lavoro */
143  integer iNumRows = 0;
144  integer iNumCols = 0;
145  WorkSpaceDim(&iNumRows, &iNumCols);
146  WM.ResizeReset(iNumRows, iNumCols);
147 
148  /* Recupera gli indici */
149  integer iNode1FirstPosIndex = pNode1->iGetFirstPositionIndex() + 3;
150  integer iNode1FirstMomIndex = pNode1->iGetFirstMomentumIndex() + 3;
151  integer iNode2FirstPosIndex = pNode2->iGetFirstPositionIndex() + 3;
152  integer iNode2FirstMomIndex = pNode2->iGetFirstMomentumIndex() + 3;
153  integer iFirstReactionIndex = iGetFirstIndex();
154 
155  /* Setta gli indici della matrice */
156  for (int iCnt = 1; iCnt <= 3; iCnt++) {
157  WM.PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
158  WM.PutColIndex(iCnt, iNode1FirstPosIndex + iCnt);
159  WM.PutRowIndex(3 + iCnt, iNode2FirstMomIndex + iCnt);
160  WM.PutColIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
161  }
162 
163  for (int iCnt = 1; iCnt <= 5; iCnt++) {
164  WM.PutRowIndex(6 + iCnt, iFirstReactionIndex + iCnt);
165  WM.PutColIndex(6 + iCnt, iFirstReactionIndex + iCnt);
166  }
167 
168  AssMat(WM, dCoef);
169 
170  return WorkMat;
171 }
172 
173 
174 void
176  VectorHandler& /* XP */ )
177 {
178  NO_OP;
179 }
180 
181 
182 void
184 {
185  Mat3x3 Ra(pNode1->GetRCurr()*R1h);
186  Mat3x3 Rb(pNode2->GetRCurr()*R2h);
187  Mat3x3 RaT(Ra.Transpose());
188 
189  Mat3x3 R_ab(RaT*Rb);
190 
191  doublereal dCosTheta = cos(dTheta);
192  doublereal dSinTheta = sin(dTheta);
193  doublereal dCosPhi = cos(dPhi);
194  doublereal dSinPhi = sin(dPhi);
195 
196  Vec3 w_theta(dSinTheta*dSinPhi, 1. + dCosPhi, -dCosTheta*dSinPhi);
197  Vec3 w_phi(dCosTheta, 0., dSinTheta);
198 
199  Vec3 w_theta_theta(dCosTheta*dSinPhi, 0., dSinTheta*dSinPhi);
200  Vec3 w_theta_phi(dSinTheta*dCosPhi, -dSinPhi, -dCosTheta*dCosPhi);
201  Vec3 w_phi_theta(-dSinTheta, 0., dCosTheta);
202 
203  /* coppie */
204  /* termini in Delta lambda */
205  WM.Add(1, 6 + 1, Ra);
206  WM.Sub(3 + 1, 6 + 1, Ra);
207 
208  /* termini in Delta g_a */
209  Vec3 Lambda(Ra*M);
210  Mat3x3 MTmp(MatCross, Lambda*dCoef);
211  WM.Sub(1, 1, MTmp);
212  WM.Add(3 + 1, 1, MTmp);
213 
214  /* equazioni di vincolo */
215  /* termini in Delta g_a, Delta g_b */
216  MTmp = RaT*dCoef;
217  WM.Add(6 + 1, 1, MTmp);
218  WM.Sub(6 + 1, 3 + 1, MTmp);
219 
220  /* termini in Delta theta */
221  Vec3 VTmp(R_ab*w_theta);
222  WM.IncCoef(6 + 1, 9 + 1, VTmp(1));
223  WM.IncCoef(6 + 2, 9 + 1, VTmp(2));
224  WM.IncCoef(6 + 3, 9 + 1, VTmp(3));
225 
226  WM.IncCoef(9 + 1, 6 + 1, VTmp(1));
227  WM.IncCoef(9 + 1, 6 + 2, VTmp(2));
228  WM.IncCoef(9 + 1, 6 + 3, VTmp(3));
229 
230  /* termini in Delta phi */
231  VTmp = Vec3(R_ab*w_phi);
232  WM.IncCoef(6 + 1, 9 + 2, VTmp(1));
233  WM.IncCoef(6 + 2, 9 + 2, VTmp(2));
234  WM.IncCoef(6 + 3, 9 + 2, VTmp(3));
235 
236  WM.IncCoef(9 + 2, 6 + 1, VTmp(1));
237  WM.IncCoef(9 + 2, 6 + 2, VTmp(2));
238  WM.IncCoef(9 + 2, 6 + 3, VTmp(3));
239 
240  /* equazione in theta */
241  /* termini in Delta g_a, Delta g_b */
242  VTmp = (Rb*w_theta).Cross(Lambda*dCoef);
243  WM.DecCoef(9 + 1, 1, VTmp(1));
244  WM.DecCoef(9 + 1, 2, VTmp(2));
245  WM.DecCoef(9 + 1, 3, VTmp(3));
246 
247  WM.IncCoef(9 + 1, 3 + 1, VTmp(1));
248  WM.IncCoef(9 + 1, 3 + 2, VTmp(2));
249  WM.IncCoef(9 + 1, 3 + 3, VTmp(3));
250 
251  /* termine in Delta theta */
252  WM.IncCoef(9 + 1, 9 + 1, (Rb*w_theta_theta)*Lambda);
253 
254  /* termine in Delta phi */
255  WM.IncCoef(9 + 1, 9 + 2, (Rb*w_theta_phi)*Lambda);
256 
257  /* equazione in phi */
258  /* termini in Delta g_a, Delta g_b */
259  VTmp = (Rb*w_phi).Cross(Lambda*dCoef);
260  WM.DecCoef(9 + 2, 1, VTmp(1));
261  WM.DecCoef(9 + 2, 2, VTmp(2));
262  WM.DecCoef(9 + 2, 3, VTmp(3));
263 
264  WM.IncCoef(9 + 2, 3 + 1, VTmp(1));
265  WM.IncCoef(9 + 2, 3 + 2, VTmp(2));
266  WM.IncCoef(9 + 2, 3 + 3, VTmp(3));
267 
268  /* termine in Delta theta */
269  WM.IncCoef(9 + 2, 9 + 1, (Rb*w_phi_theta)*Lambda);
270 }
271 
272 
273 /* assemblaggio residuo */
276  doublereal dCoef,
277  const VectorHandler& XCurr,
278  const VectorHandler& /* XPrimeCurr */ )
279 {
280  DEBUGCOUT("Entering GimbalRotationJoint::AssRes()" << std::endl);
281 
282  /* Dimensiona e resetta la matrice di lavoro */
283  integer iNumRows = 0;
284  integer iNumCols = 0;
285  WorkSpaceDim(&iNumRows, &iNumCols);
286  WorkVec.ResizeReset(iNumRows);
287 
288  /* Recupera gli indici */
289  integer iNode1FirstMomIndex = pNode1->iGetFirstMomentumIndex() + 3;
290  integer iNode2FirstMomIndex = pNode2->iGetFirstMomentumIndex() + 3;
291  integer iFirstReactionIndex = iGetFirstIndex();
292 
293  /* Setta gli indici della matrice */
294  for (int iCnt = 1; iCnt <= 3; iCnt++) {
295  WorkVec.PutRowIndex(iCnt, iNode1FirstMomIndex + iCnt);
296  WorkVec.PutRowIndex(3 + iCnt, iNode2FirstMomIndex + iCnt);
297  }
298 
299  for (int iCnt = 1; iCnt <= 5; iCnt++) {
300  WorkVec.PutRowIndex(6 + iCnt, iFirstReactionIndex + iCnt);
301  }
302 
303  M = Vec3(XCurr, iFirstReactionIndex + 1);
304  dTheta = XCurr(iFirstReactionIndex + 3 + 1);
305  dPhi = XCurr(iFirstReactionIndex + 3 + 2);
306 
307  AssVec(WorkVec, dCoef);
308 
309  return WorkVec;
310 }
311 
312 
313 void
315 {
316  Mat3x3 Ra(pNode1->GetRCurr()*R1h);
317  Mat3x3 Rb(pNode2->GetRCurr()*R2h);
318 
319  Mat3x3 ExpTheta(RotManip::Rot(Vec3(0., dTheta, 0.)));
320  Mat3x3 ExpPhi(RotManip::Rot(Vec3(dPhi, 0., 0.)));
321 
322  doublereal dCosTheta = cos(dTheta);
323  doublereal dSinTheta = sin(dTheta);
324  doublereal dCosPhi = cos(dPhi);
325  doublereal dSinPhi = sin(dPhi);
326 
327  Vec3 MTmp(Ra*M);
328 
329  Mat3x3 R_rel(ExpTheta*ExpPhi*ExpTheta);
330  Mat3x3 R_ab(Ra.Transpose()*Rb);
331 
332  WorkVec.Sub(1, MTmp);
333  WorkVec.Add(3 + 1, MTmp);
334 
335  WorkVec.Add(6 + 1, RotManip::VecRot(R_ab*R_rel.Transpose()));
336 
337  Vec3 w_theta(dSinTheta*dSinPhi, 1. + dCosPhi, -dCosTheta*dSinPhi);
338  Vec3 w_phi(dCosTheta, 0., dSinTheta);
339 
340  WorkVec.DecCoef(9 + 1, (R_ab*w_theta)*M);
341  WorkVec.DecCoef(9 + 2, (R_ab*w_phi)*M);
342 }
343 
344 
345 /*
346  * FIXME: the initial assembly is flawed:
347  * there is no constraint derivative...
348  */
349 
350 /* Contributo allo jacobiano durante l'assemblaggio iniziale */
353  const VectorHandler& XCurr)
354 {
355  DEBUGCOUT("Entering GimbalRotationJoint::InitialAssJac()" << std::endl);
356 
357  FullSubMatrixHandler& WM = WorkMat.SetFull();
358 
359  /* Dimensiona e resetta la matrice di lavoro */
360  integer iNumRows = 0;
361  integer iNumCols = 0;
362  InitialWorkSpaceDim(&iNumRows, &iNumCols);
363  WM.ResizeReset(iNumRows, iNumCols);
364 
365  /* Recupera gli indici */
366  integer iNode1FirstPosIndex = pNode1->iGetFirstPositionIndex() + 3;
367  integer iNode2FirstPosIndex = pNode2->iGetFirstPositionIndex() + 3;
368  integer iFirstReactionIndex = iGetFirstIndex();
369 
370  /* Setta gli indici della matrice */
371  for (int iCnt = 1; iCnt <= 3; iCnt++) {
372  WM.PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
373  WM.PutColIndex(iCnt, iNode1FirstPosIndex + iCnt);
374  WM.PutRowIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
375  WM.PutColIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
376  }
377 
378  for (int iCnt = 1; iCnt <= 5; iCnt++) {
379  WM.PutRowIndex(6 + iCnt, iFirstReactionIndex + iCnt);
380  WM.PutColIndex(6 + iCnt, iFirstReactionIndex + iCnt);
381  }
382 
383  AssMat(WM, 1.);
384 
385  return WorkMat;
386 }
387 
388 
389 /* Contributo al residuo durante l'assemblaggio iniziale */
392  const VectorHandler& XCurr)
393 {
394  DEBUGCOUT("Entering GimbalRotationJoint::InitialAssRes()" << std::endl);
395 
396  /* Dimensiona e resetta la matrice di lavoro */
397  integer iNumRows = 0;
398  integer iNumCols = 0;
399  InitialWorkSpaceDim(&iNumRows, &iNumCols);
400  WorkVec.ResizeReset(iNumRows);
401 
402  /* Recupera gli indici */
403  integer iNode1FirstPosIndex = pNode1->iGetFirstPositionIndex() + 3;
404  integer iNode2FirstPosIndex = pNode2->iGetFirstPositionIndex() + 3;
405  integer iFirstReactionIndex = iGetFirstIndex();
406 
407  /* Setta gli indici del vettore */
408  for (int iCnt = 1; iCnt <= 3; iCnt++) {
409  WorkVec.PutRowIndex(iCnt, iNode1FirstPosIndex + iCnt);
410  WorkVec.PutRowIndex(3 + iCnt, iNode2FirstPosIndex + iCnt);
411  }
412 
413  for (int iCnt = 1; iCnt <= 5; iCnt++) {
414  WorkVec.PutRowIndex(6 + iCnt, iFirstReactionIndex + iCnt);
415  }
416 
417  AssVec(WorkVec, 1);
418 
419  return WorkVec;
420 }
421 
422 /* Dati privati (aggiungere magari le reazioni vincolari) */
423 unsigned int
425 {
426  return 5;
427 }
428 
429 unsigned int
431 {
432  if (strncmp(s, "lambda[" /*]*/ , STRLENOF("lambda[" /*]*/ )) == 0) {
433  s += STRLENOF("lambda[" /*]*/ );
434  if (strcmp(&s[1], /*[*/ "]") != 0) {
435  return 0;
436  }
437 
438  switch (s[0]) {
439  case '1':
440  case '2':
441  case '3':
442  return s[0] - '0';
443 
444  default:
445  return 0;
446  }
447 
448  } else if (strcmp(s, "theta") == 0) {
449  return 4;
450 
451  } else if (strcmp(s, "phi") == 0) {
452  return 5;
453  }
454 
455  return 0;
456 }
457 
460 {
461  switch (i) {
462  case 1:
463  case 2:
464  case 3:
465  return M(i);
466 
467  case 4:
468  return dTheta;
469 
470  case 5:
471  return dPhi;
472  }
473 
475 }
476 
477 /* GimbalRotationJoint - end */
virtual doublereal dGetPrivData(unsigned int i=0) const
Definition: gimbal.cc:459
virtual void Output(OutputHandler &OH) const
Definition: gimbal.cc:86
void PutColIndex(integer iSubCol, integer iCol)
Definition: submat.h:325
virtual SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
Definition: gimbal.cc:391
const Vec3 Zero3(0., 0., 0.)
void AssVec(SubVectorHandler &WorkVec, doublereal dCoef)
Definition: gimbal.cc:314
long int flag
Definition: mbdyn.h:43
virtual bool bToBeOutput(void) const
Definition: output.cc:890
const StructNode * pNode1
Definition: gimbal.h:47
#define MBDYN_EXCEPT_ARGS
Definition: except.h:63
Definition: matvec3.h:98
GradientExpression< UnaryExpr< FuncSin, Expr > > sin(const GradientExpression< Expr > &u)
Definition: gradient.h:2977
virtual void ResizeReset(integer)
Definition: vh.cc:55
const MatCross_Manip MatCross
Definition: matvec3.cc:639
FullSubMatrixHandler & SetFull(void)
Definition: submat.h:1168
virtual const Mat3x3 & GetRCurr(void) const
Definition: strnode.h:1012
virtual Node::Type GetNodeType(void) const
Definition: strnode.cc:145
void Add(integer iRow, integer iCol, const Vec3 &v)
Definition: submat.cc:209
std::ostream & Write(std::ostream &out, const FullMatrixHandler &m, const char *s, const char *s2)
Definition: fullmh.cc:376
virtual void Sub(integer iRow, const Vec3 &v)
Definition: vh.cc:78
const Mat3x3 R1h
Definition: gimbal.h:49
OrientationDescription
Definition: matvec3.h:1597
#define NO_OP
Definition: myassert.h:74
void IncCoef(integer iRow, integer iCol, const doublereal &dCoef)
Definition: submat.h:683
Vec3 GetVec(unsigned short int i) const
Definition: matvec3.h:893
virtual VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
Definition: gimbal.cc:352
Vec3 VecRot(const Mat3x3 &Phi)
Definition: Rot.cc:136
void DecCoef(integer iRow, integer iCol, const doublereal &dCoef)
Definition: submat.h:694
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
virtual void DecCoef(integer iRow, const doublereal &dCoef)=0
const StructNode * pNode2
Definition: gimbal.h:48
doublereal dTheta
Definition: gimbal.h:53
OrientationDescription od
Definition: gimbal.h:55
virtual VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Definition: gimbal.cc:133
Vec3 MatR2EulerAngles313(const Mat3x3 &R)
Definition: matvec3.cc:927
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Definition: gimbal.cc:275
GimbalRotationJoint(unsigned int uL, const DofOwner *pDO, const StructNode *pN1, const StructNode *pN2, const Mat3x3 &R1, const Mat3x3 &R2, const OrientationDescription &od, flag fOut)
Definition: gimbal.cc:43
virtual unsigned int iGetNumPrivData(void) const
Definition: gimbal.cc:424
#define DEBUGCOUT(msg)
Definition: myassert.h:232
Vec3 MatR2EulerAngles123(const Mat3x3 &R)
Definition: matvec3.cc:893
virtual ~GimbalRotationJoint(void)
Definition: gimbal.cc:64
Mat3x3 Rot(const Vec3 &phi)
Definition: Rot.cc:62
virtual integer iGetFirstMomentumIndex(void) const =0
virtual integer iGetFirstPositionIndex(void) const
Definition: strnode.h:452
const doublereal dRaDegr
Definition: matvec3.cc:884
virtual std::ostream & Restart(std::ostream &out) const
Definition: joint.h:195
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Definition: gimbal.h:98
std::ostream & Joints(void) const
Definition: output.h:443
#define ASSERT(expression)
Definition: colamd.c:977
VectorExpression< VectorCrossExpr< VectorLhsExpr, VectorRhsExpr >, 3 > Cross(const VectorExpression< VectorLhsExpr, 3 > &u, const VectorExpression< VectorRhsExpr, 3 > &v)
Definition: matvec.h:3248
virtual std::ostream & Restart(std::ostream &out) const
Definition: gimbal.cc:72
virtual void Add(integer iRow, const Vec3 &v)
Definition: vh.cc:63
virtual void InitialWorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Definition: gimbal.h:125
virtual void ResizeReset(integer, integer)
Definition: submat.cc:182
Mat3x3 Transpose(void) const
Definition: matvec3.h:816
#define STRLENOF(s)
Definition: mbdyn.h:166
Definition: elem.h:75
void PutRowIndex(integer iSubRow, integer iRow)
Definition: submat.h:311
Vec3 MatR2EulerAngles321(const Mat3x3 &R)
Definition: matvec3.cc:941
void Sub(integer iRow, integer iCol, const Vec3 &v)
Definition: submat.cc:215
const Mat3x3 R2h
Definition: gimbal.h:50
GradientExpression< UnaryExpr< FuncCos, Expr > > cos(const GradientExpression< Expr > &u)
Definition: gradient.h:2978
Definition: joint.h:50
virtual integer iGetFirstIndex(void) const
Definition: dofown.h:127
double doublereal
Definition: colamd.c:52
std::ostream & Output(std::ostream &out, const char *sJointName, unsigned int uLabel, const Vec3 &FLocal, const Vec3 &MLocal, const Vec3 &FGlobal, const Vec3 &MGlobal) const
Definition: joint.cc:138
long int integer
Definition: colamd.c:51
unsigned int GetLabel(void) const
Definition: withlab.cc:62
void AssMat(FullSubMatrixHandler &WM, doublereal dCoef)
Definition: gimbal.cc:183
virtual void AfterPredict(VectorHandler &X, VectorHandler &XP)
Definition: gimbal.cc:175
Mat3x3 R
doublereal dPhi
Definition: gimbal.h:53
virtual unsigned int iGetPrivDataIdx(const char *s) const
Definition: gimbal.cc:430