North American X-15
Type | Rocket-powered aircraft |
---|---|
Author(s) | Mike Hill, Jon S. Berndt (FDM), John Check, Enrique Laso (new model) |
FDM | JSBSim |
--aircraft= | X15, X15-new |
Status | Unknown |
Supports | |
Development | |
Website | |
Repository | |
Download | |
License | GPLv2+ |
A famous rocket plane for FlightGear. Of the two out three surviving X-15, one is at the National Air and Space Museum
Development status/Issues/Todo
Outside:
- 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)
General:
- 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
Electrical system modelling (nasal proposal)
The X-15 electrical and hydraulic systems are peculiar because they use a pair of hydrogen peroxide fuelled 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 aircraft ...
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 instantiation of objects for each class e.g.
var X_15_electrical = ElectricalSystem.new ();
var AC_1 = ElectricalBus.new(X_15_electrical);
var gen_1 = Generator.new (X_15_electrical,
regulated_AC_voltage,
generator_rating,
AC_1, #bus
40000, #low rpm
25000, #cutoff rpm
3); #priority on bus
var AC_voltmeter_1 = Gauge.new (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
|