X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2Fmodels%2FFGLGear.h;h=c2d38a0c4843034ec20da9bc3bd3f73a7c152c6c;hb=642735ab18421db87a07d6841dd720fd4615bfff;hp=e35d2b7c40fc78bdba0fe656b8bf7c5fe986d008;hpb=3ec74d79c23347add2afa088b05ad29af975f65f;p=flightgear.git diff --git a/src/FDM/JSBSim/models/FGLGear.h b/src/FDM/JSBSim/models/FGLGear.h index e35d2b7c4..c2d38a0c4 100644 --- a/src/FDM/JSBSim/models/FGLGear.h +++ b/src/FDM/JSBSim/models/FGLGear.h @@ -4,7 +4,7 @@ Author: Jon S. Berndt Date started: 11/18/99 - ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) ------------- + ------------- Copyright (C) 1999 Jon S. Berndt (jon@jsbsim.org) ------------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software @@ -38,22 +38,17 @@ SENTRY INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ -#ifdef FGFS -# include -#endif - -#include -#include -#include -#include -#include #include +#include "models/propulsion/FGForce.h" +#include "math/FGColumnVector3.h" +#include "math/LagrangeMultiplier.h" + /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DEFINITIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ -#define ID_LGEAR "$Id$" +#define ID_LGEAR "$Id: FGLGear.h,v 1.54 2012/04/01 17:05:51 bcoconni Exp $" /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FORWARD DECLARATIONS @@ -61,12 +56,9 @@ FORWARD DECLARATIONS namespace JSBSim { -class FGAircraft; -class FGPropagate; -class FGFCS; -class FGState; -class FGMassBalance; -class FGAuxiliary; +class FGTable; +class Element; +class FGPropertyManager; /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CLASS DOCUMENTATION @@ -78,7 +70,7 @@ CLASS DOCUMENTATION are the parameters that can be specified in the config file for modeling landing gear:

- Physical Characteristics
+

Physical Characteristics

  1. X, Y, Z location, in inches in structural coordinate frame
  2. Spring constant, in lbs/ft
  3. @@ -86,15 +78,14 @@ CLASS DOCUMENTATION
  4. Dynamic Friction Coefficient
  5. Static Friction Coefficient

- Operational Properties
+

Operational Properties

  1. Name
  2. -
  3. Steerability attribute {one of STEERABLE | FIXED | CASTERED}
  4. Brake Group Membership {one of LEFT | CENTER | RIGHT | NOSE | TAIL | NONE}
  5. Max Steer Angle, in degrees

- Algorithm and Approach to Modeling
+

Algorithm and Approach to Modeling

  1. Find the location of the uncompressed landing gear relative to the CG of the aircraft. Remember, the structural coordinate frame that the aircraft is @@ -158,8 +149,35 @@ CLASS DOCUMENTATION (radius to wheel crossed into the wheel force). Both of these operands are in body frame.
+ +

Configuration File Format:

+@code + + + {number} + {number} + {number} + + + {number} + {number} + {number} + + {number} + {number} + {number} + {number} + {number} + {number} + {number | 0 | 360} + {NONE | LEFT | RIGHT | CENTER | NOSE | TAIL} + {0 | 1} + +
+
+@endcode @author Jon S. Berndt - @version $Id$ + @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", @@ -172,101 +190,129 @@ CLASS DOCUMENTATION CLASS DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ -class FGLGear : public FGJSBBase +class FGLGear : public FGForce { public: + struct Inputs { + double Vground; + double VcalibratedKts; + double Temperature; + double DistanceAGL; + double DistanceASL; + double TotalDeltaT; + bool TakeoffThrottle; + bool WOW; + FGMatrix33 Tb2l; + FGMatrix33 Tec2l; + FGMatrix33 Tec2b; + FGColumnVector3 PQR; + FGColumnVector3 UVW; + FGColumnVector3 vXYZcg; // CG coordinates expressed in the structural frame + FGLocation Location; + std::vector SteerPosDeg; + std::vector BrakePos; + double FCSGearPos; + double EmptyWeight; + }; + /// Brake grouping enumerators - enum BrakeGroup {bgNone=0, bgLeft, bgRight, bgCenter, bgNose, bgTail }; + enum BrakeGroup {bgNone=0, bgLeft, bgRight, bgCenter, bgNose, bgTail, bgNumBrakeGroups }; /// Steering group membership enumerators enum SteerType {stSteer, stFixed, stCaster}; + /// Contact point type + enum ContactType {ctBOGEY, ctSTRUCTURE}; /// Report type enumerators enum ReportType {erNone=0, erTakeoff, erLand}; + /// Damping types + enum DampType {dtLinear=0, dtSquare}; + /// Friction types + enum FrictionType {ftRoll=0, ftSide, ftDynamic}; /** Constructor @param el a pointer to the XML element that contains the CONTACT info. @param Executive a pointer to the parent executive object - @param File a pointer to the config file instance */ - FGLGear(Element* el, FGFDMExec* Executive, int number); - /** Constructor - @param lgear a reference to an existing FGLGear object */ - FGLGear(const FGLGear& lgear); + @param number integer identifier for this instance of FGLGear + */ + FGLGear(Element* el, FGFDMExec* Executive, int number, const struct Inputs& input); /// Destructor ~FGLGear(); - /// The Force vector for this gear - FGColumnVector3& Force(void); - /// The Moment vector for this gear - FGColumnVector3& Moment(void) {return vMoment;} + const FGColumnVector3& GetBodyForces(void); /// Gets the location of the gear in Body axes - FGColumnVector3& GetBodyLocation(void) { return vWhlBodyVec; } - double GetBodyLocation(int idx) { return vWhlBodyVec(idx); } + FGColumnVector3 GetBodyLocation(void) const { + return Ts2b * (vXYZn - in.vXYZcg); + } + double GetBodyLocation(int idx) const { + FGColumnVector3 vWhlBodyVec = Ts2b * (vXYZn - in.vXYZcg); + return vWhlBodyVec(idx); + } - FGColumnVector3& GetLocalGear(void) { return vLocalGear; } - double GetLocalGear(int idx) { return vLocalGear(idx); } + const FGColumnVector3& GetLocalGear(void) const { return vLocalGear; } + double GetLocalGear(int idx) const { return vLocalGear(idx); } /// Gets the name of the gear - inline string GetName(void) {return name; } + const string& GetName(void) const {return name; } /// Gets the Weight On Wheels flag value - inline bool GetWOW(void) {return WOW; } + bool GetWOW(void) const {return WOW; } /// Gets the current compressed length of the gear in feet - inline double GetCompLen(void) {return compressLength;} + double GetCompLen(void) const {return compressLength;} /// Gets the current gear compression velocity in ft/sec - inline double GetCompVel(void) {return compressSpeed; } + double GetCompVel(void) const {return compressSpeed; } /// Gets the gear compression force in pounds - inline double GetCompForce(void) {return Force()(3); } - inline double GetBrakeFCoeff(void) {return BrakeFCoeff;} - - /// Gets the current normalized tire pressure - inline double GetTirePressure(void) { return TirePressureNorm; } - /// Sets the new normalized tire pressure - inline void SetTirePressure(double p) { TirePressureNorm = p; } + double GetCompForce(void) const {return StrutForce; } - /// Sets the brake value in percent (0 - 100) - inline void SetBrake(double bp) {brakePct = bp;} + /// Sets the weight-on-wheels flag. + void SetWOW(bool wow) {WOW = wow;} /** Set the console touchdown reporting feature @param flag true turns on touchdown reporting, false turns it off */ - inline void SetReport(bool flag) { ReportEnable = flag; } + void SetReport(bool flag) { ReportEnable = flag; } /** Get the console touchdown reporting feature @return true if reporting is turned on */ - inline bool GetReport(void) { return ReportEnable; } + bool GetReport(void) const { return ReportEnable; } double GetSteerNorm(void) const { return radtodeg/maxSteerAngle*SteerAngle; } double GetDefaultSteerAngle(double cmd) const { return cmd*maxSteerAngle; } - double GetstaticFCoeff(void) { return staticFCoeff; } - - inline int GetBrakeGroup(void) { return (int)eBrakeGrp; } - inline int GetSteerType(void) { return (int)eSteerType; } - - bool GetSteerable(void) const { return eSteerType != stFixed; } - inline bool GetRetractable(void) { return isRetractable; } - inline bool GetGearUnitUp(void) { return GearUp; } - inline bool GetGearUnitDown(void) { return GearDown; } - inline double GetWheelSideForce(void) { return SideForce; } - inline double GetWheelRollForce(void) { return RollingForce; } - inline double GetBodyXForce(void) { return vLocalForce(eX); } - inline double GetBodyYForce(void) { return vLocalForce(eY); } - inline double GetWheelSlipAngle(void) { return WheelSlip; } - double GetWheelVel(int axis) { return vWhlVelVec(axis);} - - bool IsBogey(void) {return (sContactType == string("BOGEY"));} + double GetstaticFCoeff(void) const { return staticFCoeff; } + + 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; } + + double GetWheelRollForce(void) { + UpdateForces(); + FGColumnVector3 vForce = mTGear.Transposed() * FGForce::GetBodyForces(); + return vForce(eX)*cos(SteerAngle) + vForce(eY)*sin(SteerAngle); } + double GetWheelSideForce(void) { + UpdateForces(); + FGColumnVector3 vForce = mTGear.Transposed() * FGForce::GetBodyForces(); + return vForce(eY)*cos(SteerAngle) - vForce(eX)*sin(SteerAngle); } + double GetWheelRollVel(void) const { return vWhlVelVec(eX)*cos(SteerAngle) + + vWhlVelVec(eY)*sin(SteerAngle); } + double GetWheelSideVel(void) const { return vWhlVelVec(eY)*cos(SteerAngle) + - vWhlVelVec(eX)*sin(SteerAngle); } + double GetWheelSlipAngle(void) const { return WheelSlip; } + double GetWheelVel(int axis) const { return vWhlVelVec(axis);} + bool IsBogey(void) const { return (eContactType == ctBOGEY);} + double GetGearUnitPos(void) const; + double GetSteerAngleDeg(void) const { return radtodeg*SteerAngle; } + + const struct Inputs& in; void bind(void); - void unbind(void); private: int GearNumber; - FGColumnVector3 vXYZ; - FGColumnVector3 vMoment; - FGColumnVector3 vWhlBodyVec; + static const FGMatrix33 Tb2s, Ts2b; + FGMatrix33 mTGear; FGColumnVector3 vLocalGear; - FGColumnVector3 vForce; - FGColumnVector3 last_vForce; // remove this - FGColumnVector3 vLocalForce; - FGColumnVector3 vWhlVelVec; // Velocity of this wheel (Local) - FGColumnVector3 prevOut, prevIn; + FGColumnVector3 vWhlVelVec, vGroundWhlVel; // Velocity of this wheel + FGColumnVector3 vGroundNormal; FGTable *ForceY_Table; - double dT; double SteerAngle; double kSpring; double bDamp; @@ -274,7 +320,7 @@ private: double compressLength; double compressSpeed; double staticFCoeff, dynamicFCoeff, rollingFCoeff; - double brakePct; + double Stiffness, Shape, Peak, Curvature; // Pacejka factors double BrakeFCoeff; double maxCompLen; double SinkRate; @@ -282,15 +328,11 @@ private: double TakeoffDistanceTraveled; double TakeoffDistanceTraveled50ft; double LandingDistanceTraveled; - double MaximumStrutForce; + double MaximumStrutForce, StrutForce; double MaximumStrutTravel; - double SideWhlVel, RollingWhlVel; - double RollingForce, SideForce, FCoeff; + double FCoeff; double WheelSlip; - double prevSlipIn; - double prevSlipOut; - double TirePressureNorm; - double SinWheel, CosWheel; + double GearPos; bool WOW; bool lastWOW; bool FirstContact; @@ -299,37 +341,32 @@ private: bool TakeoffReported; bool ReportEnable; bool isRetractable; - bool GearUp, GearDown; - bool Servicable; - string name; - string sSteerType; - string sBrakeGroup; - string sRetractable; - string sContactType; - - BrakeGroup eBrakeGrp; - SteerType eSteerType; + bool Castered; + bool StaticFriction; + std::string name; + + BrakeGroup eBrakeGrp; + ContactType eContactType; + SteerType eSteerType; + DampType eDampType; + DampType eDampTypeRebound; double maxSteerAngle; - double RFRV; // Rolling force relaxation velocity - double SFRV; // Side force relaxation velocity - double LongForceLagFilterCoeff; // Longitudinal Force Lag Filter Coefficient - double LatForceLagFilterCoeff; // Lateral Force Lag Filter Coefficient - double WheelSlipLagFilterCoeff; // Wheel slip angle lag filter coefficient - - FGFDMExec* Exec; - FGState* State; - FGAircraft* Aircraft; - FGPropagate* Propagate; - FGAuxiliary* Auxiliary; - FGFCS* FCS; - FGMassBalance* MassBalance; - - void ComputeRetractionState(void); + + LagrangeMultiplier LMultiplier[3]; + + FGGroundReactions* GroundReactions; + FGPropertyManager* PropertyManager; + + mutable bool useFCSGearPos; + void ComputeBrakeForceCoefficient(void); void ComputeSteeringAngle(void); void ComputeSlipAngle(void); void ComputeSideForceCoefficient(void); void ComputeVerticalStrutForce(void); + void ComputeGroundFrame(void); + void ComputeJacobian(const FGColumnVector3& vWhlContactVec); + void UpdateForces(void); void CrashDetect(void); void InitializeReporting(void); void ResetReporting(void); @@ -338,12 +375,6 @@ private: void Debug(int from); }; } -#include "FGAircraft.h" -#include "FGPropagate.h" -#include "FGAuxiliary.h" -#include "FGFCS.h" -#include "FGMassBalance.h" -#include "FGState.h" //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%