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 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
42 # include <simgear/compiler.h>
43 # ifdef FG_HAVE_STD_INCLUDES
49 # include <iterator.h>
59 #include "FGCoefficient.h"
60 #include "FGPropulsion.h"
62 #include "FGConfigFile.h"
65 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
69 #define ID_AIRCRAFT "$Id$"
71 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
73 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
75 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76 COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
77 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
79 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
81 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
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).
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>
109 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
111 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
113 class FGAircraft : public FGModel {
117 enum {ePhi=1, eTht, ePsi};
121 @param Executive a pointer to the parent executive object */
122 FGAircraft(FGFDMExec *Executive);
127 /** Runs the Aircraft model; called by the Executive
128 @see JSBSim.cpp documentation
129 @return false if no error */
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);
140 /** Gets the aircraft name
141 @return the name of the aircraft as a string type */
142 inline string GetAircraftName(void) { return AircraftName; }
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; }
176 inline void SetGearUp(bool tt) { GearUp = tt; }
177 inline void SetAlphaCLMax(float tt) { alphaclmax=tt; }
178 inline void SetAlphaCLMin(float tt) { alphaclmin=tt; }
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);
186 /// Subsystem types for specifying which will be output in the FDM data logging
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
209 void MassChange(void);
210 FGColumnVector vMoments;
211 FGColumnVector vForces;
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;
221 float WingArea, WingSpan, cbar;
222 float Weight, EmptyWeight;
223 float nlf,alphaclmax,alphaclmin;
228 typedef map<string,int> AxisIndex;
231 typedef vector<FGCoefficient*> CoeffArray;
235 void DisplayCoeffFactors(vector <eParam> multipliers);
240 vector <FGLGear> lGear;
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*);
254 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%