00001
00002
00003
00004
00005 #ifndef __rdMuscleZajac_h__
00006 #define __rdMuscleZajac_h__
00007
00008
00009
00010
00011
00012 #include <rdMath.h>
00013 #include <rdTools.h>
00014 #include <rdStorage.h>
00015 #include <rdModel.h>
00016 #include <rdForce.h>
00017 #include "rdActuators.h"
00018
00019
00020
00021
00044 class RDACTUATORS_API rdMuscleZajac : public rdForce
00045 {
00046
00047
00048
00049 public:
00050
00051 static const char PROP_RISE_TIME[];
00052 static const char PROP_FALL_TIME[];
00053 static const char PROP_OPTIMAL_FORCE[];
00054 static const char PROP_OPTIMAL_FIBER_LENGTH[];
00055 static const char PROP_OPTIMAL_PENNATION_ANGLE[];
00056 static const char PROP_TENDON_SLACK_LENGTH[];
00057 static const char PROP_MAX_SHORTENING_VELOCITY[];
00058
00059 static const double C1;
00060 static const double C2;
00061 static const double PE1;
00062 static const double SIG0;
00063 static const double LMNORMMAX;
00064 static const double flcoef[][6];
00065 static const double fvcoef[][6];
00066
00067 protected:
00069 double _x;
00071 double _a;
00075 double _tRise;
00077 double _tFall;
00079 double _fmOpt;
00081 double _lmOpt;
00083 double _alphaOpt;
00086 double _vmMax;
00088 double _ltSlack;
00089
00091 double _lmOptRecip;
00093 double _width;
00095 double _widthSquared;
00097 double _ktRecip;
00099 double _ktLmOptRecip;
00100
00102 double _lmt;
00103
00104
00105
00106
00107 public:
00108 rdMuscleZajac(int aQID=-1,int aNX=1,int aNY=2,int aNYP=0);
00109 rdMuscleZajac(IDOM_Element *aElement,
00110 int aNX=1,int aNY=2,int aNYP=0);
00111 rdMuscleZajac(const rdMuscleZajac &aActuator);
00112 virtual ~rdMuscleZajac();
00113 virtual rdActuator* copy() const;
00114 virtual rdActuator* copy(IDOM_Element *aElement) const;
00115 private:
00116 void setNull();
00117 void copyData(const rdMuscleZajac &aActuator);
00118
00119 public:
00120
00121
00122
00123
00124 rdMuscleZajac&
00125 operator=(const rdMuscleZajac &aActuator);
00126
00127
00128
00129
00130 virtual void setControls(const double aX[]);
00131 virtual void getControls(double rX[]) const;
00132 virtual void setStates(const double aY[]);
00133 virtual void getStates(double rY[]) const;
00134 void setRiseTime(double aTime);
00135 double getRiseTime() const;
00136 void setFallTime(double aTime);
00137 double getFallTime() const;
00138 void setOptimalForce(double aForce);
00139 double getOptimalForce() const;
00140 void setOptimalFiberLength(double aLength);
00141 double getOptimalFiberLength() const;
00142 void setOptimalPennationAngle(double aAngle);
00143 double getOptimalPennationAngle() const;
00144 void setTendonSlackLength(double aLength);
00145 double getTendonSlackLength() const;
00146 void setMaxShorteningVelocity(double aVelocity);
00147 double getMaxShorteningVelocity() const;
00148
00149
00150
00151
00152
00153
00154
00155
00156 virtual void promoteControlsToStates(const double aX[],double aDT);
00157 virtual void computeActuation();
00158 virtual void computeStateDerivatives(double rDYDT[]);
00159 virtual double computeDFDT();
00160 static double ComputeForceLengthCurve(double aLmNorm);
00161 static double ComputeShorteningVelocity(double aFmNormIso,double aFmNorm);
00162
00163
00164
00165
00166 virtual void updateObject(bool aDeep=true);
00167 virtual void updateNode(bool aDeep=true);
00168 virtual void generateNode(IDOM_Element *aParent);
00169 void updateData();
00170
00171
00172 };
00173
00174
00175
00176
00177 #endif // #ifndef __rdMuscleZajac_h__