1 /*******************************************************************************
7 ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
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
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
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.
23 Further information about the GNU General Public License can also be found on
24 the world wide web at http://www.gnu.org.
27 --------------------------------------------------------------------------------
30 ********************************************************************************
32 *******************************************************************************/
37 /*******************************************************************************
38 COMMENTS, REFERENCES, and NOTES
39 *******************************************************************************/
41 The aerodynamic coefficients used in this model typically are:
44 CL0 - Reference lift at zero alpha
45 CD0 - Reference drag at zero alpha
46 CDM - Drag due to Mach
47 CLa - Lift curve slope (w.r.t. alpha)
48 CDa - Drag curve slope (w.r.t. alpha)
49 CLq - Lift due to pitch rate
50 CLM - Lift due to Mach
51 CLadt - Lift due to alpha rate
53 Cmadt - Pitching Moment due to alpha rate
54 Cm0 - Reference Pitching moment at zero alpha
55 Cma - Pitching moment slope (w.r.t. alpha)
56 Cmq - Pitch damping (pitch moment due to pitch rate)
57 CmM - Pitch Moment due to Mach
60 Cyb - Side force due to sideslip
61 Cyr - Side force due to yaw rate
63 Clb - Dihedral effect (roll moment due to sideslip)
64 Clp - Roll damping (roll moment due to roll rate)
65 Clr - Roll moment due to yaw rate
66 Cnb - Weathercocking stability (yaw moment due to sideslip)
67 Cnp - Rudder adverse yaw (yaw moment due to roll rate)
68 Cnr - Yaw damping (yaw moment due to yaw rate)
71 CLDe - Lift due to elevator
72 CDDe - Drag due to elevator
73 CyDr - Side force due to rudder
74 CyDa - Side force due to aileron
76 CmDe - Pitch moment due to elevator
77 ClDa - Roll moment due to aileron
78 ClDr - Roll moment due to rudder
79 CnDr - Yaw moment due to rudder
80 CnDa - Yaw moment due to aileron
82 This class expects to be run in a directory which contains the subdirectory
83 structure shown below (where example aircraft X-15 is shown):
88 X-15.dat reset00 reset01 reset02 ...
102 F-16.dat reset00 reset01 ...
110 The file structure is arranged so that various modeled aircraft are stored in
111 their own subdirectory. Each aircraft subdirectory is named after the aircraft.
112 There should be a file present in the specific aircraft subdirectory (e.g.
113 aircraft/X-15) with the same name as the directory with a .dat appended. This
114 file contains mass properties information, name of aircraft, etc. for the
115 aircraft. In that same directory are reset files numbered starting from 0 (two
116 digit numbers), e.g. reset03. Within each reset file are values for important
117 state variables for specific flight conditions (altitude, airspeed, etc.). Also
118 within this directory are the directories containing lookup tables for the
119 stability derivatives for the aircraft.
120 @author Jon S. Berndt
121 @memo Encompasses all aircraft functionality and objects
123 <li>[1] Cooke, Zyda, Pratt, and McGhee, "NPSNET: Flight Simulation Dynamic Modeling
124 Using Quaternions", Presence, Vol. 1, No. 4, pp. 404-420 Naval Postgraduate
125 School, January 1994</li>
126 <li>[2] D. M. Henderson, "Euler Angles, Quaternions, and Transformation Matrices",
127 JSC 12960, July 1977</li>
128 <li>[3] Richard E. McFarland, "A Standard Kinematic Model for Flight Simulation at
129 NASA-Ames", NASA CR-2497, January 1975</li>
130 <li>[4] Barnes W. McCormick, "Aerodynamics, Aeronautics, and Flight Mechanics",
131 Wiley & Sons, 1979 ISBN 0-471-03032-5</li>
132 <li>[5] Bernard Etkin, "Dynamics of Flight, Stability and Control", Wiley & Sons,
133 1982 ISBN 0-471-08936-2</li>
137 /*******************************************************************************
139 *******************************************************************************/
141 # include <Include/compiler.h>
142 # ifdef FG_HAVE_STD_INCLUDES
145 # include <fstream.h>
152 #include "FGCoefficient.h"
153 #include "FGEngine.h"
156 /*******************************************************************************
158 *******************************************************************************/
160 /*******************************************************************************
162 *******************************************************************************/
164 class FGAircraft : public FGModel
167 // ***************************************************************************
168 /** @memo Constructor
169 @param FGFDMExec* - a pointer to the "owning" FDM Executive
171 FGAircraft(FGFDMExec*);
173 // ***************************************************************************
177 // ***************************************************************************
178 /** This must be called for each dt to execute the model algorithm */
181 // ***************************************************************************
182 /** This function must be called with the name of an aircraft which
183 has an associated .dat file in the appropriate subdirectory. The
184 appropriate subdirectory is underneath the main fgfs binary directory
185 called "aircraft/{<i>aircraft</i>}/, where {<i>aircraft</i>} is the name of
186 specific aircraft you want to simulate.
187 @memo Loads the given aircraft.
188 @param string Path to the Aircraft files
189 @param string Path to the Engine files
190 @param string The name of the aircraft to be loaded, e.g. "X15".
191 @return True - if successful
193 bool LoadAircraft(string, string, string);
195 // ***************************************************************************
196 /** @memo Gets the aircraft name as defined in the aircraft config file.
198 @return string Aircraft name.
200 inline string GetAircraftName(void) {return AircraftName;}
202 // ***************************************************************************
203 /** @memo Sets the GearUp flag
204 @param boolean true or false
207 inline void SetGearUp(bool tt) {GearUp = tt;}
209 // ***************************************************************************
210 /** @memo Returns the state of the GearUp flag
212 @return boolean true or false
214 inline bool GetGearUp(void) {return GearUp;}
216 // ***************************************************************************
217 /** @memo Returns the area of the wing
219 @return float wing area S, in square feet
221 inline float GetWingArea(void) {return WingArea;}
223 // ***************************************************************************
224 /** @memo Returns the wing span
226 @return float wing span in feet
228 inline float GetWingSpan(void) {return WingSpan;}
230 // ***************************************************************************
231 /** @memo Returns the average wing chord
233 @return float wing chord in feet
235 inline float Getcbar(void) {return cbar;}
237 // ***************************************************************************
238 /** @memo Returns an engine object
239 @param int The engine number
240 @return FGEengine* The pointer to the requested engine object.
242 inline FGEngine* GetEngine(int tt) {return Engine[tt];}
244 // ***************************************************************************
249 inline FGTank* GetTank(int tt) {return Tank[tt];}
251 // ***************************************************************************
256 inline float GetWeight(void) {return Weight;}
258 // ***************************************************************************
263 inline float GetMass(void) {return Mass;}
265 // ***************************************************************************
270 inline float GetL(void) {return Moments[0];}
272 // ***************************************************************************
277 inline float GetM(void) {return Moments[1];}
279 // ***************************************************************************
284 inline float GetN(void) {return Moments[2];}
286 // ***************************************************************************
291 inline float GetFx(void) {return Forces[0];}
293 // ***************************************************************************
298 inline float GetFy(void) {return Forces[1];}
300 // ***************************************************************************
305 inline float GetFz(void) {return Forces[2];}
307 // ***************************************************************************
312 inline float GetIxx(void) {return Ixx;}
314 // ***************************************************************************
319 inline float GetIyy(void) {return Iyy;}
321 // ***************************************************************************
326 inline float GetIzz(void) {return Izz;}
328 // ***************************************************************************
333 inline float GetIxz(void) {return Ixz;}
336 // ***************************************************************************
343 // ***************************************************************************
350 // ***************************************************************************
357 // ***************************************************************************
364 // ***************************************************************************
371 // ***************************************************************************
378 // ***************************************************************************
385 // ***************************************************************************
392 // ***************************************************************************
399 // ***************************************************************************
406 // ***************************************************************************
411 void MassChange(void);
413 // ***************************************************************************
420 // ***************************************************************************
427 // ***************************************************************************
434 // ***************************************************************************
436 float Ixx, Iyy, Izz, Ixz, EmptyMass, Mass;
446 float WingArea, WingSpan, cbar;
450 float Weight, EmptyWeight;
459 int numSelectedOxiTanks;
461 int numSelectedFuelTanks;
463 FGTank* Tank[MAX_TANKS];
465 FGEngine *Engine[MAX_ENGINES];
468 FGCoefficient *Coeff[6][10];
476 enum Param {LiftCoeff,
491 /******************************************************************************/