00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __rdModel_h__
00010 #define __rdModel_h__
00011
00012
00013 #include "rdSimulationDLL.h"
00014 #include <stdlib.h>
00015 #include <stdio.h>
00016 #include <string.h>
00017 #include <rdStorage.h>
00018
00019
00020 class rdBody;
00021 class rdAnalysis;
00022 class rdDerivCallback;
00023 class rdIntegCallbackSet;
00024
00025 const int rdModel_ANALYSIS_LIMIT = 100;
00026 const int rdModel_CALLBACK_LIMIT = 100;
00027 const int rdModel_MAXLEN = 1048;
00028 const int rdModel_NAME_LENGTH = 64;
00029
00030
00031
00032
00039 class RDSIMULATION_API rdModel
00040 {
00041
00042
00043
00044
00045 public:
00047 static const int ANALYSIS_LIMIT;
00050 static const int CALLBACK_LIMIT;
00052 static const int MAXLEN;
00054 static const int NAME_LENGTH;
00056 static const char *DEFAULT_NAME;
00057
00058 protected:
00060 int _nx;
00062 int _nq;
00064 int _nu;
00066 int _ny;
00070 int _nyp;
00072 int _nj;
00074 int _nb;
00076 int _na;
00078 int _np;
00079
00081 char _name[rdModel_MAXLEN];
00083 char **_bNames;
00085 char **_qNames;
00087 char **_uNames;
00089 char **_yNames;
00091 char **_ypNames;
00093 char **_xNames;
00095 char **_aNames;
00096
00098 double _g[3];
00099
00101 double _t;
00103 double _tNormConst;
00105 double *_x;
00107 double *_yi;
00109 double *_ypi;
00111 double *_q;
00113 double *_u;
00115 double *_dudt;
00117 rdBody **_b;
00118
00120 int _nAnalyses;
00122 rdAnalysis *_analyses[rdModel_ANALYSIS_LIMIT];
00123
00125 int _nDerivCallbacks;
00126 rdDerivCallback *_derivCallbacks[rdModel_CALLBACK_LIMIT];
00127
00129 rdIntegCallbackSet *_integCallbackSet;
00130
00131
00132
00133
00134
00135
00136
00137
00138 public:
00139 rdModel();
00140 virtual ~rdModel();
00141 private:
00142 void setNull();
00143 void removeFromCallbacks();
00144
00145 public:
00146
00147
00148
00149 int getNX() const;
00150 int getNQ() const;
00151 int getNU() const;
00152 int getNY() const;
00153 int getNYP() const;
00154 int getNB() const;
00155 int getNJ() const;
00156 int getNA() const;
00157 int getNP() const;
00158
00159
00160
00161
00162 protected:
00163 virtual void setBodyName(int aIndex,const char *aName);
00164 virtual void setCoordinateName(int aIndex,const char *aName);
00165 virtual void setSpeedName(int aIndex,const char *aName);
00166 virtual void setActuatorName(int aIndex,const char *aName);
00167 virtual void setControlName(int aIndex,const char *aName);
00168 virtual void setStateName(int aIndex,const char *aName);
00169 virtual void setPseudoStateName(int aIndex,const char *aName);
00170 public:
00171 void setName(const char *aName);
00172 const char* getName() const;
00173 const char* getBodyName(int aIndex) const;
00174 const char* getCoordinateName(int aIndex) const;
00175 const char* getSpeedName(int aIndex) const;
00176 const char* getActuatorName(int aIndex) const;
00177 const char* getControlName(int aIndex) const;
00178 const char* getStateName(int aIndex) const;
00179 const char* getPseudoStateName(int aIndex) const;
00180
00181
00182
00183
00184 int getBodyIndex(const char *aName) const;
00185 int getCoordinateIndex(const char *aName) const;
00186 int getSpeedIndex(const char *aName) const;
00187 int getActuatorIndex(const char *aName) const;
00188 int getControlIndex(const char *aName) const;
00189 int getStateIndex(const char *aName) const;
00190 int getPseudoStateIndex(const char *aName) const;
00191
00192
00193
00194
00195 virtual void set(double aT,const double aX[],const double aY[]);
00196
00197
00198
00199
00200 virtual void setTime(double aT);
00201 double getTime() const;
00202
00203
00204
00205
00206 virtual void setTimeNormConstant(double aNormConst);
00207 double getTimeNormConstant() const;
00208
00209
00210
00211
00212 virtual void setControls(const double aX[]);
00213 virtual void setControl(int aIndex,double aValue);
00214 virtual void setControl(const char *aName,double aValue);
00215 virtual void getControls(double rX[]) const;
00216 virtual double getControl(int aIndex) const;
00217 double getControl(const char *aName) const;
00218
00219
00220
00221
00222 virtual void setInitialStates(const double aYI[]);
00223 virtual void getInitialStates(double rYI[]) const;
00224 virtual double getInitialState(int aIndex) const;
00225 double getInitialState(const char *aName) const;
00226
00227
00228
00229
00230 virtual void setStates(const double aY[]) = 0;
00231 virtual void getStates(double rY[]) const = 0;
00232 virtual double getState(int aIndex) const = 0;
00233 double getState(const char *aName) const;
00234
00235
00236
00237
00238 virtual void setInitialPseudoStates(const double aYPI[]);
00239 virtual void getInitialPseudoStates(double rYPI[]) const;
00240 virtual double getInitialPseudoState(int aIndex) const;
00241 double getInitialPseudoState(const char *aName) const;
00242
00243
00244
00245
00246 virtual void setPseudoStates(const double aYP[]);
00247 virtual void getPseudoStates(double rYP[]) const;
00248 virtual double getPseudoState(int aIndex) const;
00249 double getPseudoState(const char *aName) const;
00250
00251
00252
00253
00254 virtual void setConfiguration(const double aY[]);
00255 virtual void setConfiguration(const double aQ[],const double aU[]);
00256 void getCoordinates(double rQ[]) const;
00257 double getCoordinate(int aIndex) const;
00258 double getCoordinate(const char *aName) const;
00259 void getSpeeds(double rU[]) const;
00260 double getSpeed(int aIndex) const;
00261 double getSpeed(const char *aName) const;
00262 void getAccelerations(double rDUDT[]) const;
00263 double getAcceleration(int aIndex) const;
00264 double getAcceleration(const char *aSpeedName) const;
00265 virtual void
00266 extractConfiguration(const double aY[],double rQ[],double rU[]) const;
00267
00268
00269
00270
00271 virtual void getGravity(double rGrav[3]) const;
00272 virtual void setGravity(double aGrav[3]);
00273
00274
00275
00276
00277 virtual int getGroundID() const = 0;
00278 virtual void getBodyToJointBodyLocal(int aBody,double rBTJ[3]) const = 0;
00279 virtual void getInboardToJointBodyLocal(int aBody,double rBTJ[3]) const = 0;
00280
00281
00282
00283
00284 virtual double getMass(int aBody) const = 0;
00285 virtual int getInertiaBodyLocal(int aBody,double rI[3][3]) const = 0;
00286 virtual int
00287 getInertiaBodyLocal(int aBody,double *rI) const = 0;
00288 virtual void
00289 getSystemInertia(double *rM,double rCOM[3],double rI[3][3]) const = 0;
00290 virtual void
00291 getSystemInertia(double *rM,double *rCOM,double *rI) const = 0;
00292
00293
00294
00295
00296 virtual void
00297 getPosition(int aBody,const double aPoint[3],double rPos[3])
00298 const = 0;
00299 virtual void
00300 getVelocity(int aBody,const double aPoint[3],double rVel[3])
00301 const = 0;
00302 virtual void
00303 getAcceleration(int aBody,const double aPoint[3],double rAcc[3])
00304 const = 0;
00305 virtual void
00306 getDirectionCosines(int aBody,double rDirCos[3][3]) const = 0;
00307 virtual void
00308 getDirectionCosines(int aBody,double *rDirCos) const = 0;
00309 virtual void
00310 getAngularVelocity(int aBody,double rAngVel[3]) const = 0;
00311 virtual void
00312 getAngularVelocityBodyLocal(int aBody,double rAngVel[3]) const = 0;
00313 virtual void
00314 getAngularAcceleration(int aBody,double rAngAcc[3]) const = 0;
00315 virtual void
00316 getAngularAccelerationBodyLocal(int aBody,double rAngAcc[3]) const = 0;
00317
00318
00319
00320
00321
00322 virtual void
00323 applyForce(int aBody,const double aPoint[3],const double aForce[3]) = 0;
00324 virtual void
00325 applyForces(int aN,const int aBodies[],const double aPoints[][3],
00326 const double aForces[][3]) = 0;
00327 virtual void
00328 applyForces(int aN,const int aBodies[],const double *aPoints,
00329 const double *aForces) = 0;
00330
00331
00332 virtual void
00333 applyForceBodyLocal(int aBody,const double aPoint[3],
00334 const double aForce[3]) = 0;
00335 virtual void
00336 applyForcesBodyLocal(int aN,const int aBodies[],
00337 const double aPoints[][3],const double aForces[][3])= 0;
00338 virtual void
00339 applyForcesBodyLocal(int aN,const int aBodies[],const double *aPoints,
00340 const double *aForces) = 0;
00341
00342
00343 virtual void
00344 applyTorque(int aBody,const double aTorque[3]) = 0;
00345 virtual void
00346 applyTorques(int aN,const int aBodies[],const double aTorques[][3]) = 0;
00347 virtual void
00348 applyTorques(int aN,const int aBodies[],const double *aTorques) = 0;
00349
00350
00351 virtual void
00352 applyTorqueBodyLocal(int aBody,const double aTorque[3]) = 0;
00353 virtual void
00354 applyTorquesBodyLocal(int aN,const int aBodies[],
00355 const double aTorques[][3]) = 0;
00356 virtual void
00357 applyTorquesBodyLocal(int aN,const int aBodies[],
00358 const double *aTorques) = 0;
00359
00360
00361 virtual void
00362 applyGeneralizedForce(int aU,double aF) = 0;
00363 virtual void
00364 applyGeneralizedForces(const double aF[]) = 0;
00365 virtual void
00366 applyGeneralizedForces(int aN,const int aU[],const double aF[]) = 0;
00367
00368
00369
00370
00371 virtual double
00372 getNetAppliedGeneralizedForce(int aU) const = 0;
00373 virtual void
00374 computeGeneralizedForces(double aDUDT[],double rF[]) const = 0;
00375
00376
00377
00378
00379 virtual int
00380 computeAccelerations(double *dqdt,double *dudt) = 0;
00381 virtual void formMassMatrix(double *rI) = 0;
00382 virtual void formEulerTransform(int aBody,double *rE) const = 0;
00383 virtual void
00384 formJacobianTranslation(int aBody,const double aPoint[3],double *rJ,
00385 int aRefBody=-1) const = 0;
00386 virtual void
00387 formJacobianOrientation(int aBody,double *rJ0,int aRefBody=-1) const = 0;
00388 virtual void
00389 formJacobianEuler(int aBody,double *rJE,int aRefBody=-1) const = 0;
00390 static int
00391 ComputeEffectiveMassMatrix(int aNJX,int aNU,const double *aJ,
00392 const double *aIinv,double *rIeff);
00393 static int
00394 ComputeJacobianInverse(int aNJX,int aNU,const double *aJ,
00395 const double *aI,double *rJInv);
00396
00397
00398
00399
00400 virtual int
00401 deriv(double t,double *xt,double *y,double *dy) = 0;
00402 virtual int
00403 deriv(double t,double *xt,double *y,double *dqdt,double *dudt) = 0;
00404
00405
00406
00407
00408 virtual void
00409 promoteControlsToStates(const double aX[],double aDT);
00410 virtual int
00411 computePerformance(double t,double *x,double *y,double *p,
00412 void *cd=NULL);
00413 virtual int
00414 computeConstraint(double t,double *x,double *y,int ic,double *c,
00415 void *cd=NULL);
00416
00417
00418
00419
00420
00421 virtual void
00422 transform(int aBody1,const double aVec1[3],int aBody2,
00423 double rVec2[3]) const = 0;
00424
00425 virtual void
00426 convertQuaternionsToAngles(double *aQ,double *rQAng) const = 0;
00427 virtual void
00428 convertQuaternionsToAngles(rdStorage *rQStore) const = 0;
00429 virtual void
00430 convertAnglesToQuaternions(double *aQAng,double *rQ) const = 0;
00431 virtual void
00432 convertAnglesToQuaternions(rdStorage *rQStore) const = 0;
00433
00434 virtual void
00435 convertRadiansToDegrees(double *aQRad,double *rQDeg) const = 0;
00436 virtual void
00437 convertRadiansToDegrees(rdStorage *rQStore) const = 0;
00438 virtual void
00439 convertDegreesToRadians(double *aQDeg,double *rQRad) const = 0;
00440 virtual void
00441 convertDegreesToRadians(rdStorage *rQStore) const = 0;
00442
00443 virtual void
00444 convertAnglesToDirectionCosines(double aE1,double aE2,double aE3,
00445 double rDirCos[3][3]) const = 0;
00446 virtual void
00447 convertAnglesToDirectionCosines(double aE1,double aE2,double aE3,
00448 double *rDirCos) const = 0;
00449
00450 virtual void
00451 convertDirectionCosinesToAngles(double aDirCos[3][3],
00452 double *rE1,double *rE2,double *rE3) const = 0;
00453 virtual void
00454 convertDirectionCosinesToAngles(double *aDirCos,
00455 double *rE1,double *rE2,double *rE3) const = 0;
00456
00457 virtual void
00458 convertDirectionCosinesToQuaternions(double aDirCos[3][3],
00459 double *rQ1,double *rQ2,double *rQ3,double *rQ4) const = 0;
00460 virtual void
00461 convertDirectionCosinesToQuaternions(double *aDirCos,
00462 double *rQ1,double *rQ2,double *rQ3,double *rQ4) const = 0;
00463
00464 virtual void
00465 convertQuaternionsToDirectionCosines(
00466 double aQ1,double aQ2,double aQ3,double aQ4,double rDirCos[3][3])
00467 const = 0;
00468 virtual void
00469 convertQuaternionsToDirectionCosines(
00470 double aQ1,double aQ2,double aQ3,double aQ4,double *rDirCos)
00471 const = 0;
00472
00473
00474
00475
00476 virtual void computeActuation();
00477 virtual void applyActuatorForce(int aID);
00478 virtual void applyActuatorForces();
00479 virtual void setActuatorForce(int aID,double aForce);
00480 virtual double getActuatorForce(int aID) const;
00481 virtual double getActuatorSpeed(int aID) const;
00482 virtual double getActuatorPower(int aID) const;
00483
00484
00485
00486
00487 virtual void
00488 computeContact();
00489 virtual void
00490 applyContactForce(int aID);
00491 virtual void
00492 applyContactForces();
00493 virtual int
00494 getContactBodyA(int aID) const;
00495 virtual int
00496 getContactBodyB(int aID) const;
00497 virtual void
00498 setContactPointA(int aID,const double aPoint[3]);
00499 virtual void
00500 getContactPointA(int aID,double rPoint[3]) const;
00501 virtual void
00502 setContactPointB(int aID,const double aPoint[3]);
00503 virtual void
00504 getContactPointB(int aID,double rPoint[3]) const;
00505 virtual void
00506 getContactForce(int aID,double rF[3]) const;
00507 virtual void
00508 getContactNormalForce(int aID,double rFP[3],double rFV[3],double rF[3])
00509 const;
00510 virtual void
00511 getContactTangentForce(int aID,double rFP[3],double rFV[3],double rF[3])
00512 const;
00513 virtual void
00514 getContactStiffness(int aID,const double aDX[3],double rDF[3]) const;
00515 virtual void
00516 getContactViscosity(int aID,const double aDV[3],double rDF[3]) const;
00517 virtual void
00518 getContactFrictionCorrection(int aID,double aDFFric[3]) const;
00519 virtual double
00520 getContactForce(int aID) const;
00521 virtual double
00522 getContactSpeed(int aID) const;
00523 virtual double
00524 getContactPower(int aID) const;
00525
00526
00527
00528
00529 int getNumAnalyses();
00530 rdAnalysis* getAnalysis(int aIndex);
00531 int addAnalysis(rdAnalysis *aAnalysis);
00532 rdAnalysis* removeAnalysis(int aIndex);
00533 void turnOffAnalyses();
00534 void turnOnAnalyses();
00535 void listAnalyses();
00536
00537
00538
00539
00540 int getNumDerivCallbacks() const;
00541 int getDerivCallbackIndex(rdDerivCallback *aCallback) const;
00542 rdDerivCallback* getDerivCallback(int aIndex) const;
00543 int addDerivCallback(rdDerivCallback *aCallback);
00544 rdDerivCallback* removeDerivCallback(int aIndex);
00545 rdDerivCallback* removeDerivCallback(rdDerivCallback *aCallback);
00546 void makeDerivCallbacksConsecutive();
00547 void turnOffDerivCallbacks();
00548 void turnOnDerivCallbacks();
00549 void listDerivCallbacks();
00550 void callSetCallbacks(double aT,double *aX,double *aY);
00551 void callComputeContactCallbacks(double aT,double *aX,double *aY);
00552 void callApplyContactCallbacks(double aT,double *aX,double *aY);
00553 void callComputeActuationCallbacks(double aT,double *aX,double *aY);
00554 void callApplyActuationCallbacks(double aT,double *aX,double *aY);
00555 void callComputeDerivativesCallbacks(double aT,double *aX,double *aY,
00556 double *aDY);
00557
00558
00559
00560
00561 rdIntegCallbackSet* getIntegCallbackSet();
00562
00563
00564 virtual void
00565 integBeginCallback(int aStep,double aDT,double aT,
00566 double *aX,double *aY,void *aClientData=NULL);
00567 virtual void
00568 integStepCallback(double *aXPrev,double *aYPrev,int aStep,double aDT,
00569 double aT,double *aX,double *aY,
00570 void *aClientData=NULL);
00571 virtual void
00572 integEndCallback(int aStep,double aDT,double aT,double *aX,double *aY,
00573 void *aClientData=NULL);
00574
00575
00576 };
00577
00578
00579
00580
00581 #endif // __rdModel_h__
00582
00583