Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   Related Pages  

rdModel.h

00001 // rdModel.h
00002 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00003 // Copyright 2000-2003 Realistic Dynamics, Inc.
00004 // All rights reserved.
00005 //
00006 // Please do not read, copy, distribute, or use without permission.
00007 // Contact: Frank C. Anderson, fca@RealisticDynamics.com
00008 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00009 #ifndef __rdModel_h__
00010 #define __rdModel_h__
00011 
00012 // INCLUDES
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 // DATA
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 // METHODS
00134 //=============================================================================
00135    //--------------------------------------------------------------------------
00136    // CONSTRUCTION AND DESTRUCTION
00137    //--------------------------------------------------------------------------
00138 public:
00139    rdModel();
00140    virtual ~rdModel();
00141 private:
00142    void setNull();
00143    void removeFromCallbacks();
00144 
00145 public:
00146    //--------------------------------------------------------------------------
00147    // NUMBERS
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    // NAMES
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    // INDICES FROM NAMES
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    // SET CURRENT TIME, CONTROLS, AND STATES
00194    //--------------------------------------------------------------------------
00195    virtual void set(double aT,const double aX[],const double aY[]);
00196 
00197    //--------------------------------------------------------------------------
00198    // TIME
00199    //--------------------------------------------------------------------------
00200    virtual void setTime(double aT);
00201    double getTime() const;
00202 
00203    //--------------------------------------------------------------------------
00204    // TIME NORMALIZATION
00205    //--------------------------------------------------------------------------
00206    virtual void setTimeNormConstant(double aNormConst);
00207    double getTimeNormConstant() const;
00208    
00209    //--------------------------------------------------------------------------
00210    // CONTROLS
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    // INITIAL STATES
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    // STATES
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    // INITIAL PSEUDO STATES
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    // PSEUDO STATES
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    // CONFIGURATION
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    // GRAVITY
00270    //--------------------------------------------------------------------------
00271    virtual void getGravity(double rGrav[3]) const;
00272    virtual void setGravity(double aGrav[3]);
00273 
00274    //--------------------------------------------------------------------------
00275    // BODY INFORMATION
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    // INERTIA
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    // KINEMATICS
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    // LOAD APPLICATION
00320    //--------------------------------------------------------------------------
00321    // FORCES EXPRESSED IN INERTIAL FRAME
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    // FORCES EXPRESSED IN BODY-LOCAL FRAME
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    // TORQUES EXPRESSED IN INERTIAL FRAME
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    // TORQUES EXPRESSED IN BODY-LOCAL FRAME (sdbodyt())
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    // GENERALIZED FORCES
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    // LOAD ACCESS AND COMPUTATION
00370    //--------------------------------------------------------------------------
00371    virtual double
00372       getNetAppliedGeneralizedForce(int aU) const = 0;
00373    virtual void
00374       computeGeneralizedForces(double aDUDT[],double rF[]) const = 0;
00375 
00376    //--------------------------------------------------------------------------
00377    // EQUATIONS OF MOTION
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    // INTEGRATION
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    // OPTIMIZATION
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    // UTILITY
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    // ACTUATION
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    // CONTACT
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    // ANALYSIS
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    // DERIVATIVE CALLBACKS
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    // INTEGRATION CALLBACKS
00560    //--------------------------------------------------------------------------
00561    rdIntegCallbackSet* getIntegCallbackSet();
00562    // THESE METHODS BELOW HERE WILL BE OBSOLETED AND REPLACED BY THE
00563    // FUNCTIONALITY IN rdIntegCallbackSet.
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 }; // END of class rdModel
00577 //=============================================================================
00578 //=============================================================================
00579 
00580 
00581 #endif // __rdModel_h__
00582 
00583 

Generated on Wed Aug 20 02:17:06 2003 for Simulation Software by doxygen1.3