]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/FGTrim.h
Rob Deters: UIUC updates from March 1, 2004.
[flightgear.git] / src / FDM / JSBSim / FGTrim.h
index bdd3316becc379a47841710d393ca1d973dadb73..6d8069813705b390642b406414e2d1ab678930a3 100644 (file)
 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
@@ -50,16 +52,6 @@ INCLUDES
 
 #include "FGFDMExec.h"
 #include "FGJSBBase.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 "FGTrimAxis.h"
 
 #include <vector>
@@ -70,15 +62,19 @@ DEFINITIONS
 
 #define ID_TRIM "$Id$"
 
-typedef enum { tLongitudinal, tFull, tGround, tCustom, tNone } TrimMode;
+#if defined(_WIN32) && !defined(__CYGWIN__)
+  #define snprintf _snprintf
+#endif
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+namespace JSBSim {
+
+typedef enum { tLongitudinal, tFull, tGround, tPullup, 
+               tCustom, tNone, tTurn 
+             } TrimMode;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 CLASS DOCUMENTATION
@@ -97,28 +93,25 @@ CLASS DOCUMENTATION
     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:
-    <ul>
-    <li> tLongitudinal: Trim wdot with alpha, udot with thrust, qdot with elevator</li>
-    <li> tFull: tLongitudinal + vdot with phi, pdot with aileron, rdot with rudder
-                and heading minus ground track (hmgt) with beta</li>
-    <li> tGround: wdot with altitude, qdot with theta, and pdot with phi</li>
+    - 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 <b>tCustom</b>, which is completely user defined and
     <b>tNone</b>.
-    </ul>
-    Currently, this class cannot trim a non-1g condition and is limited to 
-    trimming for constant true airspeed in climbs and descents.
-    
+
     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:
+    Example usage:<pre>
     FGFDMExec* FDMExec = new FGFDMExec();
-    .
-    .
-    .
+
     FGInitialCondition* fgic = new FGInitialCondition(FDMExec);
     FGTrim *fgt(FDMExec,fgic,tFull);
     fgic->SetVcaibratedKtsIC(100);
@@ -127,9 +120,9 @@ CLASS DOCUMENTATION
     if( !fgt->DoTrim() ) {
       cout << "Trim Failed" << endl;
     }
-    fgt->ReportState();  
+    fgt->ReportState(); </pre>  
     @author Tony Peden
-    @version $Id$
+    @version "$Id$"
 */       
   
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -141,15 +134,15 @@ class FGTrim : public FGJSBBase
 private:
 
   vector<FGTrimAxis*> TrimAxes;
-  int current_axis;
+  unsigned int current_axis;
   int N, Nsub;
   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;
@@ -157,9 +150,13 @@ 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;
@@ -176,17 +173,22 @@ private:
   bool findInterval(void);
 
   bool checkLimits(void);
+  
+  void setupPullup(void);
+  void setupTurn(void);
+  
+  void updateRates(void);
+
+  void setDebug(void);
 
 public:
   /** Initializes the trimming class
       @param FDMExec pointer to a JSBSim executive object.
-      @param FGIC pointer to a FGInitialCondition object
-      @param TrimMode the set of axes to trim. Can be:
-             tLongitudinal, tFull, tGround, tCustom, or tNone
+      @param tm trim mode
   */
-  FGTrim(FGFDMExec *FDMExec, FGInitialCondition *FGIC, TrimMode tt);
+  FGTrim(FGFDMExec *FDMExec, TrimMode tm=tGround );
 
-    ~FGTrim(void);
+  ~FGTrim(void);
 
   /** Execute the trim
   */
@@ -202,6 +204,12 @@ public:
   /** 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
@@ -226,16 +234,16 @@ public:
   
   /** Change the control used to zero a state previously configured
       @param state the accel or other condition to zero 
-      @param control the control used to zero the state
+      @param new_control the control used to zero the state
   */
   bool EditState( State state, Control new_control );
 
   /** automatically switch to trimming longitudinal acceleration with
       flight path angle (gamma) once it becomes apparent that there
       is not enough/too much thrust.
-      @param gamma_fallback true to enable fallback
+      @param bb true to enable fallback
   */     
-  inline void SetGammaFallback(bool bb) { gamma_fallback=true; }
+  inline void SetGammaFallback(bool bb) { gamma_fallback=bb; }
   
   /** query the fallback state
       @return true if fallback is enabled.
@@ -261,26 +269,28 @@ public:
       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(float tt) {
+  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
-
-
-
-
-
-
-
-
-