]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGAircraft.h
More JSBSim updates.
[flightgear.git] / src / FDM / JSBSim / FGAircraft.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2  
3  Header:       FGAircraft.h
4  Author:       Jon S. Berndt
5  Date started: 12/12/98
6  
7  ------------- Copyright (C) 1999  Jon S. Berndt (jsb@hal-pc.org) -------------
8  
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU General Public License as published by the Free Software
11  Foundation; either version 2 of the License, or (at your option) any later
12  version.
13  
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
17  details.
18  
19  You should have received a copy of the GNU General Public License along with
20  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21  Place - Suite 330, Boston, MA  02111-1307, USA.
22
23  Further information about the GNU General Public License can also be found on
24  the world wide web at http://www.gnu.org.
25  
26 HISTORY
27 --------------------------------------------------------------------------------
28 12/12/98   JSB   Created
29  
30 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31 SENTRY
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
33
34 #ifndef FGAIRCRAFT_H
35 #define FGAIRCRAFT_H
36
37 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 INCLUDES
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40
41 #ifdef FGFS
42 #  include <simgear/compiler.h>
43 #  ifdef FG_HAVE_STD_INCLUDES
44 #    include <vector>
45 #    include <iterator>
46 #    include <map>
47 #  else
48 #    include <vector.h>
49 #    include <iterator.h>
50 #    include <map.h>
51 #  endif
52 #else
53 #  include <vector>
54 #  include <iterator>
55 #  include <map>
56 #endif
57
58 #include "FGModel.h"
59 #include "FGCoefficient.h"
60 #include "FGPropulsion.h"
61 #include "FGLGear.h"
62 #include "FGConfigFile.h"
63 #include "FGMatrix.h"
64
65 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
66 DEFINITIONS
67 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
68
69 #define ID_AIRCRAFT "$Id$"
70
71 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
72 FORWARD DECLARATIONS
73 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
74
75 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76 COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
77 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
78
79 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80 CLASS DOCUMENTATION
81 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
82
83 /** Encapsulates an Aircraft and its systems.
84     Owns all the parts (other classes) which make up this aircraft. This includes
85     the Engines, Tanks, Propellers, Nozzles, Aerodynamic and Mass properties,
86     landing gear, etc. These constituent parts may actually run as separate
87     JSBSim models themselves, but the responsibility for initializing them and
88     for retrieving their force and moment contributions falls to FGAircraft.<br>
89     When an aircraft model is loaded the config file is parsed and for each of the
90     sections of the config file (propulsion, flight control, etc.) the
91     corresponding "ReadXXX()" method is called. From within this method the 
92     "Load()" method of that system is called (e.g. LoadFCS).
93     @author Jon S. Berndt
94     @version $Id$
95     @see
96      <ol><li>Cooke, Zyda, Pratt, and McGhee, "NPSNET: Flight Simulation Dynamic Modeling
97            Using Quaternions", Presence, Vol. 1, No. 4, pp. 404-420  Naval Postgraduate
98            School, January 1994</li>
99      <li>D. M. Henderson, "Euler Angles, Quaternions, and Transformation Matrices",
100      JSC 12960, July 1977</li>
101      <li>Richard E. McFarland, "A Standard Kinematic Model for Flight Simulation at
102      NASA-Ames", NASA CR-2497, January 1975</li>
103      <li>Barnes W. McCormick, "Aerodynamics, Aeronautics, and Flight Mechanics",
104      Wiley & Sons, 1979 ISBN 0-471-03032-5</li>
105      <li>Bernard Etkin, "Dynamics of Flight, Stability and Control", Wiley & Sons,
106      1982 ISBN 0-471-08936-2</li></ol>
107 */
108
109 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
110 CLASS DECLARATION
111 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
112
113 class FGAircraft : public FGModel {
114   enum {eL=1, eM, eN};
115   enum {eX=1, eY, eZ};
116   enum {eP=1, eQ, eR};
117   enum {ePhi=1, eTht, ePsi};
118
119 public:
120   /** Constructor
121       @param Executive a pointer to the parent executive object */
122   FGAircraft(FGFDMExec *Executive);
123   
124   /// Destructor
125   ~FGAircraft();
126
127   /** Runs the Aircraft model; called by the Executive
128       @see JSBSim.cpp documentation
129       @return false if no error */
130   bool Run(void);
131   
132   /** Loads the aircraft.
133       The executive calls this method to load the aircraft into JSBSim.
134       @param apath path to the aircraft files (e.g. "aircraft/X15/")
135       @param epath path to engine files (e.g. "engine/")
136       @param acname name of aircraft (e.g. "X15")
137       @return true if succesful */
138   bool LoadAircraft(string apath, string epath, string acname);
139   
140   /** Gets the aircraft name
141       @return the name of the aircraft as a string type */
142   inline string GetAircraftName(void) { return AircraftName; }
143   
144   /** Gets the gear status
145       @return true if gear is not deployed */
146   inline bool GetGearUp(void) { return GearUp; }
147   /** Gets the number of gear units defined for the aircraft
148       @return number of gear units defined */
149   inline int GetNumGearUnits(void) { return lGear.size(); }
150   /** Gets a gear instance
151       @param gear index of gear instance
152       @return a pointer to the FGLGear instance of the gear unit requested */
153   inline FGLGear* GetGearUnit(int gear) { return &(lGear[gear]); }
154   /// Gets the wing area
155   inline float GetWingArea(void) { return WingArea; }
156   /// Gets the wing span
157   inline float GetWingSpan(void) { return WingSpan; }
158   /// Gets the average wing chord
159   inline float Getcbar(void) { return cbar; }
160   inline float GetWeight(void) { return Weight; }
161   inline float GetMass(void) { return Mass; }
162   inline FGColumnVector GetMoments(void) { return vMoments; }
163   inline FGColumnVector GetForces(void) { return vForces; }
164   inline FGColumnVector GetvFs(void) { return vFs; }
165   inline float GetIxx(void) { return Ixx; }
166   inline float GetIyy(void) { return Iyy; }
167   inline float GetIzz(void) { return Izz; }
168   inline float GetIxz(void) { return Ixz; }
169   inline FGColumnVector GetXYZcg(void) { return vXYZcg; }
170   inline FGColumnVector GetXYZrp(void) { return vXYZrp; }
171   inline FGColumnVector GetXYZep(void) { return vXYZep; }
172   inline float GetNlf(void) { return nlf; }
173   inline float GetAlphaCLMax(void) { return alphaclmax; }
174   inline float GetAlphaCLMin(void) { return alphaclmin; }
175
176   inline void SetGearUp(bool tt) { GearUp = tt; }
177   inline void SetAlphaCLMax(float tt) { alphaclmax=tt; }
178   inline void SetAlphaCLMin(float tt) { alphaclmin=tt; }
179
180   inline FGCoefficient* GetCoeff(int axis, int idx) { return Coeff[axis][idx]; }
181   string GetCoefficientStrings(void);
182   string GetCoefficientValues(void);
183   string GetGroundReactionStrings(void);
184   string GetGroundReactionValues(void);
185
186   /// Subsystem types for specifying which will be output in the FDM data logging
187   enum  SubSystems {
188     /** Subsystem: Simulation (= 1)          */ ssSimulation      = 1,
189     /** Subsystem: Aerosurfaces (= 2)        */ ssAerosurfaces    = 2,
190     /** Subsystem: Body rates (= 4)          */ ssRates           = 4,
191     /** Subsystem: Velocities (= 8)          */ ssVelocities      = 8,
192     /** Subsystem: Forces (= 16)             */ ssForces          = 16,
193     /** Subsystem: Moments (= 32)            */ ssMoments         = 32,
194     /** Subsystem: Atmosphere (= 64)         */ ssAtmosphere      = 64,
195     /** Subsystem: Mass Properties (= 128)   */ ssMassProps       = 128,
196     /** Subsystem: Coefficients (= 256)      */ ssCoefficients    = 256,
197     /** Subsystem: Position (= 512)          */ ssPosition        = 512,
198     /** Subsystem: Ground Reactions (= 1024) */ ssGroundReactions = 1024,
199     /** Subsystem: FCS (= 2048)              */ ssFCS             = 2048,
200     /** Subsystem: Propulsion (= 4096)       */ ssPropulsion      = 4096
201   } subsystems;
202
203 private:
204   void GetState(void);
205   void FMAero(void);
206   void FMGear(void);
207   void FMMass(void);
208   void FMProp(void);
209   void MassChange(void);
210   FGColumnVector vMoments;
211   FGColumnVector vForces;
212   FGColumnVector vFs;
213   FGColumnVector vXYZrp;
214   FGColumnVector vbaseXYZcg;
215   FGColumnVector vXYZcg;
216   FGColumnVector vXYZep;
217   FGColumnVector vEuler;
218   float baseIxx, baseIyy, baseIzz, baseIxz, EmptyMass, Mass;
219   float Ixx, Iyy, Izz, Ixz;
220   float alpha, beta;
221   float WingArea, WingSpan, cbar;
222   float Weight, EmptyWeight;
223   float nlf,alphaclmax,alphaclmin;
224   float dt;
225   string CFGVersion;
226   string AircraftName;
227
228   typedef map<string,int> AxisIndex;
229   AxisIndex AxisIdx;
230
231   typedef vector<FGCoefficient*> CoeffArray;
232
233   CoeffArray* Coeff;
234
235   void DisplayCoeffFactors(vector <eParam> multipliers);
236
237   bool GearUp;
238
239   string Axis[6];
240   vector <FGLGear> lGear;
241
242   string AircraftPath;
243   string EnginePath;
244   void ReadMetrics(FGConfigFile*);
245   void ReadPropulsion(FGConfigFile*);
246   void ReadFlightControls(FGConfigFile*);
247   void ReadAerodynamics(FGConfigFile*);
248   void ReadUndercarriage(FGConfigFile*);
249   void ReadPrologue(FGConfigFile*);
250   void ReadOutput(FGConfigFile*);
251   void Debug(void);
252 };
253
254 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
255 #endif
256