JSBSim Thrusters: Difference between revisions

From FlightGear wiki
Jump to navigation Jump to search
(→‎FGRotor: Remove the freewheelthresh tag, its not used.)
mNo edit summary
 
(11 intermediate revisions by 6 users not shown)
Line 1: Line 1:
'''[[JSBSim]]''' uses '''thruster''' models to convert engine power into aerodynamic forces. The following table shows which engine-thruster combinations work.
'''[[JSBSim]]''' uses '''thruster''' models to convert engine power into aerodynamic forces. The following table shows which engine-thruster combinations work.
{| class="wikitable" style="text-align:center;"
 
|
{| class="wikitable" style="text-align:center;border: none; background: none;"
|-
! colspan="2" rowspan="2" style="border: none; background: none;" |
! colspan=4 | Thrusters
|-
| style="width:60px;" | [[JSBSim Thrusters#FGDirect|Direct]]  
| style="width:60px;" | [[JSBSim Thrusters#FGDirect|Direct]]  
| style="width:60px;" | [[JSBSim Thrusters#FGNozzle|Nozzle]]
| style="width:60px;" | [[JSBSim Thrusters#FGNozzle|Nozzle]]
Line 7: Line 11:
| style="width:60px;" | [[JSBSim Thrusters#FGRotor|Rotor]]  
| style="width:60px;" | [[JSBSim Thrusters#FGRotor|Rotor]]  
|-
|-
! rowspan=5 | Engines
|[[JSBSim Engines#FGElectric|Electric]]
|[[JSBSim Engines#FGElectric|Electric]]
| style="background-color: #33FF33;" |
| style="background-color: #33FF33;" |
Line 40: Line 45:
== FGDirect ==
== FGDirect ==
Thrust is computed directly by the engine, the direct thruster file is a stub. Currently FGTurbine engines use this thruster and it can also be used with FGElectric.
Thrust is computed directly by the engine, the direct thruster file is a stub. Currently FGTurbine engines use this thruster and it can also be used with FGElectric.
=== Configuration File Format ===
 
=== Configuration file format ===
This is the complete configuration file. Copy and paste into your 'direct.xml' file.
This is the complete configuration file. Copy and paste into your 'direct.xml' file.
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
Line 47: Line 53:
</direct>  
</direct>  
</syntaxhighlight>
</syntaxhighlight>
=== Notes ===
=== Notes ===
* The direct thruster creates a property called propulsion/engine[#]/reverser-angle-rad
* The direct thruster creates a property called propulsion/engine[#]/reverser-angle-rad
Line 53: Line 60:
== FGNozzle ==
== FGNozzle ==
FGNozzle is for the FGRocket engine.
FGNozzle is for the FGRocket engine.
=== Configuration File Format ===
 
=== Configuration file format ===
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<?xml version="1.0"?>  
<?xml version="1.0"?>  
Line 60: Line 68:
</nozzle>
</nozzle>
</syntaxhighlight>
</syntaxhighlight>
=== Parameter definitions ===
=== Parameter definitions ===
{| class="prettytable"
{| class="prettytable"
Line 66: Line 75:
|Nozzle area at the exit plane.
|Nozzle area at the exit plane.
|}
|}
=== Notes ===
=== Notes ===
* All parameters MUST be specified.
* All parameters MUST be specified.
* The area specified times the sea level pressure (2117 lbf/ft^2) is the amount thrust is reduced at sea level


== FGPropeller ==
== FGPropeller ==
FGPropeller models a propeller given the tabular data for Ct and Cp, indexed by the advance ratio "J".  
FGPropeller models a propeller given the tabular data for Ct and Cp, indexed by the advance ratio "J".
=== Configuration File Format ===
 
=== Configuration file format ===
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<!-- Sense goes in the parent tag -->
<!-- Sense and P factor go in the parent tag of the propeller, i.e. in the <thruster> element -->
<sense> {1 | -1} </sense>  
<sense> {1 | -1} </sense>  
<p_factor> {number} </p_factor>
<?xml version="1.0"?>  
<?xml version="1.0"?>  
<propeller name="{string}">
<propeller name="{string}">
Line 87: Line 101:
   <constspeed> {number} </constspeed>
   <constspeed> {number} </constspeed>
   <reversepitch> {number} </reversepitch>
   <reversepitch> {number} </reversepitch>
  <p_factor> {number} </p_factor>
   <ct_factor> {number} </ct_factor>
   <ct_factor> {number} </ct_factor>
   <cp_factor> {number} </cp_factor>
   <cp_factor> {number} </cp_factor>
Line 117: Line 130:
</propeller>
</propeller>
</syntaxhighlight>
</syntaxhighlight>
=== Parameter definitions ===
=== Parameter definitions ===
{| class="prettytable"
{| class="prettytable"
|-
|-
|ixx
| valign="top" | ixx
|Propeller rotational inertia. This can be english units, slug & feet^2:
|Propeller rotational inertia. This can be english units, slug & feet^2:


Line 159: Line 173:
|-
|-
|sense
|sense
|Direction of rotation (1= clockwise as viewed from rear, -1=counter-clockwise as viewed from rear). Sense is specified in the parent tag of the propeller.
|Direction of rotation (1= clockwise as viewed from rear, -1=counter-clockwise as viewed from rear). Sense is specified in the parent tag of the propeller. ''See [[JSBSim_Thrusters#Sense_bug_affecting_gyroscopic_moment|important note below]] regarding a JSBSim bug affecting sense and the direction of the resulting gyroscopic moment.''
|-
|-
|p_factor
|p_factor
|P factor.
|P factor. It is specified in the parent tag of the propeller.
|-
|-
|ct_factor
|ct_factor
Line 170: Line 184:
|A multiplier for the coefficients of power (multiplies the dependent variable in the C_POWER table by this factor).
|A multiplier for the coefficients of power (multiplies the dependent variable in the C_POWER table by this factor).
|}
|}
The parameters <sense> and <p_factor> must be specified at the parent level i.e. in the <thruster> element. This allows to specify different sense and P factor values for each propeller of the model while using the same definition file for all the propellers.


===C_THRUST and C_POWER tables===
=== C_THRUST and C_POWER tables ===
The C_THRUST and C_POWER tables are required.  
The C_THRUST and C_POWER tables are required.  


Line 205: Line 220:
==== Sample C_THRUST and C_POWER tables ====
==== Sample C_THRUST and C_POWER tables ====
These example tables are from FlightGear's C172P aircraft:
These example tables are from FlightGear's C172P aircraft:
<nowiki>
 
<syntaxhighlight lang="xml">
   <table name="C_THRUST" type="internal">
   <table name="C_THRUST" type="internal">
       <tableData>
       <tableData>
Line 266: Line 282:
       </tableData>
       </tableData>
     </table>
     </table>
</nowiki>
</syntaxhighlight>


Example of table for variable pitch propeller ([http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg32187.html source]):
Example of table for variable pitch propeller ([http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg32187.html source]):


<nowiki>
<syntaxhighlight lang="xml">
  <!-- thrust coefficient as a function of advance ratio and blade angle -->
  <!-- thrust coefficient as a function of advance ratio and blade angle -->
     <table name="C_THRUST" type="internal">
     <table name="C_THRUST" type="internal">
Line 347: Line 363:
     </tableData>
     </tableData>
   </table>
   </table>
 
<syntaxhighlight lang="xml">
</nowiki>


=== CT_MACH and CP_MACH ===
=== CT_MACH and CP_MACH ===
The CT_MACH and CP_MACH tables are optional. They apply a factor to Ct and Cp based on the helical tip Mach.
The CT_MACH and CP_MACH tables are optional. They apply a factor to Ct and Cp based on the helical tip Mach. The CP_MACH table models the [http://en.wikipedia.org/wiki/Drag_divergence_Mach_number Drag Divergence Mach Number] for the propeller airfoil. The CT_MACH table models the thrust reduction.


Examples:
Examples:
   
   
<nowiki>
<syntaxhighlight lang="xml">


  <!-- thrust effects of helical tip Mach -->
  <!-- thrust effects of helical tip Mach -->
Line 373: Line 388:
     </tableData>
     </tableData>
   </table>
   </table>
</nowiki>
</syntaxhighlight>


=== Sense ===
=== Sense ===
Sense is the direction of rotation. 1=clockwise (typically as seen from rear of aircraft or the cockpit of a typical front-propeller aircraft, but this may vary depending on how you have set up the coordinate system for your aircraft) and -1 is counter-clockwise.
Sense is the direction of rotation. 1=clockwise (typically as seen from rear of aircraft or the cockpit of a typical front-propeller aircraft, but this may vary depending on how you have set up the coordinate system for your aircraft) and -1 is counter-clockwise.


The sense tag goes in the parent tag of the thruster, ie, in the <propulsion><thruster> section which is typically in the main JSBSim XML file.  Example:
The sense tag goes in the parent tag of the thruster, ie, in the <propulsion><thruster> section which is typically in the main JSBSim XML file.  Example:


<syntaxhighlight lang="xml">
     <propulsion>
     <propulsion>
         <engine file="Clerget9B">
         <engine file="Clerget9B">
Line 418: Line 433:
         </tank>
         </tank>
     </propulsion>
     </propulsion>
</syntaxhighlight>
====Sense bug affecting gyroscopic moment====
Prior to about 2015--and continuing in current JSBSim and FlightGear versions unless you take the corrective steps outlined below--a JSBSim bug cause the gyroscopic moment of the propeller to be reversed.
To fix this bug and get the correct sign for your gyroscopic effect, you must add version="1.1" (or higher--any version greater than 1.0 should work) to your propeller definition, as shown in this example:
<syntaxhighlight>
<propeller name="prop" version="1.1">
  <!-- propeller definition -->
</propeller>
</syntaxhighlight>
The bug with the sign of gyroscopic effect and the fix are outlined under [https://sourceforge.net/p/jsbsim/bugs/110/ JSBSim Bug #110].
For most aircraft and engine/propeller systems the gyroscopic effect is fairly subtle and thus the bug is difficult to detect. But for some aircraft, such as small, light, rotary-engined WWI-era aircraft, the gyroscopic effect is very noticeable, and the reverse in direction of the effect created by the bug is very noticeable as well.


=== Starter speed (For piston engines) ===
=== Starter speed (for piston engines) ===
There is a somewhat complex relationship among the power coefficient, the maxhp, and idlerpm.  Both maxhp and idlerpm are set in the engine xml file.
There is a somewhat complex relationship among the power coefficient, the maxhp, and idlerpm.  Both maxhp and idlerpm are set in the engine xml file.


Line 434: Line 465:


''' Code is in FG 2.8 to independently control the power of the piston starter motor, to include battery effects. '''
''' Code is in FG 2.8 to independently control the power of the piston starter motor, to include battery effects. '''
starter-torque (fgfs 2.8) is a value specifying the zero RPM torque in lb*ft the starter motor provides. Current default value is 40% of the maximum horsepower value.
starter-rpm (fgfs 2.8) is a value specifying the maximum RPM the unloaded starter motor can achieve. Loads placed on the engine by the propeller and throttle will further limit RPM achieved in practice. Peak starter power is achieved at 1/2 starter-rpm. At 1/2 starter-rpm torque is 1/2 starter-torque. Peak power can be calculated by the standard formula HP=(Torque*RPM)/5252


=== Development Tips ===
=== Development tips ===
* If you open the property tree browser within FG to /fdm/jsbsim/propulsion/engines you can see a number of helpful variables in action, including RPM, horsepower, advance ratio, thrust coefficient, and others.


* If you open the property tree browser within FG to /fdm/jsbsim/propulsion/engines you can see a number of helpful variables in action, including RPM, horsepower, advance ration, thrust coefficient, and others.
=== References ===
* Barnes W. McCormick, "Aerodynamics, Aeronautics, and Flight Mechanics", Wiley & Sons, 1979 ISBN 0-471-03032-5
* Edwin Hartman, David Biermann, "The Aerodynamic Characteristics of Full Scale Propellers Having 2, 3, and 4 Blades of Clark Y and R.A.F. 6 Airfoil Sections", NACA Report TN-640, 1938 (?)
* Various NACA Technical Notes and Reports


=== Notes ===
== FGRotor ==
*  Several references were helpful, here:
FGRotor models a helicopter rotor.
**Barnes W. McCormick, "Aerodynamics, Aeronautics, and Flight Mechanics", Wiley & Sons, 1979 ISBN 0-471-03032-5
**Edwin Hartman, David Biermann, "The Aerodynamic Characteristics of Full Scale Propellers Having 2, 3, and 4 Blades of Clark Y and R.A.F. 6 Airfoil Sections", NACA Report TN-640, 1938 (?)
**Various NACA Technical Notes and Reports


== FGRotor ==
=== Configuration file format ===
FGRotor moodels a helicopter rotor.
=== Configuration File Format ===
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<!-- Sense goes in the parent tag -->
<!-- Sense goes in the parent tag -->
Line 548: Line 580:
=== Notes ===
=== Notes ===
==== Controls ====
==== Controls ====
* The behavior of the rotor is controlled/influenced by following inputs.
The behavior of the rotor is controlled/influenced by following inputs.
** The power provided by the engine. This is handled by the regular engine controls.
* The power provided by the engine. This is handled by the regular engine controls.
** The collective control input. This is read from the <tt>fdm</tt> property <tt>propulsion/engine[x]/collective-ctrl-rad</tt>. See below for tail rotor
* The collective control input. This is read from the <tt>fdm</tt> property <tt>propulsion/engine[x]/collective-ctrl-rad</tt>. See below for tail rotor
** The lateral cyclic input. Read from <tt>propulsion/engine[x]/lateral-ctrl-rad</tt>.
* The lateral cyclic input. Read from <tt>propulsion/engine[x]/lateral-ctrl-rad</tt>.
** The longitudinal cyclic input. Read from <tt>propulsion/engine[x]/longitudinal-ctrl-rad</tt>.
* The longitudinal cyclic input. Read from <tt>propulsion/engine[x]/longitudinal-ctrl-rad</tt>.
** The tail collective (aka antitorque, aka pedal) control input. Read from <tt>propulsion/engine[x]/antitorque-ctrl-rad</tt> or <tt>propulsion/engine[x]/tail-collective-ctrl-rad</tt>.  
** The tail collective (aka antitorque, aka pedal) control input. Read from <tt>propulsion/engine[x]/antitorque-ctrl-rad</tt> or <tt>propulsion/engine[x]/tail-collective-ctrl-rad</tt>.  


==== Tail/tandem rotor ====
==== Tail/tandem rotor ====
 
Providing '''&lt;ExternalRPM&gt; 0 &lt;/ExternalRPM&gt;''' the tail rotor's RPM is linked to to the main (=first, =0) rotor, and specifying '''&lt;controlmap&gt; TAIL &lt;/controlmap&gt;''' tells this rotor to read the collective input from '''propulsion/engine[1]/antitorque-ctrl-rad''' (The TAIL-map ignores lateral and longitudinal input). The rotor needs to be attached to a dummy engine, e.g. an 1HP electrical engine. A tandem rotor is setup analogous.
    Providing '''&lt;ExternalRPM&gt; 0 &lt;/ExternalRPM&gt;''' the tail rotor's RPM
    is linked to to the main (=first, =0) rotor, and specifying
    '''&lt;controlmap&gt; TAIL &lt;/controlmap&gt;''' tells this rotor to read the
    collective input from '''propulsion/engine[1]/antitorque-ctrl-rad'''
    (The TAIL-map ignores lateral and longitudinal input). The rotor needs to be  
    attached to a dummy engine, e.g. an 1HP electrical engine.
    A tandem rotor is setup analogous.


==== Sense ====
==== Sense ====
 
The 'sense' parameter from the thruster is interpreted as follows, sense=1 means counter clockwise rotation of the main rotor, as viewed from above. This is as a far as I know more popular than clockwise rotation, which is defined by setting sense to -1. Concerning coaxial designs - by setting 'sense' to zero, a Kamov-style rotor is modeled (i.e. the rotor produces no torque).
    The 'sense' parameter from the thruster is interpreted as follows, sense=1 means
    counter clockwise rotation of the main rotor, as viewed from above. This is as a far
    as I know more popular than clockwise rotation, which is defined by setting sense to
    -1. Concerning coaxial designs - by setting 'sense' to zero, a Kamov-style rotor is
    modeled (i.e. the rotor produces no torque).


==== Engine issues ====
==== Engine issues ====
 
In order to keep the rotor speed constant, use of a RPM-Governor system is encouraged (see examples).
    In order to keep the rotor speed constant, use of a RPM-Governor system is  
    encouraged (see examples).


==== Development hints ====
==== Development hints ====
Setting '''&lt;ExternalRPM&gt; -1 &lt;/ExternalRPM&gt;''' the rotor's RPM is controlled by the '''propulsion/engine[x]/x-rpm-dict''' property. This feature can be useful when developing a FDM.


    Setting '''&lt;ExternalRPM&gt; -1 &lt;/ExternalRPM&gt;''' the rotor's RPM is controlled  by
==== Properties ====
    the '''propulsion/engine[x]/x-rpm-dict''' property. This feature can be useful
The rotor model creates the following properties:
    when developing a FDM.


==== Properties ====
    The rotor model creates the following properties:
{| class="prettytable"
{| class="prettytable"
|-
|-
Line 630: Line 646:
|
|
|}
|}


(Control Inputs)
(Control Inputs)
Line 657: Line 672:
|}
|}


=== References:===
=== References ===
{| class="prettytable"
{| class="prettytable"
|-
|-

Latest revision as of 09:14, 19 June 2018

JSBSim uses thruster models to convert engine power into aerodynamic forces. The following table shows which engine-thruster combinations work.

Thrusters
Direct Nozzle Propeller Rotor
Engines Electric
Piston
Rocket
Turbine
TurboProp

FGDirect

Thrust is computed directly by the engine, the direct thruster file is a stub. Currently FGTurbine engines use this thruster and it can also be used with FGElectric.

Configuration file format

This is the complete configuration file. Copy and paste into your 'direct.xml' file.

<?xml version="1.0"?> 
<direct name="Direct">
</direct>

Notes

  • The direct thruster creates a property called propulsion/engine[#]/reverser-angle-rad
  • "Reverser angle" as used here is a way to manipulate the thrust vector, along the thrust axis ONLY, during run time. This should not be confused with a thrust vectoring nozzle. The angle is defined in radians, and is used thus: Final_thrust = cosine( reverser_angle ) * unmodified_thrust. Therefore a reverser angle of 0 results in no change, and a reverser angle of 3.14 (pi) results in a completely reversed thrust vector. An angle of 1.57 (pi/2) results in no thrust at all

FGNozzle

FGNozzle is for the FGRocket engine.

Configuration file format

<?xml version="1.0"?> 
<nozzle name="{string}">
  <area unit="{FT2 | M2 | IN2}"> {number}  </area>
</nozzle>

Parameter definitions

area Nozzle area at the exit plane.

Notes

  • All parameters MUST be specified.
  • The area specified times the sea level pressure (2117 lbf/ft^2) is the amount thrust is reduced at sea level

FGPropeller

FGPropeller models a propeller given the tabular data for Ct and Cp, indexed by the advance ratio "J".

Configuration file format

<!-- Sense and P factor go in the parent tag of the propeller, i.e. in the <thruster> element -->
<sense> {1 | -1} </sense> 
<p_factor> {number} </p_factor>

<?xml version="1.0"?> 
<propeller name="{string}">
  <ixx> {number} </ixx>
  <diameter unit="IN"> {number} </diameter>
  <numblades> {number} </numblades>
  <gearratio> {number} </gearratio>
  <minpitch> {number} </minpitch>
  <maxpitch> {number} </maxpitch>
  <minrpm> {number} </minrpm>
  <maxrpm> {number} </maxrpm>
  <constspeed> {number} </constspeed>
  <reversepitch> {number} </reversepitch>
  <ct_factor> {number} </ct_factor>
  <cp_factor> {number} </cp_factor>

  <table name="C_THRUST" type="internal">
    <tableData>
      {numbers}
    </tableData>
  </table>

  <table name="C_POWER" type="internal">
    <tableData>
      {numbers}
    </tableData>
  </table>

  <table name="CT_MACH" type="internal">
    <tableData>
      {numbers}
    </tableData>
  </table>

  <table name="CP_MACH" type="internal">
    <tableData>
      {numbers}
    </tableData>
  </table>

</propeller>

Parameter definitions

ixx Propeller rotational inertia. This can be english units, slug & feet^2:
<ixx unit="SLUG*FT2">       8.95 </ixx>

Or in metric units, kg * meters^2:

<ixx unit="KG*M2">         12.14 </ixx>

For a thin rod of mass m (kg) and diameter D (meters) spinning about its center, the formula is m*D^2/12. See the Moments of inertia reference page and list of conversion factors for different units for moment of inertia.)

diameter Propeller disk diameter.
numblades Number of blades.
gearratio Ratio of (engine rpm) / (prop rpm).
minpitch Minimum blade pitch angle.
maxpitch Maximum blade pitch angle.
minrpm Minimum rpm target for constant speed propeller.
maxrpm Maximum rpm target for constant speed propeller.
constspeed 1 = constant speed mode, 0 = manual pitch mode.
reversepitch Blade pitch angle for reverse.
sense Direction of rotation (1= clockwise as viewed from rear, -1=counter-clockwise as viewed from rear). Sense is specified in the parent tag of the propeller. See important note below regarding a JSBSim bug affecting sense and the direction of the resulting gyroscopic moment.
p_factor P factor. It is specified in the parent tag of the propeller.
ct_factor A multiplier for the coefficients of thrust (multiplies the dependent variable in the C_THRUST table by this factor).
cp_factor A multiplier for the coefficients of power (multiplies the dependent variable in the C_POWER table by this factor).

The parameters <sense> and <p_factor> must be specified at the parent level i.e. in the <thruster> element. This allows to specify different sense and P factor values for each propeller of the model while using the same definition file for all the propellers.

C_THRUST and C_POWER tables

The C_THRUST and C_POWER tables are required.

The independent variable for both tables is Advance Ratio (J). The dependent variable is the coefficient of thrust (Ct) for the C_THRUST and the coefficient of power (Cp) for C_POWER.

For variable pitch propellers, it is possible to give a two-dimensional table, showing Ct and Cp for different J and different pitch angles of the propeller. See example below.

Propellors for F3D Models explains the theory and has formulas and many graphs showing the relationship between J, Ct, and Cp.

Relevant formulas relating the variables in the tables (and metric system units):

  • Thrust: T = Ct * rho * n^2 * D^4
  • Power: P = Cp * rho * n^3 * D^5)
  • Advance Ratio: J = v/(n*D)
  • Efficiency: eta = Ct/Cp * v/(n*D) (or equivalently, eta = Ct/Cp * J )

In the formulas

  • Ct = coefficient of thrust
  • Cp = coefficient of power
  • v = true velocity of aircraft (m/s)
  • D = diameter of propeller disk (m)
  • n = rotations per second (1/s) (note RPS, not RPM)
  • rho = density of air (kg/m^3)
  • P = power (W)
  • T = thrust (N)

For a typical propeller, both Cp and Ct are downward sloping curves that reach 0 when J is somewhere in the range 0-4 (depending on blade angle and other factors). Cp and Ct can be negative; this indicates the drag induced by the prop when the airspeed is relatively fast compared with prop RPM. At higher pitch angles Ct may have a positive slope or be flat in the lower J range.

Ct/Cp gives the efficiency (eta), and propeller shape and general design give each propeller a distinctive efficiency curve. For fixed-pitch propellers, the propeller is generally designed to reach peak efficiency either at climb velocity & RPM, cruise velocity and RPM, or some compromise between the two. Variable pitch propellers and constant speed propellers bring different factors into play.

Note that several of the values mentioned above can be viewed while FG is running, in the property tree under /fdm/jsbsim/propulsion/engine. This is useful for seeing how the settings and tables play out under various conditions and fine-tuning the settings.

Sample C_THRUST and C_POWER tables

These example tables are from FlightGear's C172P aircraft:

  <table name="C_THRUST" type="internal">
      <tableData>
        0.0    0.068
        0.1    0.068
        0.2    0.067
        0.3    0.066
        0.4    0.064
        0.5    0.062
        0.6    0.059
        0.7    0.054
        0.8    0.043
        0.9    0.031
        1.0    0.019
        1.1    0.008
        1.2   -0.001
        1.3   -0.008
        1.4   -0.019
        1.5   -0.029
        1.6   -0.040
        1.7   -0.050
        1.8   -0.057
        1.9   -0.061
        2.0   -0.064
        2.1   -0.066
        2.2   -0.067
        2.3   -0.068
        5.0   -0.068
      </tableData>
    </table>
  
    <table name="C_POWER" type = "internal">
      <tableData>
        0.0   0.0580
        0.1   0.0620
        0.2   0.0600
        0.3   0.0580
        0.4   0.0520
        0.5   0.0457
        0.6   0.0436
        0.7   0.0420
        0.8   0.0372
        0.9   0.0299
        1.0   0.0202
        1.1   0.0111
        1.2   0.0075
        1.3   0.0111
        1.4   0.0202
        1.5   0.0280
        1.6   0.0346
        1.7   0.0389
        1.8   0.0421
        1.9   0.0436
        2.0   0.0445
        2.1   0.0445
        2.2   0.0442
        2.3   0.0431
        2.4   0.0424
        5.0   0.0413
      </tableData>
    </table>

Example of table for variable pitch propeller (source):

 <!-- thrust coefficient as a function of advance ratio and blade angle -->
    <table name="C_THRUST" type="internal">
        <tableData>
                  -10        0         15        25        35        45        55        65       90
        -0.2      -0.0734    0.0413    0.1503    0.1842    0.2030    0.2142    0.1974    0.1691   0.0000
         0.0      -0.1090    0.0000    0.1503    0.1842    0.2030    0.2162    0.2021    0.1691   0.0000
         0.2      -0.1222   -0.0376    0.1297    0.1804    0.2001    0.2162    0.2021    0.1691   0.0000
         0.4      -0.1222   -0.0873    0.0977    0.1786    0.1963    0.2142    0.2021    0.1691   0.0000
         0.6      -0.1222   -0.1222    0.0517    0.1607    0.1879    0.2087    0.1992    0.1691   0.0000
         0.8      -0.1222   -0.1222    0.0029    0.1203    0.1824    0.2012    0.1992    0.1691   0.0000
         1.0      -0.1222   -0.1222   -0.0489    0.0734    0.1748    0.1908    0.1974    0.1691   0.0000
         1.2      -0.1222   -0.1222   -0.1006    0.0226    0.1437    0.1842    0.1974    0.1691   0.0000
         1.4      -0.1222   -0.1222   -0.1222   -0.0329    0.1034    0.1813    0.1936    0.1691   0.0000
         1.6      -0.1222   -0.1222   -0.1222   -0.0836    0.0564    0.1748    0.1899    0.1691   0.0000
         1.8      -0.1222   -0.1222   -0.1222   -0.1222    0.0095    0.1503    0.1842    0.1691   0.0000
         2.0      -0.1222   -0.1222   -0.1222   -0.1222   -0.0376    0.1174    0.1834    0.1691   0.0000
         2.2      -0.1222   -0.1222   -0.1222   -0.1222   -0.0846    0.0846    0.1804    0.1691   0.0000
         2.4      -0.1222   -0.1222   -0.1222   -0.1222   -0.1222    0.0451    0.1473    0.1691   0.0000
         2.6      -0.1222   -0.1222   -0.1222   -0.1222   -0.1222    0.0057    0.0932    0.1503   0.0000
         2.8      -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.0338    0.0610    0.1222   0.0000
         3.0      -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.0734    0.0320    0.0940   0.0000
         3.2      -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.1128    0.0029    0.0658   0.0000
         3.4      -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.0263    0.0376   0.0000
         3.6      -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.0555    0.0095   0.0000
         3.8      -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.0846   -0.0188   0.0000
         4.0      -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.1137   -0.0471   0.0000
         6.0      -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   -0.1222   0.0000
        </tableData>
    </table>
  
   <!-- power coefficient as a function of advance ratio and blade angle -->
    <table name="C_POWER" type="internal">
       <tableData>
                 -10        0        15        25        35        45        55        65       90
        -0.2      0.0108   0.0215    0.0753    0.1710    0.2949    0.4194    0.4839    0.5355   0.5355
         0.0      0.0430   0.0108    0.0645    0.1594    0.2820    0.4194    0.4859    0.5355   0.5355
         0.2      0.0613   0.0172    0.0624    0.1484    0.2697    0.4194    0.4859    0.5355   0.5355
         0.4      0.0826   0.0376    0.0537    0.1368    0.2562    0.4194    0.4859    0.5355   0.5355
         0.6      0.1013   0.0570    0.0355    0.1271    0.2400    0.4110    0.4839    0.5355   0.5355
         0.8      0.1194   0.0763    0.0108    0.1078    0.2258    0.3923    0.4839    0.5355   0.5355
         1.0      0.1374   0.0948    0.0108    0.0755    0.2129    0.3723    0.4820    0.5355   0.5355
         1.2      0.1561   0.0758   -0.0355    0.0290    0.1884    0.3568    0.4788    0.5355   0.5355
         1.4      0.1742   0.1310   -0.0536   -0.0215    0.1452    0.3516    0.4729    0.5355   0.5355
         1.6      0.1923   0.1497   -0.0626   -0.0645    0.0916    0.3420    0.4626    0.5162   0.5355
         1.8      0.2110   0.1678   -0.0645   -0.1078    0.0269    0.3033    0.4484    0.5052   0.5355
         2.0      0.2291   0.1858   -0.0826   -0.1503   -0.0323    0.2581    0.4271    0.4949   0.5355
         2.2      0.2471   0.2045   -0.1013   -0.1936   -0.0968    0.2097    0.4142    0.4729   0.5355
         2.4      0.2658   0.2226   -0.1194   -0.2368   -0.1613    0.1497    0.4020    0.4626   0.5355
         2.6      0.2839   0.2407   -0.1374   -0.2794   -0.2045    0.0626    0.3923    0.4465   0.5355
         2.8      0.3020   0.2594   -0.1561   -0.3226   -0.2452   -0.0213    0.3839    0.4407   0.5355
         3.0      0.3207   0.2774   -0.1742   -0.3658   -0.2903   -0.0968    0.3710    0.4407   0.5355
         3.2      0.3387   0.2955   -0.1923   -0.4084   -0.3336   -0.1723    0.3471    0.4304   0.5355
         3.4      0.3568   0.3142   -0.2110   -0.4517   -0.3762   -0.2471    0.2691    0.4194   0.5355
         3.6      0.3755   0.3323   -0.2291   -0.4949   -0.4194   -0.3226    0.1890    0.4084   0.5355
         3.8      0.3936   0.3504   -0.2471   -0.5355   -0.4626   -0.3981    0.1052    0.3955   0.5355
         4.0      0.4117   0.3691   -0.2658   -0.5355   -0.5355   -0.4729    0.0213    0.3658   0.5355
         6.0      0.5355   0.5355   -0.5355   -0.5355   -0.5355   -0.5355   -0.5355   -0.3226   0.5355
       </tableData>
    </table>
  
  <!-- thrust effects of helical tip Mach -->
  <table name="CT_MACH" type="internal">
    <tableData>
      0.85   1.0
      1.05   0.8
    </tableData>
  </table>

  <!-- power-required effects of helical tip Mach -->
  <table name="CP_MACH" type="internal">
    <tableData>
      0.85   1.0
      1.05   1.8
      2.00   1.4
    </tableData>
  </table>
<syntaxhighlight lang="xml">

=== CT_MACH and CP_MACH ===
The CT_MACH and CP_MACH tables are optional. They apply a factor to Ct and Cp based on the helical tip Mach. The CP_MACH table models the [http://en.wikipedia.org/wiki/Drag_divergence_Mach_number Drag Divergence Mach Number] for the propeller airfoil. The CT_MACH table models the thrust reduction.

Examples:
 
<syntaxhighlight lang="xml">

 <!-- thrust effects of helical tip Mach -->
  <table name="CT_MACH" type="internal">
    <tableData>
      0.85   1.0
      1.05   0.8
    </tableData>
  </table>
  
  <!-- power-required effects of helical tip Mach -->
  <table name="CP_MACH" type="internal">
    <tableData>
      0.85   1.0
      1.05   1.8
      2.00   1.4
    </tableData>
  </table>

Sense

Sense is the direction of rotation. 1=clockwise (typically as seen from rear of aircraft or the cockpit of a typical front-propeller aircraft, but this may vary depending on how you have set up the coordinate system for your aircraft) and -1 is counter-clockwise.

The sense tag goes in the parent tag of the thruster, ie, in the <propulsion><thruster> section which is typically in the main JSBSim XML file. Example:

    <propulsion>
        <engine file="Clerget9B">
            <location unit="IN">
                <x> 12 </x>
                <y> 0 </y>
                <z> 0 </z>
            </location>
            <orient unit="DEG">
                <roll> 0 </roll>
                <pitch> 0 </pitch>
                <yaw> 0 </yaw>
            </orient>
            <feed>0</feed>
            <thruster file="CamelProp">
                '''<sense>1</sense>'''
                <location unit="IN">
                    <x> 0 </x>
                    <y> 0 </y>
                    <z> 0 </z>
                </location>
                <orient unit="DEG">
                    <roll> 0 </roll>
                    <pitch> 0 </pitch>
                    <yaw> 0 </yaw>
                </orient>
            </thruster>
        </engine>
        <tank type="FUEL">
            <location unit="IN">
                <x> 60 </x>
                <y> 0 </y>
                <z> -5.62 </z>
            </location>
            <capacity unit="LBS">133.6</capacity>
            <contents unit="LBS">133.6</contents>
        </tank>
    </propulsion>

Sense bug affecting gyroscopic moment

Prior to about 2015--and continuing in current JSBSim and FlightGear versions unless you take the corrective steps outlined below--a JSBSim bug cause the gyroscopic moment of the propeller to be reversed.

To fix this bug and get the correct sign for your gyroscopic effect, you must add version="1.1" (or higher--any version greater than 1.0 should work) to your propeller definition, as shown in this example:

<propeller name="prop" version="1.1">
  <!-- propeller definition -->
</propeller>

The bug with the sign of gyroscopic effect and the fix are outlined under JSBSim Bug #110.

For most aircraft and engine/propeller systems the gyroscopic effect is fairly subtle and thus the bug is difficult to detect. But for some aircraft, such as small, light, rotary-engined WWI-era aircraft, the gyroscopic effect is very noticeable, and the reverse in direction of the effect created by the bug is very noticeable as well.

Starter speed (for piston engines)

There is a somewhat complex relationship among the power coefficient, the maxhp, and idlerpm. Both maxhp and idlerpm are set in the engine xml file.

The power of the starter motor is equal to 0.4*sqrt(maxhp). The minimum RPM needed to start the engine is 80% of the idlerpm. The greater the power coefficient (for J near 0), the more power the propeller will require to spin when starting the engine with the aircraft at rest.

If your propeller will not spin fast enough to start, you can try some combination of:

  • Open the throttle. Pulling a partial vacuum in the intake manifold takes some power.
  • Increase maxhp (increases the power of the starter motor)
  • Decrease idlerpm (decreases the minimum RPM needed to start the engine)
  • Decrease the power coefficient in the C_POWER table, for values of J close to (or equal to) 0. This will reduce the amount of power it takes for the propeller to spin at a given RPM where J is close to 0 (which is the typical situation when starting the engine and the aircraft is at a dead stop).

You can open the property tree and watch the value of J (/fdm/jsbsim/propulsion/engines/advance-ratio) to get an idea of which values you need to change in the C_POWER table.

Code is in FG 2.8 to independently control the power of the piston starter motor, to include battery effects. starter-torque (fgfs 2.8) is a value specifying the zero RPM torque in lb*ft the starter motor provides. Current default value is 40% of the maximum horsepower value. starter-rpm (fgfs 2.8) is a value specifying the maximum RPM the unloaded starter motor can achieve. Loads placed on the engine by the propeller and throttle will further limit RPM achieved in practice. Peak starter power is achieved at 1/2 starter-rpm. At 1/2 starter-rpm torque is 1/2 starter-torque. Peak power can be calculated by the standard formula HP=(Torque*RPM)/5252

Development tips

  • If you open the property tree browser within FG to /fdm/jsbsim/propulsion/engines you can see a number of helpful variables in action, including RPM, horsepower, advance ratio, thrust coefficient, and others.

References

  • Barnes W. McCormick, "Aerodynamics, Aeronautics, and Flight Mechanics", Wiley & Sons, 1979 ISBN 0-471-03032-5
  • Edwin Hartman, David Biermann, "The Aerodynamic Characteristics of Full Scale Propellers Having 2, 3, and 4 Blades of Clark Y and R.A.F. 6 Airfoil Sections", NACA Report TN-640, 1938 (?)
  • Various NACA Technical Notes and Reports

FGRotor

FGRotor models a helicopter rotor.

Configuration file format

<!-- Sense goes in the parent tag -->
<sense> {1 | 0 | -1} </sense>
<?xml version="1.0"?> 
<rotor name="{string}">
  <diameter unit="{LENGTH}"> {number} </diameter>
  <numblades> {number} </numblades>
  <gearratio> {number} </gearratio>
  <nominalrpm> {number} </nominalrpm>
  <minrpm> {number} </minrpm>
  <maxrpm> {number} </maxrpm> 
  <chord unit="{LENGTH}"> {number} </chord>
  <liftcurveslope Xunit="1/RAD"> {number} </liftcurveslope>
  <twist unit="{ANGLE}"> {number} </twist>
  <hingeoffset unit="{LENGTH}"> {number} </hingeoffset>
  <flappingmoment unit="{MOMENT}"> {number} </flappingmoment>
  <massmoment Xunit="SLUG*FT"> {number} </massmoment>
  <polarmoment unit="{MOMENT}"> {number} </polarmoment>
  <inflowlag> {number} </inflowlag>
  <tiplossfactor> {number} </tiplossfactor>
  <maxbrakepower unit="{POWER}"> {number} </maxbrakepower>

  <controlmap> {MAIN|TAIL|TANDEM} </controlmap>
  <ExternalRPM> {number} </ExternalRPM>

  <groundeffectexp> {number} </groundeffectexp>
  <groundeffectshift unit="{LENGTH}"> {number} </groundeffectshift>
</rotor>
  • LENGTH means any of the supported units, same for ANGLE and MOMENT.X unit-attributes are a hint for currently unsupported units, so values must be provided accordingly.

Parameter definitions

diameter Rotor disk diameter (2x R).
numblades Number of blades (b).
gearratio Ratio of (engine rpm) / (rotor rpm), usually > 1.
nominalrpm RPM at which the rotor usally operates.
minrpm Lowest RPM used in the model, optional and defaults to 1.
maxrpm Largest RPM used in the model, optional and defaults to 2 x nominalrpm.
chord Blade chord, (c).
liftcurveslope Slope of curve of section lift against section angle of attack, per rad (a).
twist Blade twist from root to tip, (theta_1).
hingeoffset Rotor flapping-hinge offset (e).
flappingmoment Flapping moment of inertia (I_b).
massmoment Blade mass moment. Mass of a single blade times the blade's cg-distance from the hub, optional.
polarmoment Moment of inertia for the whole rotor disk, optional.
inflowlag Rotor inflow time constant, sec. Smaller values yield to quicker responses (typical values for main rotor: 0.1 - 0.2 s).
tiplossfactor Tip-loss factor. The Blade fraction that produces lift. Value usually ranges between 0.95 - 1.0, optional (B).
maxbrakepower Rotor brake, 20-30 hp should work for a mid size helicopter.
controlmap Defines the control inputs used (see notes).
ExternalRPM Links the rotor to another rotor, or an user controllable property.

Experimental properties

groundeffectexp Exponent for ground effect approximation. Values usually range from 0.04 for large rotors to 0.1 for smaller ones. As a rule of thumb the effect vanishes at a height 2-3 times the rotor diameter. formula used: exp ( - groundeffectexp * (height+groundeffectshift) ) Omitting or setting to 0.0 disables the effect calculation.
groundeffectshift Further adjustment of ground effect, approx. hub height or slightly above.

Notes

Controls

The behavior of the rotor is controlled/influenced by following inputs.

  • The power provided by the engine. This is handled by the regular engine controls.
  • The collective control input. This is read from the fdm property propulsion/engine[x]/collective-ctrl-rad. See below for tail rotor
  • The lateral cyclic input. Read from propulsion/engine[x]/lateral-ctrl-rad.
  • The longitudinal cyclic input. Read from propulsion/engine[x]/longitudinal-ctrl-rad.
    • The tail collective (aka antitorque, aka pedal) control input. Read from propulsion/engine[x]/antitorque-ctrl-rad or propulsion/engine[x]/tail-collective-ctrl-rad.

Tail/tandem rotor

Providing <ExternalRPM> 0 </ExternalRPM> the tail rotor's RPM is linked to to the main (=first, =0) rotor, and specifying <controlmap> TAIL </controlmap> tells this rotor to read the collective input from propulsion/engine[1]/antitorque-ctrl-rad (The TAIL-map ignores lateral and longitudinal input). The rotor needs to be attached to a dummy engine, e.g. an 1HP electrical engine. A tandem rotor is setup analogous.

Sense

The 'sense' parameter from the thruster is interpreted as follows, sense=1 means counter clockwise rotation of the main rotor, as viewed from above. This is as a far as I know more popular than clockwise rotation, which is defined by setting sense to -1. Concerning coaxial designs - by setting 'sense' to zero, a Kamov-style rotor is modeled (i.e. the rotor produces no torque).

Engine issues

In order to keep the rotor speed constant, use of a RPM-Governor system is encouraged (see examples).

Development hints

Setting <ExternalRPM> -1 </ExternalRPM> the rotor's RPM is controlled by the propulsion/engine[x]/x-rpm-dict property. This feature can be useful when developing a FDM.

Properties

The rotor model creates the following properties:

propulsion/engine[#]/rotor-rpm RPMs of the rotor
propulsion/engine[#]/engine-rpm RPMs of the Engine, as seen from this rotor.
propulsion/engine[#]/a0-rad Rotor's coning angle in radians
propulsion/engine[#]/a1-rad Longitudinal flapping angle with respect to the rotor shaft in radians
propulsion/engine[#]/b1-rad Lateral flapping angle with respect to the rotor shaft in radians
propulsion/engine[#]/inflow-ratio Lambda or λ
propulsion/engine[#]/advance-ratio the tip-speed (aka advance) ratio Mu or μ
propulsion/engine[#]/induced-inflow-ratio Nu or ν
propulsion/engine[#]/vi-fps Induced Velocity in feet per second
propulsion/engine[#]/thrust-coefficient
propulsion/engine[#]/torque-lbsft Rotor torque in pound * feet
propulsion/engine[#]/theta-downwash-rad Down wash θ angle - positive values point forward (given a horizontal spinning rotor) in radians
propulsion/engine[#]/phi-downwash-rad Down wash Φ angle - positive values point leftward (given a horizontal spinning rotor) in radians
propulsion/engine[#]/groundeffect-scale-norm

(Control Inputs)

propulsion/engine[#]/antitorque-ctrl-rad
propulsion/engine[#]/tail-collective-ctrl-rad
propulsion/engine[#]/lateral-ctrl-rad
propulsion/engine[#]/longitudinal-ctrl-rad
propulsion/engine[#]/collective-ctrl-rad
propulsion/engine[#]/lateral-ctrl-rad
propulsion/engine[#]/longitudinal-ctrl-rad

References

SH79 Shaugnessy, J. D., Deaux, Thomas N., and Yenni, Kenneth R., "Development and Validation of a Piloted Simulation of a Helicopter and External Sling Load", NASA TP-1285, 1979.
BA41 Bailey,F.J.,Jr., "A Simplified Theoretical Method of Determining the Characteristics of a Lifting Rotor in Forward Flight", NACA Rep.716, 1941
AM50 Amer, Kenneth B.,"Theory of Helicopter Damping in Pitch or Roll and a Comparison With Flight Measurements", NACA TN-2136, 1950.
TA77 Talbot, Peter D., Corliss, Lloyd D., "A Mathematical Force and Moment Model of a UH-1H Helicopter for Flight Dynamics Simulations", NASA TM-73,254, 1977.
GE49 Gessow, Alfred, Amer, Kenneth B. "An Introduction to the Physical Aspects of Helicopter Stability", NACA TN-1982, 1949.