Aircraft Signal Positioning System

Uses aircraft signals to localize users.
Runs on Raspberry Pi.
Developed at ETH Zurich.

Welcome to the project page for the Aircraft Positioning System developed by the Distributed Computing Group at ETH Zurich.

We use the position status messages broadcast by aircraft to determine the user's position using multilateration. This is similar to how GPS works, which uses satellite signals instead of aircraft signals.


Click an aircraft to see its ICAO address and altitude as well as its travelled path. Click a ground station to see its current message rate.

An aircraft's color indicates its altitude, from red for low to blue for high.

Check the checkbox to see a visual indication whenever a ground station receives a message from an aircraft.



Messages Today

Number of position messages recorded in the last 24 hours.


Active Stations

Number of ground stations active in the last 5 minutes.


The idea of multilateration is that a receiver's position can be determined by measuring the differences in arrival time of signals originating from multiple known locations.

The way we apply this idea is by using aircraft as the known positions.

Modern aircraft constantly send out messages containing information such as position, altitude, heading or speed. We use the messages containing position, so we know the aircraft's position at that moment, and then measure the time difference between sending of the message at the aircraft and arrival at the receiver to measure the distance.

There are two main challenges to overcome:

  1. The aircraft do not provide a timestamp with the messages, so we do not know when each was sent. We have solved this problem by setting up ground stations with known positions, which record all messages received with a precise timestamp. Since we know the position of the ground station and we know the position of the aircraft, we can calculate when the message was sent at the aircraft by subtracting the calculated travel time from the reception time.
  2. All measurements need to be very precise and every part of the system needs to be precisely synchronized, as an error of only 1ms will result in an inaccuracy of 300km at light speed. We therefore require about nanosecond precision.

Our client-side software works in the same way as and is compatible with the feeders for sites such as FlightAware or FlightRadar24. These consist of two parts:

  1. dump1090, a Mode S decoding software, which connects to the attached receiver, such as a FlightAware Pro Stick Plus, decodes received messages and makes the information available to other software running on the device.
  2. A feeder, which relays this information to the appropriate servers.

We use a modified version of dump1090, based on and fully compatible with FlightAware's version. Since we require as much precision as possible, our version of dump1090 performs additional upsampling of the messages' timestamps, which means that it uses signal processing techniques to calculate the timestamps to a higher precision than is provided by the receiver or the unmodified version of dump1090.

Due to the imprecision of the Raspberry Pi's internal clock, subject to both an offset and a unpredictable drift over time, the synchronization of the ground stations and the handsets is performed on the server using a least-squares optimization and only in the context of a localization query.

Messages received by the handset to be localized are sent to the server with a reception timestamp, where they are matched with the reception timestamps as seen by the ground stations. After synchronization, the transmission time at the aircraft is determined, based on which the travel time and therefore the distance from the aircraft to the handset is calculated. These results is then used for trilateration of the handset.

For an in-depth, technical description of these processes, see our paper: Indoor Localization with Aircraft Signals.


Installing our software on your own Raspberry Pi is really simple. All you will need is an RTL-SDR dongle capable of picking up 1090 MHz signals such as the FlightAware Pro Stick Plus and an antenna.
We currently only support Raspbian Stretch.

  1. If you have not yet installed Raspbian on your Pi's SD card or would like to reinstall, we have provided instructions for doing so in the next section, or you can follow one of many tutorials online.
  2. Add our gpg key to your apt keyring:
    wget -q - | sudo apt-key add key.asc
  3. Add our Raspbian repository to your package manager's sources, so it knows where to find the packages.
    • For Raspbian Stretch:
      echo "deb stretch main" | sudo tee -a /etc/apt/sources.list

    If you are not sure which version of Raspbian you have installed, run lsb_release -c.

  4. Install the acpos package.
    sudo apt-get update
    sudo apt-get install acpos

That's it. During installation, you will be asked to enter the latitude, longitude, and altitude of your base station. To find these values, you can use services such as LatLong and Elevation Finder.

If you move your base station, or want to change its name, you can change your config values by running sudo dpkg-reconfigure acpos or by manually editing /etc/default/acpos.

Installing Raspbian

To set up a Raspberry Pi from scratch, follow these steps. You will need an SD card reader/writer - if you have a laptop there's a good chance you have one built in.

  1. Download Raspbian. If you will be using your Pi for tasks where you do not require a graphical desktop, the lite version is recommended, as it uses fewer resources.
  2. Get software for flashing the image to the SD card. Etcher is very easy to use.
  3. Insert your Raspberry Pi's SD card into the card reader and flash the downloaded image. Ignore any prompts to format once the flashing is complete.
  4. At this point you have two options:
    • Reinsert the SD card into the Raspberry Pi, attach a screen, keyboard and power cable then continue the setup on the Pi.
    • If you are an advanced user and would like to preform a 'headless' setup (without screen and keyboard) over SSH, the newer versions of Raspbian have features built in to make this easier:
      1. In the SD card's newly created boot partition, which should be accessible from every operating system while the SD card is plugged in, create a new empty file called ssh. This will enable connecting to the Pi over SSH.
      2. If your Pi is going to connect over WiFi, you can also preconfigure the appropriate settings, by creating a file in the boot partition called wpa_supplicant.conf, with the contents:
        where YOUR_SSID should be replaced by your WiFi's name and YOUR_PASSWORD by it's password. These settings will be automatically copied to the appropriate location on boot.
      3. Connect your Pi to power and give it a minute to boot up.
      4. Next, you will need to find out which IP address was assigned to your Pi. Either check your router's web interface or run a network scanning utility such as nmap from a computer in the same network, e.g. nmap -sn 192.168.1.*.
      5. Now you can connect to your Raspberry: ssh pi@IP_ADDRESS, where IP_ADDRESS is the Raspberry's IP as determined in the previous step. The default password is raspberry.