JSBSim Flight Dynamics Model  1.2.0 (05 Nov 2023)
An Open Source Flight Dynamics and Control Software Library in C++
FGMassBalance Class Reference

Detailed Description

Models weight, balance and moment of inertia information.

Maintains a vector of point masses. Sums the contribution of all, and provides this to FGPropagate. Loads the <mass_balance> section of the aircraft configuration file. There can be any number of <pointmasses>. Each can also have a shape which - if present - causes an associated moment of inertia to be calculated based on the shape. Note that a cylinder is solid, a tube is hollow, a ball is solid and a sphere is hollow.

The inertia tensor must be specified in the structural frame (x axis positive aft, y axis positive out of the right wing and z axis upward). The sign of the inertia cross products are optional by JSBSim. if negated_crossproduct_inertia == "true", then define: ixy = -integral( x * y * dm ), ixz = -integral( x * z * dm ), iyz = -integral( y * z * dm ). else if negated_crossproduct_inertia == "false", then define: ixy = integral( x * y * dm ), ixz = integral( x * z * dm ), iyz = integral( y * z * dm ). default is negated_crossproduct_inertia = "true". We strongly recommend defining negated_crossproduct_inertia = "false", which is consistent with the specifications in the field of flight dynamics.

Configuration File Format for <mass_balance> Section:

<mass_balance negated_crossproduct_inertia="true|false">
<ixx unit="{SLUG*FT2 | KG*M2}"> {number} </ixx>
<iyy unit="{SLUG*FT2 | KG*M2}"> {number} </iyy>
<izz unit="{SLUG*FT2 | KG*M2}"> {number} </izz>
<ixy unit="{SLUG*FT2 | KG*M2}"> {number} </ixy>
<ixz unit="{SLUG*FT2 | KG*M2}"> {number} </ixz>
<iyz unit="{SLUG*FT2 | KG*M2}"> {number} </iyz>
<emptywt unit="{LBS | KG"> {number} </emptywt>
<location name="CG" unit="{IN | FT | M}">
<x> {number} </x>
<y> {number} </y>
<z> {number} </z>
</location>
[<pointmass name="{string}">
<form shape="{tube | cylinder | sphere | ball}">
<radius unit="{IN | FT | M}"> {number} </radius>
<length unit="{IN | FT | M}"> {number} </length>
</form>
<weight unit="{LBS | KG}"> {number} </weight>
<location name="{string}" unit="{IN | FT | M}">
<x> {number} </x>
<y> {number} </y>
<z> {number} </z>
</location>
</pointmass>
... other point masses ...]
</mass_balance>
@see Stevens and Lewis, "Flight Control & Simulation"
@see Bernard Etkin, " Dynamics Of Atmosferic Flight"
@see https://en.wikipedia.org/wiki/Moment_of_inertia#Inertia_tensor
@see https://www.mathworks.com/help/physmod/sm/ug/specify-custom-inertia.html

Definition at line 124 of file FGMassBalance.h.

#include <FGMassBalance.h>

+ Inheritance diagram for FGMassBalance:
+ Collaboration diagram for FGMassBalance:

Classes

struct  Inputs
 

Public Member Functions

 FGMassBalance (FGFDMExec *)
 
void AddPointMass (Element *el)
 
double GetDeltaXYZcg (int axis) const
 
const FGColumnVector3GetDeltaXYZcg (void) const
 
double GetEmptyWeight (void) const
 
const FGMatrix33GetJ (void) const
 Returns the inertia matrix expressed in the body frame.
 
const FGMatrix33GetJinv (void) const
 Returns the inverse of the inertia matrix expressed in the body frame.
 
double GetMass (void) const
 
void GetMassPropertiesReport (int i)
 
FGMatrix33 GetPointmassInertia (double mass_sl, const FGColumnVector3 &r) const
 Computes the inertia contribution of a pointmass. More...
 
const FGColumnVector3GetPointMassMoment (void)
 
double GetTotalPointMassWeight (void) const
 
double GetWeight (void) const
 
double GetXYZcg (int axis) const
 
const FGColumnVector3GetXYZcg (void) const
 Returns the coordinates of the center of gravity expressed in the structural frame.
 
bool InitModel (void) override
 
bool Load (Element *el) override
 
bool Run (bool Holding) override
 Runs the Mass Balance model; called by the Executive Can pass in a value indicating if the executive is directing the simulation to Hold. More...
 
void SetAircraftBaseInertias (const FGMatrix33 &BaseJ)
 
void SetBaseCG (const FGColumnVector3 &CG)
 
void SetEmptyWeight (double EW)
 
FGColumnVector3 StructuralToBody (const FGColumnVector3 &r) const
 Conversion from the structural frame to the body frame. More...
 
- Public Member Functions inherited from FGModel
 FGModel (FGFDMExec *)
 Constructor.
 
 ~FGModel () override
 Destructor.
 
virtual SGPath FindFullPathName (const SGPath &path) const
 
FGFDMExecGetExec (void)
 
const std::string & GetName (void)
 
unsigned int GetRate (void)
 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. More...
 
std::string GetFunctionValues (const std::string &delimeter) const
 Gets the function values. More...
 
std::shared_ptr< FGFunctionGetPreFunction (const std::string &name)
 Get one of the "pre" function. More...
 
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.
 

Public Attributes

struct JSBSim::FGMassBalance::Inputs in
 

Additional Inherited Members

- Public Types inherited from FGJSBBase
enum  { eL = 1 , eM , eN }
 Moments L, M, N.
 
enum  { eP = 1 , eQ , eR }
 Rates P, Q, R.
 
enum  { eU = 1 , eV , eW }
 Velocities U, V, W.
 
enum  { eX = 1 , eY , eZ }
 Positions X, Y, Z.
 
enum  { ePhi = 1 , eTht , ePsi }
 Euler angles Phi, Theta, Psi.
 
enum  { eDrag = 1 , eSide , eLift }
 Stability axis forces, Drag, Side force, Lift.
 
enum  { eRoll = 1 , ePitch , eYaw }
 Local frame orientation Roll, Pitch, Yaw.
 
enum  { eNorth = 1 , eEast , eDown }
 Local frame position North, East, Down.
 
enum  { eLat = 1 , eLong , eRad }
 Locations Radius, Latitude, Longitude.
 
enum  {
  inNone = 0 , inDegrees , inRadians , inMeters ,
  inFeet
}
 Conversion specifiers.
 
- Static Public Member Functions inherited from FGJSBBase
static const std::string & GetVersion (void)
 Returns the version number of JSBSim. More...
 
static constexpr double KelvinToFahrenheit (double kelvin)
 Converts from degrees Kelvin to degrees Fahrenheit. More...
 
static constexpr double CelsiusToRankine (double celsius)
 Converts from degrees Celsius to degrees Rankine. More...
 
static constexpr double RankineToCelsius (double rankine)
 Converts from degrees Rankine to degrees Celsius. More...
 
static constexpr double KelvinToRankine (double kelvin)
 Converts from degrees Kelvin to degrees Rankine. More...
 
static constexpr double RankineToKelvin (double rankine)
 Converts from degrees Rankine to degrees Kelvin. More...
 
static constexpr double FahrenheitToCelsius (double fahrenheit)
 Converts from degrees Fahrenheit to degrees Celsius. More...
 
static constexpr double CelsiusToFahrenheit (double celsius)
 Converts from degrees Celsius to degrees Fahrenheit. More...
 
static constexpr double CelsiusToKelvin (double celsius)
 Converts from degrees Celsius to degrees Kelvin. More...
 
static constexpr double KelvinToCelsius (double kelvin)
 Converts from degrees Kelvin to degrees Celsius. More...
 
static constexpr double FeetToMeters (double measure)
 Converts from feet to meters. More...
 
static bool EqualToRoundoff (double a, double b)
 Finite precision comparison. More...
 
static bool EqualToRoundoff (float a, float b)
 Finite precision comparison. More...
 
static bool EqualToRoundoff (float a, double b)
 Finite precision comparison. More...
 
static bool EqualToRoundoff (double a, float b)
 Finite precision comparison. More...
 
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)
 
- 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. More...
 
- 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< FGPropertyManagerPropertyManager
 
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. More...
 
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 Function Documentation

◆ GetPointmassInertia()

FGMatrix33 GetPointmassInertia ( double  mass_sl,
const FGColumnVector3 r 
) const
inline

Computes the inertia contribution of a pointmass.

Computes and returns the inertia matrix of a pointmass of mass slugs at the given vector r in the structural frame. The units should be for the mass in slug and the vector in the structural frame as usual in inches.

Parameters
mass_slthe mass of this single pointmass given in slugs
rthe location of this single pointmass in the structural frame

Definition at line 161 of file FGMassBalance.h.

162  {
163  FGColumnVector3 v = StructuralToBody( r );
164  FGColumnVector3 sv = mass_sl*v;
165  double xx = sv(1)*v(1);
166  double yy = sv(2)*v(2);
167  double zz = sv(3)*v(3);
168  double xy = -sv(1)*v(2);
169  double xz = -sv(1)*v(3);
170  double yz = -sv(2)*v(3);
171  return FGMatrix33( yy+zz, xy, xz,
172  xy, xx+zz, yz,
173  xz, yz, xx+yy );
174  }
FGColumnVector3 StructuralToBody(const FGColumnVector3 &r) const
Conversion from the structural frame to the body frame.

◆ Run()

bool Run ( bool  Holding)
overridevirtual

Runs the Mass Balance 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 181 of file FGMassBalance.cpp.

182 {
183  double denom, k1, k2, k3, k4, k5, k6;
184  double Ixx, Iyy, Izz, Ixy, Ixz, Iyz;
185 
186  if (FGModel::Run(Holding)) return true;
187  if (Holding) return false;
188 
189  RunPreFunctions();
190 
191  double ChildFDMWeight = 0.0;
192  for (size_t fdm=0; fdm<FDMExec->GetFDMCount(); fdm++) {
193  if (FDMExec->GetChildFDM(fdm)->mated) ChildFDMWeight += FDMExec->GetChildFDM(fdm)->exec->GetMassBalance()->GetWeight();
194  }
195 
196  Weight = EmptyWeight + in.TanksWeight + GetTotalPointMassWeight()
197  + in.GasMass*slugtolb + ChildFDMWeight;
198 
199  Mass = lbtoslug*Weight;
200 
201 // Calculate new CG
202 
203  vXYZcg = (EmptyWeight*vbaseXYZcg
204  + GetPointMassMoment()
205  + in.TanksMoment
206  + in.GasMoment) / Weight;
207 
208  // Track frame-by-frame delta CG, and move the EOM-tracked location
209  // by this amount.
210  if (vLastXYZcg.Magnitude() == 0.0) vLastXYZcg = vXYZcg;
211  vDeltaXYZcg = vXYZcg - vLastXYZcg;
212  vDeltaXYZcgBody = StructuralToBody(vLastXYZcg) - StructuralToBody(vXYZcg);
213  vLastXYZcg = vXYZcg;
214 
215  // Compensate displacements of the structural frame when the mass distribution
216  // is modified while the aircraft is in contact with the ground.
217  if (FDMExec->GetHoldDown() || in.WOW)
218  Propagate->NudgeBodyLocation(vDeltaXYZcgBody);
219 
220 // Calculate new total moments of inertia
221 
222  // At first it is the base configuration inertia matrix ...
223  mJ = baseJ;
224  // ... with the additional term originating from the parallel axis theorem.
225  mJ += GetPointmassInertia( lbtoslug * EmptyWeight, vbaseXYZcg );
226  // Then add the contributions from the additional pointmasses.
227  mJ += CalculatePMInertias();
228  mJ += in.TankInertia;
229  mJ += in.GasInertia;
230 
231  Ixx = mJ(1,1);
232  Iyy = mJ(2,2);
233  Izz = mJ(3,3);
234  Ixy = -mJ(1,2);
235  Ixz = -mJ(1,3);
236  Iyz = -mJ(2,3);
237 
238 // Calculate inertia matrix inverse (ref. Stevens and Lewis, "Flight Control &
239 // Simulation")
240 
241  k1 = (Iyy*Izz - Iyz*Iyz);
242  k2 = (Iyz*Ixz + Ixy*Izz);
243  k3 = (Ixy*Iyz + Iyy*Ixz);
244 
245  denom = 1.0/(Ixx*k1 - Ixy*k2 - Ixz*k3 );
246  k1 = k1*denom;
247  k2 = k2*denom;
248  k3 = k3*denom;
249  k4 = (Izz*Ixx - Ixz*Ixz)*denom;
250  k5 = (Ixy*Ixz + Iyz*Ixx)*denom;
251  k6 = (Ixx*Iyy - Ixy*Ixy)*denom;
252 
253  mJinv = { k1, k2, k3,
254  k2, k4, k5,
255  k3, k5, k6 };
256 
257  RunPostFunctions();
258 
259  Debug(0);
260 
261  return false;
262 }
double Magnitude(void) const
Length of the vector.
bool GetHoldDown(void) const
Gets the value of the property forces/hold-down.
Definition: FGFDMExec.h:611
size_t GetFDMCount(void) const
Gets the number of child FDMs.
Definition: FGFDMExec.h:425
auto GetChildFDM(int i) const
Gets a particular child FDM.
Definition: FGFDMExec.h:427
static constexpr double slugtolb
Note that definition of lbtoslug by the inverse of slugtolb and not to a different constant you can a...
Definition: FGJSBBase.h:314
FGMatrix33 GetPointmassInertia(double mass_sl, const FGColumnVector3 &r) const
Computes the inertia contribution of a pointmass.
virtual bool Run(bool Holding)
Runs the model; called by the Executive.
Definition: FGModel.cpp:89
+ Here is the call graph for this function:

◆ StructuralToBody()

FGColumnVector3 StructuralToBody ( const FGColumnVector3 r) const

Conversion from the structural frame to the body frame.

Converts the location given in the structural frame coordinate system to the body frame. The units of the structural frame are assumed to be in inches. The unit of the result is in ft.

Parameters
rvector coordinate in the structural reference frame (X positive aft, measurements in inches).
Returns
vector coordinate in the body frame, in feet.

Definition at line 364 of file FGMassBalance.cpp.

365 {
366  // Under the assumption that in the structural frame the:
367  //
368  // - X-axis is directed afterwards,
369  // - Y-axis is directed towards the right,
370  // - Z-axis is directed upwards,
371  //
372  // (as documented in http://jsbsim.sourceforge.net/JSBSimCoordinates.pdf)
373  // we have to subtract first the center of gravity of the plane which
374  // is also defined in the structural frame:
375  //
376  // FGColumnVector3 cgOff = r - vXYZcg;
377  //
378  // Next, we do a change of units:
379  //
380  // cgOff *= inchtoft;
381  //
382  // And then a 180 degree rotation is done about the Y axis so that the:
383  //
384  // - X-axis is directed forward,
385  // - Y-axis is directed towards the right,
386  // - Z-axis is directed downward.
387  //
388  // This is needed because the structural and body frames are 180 degrees apart.
389 
390  return FGColumnVector3(inchtoft*(vXYZcg(1)-r(1)),
391  inchtoft*(r(2)-vXYZcg(2)),
392  inchtoft*(vXYZcg(3)-r(3)));
393 }

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