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
FGInertial Class Reference

Detailed Description

Models inertial forces (e.g.

centripetal and coriolis accelerations). Starting conversion to WGS84.

Definition at line 65 of file FGInertial.h.

#include <FGInertial.h>

+ Inheritance diagram for FGInertial:
+ Collaboration diagram for FGInertial:

Classes

struct  Inputs
 

Public Types

enum  eGravType { gtStandard , gtWGS84 }
 These define the indices use to select the gravitation models. More...
 
- Public Types inherited from FGJSBBase
enum  { eL = 1 , eM , eN }
 Moments L, M, N. More...
 
enum  { eP = 1 , eQ , eR }
 Rates P, Q, R. More...
 
enum  { eU = 1 , eV , eW }
 Velocities U, V, W. More...
 
enum  { eX = 1 , eY , eZ }
 Positions X, Y, Z. More...
 
enum  { ePhi = 1 , eTht , ePsi }
 Euler angles Phi, Theta, Psi. More...
 
enum  { eDrag = 1 , eSide , eLift }
 Stability axis forces, Drag, Side force, Lift. More...
 
enum  { eRoll = 1 , ePitch , eYaw }
 Local frame orientation Roll, Pitch, Yaw. More...
 
enum  { eNorth = 1 , eEast , eDown }
 Local frame position North, East, Down. More...
 
enum  { eLat = 1 , eLong , eRad }
 Locations Radius, Latitude, Longitude. More...
 
enum  {
  inNone = 0 , inDegrees , inRadians , inMeters ,
  inFeet
}
 Conversion specifiers. More...
 

Public Member Functions

 FGInertial (FGFDMExec *)
 
double GetGM (void) const
 
const FGColumnVector3GetGravity (void) const
 
int GetGravityType (void) const
 Get the gravity type.
 
const FGColumnVector3GetOmegaPlanet () const
 
double GetSemimajor (void) const
 
double GetSemiminor (void) const
 
FGMatrix33 GetTec2l (const FGLocation &location) const
 Transform matrix from the earth centered to local horizontal frame.
 
FGMatrix33 GetTl2ec (const FGLocation &location) const
 Transform matrix from the local horizontal frame to earth centered.
 
bool Load (Element *el) override
 
bool Run (bool Holding) override
 Runs the Inertial model; called by the Executive Can pass in a value indicating if the executive is directing the simulation to Hold.
 
void SetGravityType (int gt)
 Set the gravity type.
 
void SetGroundCallback (FGGroundCallback *gc)
 Sets the ground callback pointer.
 
void SetOmegaPlanet (double rate)
 
Functions that rely on the ground callback

The following functions allow to set and get the vehicle position above the ground.

The ground level is obtained by interrogating an instance of FGGroundCallback. A ground callback must therefore be set with SetGroundCallback() before calling any of these functions.

double GetContactPoint (const FGLocation &location, FGLocation &contact, FGColumnVector3 &normal, FGColumnVector3 &velocity, FGColumnVector3 &ang_velocity) const
 Get terrain contact point information below the current location.
 
double GetAltitudeAGL (const FGLocation &location) const
 Get the altitude above ground level.
 
void SetAltitudeAGL (FGLocation &location, double altitudeAGL)
 Set the altitude above ground level.
 
void SetTerrainElevation (double h)
 Set the terrain elevation above sea level.
 
void SetTime (double time)
 Set the simulation time.
 
- Public Member Functions inherited from FGModel
 FGModel (FGFDMExec *)
 Constructor.
 
 ~FGModel () override
 Destructor.
 
virtual SGPath FindFullPathName (const SGPath &path) const
 
FGFDMExecGetExec (void) const
 
const std::string & GetName (void) const
 
unsigned int GetRate (void) const
 Get the output rate for the model in frames.
 
bool InitModel (void) override
 
void SetPropertyManager (std::shared_ptr< FGPropertyManager > fgpm)
 
void SetRate (unsigned int tt)
 Set the ouput rate for the model in frames.
 
- Public Member Functions inherited from FGModelFunctions
std::string GetFunctionStrings (const std::string &delimeter) const
 Gets the strings for the current set of functions.
 
std::string GetFunctionValues (const std::string &delimeter) const
 Gets the function values.
 
std::shared_ptr< FGFunctionGetPreFunction (const std::string &name)
 Get one of the "pre" function.
 
bool Load (Element *el, FGFDMExec *fdmex, std::string prefix="")
 
void PostLoad (Element *el, FGFDMExec *fdmex, std::string prefix="")
 
void PreLoad (Element *el, FGFDMExec *fdmex, std::string prefix="")
 
void RunPostFunctions (void)
 
void RunPreFunctions (void)
 
- Public Member Functions inherited from FGJSBBase
 FGJSBBase ()
 Constructor for FGJSBBase.
 
virtual ~FGJSBBase ()
 Destructor for FGJSBBase.
 
void disableHighLighting (void)
 Disables highlighting in the console output.
 

Static Public Member Functions

static constexpr double GetStandardGravity (void)
 
- Static Public Member Functions inherited from FGJSBBase
static const std::string & GetVersion (void)
 Returns the version number of JSBSim.
 
static constexpr double KelvinToFahrenheit (double kelvin)
 Converts from degrees Kelvin to degrees Fahrenheit.
 
static constexpr double CelsiusToRankine (double celsius)
 Converts from degrees Celsius to degrees Rankine.
 
static constexpr double RankineToCelsius (double rankine)
 Converts from degrees Rankine to degrees Celsius.
 
static constexpr double KelvinToRankine (double kelvin)
 Converts from degrees Kelvin to degrees Rankine.
 
static constexpr double RankineToKelvin (double rankine)
 Converts from degrees Rankine to degrees Kelvin.
 
static constexpr double FahrenheitToCelsius (double fahrenheit)
 Converts from degrees Fahrenheit to degrees Celsius.
 
static constexpr double CelsiusToFahrenheit (double celsius)
 Converts from degrees Celsius to degrees Fahrenheit.
 
static constexpr double CelsiusToKelvin (double celsius)
 Converts from degrees Celsius to degrees Kelvin.
 
static constexpr double KelvinToCelsius (double kelvin)
 Converts from degrees Kelvin to degrees Celsius.
 
static constexpr double FeetToMeters (double measure)
 Converts from feet to meters.
 
static bool EqualToRoundoff (double a, double b)
 Finite precision comparison.
 
static bool EqualToRoundoff (float a, float b)
 Finite precision comparison.
 
static bool EqualToRoundoff (float a, double b)
 Finite precision comparison.
 
static bool EqualToRoundoff (double a, float b)
 Finite precision comparison.
 
static constexpr double Constrain (double min, double value, double max)
 Constrain a value between a minimum and a maximum value.
 
static constexpr double sign (double num)
 

Public Attributes

struct JSBSim::FGInertial::Inputs in
 

Additional Inherited Members

- Static Public Attributes inherited from FGJSBBase
static char highint [5] = {27, '[', '1', 'm', '\0' }
 highlights text
 
static char halfint [5] = {27, '[', '2', 'm', '\0' }
 low intensity text
 
static char normint [6] = {27, '[', '2', '2', 'm', '\0' }
 normal intensity text
 
static char reset [5] = {27, '[', '0', 'm', '\0' }
 resets text properties
 
static char underon [5] = {27, '[', '4', 'm', '\0' }
 underlines text
 
static char underoff [6] = {27, '[', '2', '4', 'm', '\0' }
 underline off
 
static char fgblue [6] = {27, '[', '3', '4', 'm', '\0' }
 blue text
 
static char fgcyan [6] = {27, '[', '3', '6', 'm', '\0' }
 cyan text
 
static char fgred [6] = {27, '[', '3', '1', 'm', '\0' }
 red text
 
static char fggreen [6] = {27, '[', '3', '2', 'm', '\0' }
 green text
 
static char fgdef [6] = {27, '[', '3', '9', 'm', '\0' }
 default text
 
static short debug_lvl = 1
 
- Protected Member Functions inherited from FGModel
bool Upload (Element *el, bool preLoad)
 Uploads this model in memory.
 
- Static Protected Member Functions inherited from FGJSBBase
static std::string CreateIndexedPropertyName (const std::string &Property, int index)
 
- Protected Attributes inherited from FGModel
unsigned int exe_ctr
 
FGFDMExecFDMExec
 
std::string Name
 
std::shared_ptr< FGPropertyManager > PropertyManager
 
unsigned int rate
 
- Protected Attributes inherited from FGModelFunctions
FGPropertyReader LocalProperties
 
std::vector< std::shared_ptr< FGFunction > > PostFunctions
 
std::vector< std::shared_ptr< FGFunction > > PreFunctions
 
- Static Protected Attributes inherited from FGJSBBase
static constexpr double radtodeg = 180. / M_PI
 
static constexpr double degtorad = M_PI / 180.
 
static constexpr double hptoftlbssec = 550.0
 
static constexpr double psftoinhg = 0.014138
 
static constexpr double psftopa = 47.88
 
static constexpr double fttom = 0.3048
 
static constexpr double ktstofps = 1852./(3600*fttom)
 
static constexpr double fpstokts = 1.0 / ktstofps
 
static constexpr double inchtoft = 1.0/12.0
 
static constexpr double m3toft3 = 1.0/(fttom*fttom*fttom)
 
static constexpr double in3tom3 = inchtoft*inchtoft*inchtoft/m3toft3
 
static constexpr double inhgtopa = 3386.38
 
static constexpr double slugtolb = 32.174049
 Note that definition of lbtoslug by the inverse of slugtolb and not to a different constant you can also get from some tables will make lbtoslug*slugtolb == 1 up to the magnitude of roundoff.
 
static constexpr double lbtoslug = 1.0/slugtolb
 
static constexpr double kgtolb = 2.20462
 
static constexpr double kgtoslug = 0.06852168
 
static const std::string needed_cfg_version = "2.0"
 
static const std::string JSBSim_version = JSBSIM_VERSION " " __DATE__ " " __TIME__
 

Member Enumeration Documentation

◆ eGravType

enum eGravType

These define the indices use to select the gravitation models.

Enumerator
gtStandard 

Evaluate gravity using Newton's classical formula assuming the Earth is spherical.

gtWGS84 

Evaluate gravity using WGS84 formulas that take the Earth oblateness into account.

Definition at line 154 of file FGInertial.h.

154 {
160 gtWGS84
161 };
@ gtWGS84
Evaluate gravity using WGS84 formulas that take the Earth oblateness into account.
Definition FGInertial.h:160
@ gtStandard
Evaluate gravity using Newton's classical formula assuming the Earth is spherical.
Definition FGInertial.h:157

Constructor & Destructor Documentation

◆ FGInertial()

FGInertial ( FGFDMExec fgex)
explicit

Definition at line 53 of file FGInertial.cpp.

54 : FGModel(fgex)
55{
56 Name = "Earth";
57
58 // Earth defaults
59 double RotationRate = 0.00007292115;
60 GM = 14.0764417572E15; // WGS84 value
61 J2 = 1.08262982E-03; // WGS84 value for J2
62 a = 20925646.32546; // WGS84 semimajor axis length in feet
63 b = 20855486.5951; // WGS84 semiminor axis length in feet
64 gravType = gtWGS84;
65
66 // Lunar defaults
67 /*
68 double RotationRate = 0.0000026617;
69 GM = 1.7314079E14; // Lunar GM
70 J2 = 2.033542482111609E-4; // value for J2
71 a = 5702559.05; // semimajor axis length in feet
72 b = 5695439.63; // semiminor axis length in feet
73 */
74
75 vOmegaPlanet = { 0.0, 0.0, RotationRate };
76 GroundCallback = std::make_unique<FGDefaultGroundCallback>(a, b);
77
78 bind();
79
80 Debug(0);
81}
FGModel(FGFDMExec *)
Constructor.
Definition FGModel.cpp:58

◆ ~FGInertial()

~FGInertial ( void  )

Definition at line 85 of file FGInertial.cpp.

86{
87 Debug(1);
88}

Member Function Documentation

◆ GetAltitudeAGL()

double GetAltitudeAGL ( const FGLocation location) const
inline

Get the altitude above ground level.

Returns
the altitude AGL in feet.
Parameters
locationLocation at which the AGL is evaluated.
See also
SetGroundCallback

Definition at line 115 of file FGInertial.h.

115 {
116 FGLocation lDummy;
117 FGColumnVector3 vDummy;
118 return GroundCallback->GetAGLevel(location, lDummy, vDummy, vDummy,
119 vDummy);
120 }

◆ GetContactPoint()

double GetContactPoint ( const FGLocation location,
FGLocation contact,
FGColumnVector3 normal,
FGColumnVector3 velocity,
FGColumnVector3 ang_velocity 
) const
inline

Get terrain contact point information below the current location.

Parameters
locationLocation at which the contact point is evaluated.
contactContact point location
normalTerrain normal vector in contact point (ECEF frame)
velocityTerrain linear velocity in contact point (ECEF frame)
ang_velocityTerrain angular velocity in contact point (ECEF frame)
Returns
Location altitude above contact point (AGL) in feet.
See also
SetGroundCallback

Definition at line 104 of file FGInertial.h.

107 {
108 return GroundCallback->GetAGLevel(location, contact, normal, velocity,
109 ang_velocity); }

◆ GetGM()

double GetGM ( void  ) const
inline

Definition at line 88 of file FGInertial.h.

88{return GM;}

◆ GetGravity()

const FGColumnVector3 & GetGravity ( void  ) const
inline

Definition at line 81 of file FGInertial.h.

81{return vGravAccel;}

◆ GetGravityType()

int GetGravityType ( void  ) const
inline

Get the gravity type.

Definition at line 164 of file FGInertial.h.

164{ return gravType; }

◆ GetOmegaPlanet()

const FGColumnVector3 & GetOmegaPlanet ( ) const
inline

Definition at line 82 of file FGInertial.h.

82{return vOmegaPlanet;}

◆ GetSemimajor()

double GetSemimajor ( void  ) const
inline

Definition at line 86 of file FGInertial.h.

86{return a;}

◆ GetSemiminor()

double GetSemiminor ( void  ) const
inline

Definition at line 87 of file FGInertial.h.

87{return b;}

◆ GetStandardGravity()

static constexpr double GetStandardGravity ( void  )
inlinestaticconstexpr

Definition at line 80 of file FGInertial.h.

80{ return gAccelReference; }

◆ GetTec2l()

FGMatrix33 GetTec2l ( const FGLocation location) const
inline

Transform matrix from the earth centered to local horizontal frame.

The local frame is the NED (North-East-Down) frame. Since the Down direction depends on the gravity so is the local frame. The East direction is tangent to the spheroid with a null component along the Z axis. The North direction is obtained from the cross product between East and Down.

Parameters
locationThe location at which the transform matrix must be evaluated.
Returns
a rotation matrix of the transform from the earth centered frame to the local horizontal frame.

Definition at line 195 of file FGInertial.h.

196 { return GetTl2ec(location).Transposed(); }
FGMatrix33 GetTl2ec(const FGLocation &location) const
Transform matrix from the local horizontal frame to earth centered.
FGMatrix33 Transposed(void) const
Transposed matrix.
Definition FGMatrix33.h:221
+ Here is the call graph for this function:

◆ GetTl2ec()

FGMatrix33 GetTl2ec ( const FGLocation location) const

Transform matrix from the local horizontal frame to earth centered.

The local frame is the NED (North-East-Down) frame. Since the Down direction depends on the gravity so is the local frame. The East direction is tangent to the spheroid with a null component along the Z axis. The North direction is obtained from the cross product between East and Down.

Parameters
locationThe location at which the transform matrix must be evaluated.
Returns
a rotation matrix of the transform from the earth centered frame to the local horizontal frame.

Definition at line 162 of file FGInertial.cpp.

163{
164 FGColumnVector3 North, Down, East{-location(eY), location(eX), 0.};
165
166 switch (gravType) {
167 case gtStandard:
168 {
169 Down = location;
170 Down *= -1.0;
171 }
172 break;
173 case gtWGS84:
174 {
175 FGLocation sea_level = location;
176 sea_level.SetPositionGeodetic(location.GetLongitude(),
177 location.GetGeodLatitudeRad(), 0.0);
178 Down = GetGravityJ2(location);
179 Down -= vOmegaPlanet*(vOmegaPlanet*sea_level);}
180 }
181 Down.Normalize();
182 East.Normalize();
183 North = East*Down;
184
185 return FGMatrix33{North(eX), East(eX), Down(eX),
186 North(eY), East(eY), Down(eY),
187 North(eZ), 0.0, Down(eZ)};
188}
FGColumnVector3 & Normalize(void)
Normalize.
+ Here is the call graph for this function:

◆ Load()

bool Load ( Element el)
overridevirtual

Reimplemented from FGModel.

Definition at line 92 of file FGInertial.cpp.

93{
94 if (!Upload(el, true)) return false;
95
96 Name = el->GetAttributeValue("name");
97
98 if (el->FindElement("semimajor_axis"))
99 a = el->FindElementValueAsNumberConvertTo("semimajor_axis", "FT");
100 else if (el->FindElement("equatorial_radius"))
101 a = el->FindElementValueAsNumberConvertTo("equatorial_radius", "FT");
102 if (el->FindElement("semiminor_axis"))
103 b = el->FindElementValueAsNumberConvertTo("semiminor_axis", "FT");
104 else if (el->FindElement("polar_radius"))
105 b = el->FindElementValueAsNumberConvertTo("polar_radius", "FT");
106 // Trigger GeographicLib exceptions if the equatorial or polar radii are
107 // ill-defined.
108 // This intercepts the exception before being thrown by a destructor.
109 GeographicLib::Geodesic geod(a, 1.-b/a);
110
111 if (el->FindElement("rotation_rate")) {
112 double RotationRate = el->FindElementValueAsNumberConvertTo("rotation_rate", "RAD/SEC");
113 vOmegaPlanet = {0., 0., RotationRate};
114 }
115 if (el->FindElement("GM"))
116 GM = el->FindElementValueAsNumberConvertTo("GM", "FT3/SEC2");
117 if (el->FindElement("J2"))
118 J2 = el->FindElementValueAsNumber("J2"); // Dimensionless
119
120 GroundCallback->SetEllipse(a, b);
121
122 // Messages to warn the user about possible inconsistencies.
123 if (debug_lvl > 0) {
124 FGLogging log(LogLevel::WARN);
125 if (a != b && J2 == 0.0)
126 log << "Gravitational constant J2 is null for a non-spherical planet." << endl;
127 if (a == b && J2 != 0.0)
128 log << "Gravitational constant J2 is non-zero for a spherical planet." << endl;
129 }
130
131 Debug(2);
132
133 return true;
134}
bool Upload(Element *el, bool preLoad)
Uploads this model in memory.
Definition FGModel.cpp:111

◆ Run()

bool Run ( bool  Holding)
overridevirtual

Runs the Inertial model; called by the Executive Can pass in a value indicating if the executive is directing the simulation to Hold.

Parameters
Holdingif true, the executive has been directed to hold the sim from advancing time. Some models may ignore this flag, such as the Input model, which may need to be active to listen on a socket for the "Resume" command to be given.
Returns
false if no error

Reimplemented from FGModel.

Definition at line 138 of file FGInertial.cpp.

139{
140 // Fast return if we have nothing to do ...
141 if (FGModel::Run(Holding)) return true;
142 if (Holding) return false;
143
144 // Gravitation accel
145 switch (gravType) {
146 case gtStandard:
147 {
148 double radius = in.Position.GetRadius();
149 vGravAccel = -(GetGAccel(radius) / radius) * in.Position;
150 }
151 break;
152 case gtWGS84:
153 vGravAccel = GetGravityJ2(in.Position);
154 break;
155 }
156
157 return false;
158}
double GetRadius() const
Get the distance from the center of the earth in feet.
Definition FGLocation.h:291
virtual bool Run(bool Holding)
Runs the model; called by the Executive.
Definition FGModel.cpp:90

◆ SetAltitudeAGL()

void SetAltitudeAGL ( FGLocation location,
double  altitudeAGL 
)

Set the altitude above ground level.

Parameters
locationLocation at which the AGL is set.
altitudeAGLAltitude above Ground Level in feet.
See also
SetGroundCallback

Definition at line 227 of file FGInertial.cpp.

228{
229 FGColumnVector3 vDummy;
230 FGLocation contact;
231 contact.SetEllipse(a, b);
232 GroundCallback->GetAGLevel(location, contact, vDummy, vDummy, vDummy);
233 double groundHeight = contact.GetGeodAltitude();
234 double longitude = location.GetLongitude();
235 double geodLat = location.GetGeodLatitudeRad();
236 location.SetPositionGeodetic(longitude, geodLat,
237 groundHeight + altitudeAGL);
238}
+ Here is the call graph for this function:

◆ SetGravityType()

void SetGravityType ( int  gt)

Set the gravity type.

Definition at line 242 of file FGInertial.cpp.

243{
244 // Messages to warn the user about possible inconsistencies.
245 FGLogging log(LogLevel::WARN);
246 switch (gt)
247 {
249 if (a != b)
250 log << "Standard gravity model has been set for a non-spherical planet" << endl;
251 break;
253 if (J2 == 0.0)
254 log << "WGS84 gravity model has been set without specifying the J2 gravitational constant." << endl;
255 }
256
257 gravType = gt;
258}

◆ SetGroundCallback()

void SetGroundCallback ( FGGroundCallback gc)
inline

Sets the ground callback pointer.

FGInertial will take ownership of the pointer which must therefore be located in the heap.

Parameters
gcA pointer to a ground callback object
See also
FGGroundCallback

Definition at line 151 of file FGInertial.h.

151{ GroundCallback.reset(gc); }

◆ SetOmegaPlanet()

void SetOmegaPlanet ( double  rate)
inline

Definition at line 83 of file FGInertial.h.

83 {
84 vOmegaPlanet = FGColumnVector3(0.0, 0.0, rate);
85 }

◆ SetTerrainElevation()

void SetTerrainElevation ( double  h)
inline

Set the terrain elevation above sea level.

Parameters
hTerrain elevation in ft.
See also
SetGroundcallback

Definition at line 131 of file FGInertial.h.

131 {
132 GroundCallback->SetTerrainElevation(h);
133 }

◆ SetTime()

void SetTime ( double  time)
inline

Set the simulation time.

The elapsed time can be used by the ground callback to assess the planet rotation or the movement of objects.

Parameters
timeelapsed time in seconds since the simulation started.

Definition at line 140 of file FGInertial.h.

140 {
141 GroundCallback->SetTime(time);
142 }
+ Here is the caller graph for this function:

The documentation for this class was generated from the following files: