Howto:Add thrust reversal

From FlightGear wiki
Revision as of 11:58, 7 April 2010 by Jonbourg (talk | contribs)
Jump to navigation Jump to search

JSBSim

-set.xml

Add the following codes in the -set.xml file, below the </sim> tag. You've to add such piece for every engine, containing thrust reversal.

 <engines>
  <engine n="0">
   <reverser-position type="double">0.000000</reverser-position>
  </engine>     
  <engine n="1">
   <reverser-position type="double">0.000000</reverser-position>
  </engine>    
 </engines>

 <input>
  <keyboard>
   <key n="127">
    <name>Delete</name>
    <desc>Toggle Reversers</desc>
    <binding>
     <command>nasal</command>
     <script>reversethrust.togglereverser()</script>
    </binding>
   </key>
  </keyboard>
 </input>

 <nasal>
  <reversethrust>
   <file>Aircraft/747-400/Nasal/reverse-thrust.nas</file>
  </reversethrust>
 </nasal>

reverse-thrust.nas

Create a new file into your data/Aircraft/.../Nasal/ directory named reverse-thrust.nas. The piece of code shown below is designed for a two engine plane. To see how to handle more engined planes, take a look at the Boeing 747-400.

togglereverser = func {
  r1 = "/fdm/jsbsim/propulsion/engine";
  r2 = "/fdm/jsbsim/propulsion/engine[1]";
  r3 = "/controls/engines/engine"; 
  r4 = "/controls/engines/engine[1]"; 
  r5 = "/sim/input/selected";
  rv1 = "/engines/engine/reverser-pos-norm"; 
  rv2 = "/engines/engine[1]/reverser-pos-norm"; 
 
  val = getprop(rv1);
  if (val == 0 or val == nil) {
    interpolate(rv1, 1.0, 1.4); 
    interpolate(rv2, 1.0, 1.4);  
    setprop(r1,"reverser-angle-rad","3.14159");
    setprop(r2,"reverser-angle-rad","3.14159");
    setprop(r3,"reverser", "true");
    setprop(r4,"reverser", "true");
    setprop(r5,"engine", "true");
    setprop(r5,"engine[1]", "true");
  } else {
    if (val == 1.0){
      interpolate(rv1, 0.0, 1.4);
      interpolate(rv2, 0.0, 1.4);   
      setprop(r1,"reverser-angle-rad",0);
      setprop(r2,"reverser-angle-rad",0);
      setprop(r3,"reverser",0);
      setprop(r4,"reverser",0);
      setprop(r5,"engine", "true");
      setprop(r5,"engine[1]", "true"); 
    }  
  }
}

YASim

-set.xml

Add the following codes in the -set.xml file, below the </sim> tag. You've to add such piece for every engine, containing thrust reversal.

<input>
 <keyboard>
  <key n="127">
   <name>Delete</name>
   <desc>Toggle Reversers</desc>
   <binding>
    <command>property-toggle</command>
    <property>controls/engines/engine[0]/reverser</property>
   </binding>
   <binding>
    <command>property-toggle</command>
    <property>controls/engines/engine[1]/reverser</property>
   </binding>
  </key>
 </keyboard>
</input>

-yasim.xml

Every engine with reversal should contain the following code. The transition-time defines the time that it takes to turn the engines to reversed position.

<jet>
 <control-input axis="/controls/engines/engine[0]/reverser" control="REVERSE_THRUST"/>
 <control-output control="REVERSE_THRUST" prop="/surface-positions/reverser-norm"/>
 <control-speed control="REVERSE_THRUST" transition-time="1.5"/>
</jet>

<jet>
 <control-input axis="/controls/engines/engine[1]/reverser" control="REVERSE_THRUST"/>
 <control-output control="REVERSE_THRUST" prop="/surface-positions/reverser-norm[1]"/>
 <control-speed control="REVERSE_THRUST" transition-time="1.5"/>
</jet>

Animate

-model.xml

To make it look really cool animate with the following code. You could add an animation group and do all engines at once or do each engine individually as shown here.

<animation>
 <type>translate</type>
 <object-name>Engine1.Cowl3</object-name>
 <property>/engines/engine/reverser-pos-norm</property>
 
 <interpolation>
   <entry><ind>0</ind><dep>0.0</dep></entry>
   <entry><ind>1</ind><dep>0.6</dep></entry>
 </interpolation>
 
 <axis>
   <x>1.0</x>
   <y>0.0</y>
   <z>0</z>
 </axis>
</animation>