Electrical Systems#

Warning

This section is a work in progress.

Aircraft electrical systems are vital for powering a range of systems, from essential flight instruments and navigation equipment to lighting and engine starters. In FlightGear, these systems can be simulated in a way that mirrors the real-world flow of electrical power, allowing pilots to practice realistic troubleshooting, manage failures, and understand how different components—like batteries, alternators, buses, and switches—work together.

Implementing an electrical system for an aircraft#

Aircraft Developers have two options to choose from when it comes to how to simulate electrical systems:

  • Built-in

  • Custom

Built-in Electrical Model#

Tip

The main advantages of the built-in XML-based electrical model are its simplicity and ease of use, as well as the fact that it has essentially zero performance overhead. Very complex or intricate electrical simulations are best implemented in Nasal at this time.

The FlightGear electrical system model is an approximation. It does not simulate down to the level of individual electrons but instead models a sufficiently rich subset of components to allow the implementation of a realistic electrical system from the pilot’s perspective. The model is designed to capture the general flow of electricity, enabling the simulation of typical electrical system failures, providing opportunities to practice realistic troubleshooting techniques, and understanding the basic structure and relationships of an actual aircraft electrical system.

An electrical system is constructed from four major components: suppliers, buses, outputs, and connectors. Suppliers include elements such as batteries and generators. Buses collect input from multiple suppliers and distribute power to multiple outputs. Outputs are optional but are included to allow generic output types to be named and provide a consistent naming scheme for other FlightGear subsystems. Connectors link suppliers to buses or buses to outputs and can optionally specify a switch property, representing either a physical switch or a circuit breaker.

At runtime, the structure defined in the electrical system configuration file is parsed, and a directional graph (in the computer science sense) is created. During each frame, current is propagated through the system, starting from the suppliers, flowing through the buses, and ultimately reaching the outputs. The system adheres to the path defined by the connectors in the configuration file and respects the state of any connector switches.

A supplier entry could look like the following:

<supplier>
  <name>Battery 1</name>
  <prop>/systems/electrical/suppliers/battery[0]</prop>
  <kind>battery</kind>
  <volts>24</volts>
  <amps>60</amps>
</supplier>

<name> can be anything you choose to call this entry. <prop> is the name of a property that will be updated with the state of this supplier. <kind> can be “battery”, “alternator”, or “external”. <volts> specifies the volts of the source <amps> specifies the amps of the source

Currently <volts> and <amps> are not really modeled in detail. This is more of a place holder for the future.

For alternators, you must additionally specify:

<rpm-source>/engines/engine[0]/rpm</rpm-source>

The value of the rpm source determines if the generator is able to produce power or not.

A bus entry could look like the following:

<bus>
  <name>Essential/Cross Feed Bus</name>
  <prop>/systems/electrical/outputs/bus-essential</prop>
  <prop>/systems/electrical/outputs/annunciators</prop>
  <prop>/systems/electrical/outputs/master-switch</prop>
</bus>

<name> is whatever you choose to call this bus

You can have an arbitrary number of <prop> entries. Each entry is the name of a property that will be updated with the value of the current at that bus. This allows you to wire devices directly to the bus but does not allow you to insert a switch or circuit breaker in between. See “Outputs” and “Connectors” if you want to do that.

An output entry could look like the following:

<output>
  <name>Starter 1 Power</name>
  <prop>/systems/electrical/outputs/starter[0]</prop>
</output>

An output isn’t entirely unlike a bus, but it’s nice conceptually to have a separate entity type. This enables us to specify a common set of output property names so that other subsystems can automatically work with any electrical system that follows the same conventions. An output lives on the other side of a switch, so this is how you can wire in cockpit switches to model things like fuel pump power, avionics master switch, or any other switch on the panel.

<name> is whatever you choose to call this bus

You can have an arbitrary number of <prop> entries. Each entry is the name of a property that will be updated with the value of the current at that bus. This allows you to wire devices directly to the bus but does not allow you to insert a switch or circuit breaker in between. See “Outputs” and “Connectors” if you want to do that.

Other FlightGear subsystems can monitor the property name associated with the various outputs to decide how to render an instrument, whether to run the fuel pump, whether to spin a gyro, or any other subsystem that cares about electrical power.

An connector entry could look like the following

<connector>
  <input>Alternator 1</input>
  <output>Virtual Bus 1</output>
  <switch>/controls/switches/master-alt</switch>
  <initial-state>off</initial-state>  <!-- optional tag -->
</connector>

A connector specifies and input, and output, and any number of switches that are wired in series. In other words, all switches need to be true/on in order for current to get from the input to the output of the connector.

<input> specifies the <name> of the input. Typically you would specify a “supplier” or a “bus”.

<output> specifies the <name> of the output. Typically you would specify a bus or an output.

You can have an arbitrary number of <switch> entries. The switches are wired in series so all of them need to be on (i.e. true) in order for current to pass to the output.

Note: by default the system forces any listed switches to be true. The assumption is that not every aircraft or cockpit may impliment every available switch, so rather than having systems be switched off, with no way to turn them on, we default to switched on.

This is a problem however with the starter switch which we want to be initialized to “off”. To solve this problem you can specify <initial-state>off</initial-state> or <initial-state>on</initial-state> Switches default to on, so you really only need to specify this tag if you want the connector’s switch to default to off.

The electrical system has a lot of power and flexibility to model a variety of electrical systems. However, it is not yet perfect or finished. One major weakness is that it doesn’t yet model degraded battery or generator power, and it doesn’t model the “charge” of the batteries in case of a generator failure.

Custom Scripted System

Attribution

Based on writing by Curtis L. Olson