JSBSim Flight Dynamics Model 1.3.0 (09 Apr 2026)
An Open Source Flight Dynamics and Control Software Library in C++
Loading...
Searching...
No Matches
FGOutputTextFile.cpp
1/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3 Module: FGOutputTextFile.cpp
4 Author: Bertrand Coconnier
5 Date started: 09/17/11
6 Purpose: Manage output of sim parameters to a text file
7 Called by: FGOutput
8
9 ------------- Copyright (C) 2011 Bertrand Coconnier -------------
10
11 This program is free software; you can redistribute it and/or modify it under
12 the terms of the GNU Lesser General Public License as published by the Free
13 Software Foundation; either version 2 of the License, or (at your option) any
14 later version.
15
16 This program is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
19 details.
20
21 You should have received a copy of the GNU Lesser General Public License along
22 with this program; if not, write to the Free Software Foundation, Inc., 59
23 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25 Further information about the GNU Lesser General Public License can also be
26 found on the world wide web at http://www.gnu.org.
27
28FUNCTIONAL DESCRIPTION
29--------------------------------------------------------------------------------
30This is the place where you create output routines to dump data for perusal
31later.
32
33HISTORY
34--------------------------------------------------------------------------------
3509/17/11 BC Created
36
37%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38INCLUDES
39%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40
41#include "FGOutputTextFile.h"
42#include "models/FGAerodynamics.h"
43#include "models/FGAccelerations.h"
44#include "models/FGAtmosphere.h"
45#include "models/FGAuxiliary.h"
46#include "models/FGPropulsion.h"
47#include "models/FGMassBalance.h"
48#include "models/FGExternalReactions.h"
49#include "models/FGBuoyantForces.h"
50#include "models/FGFCS.h"
51#include "models/atmosphere/FGWinds.h"
52#include "FGXMLElement.h"
53#include "string_utilities.h"
54#include "FGLog.h"
55
56using namespace std;
57
58namespace JSBSim {
59
60/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61CLASS IMPLEMENTATION
62%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
63
65{
66 if(!FGOutputFile::Load(el))
67 return false;
68
69 string type = el->GetAttributeValue("type");
70 string delim;
71 if (type == "TABULAR") {
72 delim = "\t";
73 } else {
74 delim = ",";
75 }
76
77 SetDelimiter(delim);
78
79 return true;
80}
81
82//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
83
85{
86 unique_ptr<FGLogging> out;
87 streambuf* buffer = nullptr;
88 string scratch = Filename.utf8Str();
89
90 if (to_upper(scratch) == "COUT") {
91 out.reset(new FGLogging(LogLevel::STDOUT));
92 buffer = out->rdbuf();
93 } else {
94 datafile.clear();
95 datafile.open(Filename);
96 if (!datafile) {
97 FGLogging log(LogLevel::ERROR);
98 log << LogFormat::RED << LogFormat::BOLD << "\nERROR: unable to open the file "
99 << LogFormat::RESET << Filename.c_str()
100 << LogFormat::RED << LogFormat::BOLD << "\n => Output to this file is disabled.\n\n"
101 << LogFormat::RESET;
102 Disable();
103 return false;
104 }
105 buffer = datafile.rdbuf();
106 }
107
108 ostream outstream(buffer);
109
110 outstream.precision(10);
111
112 outstream << "Time";
113 if (SubSystems & ssSimulation) {
114 // Nothing here, yet
115 }
116 if (SubSystems & ssAerosurfaces) {
117 outstream << delimeter;
118 outstream << "Aileron Command (norm)" + delimeter;
119 outstream << "Elevator Command (norm)" + delimeter;
120 outstream << "Rudder Command (norm)" + delimeter;
121 outstream << "Flap Command (norm)" + delimeter;
122 outstream << "Left Aileron Position (deg)" + delimeter;
123 outstream << "Right Aileron Position (deg)" + delimeter;
124 outstream << "Elevator Position (deg)" + delimeter;
125 outstream << "Rudder Position (deg)" + delimeter;
126 outstream << "Flap Position (deg)";
127 }
128 if (SubSystems & ssRates) {
129 outstream << delimeter;
130 outstream << "P (deg/s)" + delimeter + "Q (deg/s)" + delimeter + "R (deg/s)" + delimeter;
131 outstream << "P dot (deg/s^2)" + delimeter + "Q dot (deg/s^2)" + delimeter + "R dot (deg/s^2)" + delimeter;
132 outstream << "P_{inertial} (deg/s)" + delimeter + "Q_{inertial} (deg/s)" + delimeter + "R_{inertial} (deg/s)";
133 }
134 if (SubSystems & ssVelocities) {
135 outstream << delimeter;
136 outstream << "q bar (psf)" + delimeter;
137 outstream << "Reynolds Number" + delimeter;
138 outstream << "V_{Total} (ft/s)" + delimeter;
139 outstream << "V_{Inertial} (ft/s)" + delimeter;
140 outstream << "UBody" + delimeter + "VBody" + delimeter + "WBody" + delimeter;
141 outstream << "UdotBody" + delimeter + "VdotBody" + delimeter + "WdotBody" + delimeter;
142 outstream << "UdotBody_i" + delimeter + "VdotBody_i" + delimeter + "WdotBody_i" + delimeter;
143 outstream << "BodyAccel_X" + delimeter + "BodyAccel_Y" + delimeter + "BodyAccel_Z" + delimeter;
144 outstream << "Aero V_{X Body} (ft/s)" + delimeter + "Aero V_{Y Body} (ft/s)" + delimeter + "Aero V_{Z Body} (ft/s)" + delimeter;
145 outstream << "V_{X_{inertial}} (ft/s)" + delimeter + "V_{Y_{inertial}} (ft/s)" + delimeter + "V_{Z_{inertial}} (ft/s)" + delimeter;
146 outstream << "V_{X_{ecef}} (ft/s)" + delimeter + "V_{Y_{ecef}} (ft/s)" + delimeter + "V_{Z_{ecef}} (ft/s)" + delimeter;
147 outstream << "V_{North} (ft/s)" + delimeter + "V_{East} (ft/s)" + delimeter + "V_{Down} (ft/s)";
148 }
149 if (SubSystems & ssForces) {
150 outstream << delimeter;
151 outstream << "F_{Drag} (lbs)" + delimeter + "F_{Side} (lbs)" + delimeter + "F_{Lift} (lbs)" + delimeter;
152 outstream << "L/D" + delimeter;
153 outstream << "F_{Aero x} (lbs)" + delimeter + "F_{Aero y} (lbs)" + delimeter + "F_{Aero z} (lbs)" + delimeter;
154 outstream << "F_{Prop x} (lbs)" + delimeter + "F_{Prop y} (lbs)" + delimeter + "F_{Prop z} (lbs)" + delimeter;
155 outstream << "F_{Gear x} (lbs)" + delimeter + "F_{Gear y} (lbs)" + delimeter + "F_{Gear z} (lbs)" + delimeter;
156 outstream << "F_{Ext x} (lbs)" + delimeter + "F_{Ext y} (lbs)" + delimeter + "F_{Ext z} (lbs)" + delimeter;
157 outstream << "F_{Buoyant x} (lbs)" + delimeter + "F_{Buoyant y} (lbs)" + delimeter + "F_{Buoyant z} (lbs)" + delimeter;
158 outstream << "F_{Weight x} (lbs)" + delimeter + "F_{Weight y} (lbs)" + delimeter + "F_{Weight z} (lbs)" + delimeter;
159 outstream << "F_{Total x} (lbs)" + delimeter + "F_{Total y} (lbs)" + delimeter + "F_{Total z} (lbs)";
160 }
161 if (SubSystems & ssMoments) {
162 outstream << delimeter;
163 outstream << "L_{Aero} (ft-lbs)" + delimeter + "M_{Aero} (ft-lbs)" + delimeter + "N_{Aero} (ft-lbs)" + delimeter;
164 outstream << "L_{Aero MRC} (ft-lbs)" + delimeter + "M_{Aero MRC} (ft-lbs)" + delimeter + "N_{Aero MRC} (ft-lbs)" + delimeter;
165 outstream << "L_{Prop} (ft-lbs)" + delimeter + "M_{Prop} (ft-lbs)" + delimeter + "N_{Prop} (ft-lbs)" + delimeter;
166 outstream << "L_{Gear} (ft-lbs)" + delimeter + "M_{Gear} (ft-lbs)" + delimeter + "N_{Gear} (ft-lbs)" + delimeter;
167 outstream << "L_{ext} (ft-lbs)" + delimeter + "M_{ext} (ft-lbs)" + delimeter + "N_{ext} (ft-lbs)" + delimeter;
168 outstream << "L_{Buoyant} (ft-lbs)" + delimeter + "M_{Buoyant} (ft-lbs)" + delimeter + "N_{Buoyant} (ft-lbs)" + delimeter;
169 outstream << "L_{Total} (ft-lbs)" + delimeter + "M_{Total} (ft-lbs)" + delimeter + "N_{Total} (ft-lbs)";
170 }
171 if (SubSystems & ssAtmosphere) {
172 outstream << delimeter;
173 outstream << "Rho (slugs/ft^3)" + delimeter;
174 outstream << "Absolute Viscosity" + delimeter;
175 outstream << "Kinematic Viscosity" + delimeter;
176 outstream << "Temperature (R)" + delimeter;
177 outstream << "P_{SL} (psf)" + delimeter;
178 outstream << "P_{Ambient} (psf)" + delimeter;
179 outstream << "Turbulence Magnitude (ft/sec)" + delimeter;
180 outstream << "Turbulence X Direction (deg)" + delimeter;
181 outstream << "Wind V_{North} (ft/s)" + delimeter + "Wind V_{East} (ft/s)" + delimeter + "Wind V_{Down} (ft/s)" + delimeter;
182 outstream << "Roll Turbulence (deg/sec)" + delimeter + "Pitch Turbulence (deg/sec)" + delimeter + "Yaw Turbulence (deg/sec)";
183 }
184 if (SubSystems & ssMassProps) {
185 outstream << delimeter;
186 outstream << "I_{xx}" + delimeter;
187 outstream << "I_{xy}" + delimeter;
188 outstream << "I_{xz}" + delimeter;
189 outstream << "I_{yx}" + delimeter;
190 outstream << "I_{yy}" + delimeter;
191 outstream << "I_{yz}" + delimeter;
192 outstream << "I_{zx}" + delimeter;
193 outstream << "I_{zy}" + delimeter;
194 outstream << "I_{zz}" + delimeter;
195 outstream << "Mass" + delimeter;
196 outstream << "Weight" + delimeter;
197 outstream << "X_{cg}" + delimeter + "Y_{cg}" + delimeter + "Z_{cg}";
198 }
199 if (SubSystems & ssPropagate) {
200 outstream << delimeter;
201 outstream << "Altitude ASL (ft)" + delimeter;
202 outstream << "Altitude AGL (ft)" + delimeter;
203 outstream << "Phi (deg)" + delimeter + "Theta (deg)" + delimeter + "Psi (deg)" + delimeter;
204 outstream << "Q(1)_{LOCAL}" + delimeter + "Q(2)_{LOCAL}" + delimeter + "Q(3)_{LOCAL}" + delimeter + "Q(4)_{LOCAL}" + delimeter;
205 outstream << "Q(1)_{ECEF}" + delimeter + "Q(2)_{ECEF}" + delimeter + "Q(3)_{ECEF}" + delimeter + "Q(4)_{ECEF}" + delimeter;
206 outstream << "Q(1)_{ECI}" + delimeter + "Q(2)_{ECI}" + delimeter + "Q(3)_{ECI}" + delimeter + "Q(4)_{ECI}" + delimeter;
207 outstream << "Alpha (deg)" + delimeter;
208 outstream << "Beta (deg)" + delimeter;
209 outstream << "Latitude (deg)" + delimeter;
210 outstream << "Latitude Geodetic (deg)" + delimeter;
211 outstream << "Longitude (deg)" + delimeter;
212 outstream << "X_{ECI} (ft)" + delimeter + "Y_{ECI} (ft)" + delimeter + "Z_{ECI} (ft)" + delimeter;
213 outstream << "X_{ECEF} (ft)" + delimeter + "Y_{ECEF} (ft)" + delimeter + "Z_{ECEF} (ft)" + delimeter;
214 outstream << "Earth Position Angle (deg)" + delimeter;
215 outstream << "Distance AGL (ft)" + delimeter;
216 outstream << "Terrain Elevation (ft)";
217 }
218 if (SubSystems & ssAeroFunctions) {
219 scratch = Aerodynamics->GetAeroFunctionStrings(delimeter);
220 if (scratch.length() != 0) outstream << delimeter << scratch;
221 }
222 if (SubSystems & ssFCS) {
223 scratch = FCS->GetComponentStrings(delimeter);
224 if (scratch.length() != 0) outstream << delimeter << scratch;
225 }
226 if (SubSystems & ssGroundReactions) {
227 outstream << delimeter;
228 outstream << GroundReactions->GetGroundReactionStrings(delimeter);
229 }
230 if (SubSystems & ssPropulsion && Propulsion->GetNumEngines() > 0) {
231 outstream << delimeter;
232 outstream << Propulsion->GetPropulsionStrings(delimeter);
233 }
234
235 for (unsigned int i=0;i<OutputParameters.size();++i) {
236 if (!OutputCaptions[i].empty())
237 outstream << delimeter << OutputCaptions[i];
238 else
239 outstream << delimeter << OutputParameters[i]->GetFullyQualifiedName();
240 }
241
242 if (!PreFunctions.empty()) {
243 for (unsigned int i=0;i<PreFunctions.size();i++) {
244 outstream << delimeter << PreFunctions[i]->GetName();
245 }
246 }
247
248 outstream << endl;
249 outstream.flush();
250
251 return true;
252}
253
254//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
255
257{
258 streambuf* buffer;
259 string scratch = Filename.utf8Str();
260 unique_ptr<FGLogging> out;
261
262 if (to_upper(scratch) == "COUT") {
263 out.reset(new FGLogging(LogLevel::STDOUT));
264 buffer = out->rdbuf();
265 } else {
266 buffer = datafile.rdbuf();
267 }
268
269 ostream outstream(buffer);
270
271 outstream.precision(10);
272
273 outstream << FDMExec->GetSimTime();
274 if (SubSystems & ssSimulation) {
275 }
276 if (SubSystems & ssAerosurfaces) {
277 outstream << delimeter;
278 outstream << FCS->GetDaCmd() << delimeter;
279 outstream << FCS->GetDeCmd() << delimeter;
280 outstream << FCS->GetDrCmd() << delimeter;
281 outstream << FCS->GetDfCmd() << delimeter;
282 outstream << FCS->GetDaLPos(ofDeg) << delimeter;
283 outstream << FCS->GetDaRPos(ofDeg) << delimeter;
284 outstream << FCS->GetDePos(ofDeg) << delimeter;
285 outstream << FCS->GetDrPos(ofDeg) << delimeter;
286 outstream << FCS->GetDfPos(ofDeg);
287 }
288 if (SubSystems & ssRates) {
289 outstream << delimeter;
290 outstream << (radtodeg*Propagate->GetPQR()).Dump(delimeter) << delimeter;
291 outstream << (radtodeg*Accelerations->GetPQRdot()).Dump(delimeter) << delimeter;
292 outstream << (radtodeg*Propagate->GetPQRi()).Dump(delimeter);
293 }
294 if (SubSystems & ssVelocities) {
295 outstream << delimeter;
296 outstream << Auxiliary->Getqbar() << delimeter;
297 outstream << Auxiliary->GetReynoldsNumber() << delimeter;
298 outstream << setprecision(12) << Auxiliary->GetVt() << delimeter;
299 outstream << Propagate->GetInertialVelocityMagnitude() << delimeter;
300 outstream << setprecision(12) << Propagate->GetUVW().Dump(delimeter) << delimeter;
301 outstream << setprecision(12) << Accelerations->GetUVWdot().Dump(delimeter) << delimeter;
302 outstream << setprecision(12) << Accelerations->GetUVWidot().Dump(delimeter) << delimeter;
303 outstream << setprecision(12) << Accelerations->GetBodyAccel().Dump(delimeter) << delimeter;
304 outstream << Auxiliary->GetAeroUVW().Dump(delimeter) << delimeter;
305 outstream << Propagate->GetInertialVelocity().Dump(delimeter) << delimeter;
306 outstream << Propagate->GetECEFVelocity().Dump(delimeter) << delimeter;
307 outstream << Propagate->GetVel().Dump(delimeter);
308 outstream.precision(10);
309 }
310 if (SubSystems & ssForces) {
311 outstream << delimeter;
312 outstream << Aerodynamics->GetvFw().Dump(delimeter) << delimeter;
313 outstream << Aerodynamics->GetLoD() << delimeter;
314 outstream << Aerodynamics->GetForces().Dump(delimeter) << delimeter;
315 outstream << Propulsion->GetForces().Dump(delimeter) << delimeter;
316 outstream << Accelerations->GetGroundForces().Dump(delimeter) << delimeter;
317 outstream << ExternalReactions->GetForces().Dump(delimeter) << delimeter;
318 outstream << BuoyantForces->GetForces().Dump(delimeter) << delimeter;
319 outstream << Accelerations->GetWeight().Dump(delimeter) << delimeter;
320 outstream << Accelerations->GetForces().Dump(delimeter);
321 }
322 if (SubSystems & ssMoments) {
323 outstream << delimeter;
324 outstream << Aerodynamics->GetMoments().Dump(delimeter) << delimeter;
325 outstream << Aerodynamics->GetMomentsMRC().Dump(delimeter) << delimeter;
326 outstream << Propulsion->GetMoments().Dump(delimeter) << delimeter;
327 outstream << Accelerations->GetGroundMoments().Dump(delimeter) << delimeter;
328 outstream << ExternalReactions->GetMoments().Dump(delimeter) << delimeter;
329 outstream << BuoyantForces->GetMoments().Dump(delimeter) << delimeter;
330 outstream << Accelerations->GetMoments().Dump(delimeter);
331 }
332 if (SubSystems & ssAtmosphere) {
333 const auto Atmosphere = FDMExec->GetAtmosphere();
334 outstream << delimeter;
335 outstream << Atmosphere->GetDensity() << delimeter;
336 outstream << Atmosphere->GetAbsoluteViscosity() << delimeter;
337 outstream << Atmosphere->GetKinematicViscosity() << delimeter;
338 outstream << Atmosphere->GetTemperature() << delimeter;
339 outstream << Atmosphere->GetPressureSL() << delimeter;
340 outstream << Atmosphere->GetPressure() << delimeter;
341 outstream << Winds->GetTurbMagnitude() << delimeter;
342 outstream << Winds->GetTurbDirection() << delimeter;
343 outstream << Winds->GetTotalWindNED().Dump(delimeter) << delimeter;
344 outstream << (Winds->GetTurbPQR()*radtodeg).Dump(delimeter);
345 }
346 if (SubSystems & ssMassProps) {
347 outstream << delimeter;
348 outstream << MassBalance->GetJ().Dump(delimeter) << delimeter;
349 outstream << MassBalance->GetMass() << delimeter;
350 outstream << MassBalance->GetWeight() << delimeter;
351 outstream << MassBalance->GetXYZcg().Dump(delimeter);
352 }
353 if (SubSystems & ssPropagate) {
354 outstream.precision(14);
355 outstream << delimeter;
356 outstream << Propagate->GetAltitudeASL() << delimeter;
357 outstream << Propagate->GetDistanceAGL() << delimeter;
358 outstream << (radtodeg*Propagate->GetEuler()).Dump(delimeter) << delimeter;
359 outstream << Propagate->GetQuaternion().Dump(delimeter) << delimeter;
360 FGQuaternion Qec = Propagate->GetQuaternionECEF();
361 outstream << Qec.Dump(delimeter) << delimeter;
362 outstream << Propagate->GetQuaternionECI().Dump(delimeter) << delimeter;
363 outstream << Auxiliary->Getalpha(inDegrees) << delimeter;
364 outstream << Auxiliary->Getbeta(inDegrees) << delimeter;
365 outstream << Propagate->GetLatitudeDeg() << delimeter;
366 outstream << Propagate->GetGeodLatitudeDeg() << delimeter;
367 outstream << Propagate->GetLongitudeDeg() << delimeter;
368 outstream.precision(18);
369 outstream << ((FGColumnVector3)Propagate->GetInertialPosition()).Dump(delimeter) << delimeter;
370 outstream << ((FGColumnVector3)Propagate->GetLocation()).Dump(delimeter) << delimeter;
371 outstream.precision(14);
372 outstream << Propagate->GetEarthPositionAngleDeg() << delimeter;
373 outstream << Propagate->GetDistanceAGL() << delimeter;
374 outstream << Propagate->GetTerrainElevation();
375 outstream.precision(10);
376 }
377 if (SubSystems & ssAeroFunctions) {
378 scratch = Aerodynamics->GetAeroFunctionValues(delimeter);
379 if (scratch.length() != 0) outstream << delimeter << scratch;
380 }
381 if (SubSystems & ssFCS) {
382 scratch = FCS->GetComponentValues(delimeter);
383 if (scratch.length() != 0) outstream << delimeter << scratch;
384 }
385 if (SubSystems & ssGroundReactions) {
386 outstream << delimeter;
387 outstream << GroundReactions->GetGroundReactionValues(delimeter);
388 }
389 if (SubSystems & ssPropulsion && Propulsion->GetNumEngines() > 0) {
390 outstream << delimeter;
391 outstream << Propulsion->GetPropulsionValues(delimeter);
392 }
393
394 outstream.precision(18);
395 for (unsigned int i=0;i<OutputParameters.size();++i) {
396 outstream << delimeter << OutputParameters[i]->GetValue();
397 }
398 for (unsigned int i=0;i<PreFunctions.size();i++) {
399 outstream << delimeter << PreFunctions[i]->getDoubleValue();
400 }
401 outstream.precision(10);
402
403 outstream << endl;
404 outstream.flush();
405}
406}
std::string GetAttributeValue(const std::string &key)
Retrieves an attribute.
This class implements a 3 element column vector.
double GetSimTime(void) const
Returns the cumulative simulation time in seconds.
Definition FGFDMExec.h:550
bool Load(Element *el) override
Init the output directives from an XML file.
bool OpenFile(void) override
Opens the file.
bool Load(Element *el) override
Init the output directives from an XML file.
void Print(void) override
Generates the output to the text file.
void SetDelimiter(const std::string &delim)
Set the delimiter.
void Disable(void)
Disables the output generation.
@ ssPropulsion
Subsystem: Propulsion (= 4096)
@ ssForces
Subsystem: Forces (= 16)
@ ssAtmosphere
Subsystem: Atmosphere (= 64)
@ ssPropagate
Subsystem: Propagate (= 512)
@ ssGroundReactions
Subsystem: Ground Reactions (= 1024)
@ ssFCS
Subsystem: FCS (= 2048)
@ ssMoments
Subsystem: Moments (= 32)
@ ssRates
Subsystem: Body rates (= 4)
@ ssVelocities
Subsystem: Velocities (= 8)
@ ssAerosurfaces
Subsystem: Aerosurfaces (= 2)
@ ssMassProps
Subsystem: Mass Properties (= 128)
@ ssSimulation
Subsystem: Simulation (= 1)
@ ssAeroFunctions
Subsystem: Coefficients (= 256)
Models the Quaternion representation of rotations.
Main namespace for the JSBSim Flight Dynamics Model.
Definition FGFDMExec.cpp:71