North American X-15

From FlightGear wiki
Jump to: navigation, search
North American X-15
Type Rocket-powered aircraft
Author(s) Mike Hill, Jon S. Berndt (FDM), John Check, Enrique Laso (new model)
--aircraft= X15, X15-new
Status Unknown
Supports Space trip
Download Download the North American X-15 aircraft package for the current stable release (2018.2).

A famous rocket plane for FlightGear 1.0.

Of the two out three surviving X-15, one is a the National Air and Space Museum


Development status/Issues/Todo


  • textures are bumpy
  • flaps are not animated (fixed in future release shown below)
  • rudder, ailerons and pitch elevator are not animated (fixed in future release shown below)
  • cockpit windows are not transparent (fixed in future release shown below)
  • aircraft has no shadow
  • no aircraft light available (actual aircraft did not have external lights)
  • there is no stream behind the rocket engine visible (fixed in future release shown below)

3d Cockpit:

  • no 3d cockpit available (fixed in future release shown below)


  • engines have no sound
  • no hud available (actual aircraft did not have HUD but can be activated as usual for flight test)
  • aircraft has no braking parachutes (actual aircraft did not have brake parachute)

Ballistic high altitude flight and rendering

Flightgear is able to render the scene for the ballistic high altitude flight the X-15 is capable of (at least on a modern graphics card), but it needs some special adjustments to do so. Assume the visibility at arc top should be 500 km:

  • from the menu, LOD bare range needs to be set to 500000.0
  • in the property browser, /sim/rendering/camera-group/zfar needs to be set to 500000.0
  • in the weather menu, configure visibility at high altitude to 500000.0 m
  • use the Atmospheric Light Scattering framework to get the correct visuals of being outside the atmosphere in the rendering menu

The X-15 on the falling leg of a high-altitude ballistic trajectory above Iceland The X-15 on the falling leg of a high-altitude ballistic trajectory above Iceland The X-15 on the falling leg of a high-altitude ballistic trajectory above Iceland

Electrical system modelling (nasal proposal)

The X-15 electrical and hydraulic systems are peculiar because they use a pair of hydrogen peroxide fueled APUs to provide power to the aircraft instead of being connected to the main engine. While the mechanical power drain from those systems can be neglected for regular aircraft where most of the fuel is used for propulsion, this cannot be done for accurate computation of fuel consumption from the APU. And depletion of APU fuel can leave you without a controllable aircaft ...

As hydraulics and electrical systems have many common feature, the following is only an introduction to the electrical system design. The system can be split in the following generic components (each one having its class in Nasal)

  • Mechanically driven generators (hyd : pumps)
  • Batteries (hyd : accumulators)
  • Transformers (that includes transformer rectifiers and inverters)
  • Buses (hyd: circuit)
  • Bus ties (hyd : power transfer unit)
  • Circuit breakers (hyd : relief valve)
  • Terminal loads which include
- Lights
- Instruments
- Switches
- Actuators ...

The system will be updated per display cycle in order to achieve several goals :

  • compute the mechanical load to for the generators
  • drain each generator according to the tie logics between buses (achieved through a priority of connections towards buses)
  • compute the properties of the electrical power applied to each terminal load

As it stands, the electrical system is built by instanciation of objects for each class e.g.

var X_15_electrical = ();
var AC_1 =;
var gen_1 = (X_15_electrical,
			   AC_1, #bus
			   40000, #low rpm
			   25000, #cutoff rpm
			   3); #priority on bus
 var AC_voltmeter_1 = (AC_1,
				 0,   #low value
				 250, #hi value
				 drop_on_shutdown, #behavior when power is lost
				 200, #nominal voltage
				 0.5, #relaxation time
				 0.5, #nominal electrical consumption
				 "/systems/electrical/voltage-1"); #displayed value

And the chain of updates (tree traversal) is as follows

ElectricalSystem.update = func (delta_t)
  var index = 0;
  #first we look which are the loads attached to each generator
  forindex (index; me.generators) me.generators[index].feed();
  #then external connections 
  forindex (index; me.externals) me.externals[index].feed();
  #including batteries
  forindex (index; me.batteries) me.batteries[index].feedBus();
  #then we compute the load coming from each of the terminal loads
  forindex (index; me.terminal_loads) me.terminal_loads[index].powerDemand(delta_t);
  #compute the change in battery load
  forindex (index; me.batteries) me.batteries[index].updateCharge(delta_t);
  #compute the mechanical power demand for each of the generators
  forindex (index; me.generators) me.generators[index].computePowerConsumption(delta_t);
  #reset all cyclic elements
  forindex (index; me.buses) me.buses[index].resetForCycle();
  forindex (index; me.terminal_loads) me.terminal_loads[index].resetForCycle();

Due to the number of function calls and the genericity of the approach it may be interesting in the future to include this models in the C++ code, even though current benchmarks do no seem to show a noticeable drop in frame rate