JSBSim Thrusters: Difference between revisions
Line 173: | Line 173: | ||
[http://www.mh-aerotools.de/airfoils/pylonprops_1.htm Propellors for F3D Models explains the theory] and has [http://www.mh-aerotools.de/airfoils/pylonprops_2.htm formulas] and [http://www.mh-aerotools.de/airfoils/pylonprops_3.htm many graphs] showing the relationship between J, Ct, and Cp. | [http://www.mh-aerotools.de/airfoils/pylonprops_1.htm Propellors for F3D Models explains the theory] and has [http://www.mh-aerotools.de/airfoils/pylonprops_2.htm formulas] and [http://www.mh-aerotools.de/airfoils/pylonprops_3.htm many graphs] showing the relationship between J, Ct, and Cp. | ||
Relevant formulas relating the variables in the tables: | Relevant formulas relating the variables in the tables (and metric system units): | ||
* Thrust: T = Ct * rho * n^2 * D^4 | * Thrust: T = Ct * rho * n^2 * D^4 |
Revision as of 01:25, 3 November 2011
JSBSim uses thruster models to convert engine power into aerodynamic forces. The following table shows which engine-thruster combinations work.
Direct | Nozzle | Propeller | Rotor | |
Electric | ||||
Piston | ||||
Rocket | ||||
Turbine | ||||
TurboProp |
FGDirect
Thrust is computed directly by the engine, the direct thruster file is a stub. Currently only the FGTurbine engine uses this thruster.
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.
FGPropeller
FGPropeller models a propeller given the tabular data for Ct and Cp, indexed by the advance ratio "J".
Configuration File Format
<!-- Sense goes in the parent tag -->
<sense> {1 | -1} </sense>
<?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>
<p_factor> {number} </p_factor>
<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. (Note: This appears to be in metric units, kg * meters^2, for a thin rod of mass m (kg) and diameter D (meters) spinning about its center, 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 cockpit, -1=anti-clockwise as viewed from cockpit). Sense is specified in the parent tag of the propeller. |
p_factor | P factor. |
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). |
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 = 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.
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>
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.
Examples:
<!-- 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>
Starter speed
There is a somewhat complex relationship among the power coefficient, the maxrpm, and idlerpm. Both maxrpm and idlerpm are set in the engine xml file.
The power of the starter motor is proportional to maxrpm. 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:
- Increase maxrpm (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.
Notes
- Several references were helpful, here:
- 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 moodels 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>
<freewheelthresh> {number} </freewheelthresh>
</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. |
freewheelthresh | Ratio of thruster power to engine power. The FWU will release when above the threshold. The value shouldn't be too close to 1.0, 1.5 seems ok. 0 disables this feature, which is also the default. |
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.
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. |