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 [1] Cooke, Zyda, Pratt, and McGhee, "NPSNET: Flight Simulation Dynamic Modeling
83 Using Quaternions", Presence, Vol. 1, No. 4, pp. 404-420 Naval Postgraduate
85 [2] D. M. Henderson, "Euler Angles, Quaternions, and Transformation Matrices",
87 [3] Richard E. McFarland, "A Standard Kinematic Model for Flight Simulation at
88 NASA-Ames", NASA CR-2497, January 1975
89 [4] Barnes W. McCormick, "Aerodynamics, Aeronautics, and Flight Mechanics",
90 Wiley & Sons, 1979 ISBN 0-471-03032-5
91 [5] Bernard Etkin, "Dynamics of Flight, Stability and Control", Wiley & Sons,
92 1982 ISBN 0-471-08936-2
95 /*******************************************************************************
97 *******************************************************************************/
100 # include <simgear/compiler.h>
101 # ifdef FG_HAVE_STD_INCLUDES
107 # include <iterator.h>
117 #include "FGCoefficient.h"
118 #include "FGEngine.h"
121 #include "FGConfigFile.h"
122 #include "FGMatrix.h"
124 /*******************************************************************************
126 *******************************************************************************/
128 /** Encapsulates an Aircraft and its systems.
129 Owns all the parts (other classes) which make
130 up this aircraft. This includes the Engines, Tanks, Propellers, Nozzles,
131 aerodynamic and mass properties, landing gear, etc.
132 @author Jon S. Berndt
136 /*******************************************************************************
138 *******************************************************************************/
140 class FGAircraft : public FGModel {
144 enum {ePhi=1, eTht, ePsi};
148 @param Executive a pointer to the parent executive object
150 FGAircraft(FGFDMExec *Executive);
154 /** Runs the model; called by the Executive
155 @see JSBSim.cpp documentation
156 @return bool returns false if no error
159 /** Loads the aircraft.
160 The executive calls this method to load the aircraft into JSBSim.
161 @param apath path to the aircraft files (e.g. "aircraft/X15/")
162 @param epath path to engine files (e.g. "engine/")
163 @param acname name of aircraft (e.g. "X15")
164 @return true if succesful
166 bool LoadAircraft(string apath, string epath, string acname);
167 inline string GetAircraftName(void) { return AircraftName; }
168 inline void SetGearUp(bool tt) { GearUp = tt; }
169 inline bool GetGearUp(void) { return GearUp; }
170 inline int GetNumGearUnits(void) { return lGear.size(); }
171 inline FGLGear* GetGearUnit(int ii) { return &(lGear[ii]); }
172 inline float GetWingArea(void) { return WingArea; }
173 inline float GetWingSpan(void) { return WingSpan; }
174 inline float Getcbar(void) { return cbar; }
175 inline FGEngine* GetEngine(int tt) { return Engine[tt]; }
176 inline FGTank* GetTank(int tt) { return Tank[tt]; }
177 inline float GetWeight(void) { return Weight; }
178 inline float GetMass(void) { return Mass; }
179 inline FGColumnVector GetMoments(void) { return vMoments; }
180 inline FGColumnVector GetForces(void) { return vForces; }
181 inline FGColumnVector GetvFs(void) { return vFs; }
182 inline float GetIxx(void) { return Ixx; }
183 inline float GetIyy(void) { return Iyy; }
184 inline float GetIzz(void) { return Izz; }
185 inline float GetIxz(void) { return Ixz; }
186 inline unsigned int GetNumEngines(void) { return numEngines; }
187 inline FGColumnVector GetXYZcg(void) { return vXYZcg; }
188 inline FGColumnVector GetXYZrp(void) { return vXYZrp; }
189 inline FGColumnVector GetXYZep(void) { return vXYZep; }
190 inline float GetNlf(void) { return nlf; }
191 inline float GetAlphaCLMax(void) { return alphaclmax; }
192 inline float GetAlphaCLMin(void) { return alphaclmin; }
194 inline void SetAlphaCLMax(float tt) { alphaclmax=tt; }
195 inline void SetAlphaCLMin(float tt) { alphaclmin=tt; }
197 inline FGCoefficient* GetCoeff(int axis, int idx) { return Coeff[axis][idx]; }
198 string GetCoefficientStrings(void);
199 string GetCoefficientValues(void);
200 string GetGroundReactionStrings(void);
201 string GetGroundReactionValues(void);
203 enum { ssSimulation = 1,
211 ssCoefficients = 256,
213 ssGroundReactions = 1024 } subsystems;
221 void MassChange(void);
222 FGColumnVector vMoments;
223 FGColumnVector vForces;
225 FGColumnVector vXYZrp;
226 FGColumnVector vbaseXYZcg;
227 FGColumnVector vXYZcg;
228 FGColumnVector vXYZep;
229 FGColumnVector vEuler;
230 float baseIxx, baseIyy, baseIzz, baseIxz, EmptyMass, Mass;
231 float Ixx, Iyy, Izz, Ixz;
233 float WingArea, WingSpan, cbar;
234 float Weight, EmptyWeight;
235 float nlf,alphaclmax,alphaclmin;
240 unsigned int numTanks;
241 unsigned int numEngines;
242 unsigned int numSelectedOxiTanks;
243 unsigned int numSelectedFuelTanks;
244 FGTank* Tank[MAX_TANKS]; // need to make a vector
245 FGEngine *Engine[MAX_ENGINES]; // need to make a vector
247 typedef map<string,int> AxisIndex;
250 typedef vector<FGCoefficient*> CoeffArray;
254 void DisplayCoeffFactors(vector <eParam> multipliers);
259 vector <FGLGear> lGear;
263 void ReadMetrics(FGConfigFile*);
264 void ReadPropulsion(FGConfigFile*);
265 void ReadFlightControls(FGConfigFile*);
266 void ReadAerodynamics(FGConfigFile*);
267 void ReadUndercarriage(FGConfigFile*);
268 void ReadPrologue(FGConfigFile*);
269 void ReadOutput(FGConfigFile*);
272 /******************************************************************************/