#include "models/propulsion/FGForce.h"
#include "math/FGColumnVector3.h"
-#include "math/FGMatrix33.h"
#include "math/LagrangeMultiplier.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#define ID_LGEAR "$Id: FGLGear.h,v 1.47 2011/08/30 21:05:56 bcoconni Exp $"
+#define ID_LGEAR "$Id: FGLGear.h,v 1.54 2012/04/01 17:05:51 bcoconni Exp $"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FORWARD DECLARATIONS
</contact>
@endcode
@author Jon S. Berndt
- @version $Id: FGLGear.h,v 1.47 2011/08/30 21:05:56 bcoconni Exp $
+ @version $Id: FGLGear.h,v 1.54 2012/04/01 17:05:51 bcoconni Exp $
@see Richard E. McFarland, "A Standard Kinematic Model for Flight Simulation at
NASA-Ames", NASA CR-2497, January 1975
@see Barnes W. McCormick, "Aerodynamics, Aeronautics, and Flight Mechanics",
FGMatrix33 Tec2b;
FGColumnVector3 PQR;
FGColumnVector3 UVW;
+ FGColumnVector3 vXYZcg; // CG coordinates expressed in the structural frame
FGLocation Location;
std::vector <double> SteerPosDeg;
std::vector <double> BrakePos;
- std::vector <FGColumnVector3> vWhlBodyVec;
double FCSGearPos;
double EmptyWeight;
};
~FGLGear();
/// The Force vector for this gear
- FGColumnVector3& GetBodyForces(void);
+ const FGColumnVector3& GetBodyForces(void);
/// Gets the location of the gear in Body axes
- FGColumnVector3 GetBodyLocation(void) const { return in.vWhlBodyVec[GearNumber]; }
- double GetBodyLocation(int idx) const { return in.vWhlBodyVec[GearNumber](idx); }
-
- FGColumnVector3& GetLocalGear(void) { return vLocalGear; }
+ FGColumnVector3 GetBodyLocation(void) const {
+ return Ts2b * (vXYZn - in.vXYZcg);
+ }
+ double GetBodyLocation(int idx) const {
+ FGColumnVector3 vWhlBodyVec = Ts2b * (vXYZn - in.vXYZcg);
+ return vWhlBodyVec(idx);
+ }
+
+ const FGColumnVector3& GetLocalGear(void) const { return vLocalGear; }
double GetLocalGear(int idx) const { return vLocalGear(idx); }
/// Gets the name of the gear
- string GetName(void) const {return name; }
+ const string& GetName(void) const {return name; }
/// Gets the Weight On Wheels flag value
- bool GetWOW(void) const {return WOW; }
+ bool GetWOW(void) const {return WOW; }
/// Gets the current compressed length of the gear in feet
double GetCompLen(void) const {return compressLength;}
/// Gets the current gear compression velocity in ft/sec
double GetCompVel(void) const {return compressSpeed; }
/// Gets the gear compression force in pounds
double GetCompForce(void) const {return StrutForce; }
- double GetBrakeFCoeff(void) const {return BrakeFCoeff;}
-
- /// Gets the current normalized tire pressure
- double GetTirePressure(void) const { return TirePressureNorm; }
- /// Sets the new normalized tire pressure
- void SetTirePressure(double p) { TirePressureNorm = p; }
-
- /// Sets the brake value in percent (0 - 100)
- void SetBrake(double bp) {brakePct = bp;}
/// Sets the weight-on-wheels flag.
void SetWOW(bool wow) {WOW = wow;}
/** Get the console touchdown reporting feature
@return true if reporting is turned on */
bool GetReport(void) const { return ReportEnable; }
- double GetSteerNorm(void) const { return radtodeg/maxSteerAngle*SteerAngle; }
+ double GetSteerNorm(void) const { return radtodeg/maxSteerAngle*SteerAngle; }
double GetDefaultSteerAngle(double cmd) const { return cmd*maxSteerAngle; }
double GetstaticFCoeff(void) const { return staticFCoeff; }
- int GetBrakeGroup(void) const { return (int)eBrakeGrp; }
- int GetSteerType(void) const { return (int)eSteerType; }
+ int GetBrakeGroup(void) const { return (int)eBrakeGrp; }
+ int GetSteerType(void) const { return (int)eSteerType; }
+
+ bool GetSteerable(void) const { return eSteerType != stFixed; }
+ bool GetRetractable(void) const { return isRetractable; }
+ bool GetGearUnitUp(void) const { return isRetractable ? (GetGearUnitPos() < 0.01) : false; }
+ bool GetGearUnitDown(void) const { return isRetractable ? (GetGearUnitPos() > 0.99) : true; }
- bool GetSteerable(void) const { return eSteerType != stFixed; }
- bool GetRetractable(void) const { return isRetractable; }
- bool GetGearUnitUp(void) const { return GearUp; }
- bool GetGearUnitDown(void) const { return GearDown; }
double GetWheelRollForce(void) {
UpdateForces();
FGColumnVector3 vForce = mTGear.Transposed() * FGForce::GetBodyForces();
double GetWheelSlipAngle(void) const { return WheelSlip; }
double GetWheelVel(int axis) const { return vWhlVelVec(axis);}
bool IsBogey(void) const { return (eContactType == ctBOGEY);}
- double GetGearUnitPos(void);
+ double GetGearUnitPos(void) const;
double GetSteerAngleDeg(void) const { return radtodeg*SteerAngle; }
const struct Inputs& in;
private:
int GearNumber;
- static const FGMatrix33 Tb2s;
+ static const FGMatrix33 Tb2s, Ts2b;
FGMatrix33 mTGear;
- FGColumnVector3 vGearOrient;
FGColumnVector3 vLocalGear;
- FGColumnVector3 vWhlVelVec, vLocalWhlVel; // Velocity of this wheel
- FGColumnVector3 normal, vGroundNormal;
- FGLocation contact, gearLoc;
+ FGColumnVector3 vWhlVelVec, vGroundWhlVel; // Velocity of this wheel
+ FGColumnVector3 vGroundNormal;
FGTable *ForceY_Table;
double SteerAngle;
double kSpring;
double compressSpeed;
double staticFCoeff, dynamicFCoeff, rollingFCoeff;
double Stiffness, Shape, Peak, Curvature; // Pacejka factors
- double brakePct;
double BrakeFCoeff;
double maxCompLen;
double SinkRate;
double MaximumStrutTravel;
double FCoeff;
double WheelSlip;
- double TirePressureNorm;
double GearPos;
- bool useFCSGearPos;
bool WOW;
bool lastWOW;
bool FirstContact;
bool TakeoffReported;
bool ReportEnable;
bool isRetractable;
- bool GearUp, GearDown;
- bool Servicable;
bool Castered;
bool StaticFriction;
std::string name;
- std::string sSteerType;
- std::string sBrakeGroup;
- std::string sRetractable;
- std::string sContactType;
BrakeGroup eBrakeGrp;
ContactType eContactType;
FGGroundReactions* GroundReactions;
FGPropertyManager* PropertyManager;
- void ComputeRetractionState(void);
+ mutable bool useFCSGearPos;
+
void ComputeBrakeForceCoefficient(void);
void ComputeSteeringAngle(void);
void ComputeSlipAngle(void);
void ComputeSideForceCoefficient(void);
void ComputeVerticalStrutForce(void);
- void ComputeGroundCoordSys(void);
+ void ComputeGroundFrame(void);
void ComputeJacobian(const FGColumnVector3& vWhlContactVec);
void UpdateForces(void);
void CrashDetect(void);