FlightGear next
JSBSim::FGForce Class Reference

Utility class that aids in the conversion of forces between coordinate systems and calculation of moments. More...

#include <FGForce.h>

Inherits JSBSim::FGJSBBase.

Inherited by JSBSim::FGExternalForce, JSBSim::FGGasCell, JSBSim::FGLGear, and JSBSim::FGThruster.

Public Types

enum  TransformType { tNone , tWindBody , tLocalBody , tCustom }
 
- Public Types inherited from JSBSim::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

 FGForce (FGFDMExec *FDMExec)
 Constructor.
 
 FGForce (const FGForce &force)
 
virtual ~FGForce ()
 Destructor.
 
virtual const FGColumnVector3GetBodyForces (void)
 
double GetBodyXForce (void) const
 
double GetBodyYForce (void) const
 
double GetBodyZForce (void) const
 
const FGColumnVector3GetMoments (void) const
 
void SetLocation (double x, double y, double z)
 
void SetActingLocation (double x, double y, double z)
 Acting point of application.
 
void SetLocationX (double x)
 
void SetLocationY (double y)
 
void SetLocationZ (double z)
 
double SetActingLocationX (double x)
 
double SetActingLocationY (double y)
 
double SetActingLocationZ (double z)
 
void SetLocation (const FGColumnVector3 &vv)
 
void SetActingLocation (const FGColumnVector3 &vv)
 
double GetLocationX (void) const
 
double GetLocationY (void) const
 
double GetLocationZ (void) const
 
double GetActingLocationX (void) const
 
double GetActingLocationY (void) const
 
double GetActingLocationZ (void) const
 
const FGColumnVector3GetLocation (void) const
 
const FGColumnVector3GetActingLocation (void) const
 
void SetAnglesToBody (double broll, double bpitch, double byaw)
 
void SetAnglesToBody (const FGColumnVector3 &vv)
 
void UpdateCustomTransformMatrix (void)
 
void SetPitch (double pitch)
 
void SetYaw (double yaw)
 
double GetPitch (void) const
 
double GetYaw (void) const
 
const FGColumnVector3GetAnglesToBody (void) const
 
double GetAnglesToBody (int axis) const
 
void SetTransformType (TransformType ii)
 
TransformType GetTransformType (void) const
 
const FGMatrix33Transform (void) const
 
- Public Member Functions inherited from JSBSim::FGJSBBase
 FGJSBBase ()
 Constructor for FGJSBBase.
 
virtual ~FGJSBBase ()
 Destructor for FGJSBBase.
 
void PutMessage (const Message &msg)
 Places a Message structure on the Message queue.
 
void PutMessage (const std::string &text)
 Creates a message with the given text and places it on the queue.
 
void PutMessage (const std::string &text, bool bVal)
 Creates a message with the given text and boolean value and places it on the queue.
 
void PutMessage (const std::string &text, int iVal)
 Creates a message with the given text and integer value and places it on the queue.
 
void PutMessage (const std::string &text, double dVal)
 Creates a message with the given text and double value and places it on the queue.
 
int SomeMessages (void) const
 Reads the message on the queue (but does not delete it).
 
void ProcessMessage (void)
 Reads the message on the queue and removes it from the queue.
 
MessageProcessNextMessage (void)
 Reads the next message on the queue and removes it from the queue.
 
void disableHighLighting (void)
 Disables highlighting in the console output.
 

Protected Attributes

FGFDMExecfdmex
 
FGMassBalanceMassBalance
 
FGColumnVector3 vFn
 
FGColumnVector3 vMn
 
FGColumnVector3 vOrient
 
TransformType ttype
 
FGColumnVector3 vXYZn
 
FGColumnVector3 vActingXYZn
 
FGMatrix33 mT
 

Additional Inherited Members

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 double PitotTotalPressure (double mach, double p)
 Compute the total pressure in front of the Pitot tube.
 
static double MachFromImpactPressure (double qc, double p)
 Compute the Mach number from the differential pressure (qc) and the static pressure.
 
static double VcalibratedFromMach (double mach, double p)
 Calculate the calibrated airspeed from the Mach number.
 
static double MachFromVcalibrated (double vcas, double p)
 Calculate the Mach number from the calibrated airspeed.Based on the formulas in the US Air Force Aircraft Performance Flight Testing Manual (AFFTC-TIH-99-01).
 
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)
 
static double GaussianRandomNumber (void)
 
- Static Public Attributes inherited from JSBSim::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
 
static std::string CreateIndexedPropertyName (const std::string &Property, int index)
 
static Message localMsg
 
static std::queue< MessageMessages
 
static unsigned int messageId = 0
 
static constexpr double radtodeg = 180. / 3.14159265358979323846
 
static constexpr double degtorad = 3.14159265358979323846 / 180.
 
static constexpr double hptoftlbssec = 550.0
 
static constexpr double psftoinhg = 0.014138
 
static constexpr double psftopa = 47.88
 
static constexpr double ktstofps = 1.68781
 
static constexpr double fpstokts = 1.0 / ktstofps
 
static constexpr double inchtoft = 1.0/12.0
 
static constexpr double fttom = 0.3048
 
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__
 
static int gaussian_random_number_phase = 0
 

Detailed Description

Utility class that aids in the conversion of forces between coordinate systems and calculation of moments.


Resolution of Applied Forces into Moments and Body Axes Components


All forces acting on the aircraft that cannot be considered a change in weight need to be resolved into body axis components so that the aircraft acceleration vectors, both translational and rotational, can be computed. Furthermore, the moments produced by each force that does not act at a location corresponding to the center of gravity also need to be computed. Unfortunately, the math required to do this can be a bit messy and errors are easily introduced so the class FGForce was created to provide these services in a consistent and reusable manner.

Basic usage

FGForce requires that its users supply it with the location of the applied force vector in JSBSim structural coordinates, the sense of each axis in that coordinate system relative to the body system, the orientation of the vector also relative to body coordinates and, of course, the force vector itself. With this information it will compute both the body axis force components and the resulting moments. Any moments inherently produced by the native system can be supplied as well and they will be summed with those computed.

A good example for demonstrating the use of this class are the aerodynamic forces: lift, drag, and side force and the aerodynamic moments about the pitch, roll and yaw axes. These "native" forces and moments are computed and stored in the FGColumnVector objects vFs and vMoments. Their native coordinate system is often referred to as the wind system and is defined as a right-handed system having its x-axis aligned with the relative velocity vector and pointing towards the rear of the aircraft , the y-axis extending out the right wing, and the z-axis directed upwards. This is different than body axes; they are defined such that the x-axis is lies on the aircraft's roll axis and positive forward, the y-axis is positive out the right wing, and the z-axis is positive downwards. In this instance, JSBSim already provides the needed transform and FGForce can make use of it by calling SetTransformType() once an object is created:

FGForce fgf(FDMExec);
fgf.SetTransformType(tWindBody);

This call need only be made once for each object. The available transforms are defined in the enumerated type TransformType and are tWindBody, tLocalBody, tCustom, and tNone. The local-to-body transform, like the wind-to-body, also makes use of that already available in JSBSim. tNone sets FGForce to do no angular transform at all, and tCustom allows for modeling force vectors at arbitrary angles relative to the body system such as that produced by propulsion systems. Setting up and using a custom transform is covered in more detail below. Continuing with the example, the point of application of the aerodynamic forces, the aerodynamic reference point in JSBSim, also needs to be set:

fgf.SetLocation(x, y, z)

where x, y, and z are in JSBSim structural coordinates.

Initialization is complete and the FGForce object is ready to do its job. As stated above, the lift, drag, and side force are computed and stored in the vector vFs and need to be passed to FGForce:

fgf.SetNativeForces(vFs);

The same applies to the aerodynamic pitching, rolling and yawing moments:

fgf.SetNativeMoments(vMoments);

Note that storing the native forces and moments outside of this class is not strictly necessary, overloaded SetNativeForces() and SetNativeMoments() methods which each accept three doubles (rather than a vector) are provided and can be repeatedly called without incurring undue overhead. The body axes force vector can now be retrieved by calling:

vFb=fgf.GetBodyForces();

This method is where the bulk of the work gets done so calling it more than once for the same set of native forces and moments should probably be avoided. Note that the moment calculations are done here as well so they should be retrieved after calling the GetBodyForces() method:

vM=fgf.GetMoments();

As an aside, the native moments are not needed to perform the computations correctly so, if the FGForce object is not being used to store them then an alternate approach is to avoid the SetNativeMoments call and perform the sum

vMoments+=fgf.GetMoments();

after the forces have been retrieved.

Use of the Custom Transform Type

In cases where the native force vector is not aligned with the body, wind, or local coordinate systems a custom transform type is provided. A vectorable engine nozzle will be used to demonstrate its usage. Initialization is much the same:

FGForce fgf(FDMExec);
fgf.SetTransformType(tCustom);
fgf.SetLocation(x,y,z);

Except that here the tCustom transform type is specified and the location of the thrust vector is used rather than the aerodynamic reference point. Thrust is typically considered to be positive when directed aft while the body x-axis is positive forward and, if the native system is right handed, the z-axis will be reversed as well. These differences in sense need to be specified using by the call:

fgf.SetSense(-1,1,-1);

The angles are specified by calling the method:

fgf.SetAnglesToBody(pitch, roll, yaw);

in which the transform matrix is computed. Note that these angles should be taken relative to the body system and not the local as the names might suggest. For an aircraft with vectorable thrust, this method will need to be called every time the nozzle angle changes, a fixed engine/nozzle installation, on the other hand, will require it to be be called only once.

Retrieval of the computed forces and moments is done as detailed above.


    
CAVEAT: If the custom system is used to compute
    the wind-to-body transform, then the sign of the sideslip
    angle must be reversed when calling SetAnglesToBody().
    This is true because sideslip angle does not follow the right
    hand rule. Using the custom transform type this way
    should not be necessary, as it is already provided as a built
    in type (and the sign differences are correctly accounted for).
    

Use as a Base Type

For use as a base type, the native force and moment vector data members are defined as protected. In this case the SetNativeForces() and SetNativeMoments() methods need not be used and, instead, the assignments to vFn, the force vector, and vMn, the moments, can be made directly. Otherwise, the usage is similar.


@author Tony Peden

Definition at line 221 of file FGForce.h.

Member Enumeration Documentation

◆ TransformType

Enumerator
tNone 
tWindBody 
tLocalBody 
tCustom 

Definition at line 231 of file FGForce.h.

Constructor & Destructor Documentation

◆ FGForce() [1/2]

JSBSim::FGForce::FGForce ( FGFDMExec * FDMExec)
explicit

Constructor.

Definition at line 53 of file FGForce.cpp.

◆ FGForce() [2/2]

JSBSim::FGForce::FGForce ( const FGForce & force)

◆ ~FGForce()

JSBSim::FGForce::~FGForce ( )
virtual

Destructor.

Definition at line 74 of file FGForce.cpp.

Member Function Documentation

◆ GetActingLocation()

const FGColumnVector3 & JSBSim::FGForce::GetActingLocation ( void ) const
inline

Definition at line 278 of file FGForce.h.

◆ GetActingLocationX()

double JSBSim::FGForce::GetActingLocationX ( void ) const
inline

Definition at line 274 of file FGForce.h.

◆ GetActingLocationY()

double JSBSim::FGForce::GetActingLocationY ( void ) const
inline

Definition at line 275 of file FGForce.h.

◆ GetActingLocationZ()

double JSBSim::FGForce::GetActingLocationZ ( void ) const
inline

Definition at line 276 of file FGForce.h.

◆ GetAnglesToBody() [1/2]

double JSBSim::FGForce::GetAnglesToBody ( int axis) const
inline

Definition at line 300 of file FGForce.h.

◆ GetAnglesToBody() [2/2]

const FGColumnVector3 & JSBSim::FGForce::GetAnglesToBody ( void ) const
inline

Definition at line 299 of file FGForce.h.

◆ GetBodyForces()

const FGColumnVector3 & JSBSim::FGForce::GetBodyForces ( void )
virtual

Reimplemented in JSBSim::FGExternalForce.

Definition at line 81 of file FGForce.cpp.

◆ GetBodyXForce()

double JSBSim::FGForce::GetBodyXForce ( void ) const
inline

Definition at line 235 of file FGForce.h.

◆ GetBodyYForce()

double JSBSim::FGForce::GetBodyYForce ( void ) const
inline

Definition at line 236 of file FGForce.h.

◆ GetBodyZForce()

double JSBSim::FGForce::GetBodyZForce ( void ) const
inline

Definition at line 237 of file FGForce.h.

◆ GetLocation()

const FGColumnVector3 & JSBSim::FGForce::GetLocation ( void ) const
inline

Definition at line 277 of file FGForce.h.

◆ GetLocationX()

double JSBSim::FGForce::GetLocationX ( void ) const
inline

Definition at line 271 of file FGForce.h.

◆ GetLocationY()

double JSBSim::FGForce::GetLocationY ( void ) const
inline

Definition at line 272 of file FGForce.h.

◆ GetLocationZ()

double JSBSim::FGForce::GetLocationZ ( void ) const
inline

Definition at line 273 of file FGForce.h.

◆ GetMoments()

const FGColumnVector3 & JSBSim::FGForce::GetMoments ( void ) const
inline

Definition at line 238 of file FGForce.h.

◆ GetPitch()

double JSBSim::FGForce::GetPitch ( void ) const
inline

Definition at line 296 of file FGForce.h.

◆ GetTransformType()

TransformType JSBSim::FGForce::GetTransformType ( void ) const
inline

Definition at line 303 of file FGForce.h.

◆ GetYaw()

double JSBSim::FGForce::GetYaw ( void ) const
inline

Definition at line 297 of file FGForce.h.

◆ SetActingLocation() [1/2]

void JSBSim::FGForce::SetActingLocation ( const FGColumnVector3 & vv)
inline

Definition at line 269 of file FGForce.h.

◆ SetActingLocation() [2/2]

void JSBSim::FGForce::SetActingLocation ( double x,
double y,
double z )
inline

Acting point of application.

JSBsim structural coords used (inches, x +back, y +right, z +up). This function sets the point at which the force acts - this may not be the same as where the object resides. One area where this is true is P-Factor modeling.

Parameters
xacting location of force
yacting location of force
zacting location of force

Definition at line 257 of file FGForce.h.

◆ SetActingLocationX()

double JSBSim::FGForce::SetActingLocationX ( double x)
inline

Definition at line 265 of file FGForce.h.

◆ SetActingLocationY()

double JSBSim::FGForce::SetActingLocationY ( double y)
inline

Definition at line 266 of file FGForce.h.

◆ SetActingLocationZ()

double JSBSim::FGForce::SetActingLocationZ ( double z)
inline

Definition at line 267 of file FGForce.h.

◆ SetAnglesToBody() [1/2]

void JSBSim::FGForce::SetAnglesToBody ( const FGColumnVector3 & vv)
inline

Definition at line 288 of file FGForce.h.

◆ SetAnglesToBody() [2/2]

void JSBSim::FGForce::SetAnglesToBody ( double broll,
double bpitch,
double byaw )

Definition at line 147 of file FGForce.cpp.

◆ SetLocation() [1/2]

void JSBSim::FGForce::SetLocation ( const FGColumnVector3 & vv)
inline

Definition at line 268 of file FGForce.h.

◆ SetLocation() [2/2]

void JSBSim::FGForce::SetLocation ( double x,
double y,
double z )
inline

Definition at line 242 of file FGForce.h.

◆ SetLocationX()

void JSBSim::FGForce::SetLocationX ( double x)
inline

Definition at line 262 of file FGForce.h.

◆ SetLocationY()

void JSBSim::FGForce::SetLocationY ( double y)
inline

Definition at line 263 of file FGForce.h.

◆ SetLocationZ()

void JSBSim::FGForce::SetLocationZ ( double z)
inline

Definition at line 264 of file FGForce.h.

◆ SetPitch()

void JSBSim::FGForce::SetPitch ( double pitch)
inline

Definition at line 293 of file FGForce.h.

◆ SetTransformType()

void JSBSim::FGForce::SetTransformType ( TransformType ii)
inline

Definition at line 302 of file FGForce.h.

◆ SetYaw()

void JSBSim::FGForce::SetYaw ( double yaw)
inline

Definition at line 294 of file FGForce.h.

◆ Transform()

const FGMatrix33 & JSBSim::FGForce::Transform ( void ) const

Definition at line 98 of file FGForce.cpp.

◆ UpdateCustomTransformMatrix()

void JSBSim::FGForce::UpdateCustomTransformMatrix ( void )

Definition at line 119 of file FGForce.cpp.

Member Data Documentation

◆ fdmex

FGFDMExec* JSBSim::FGForce::fdmex
protected

Definition at line 308 of file FGForce.h.

◆ MassBalance

FGMassBalance* JSBSim::FGForce::MassBalance
protected

Definition at line 309 of file FGForce.h.

◆ mT

FGMatrix33 JSBSim::FGForce::mT
protected

Definition at line 316 of file FGForce.h.

◆ ttype

TransformType JSBSim::FGForce::ttype
protected

Definition at line 313 of file FGForce.h.

◆ vActingXYZn

FGColumnVector3 JSBSim::FGForce::vActingXYZn
protected

Definition at line 315 of file FGForce.h.

◆ vFn

FGColumnVector3 JSBSim::FGForce::vFn
protected

Definition at line 310 of file FGForce.h.

◆ vMn

FGColumnVector3 JSBSim::FGForce::vMn
protected

Definition at line 311 of file FGForce.h.

◆ vOrient

FGColumnVector3 JSBSim::FGForce::vOrient
protected

Definition at line 312 of file FGForce.h.

◆ vXYZn

FGColumnVector3 JSBSim::FGForce::vXYZn
protected

Definition at line 314 of file FGForce.h.


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