X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2FFGTrim.h;h=6d8069813705b390642b406414e2d1ab678930a3;hb=fbee3d10f0aafd4178fc1313edb8593c156b2874;hp=c7088fa1c87360f154ab370dcb8185cb4ff4a68e;hpb=972bf2263094c9ff25ced601b0d6aac200916443;p=flightgear.git diff --git a/src/FDM/JSBSim/FGTrim.h b/src/FDM/JSBSim/FGTrim.h index c7088fa1c..6d8069813 100644 --- a/src/FDM/JSBSim/FGTrim.h +++ b/src/FDM/JSBSim/FGTrim.h @@ -1,4 +1,4 @@ -/******************************************************************************* +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Header: FGTrim.h Author: Tony Peden @@ -32,61 +32,117 @@ FUNCTIONAL DESCRIPTION -------------------------------------------------------------------------------- -This class takes the given set of IC's and finds the angle of attack, elevator, -and throttle setting required to fly steady level. This is currently for in-air -conditions only. It is implemented using an iterative, one-axis-at-a-time -scheme. +This class takes the given set of IC's and finds the aircraft state required to +maintain a specified flight condition. This flight condition can be +steady-level with non-zero sideslip, a steady turn, a pull-up or pushover. +On-ground conditions can be trimmed as well, but this is currently limited to +adjusting altitude and pitch angle only. It is implemented using an iterative, +one-axis-at-a-time scheme. - - -******************************************************************************** +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SENTRY -*******************************************************************************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #ifndef FGTRIM_H #define FGTRIM_H -/******************************************************************************* +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% INCLUDES -*******************************************************************************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #include "FGFDMExec.h" -#include "FGRotation.h" -#include "FGAtmosphere.h" -#include "FGState.h" -#include "FGFCS.h" -#include "FGAircraft.h" -#include "FGTranslation.h" -#include "FGPosition.h" -#include "FGAuxiliary.h" -#include "FGOutput.h" -#include "FGTrim.h" +#include "FGJSBBase.h" #include "FGTrimAxis.h" -#include +#include -#define ID_TRIM "$Header" +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +DEFINITIONS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ -/******************************************************************************* -CLASS DECLARATION -*******************************************************************************/ +#define ID_TRIM "$Id$" + +#if defined(_WIN32) && !defined(__CYGWIN__) + #define snprintf _snprintf +#endif + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +FORWARD DECLARATIONS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +namespace JSBSim { -typedef enum { tLongitudinal, tFull, tGround } TrimMode; +typedef enum { tLongitudinal, tFull, tGround, tPullup, + tCustom, tNone, tTurn + } TrimMode; -class FGTrim { +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +CLASS DOCUMENTATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +/** FGTrim -- the trimming routine for JSBSim. + FGTrim finds the aircraft attitude and control settings needed to maintain + the steady state described by the FGInitialCondition object . It does this + iteratively by assigning a control to each state and adjusting that control + until the state is within a specified tolerance of zero. States include the + recti-linear accelerations udot, vdot, and wdot, the angular accelerations + qdot, pdot, and rdot, and the difference between heading and ground track. + Controls include the usual flight deck controls available to the pilot plus + angle of attack (alpha), sideslip angle(beta), flight path angle (gamma), + pitch attitude(theta), roll attitude(phi), and altitude above ground. The + last three are used for on-ground trimming. The state-control pairs used in + a given trim are completely user configurable and several pre-defined modes + are provided as well. They are: + - tLongitudinal: Trim wdot with alpha, udot with thrust, qdot with elevator + - tFull: tLongitudinal + vdot with phi, pdot with aileron, rdot with rudder + and heading minus ground track (hmgt) with beta + - tPullup: tLongitudinal but adjust alpha to achieve load factor input + with SetTargetNlf() + - tGround: wdot with altitude, qdot with theta, and pdot with phi + + The remaining modes include tCustom, which is completely user defined and + tNone. + + Note that trims can (and do) fail for reasons that are completely outside + the control of the trimming routine itself. The most common problem is the + initial conditions: is the model capable of steady state flight + at those conditions? Check the speed, altitude, configuration (flaps, + gear, etc.), weight, cg, and anything else that may be relevant. + + Example usage:
+    FGFDMExec* FDMExec = new FGFDMExec();
+
+    FGInitialCondition* fgic = new FGInitialCondition(FDMExec);
+    FGTrim *fgt(FDMExec,fgic,tFull);
+    fgic->SetVcaibratedKtsIC(100);
+    fgic->SetAltitudeFtIC(1000);
+    fgic->SetClimbRate(500);
+    if( !fgt->DoTrim() ) {
+      cout << "Trim Failed" << endl;
+    }
+    fgt->ReportState(); 
+ @author Tony Peden + @version "$Id$" +*/ + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +CLASS DECLARATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +class FGTrim : public FGJSBBase +{ private: vector TrimAxes; - int current_axis; + unsigned int current_axis; int N, Nsub; - int NumAxes; TrimMode mode; - int Debug; - float Tolerance, A_Tolerance; - float wdot,udot,qdot; - float dth; - float *sub_iterations; - float *successful; + int DebugLevel, Debug; + double Tolerance, A_Tolerance; + double wdot,udot,qdot; + double dth; + double *sub_iterations; + double *successful; bool *solution; int max_sub_iterations; int max_iterations; @@ -94,61 +150,147 @@ private: bool trimudot; bool gamma_fallback; bool trim_failed; - int axis_count; + unsigned int axis_count; int solutionDomain; - float xlo,xhi,alo,ahi; - + double xlo,xhi,alo,ahi; + double targetNlf; + int debug_axis; + + double psidot,thetadot; FGFDMExec* fdmex; FGInitialCondition* fgic; - - // returns false if there is no change in the current axis accel - // between accel(control_min) and accel(control_max). if there is a - // change, sets solutionDomain to: - // 0 for no sign change, - // -1 if sign change between accel(control_min) and accel(0) - // 1 if sign between accel(0) and accel(control_max) + bool solve(void); + + /** @return false if there is no change in the current axis accel + between accel(control_min) and accel(control_max). If there is a + change, sets solutionDomain to: + 0 for no sign change, + -1 if sign change between accel(control_min) and accel(0) + 1 if sign between accel(0) and accel(control_max) + */ bool findInterval(void); + bool checkLimits(void); + + void setupPullup(void); + void setupTurn(void); + + void updateRates(void); + + void setDebug(void); public: - FGTrim(FGFDMExec *FDMExec, FGInitialCondition *FGIC, TrimMode tt); + /** Initializes the trimming class + @param FDMExec pointer to a JSBSim executive object. + @param tm trim mode + */ + FGTrim(FGFDMExec *FDMExec, TrimMode tm=tGround ); + ~FGTrim(void); + /** Execute the trim + */ bool DoTrim(void); + /** Print the results of the trim. For each axis trimmed, this + includes the final state value, control value, and tolerance + used. + @return true if trim succeeds + */ void Report(void); - void ReportState(void); + + /** Iteration statistics + */ void TrimStats(); + + /** Clear all state-control pairs and set a predefined trim mode + @param tm the set of axes to trim. Can be: + tLongitudinal, tFull, tGround, tCustom, or tNone + */ + void SetMode(TrimMode tm); + + /** Clear all state-control pairs from the current configuration. + The trimming routine must have at least one state-control pair + configured to be useful + */ + void ClearStates(void); - inline void SetUdotTrim(bool bb) { trimudot=bb; } - inline bool GetUdotTrim(void) { return trimudot; } + /** Add a state-control pair to the current configuration. See the enums + State and Control in FGTrimAxis.h for the available options. + Will fail if the given state is already configured. + @param state the accel or other condition to zero + @param control the control used to zero the state + @return true if add is successful + */ + bool AddState( State state, Control control ); + + /** Remove a specific state-control pair from the current configuration + @param state the state to remove + @return true if removal is successful + */ + bool RemoveState( State state ); + + /** Change the control used to zero a state previously configured + @param state the accel or other condition to zero + @param new_control the control used to zero the state + */ + bool EditState( State state, Control new_control ); - inline void SetGammaFallback(bool bb) { gamma_fallback=true; } + /** automatically switch to trimming longitudinal acceleration with + flight path angle (gamma) once it becomes apparent that there + is not enough/too much thrust. + @param bb true to enable fallback + */ + inline void SetGammaFallback(bool bb) { gamma_fallback=bb; } + + /** query the fallback state + @return true if fallback is enabled. + */ inline bool GetGammaFallback(void) { return gamma_fallback; } + /** Set the iteration limit. DoTrim() will return false if limit + iterations are reached before trim is achieved. The default + is 60. This does not ordinarily need to be changed. + @param ii integer iteration limit + */ inline void SetMaxCycles(int ii) { max_iterations = ii; } + + /** Set the per-axis iteration limit. Attempt to zero each state + by iterating limit times before moving on to the next. The + default limit is 100 and also does not ordinarily need to + be changed. + @param ii integer iteration limit + */ inline void SetMaxCyclesPerAxis(int ii) { max_sub_iterations = ii; } - inline void SetTolerance(float tt) { + + /** Set the tolerance for declaring a state trimmed. Angular accels are + held to a tolerance of 1/10th of the given. The default is + 0.001 for the recti-linear accelerations and 0.0001 for the angular. + */ + inline void SetTolerance(double tt) { Tolerance = tt; A_Tolerance = tt / 10; } - //Debug level 1 shows results of each top-level iteration - //Debug level 2 shows level 1 & results of each per-axis iteration - inline void SetDebug(int level) { Debug = level; } - inline void ClearDebug(void) { Debug = 0; } + + /** + Debug level 1 shows results of each top-level iteration + Debug level 2 shows level 1 & results of each per-axis iteration + */ + inline void SetDebug(int level) { DebugLevel = level; } + inline void ClearDebug(void) { DebugLevel = 0; } + + /** + Output debug data for one of the axes + The State enum is defined in FGTrimAxis.h + */ + inline void DebugState(State state) { debug_axis=state; } + + inline void SetTargetNlf(float nlf) { targetNlf=nlf; } + inline double GetTargetNlf(void) { return targetNlf; } }; - +} #endif - - - - - - - - -