]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGAircraft.h
Latest round of 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: Ground Reactions (= 2048) */ ssFCS             = 2048
200   } subsystems;
201
202 private:
203   void GetState(void);
204   void FMAero(void);
205   void FMGear(void);
206   void FMMass(void);
207   void FMProp(void);
208   void MassChange(void);
209   FGColumnVector vMoments;
210   FGColumnVector vForces;
211   FGColumnVector vFs;
212   FGColumnVector vXYZrp;
213   FGColumnVector vbaseXYZcg;
214   FGColumnVector vXYZcg;
215   FGColumnVector vXYZep;
216   FGColumnVector vEuler;
217   float baseIxx, baseIyy, baseIzz, baseIxz, EmptyMass, Mass;
218   float Ixx, Iyy, Izz, Ixz;
219   float alpha, beta;
220   float WingArea, WingSpan, cbar;
221   float Weight, EmptyWeight;
222   float nlf,alphaclmax,alphaclmin;
223   float dt;
224   string CFGVersion;
225   string AircraftName;
226
227   typedef map<string,int> AxisIndex;
228   AxisIndex AxisIdx;
229
230   typedef vector<FGCoefficient*> CoeffArray;
231
232   CoeffArray* Coeff;
233
234   void DisplayCoeffFactors(vector <eParam> multipliers);
235
236   bool GearUp;
237
238   string Axis[6];
239   vector <FGLGear> lGear;
240
241   string AircraftPath;
242   string EnginePath;
243   void ReadMetrics(FGConfigFile*);
244   void ReadPropulsion(FGConfigFile*);
245   void ReadFlightControls(FGConfigFile*);
246   void ReadAerodynamics(FGConfigFile*);
247   void ReadUndercarriage(FGConfigFile*);
248   void ReadPrologue(FGConfigFile*);
249   void ReadOutput(FGConfigFile*);
250   void Debug(void);
251 };
252
253 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
254 #endif
255