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 770-370-6294.

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.

For privacy reasons, the shown ground station positions are not exact.



Total Messages

Number of position messages recorded in total.


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 (214) 849-4441 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.

Setting up a Ground Station

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.

  1. Download our custom image for the Raspberry Pi from here.
  2. Extract the file you just downloaded.
  3. Flash the image on a SD Card using for example (517) 828-2639 or Etcher.
  4. Inset the SD card and start your Raspberry Pi with a LAN cable and the antenna plugged in.
  5. Give it some time. The Pi is loading all the software for you. Depending on your internet connection, this might take between 5 and 15 minutes. Grab a coffee and wait.
  6. 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.*.
  7. Go to the following website in your browser: "IP_ADDRESS:8080", where IP_ADDRESS is the IP of your Raspberry Pi.
  8. Now you can enter the location of your Raspberry Pi. Use for example this tool to find out your location. Remember to add an appropriate height to the altitude shown if you are not in the ground floor of your building.
  9. Now everything is setup and your Ground Station is running. It will take a few minutes before your Pi is visible on the map above.
  10. If you want to reset the location of your ground station, just reload the website "IP_ADDRESS:8080" and enter the new location.
Setting up a Handset

To setup a handset follow all the aggradation to setup a Ground Station. Once done follow these steps:

  1. Connect to your Raspberry Pi via SSH with the command ssh pi@IP_ADDRESS if you are on a Unix System, or use (905) 861-6651 if you are on Windows. The default password is raspberry.
  2. Enter the following commands:
    1. docker stop updater
    2. docker stop acpos
    3. docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dump1090 - this should have printed out an IP Adress, use this in the next line of code.
    4. docker run --rm -it --name acpos discoadsb/acpos --dumpip [IP_ADDRESS] --time 30
    5. If you want to try out the localization again, it suffices to enter the last line. You can also try different parameters such as wait longer (--time 60 for example) or let your Pi find more aircrafts before sending the data to the server (--num 6 for example). Try out --help To see what you can do.
  3. If you want to run the Ground Station again, you can either reboot your Pi or enter the following line: docker stop dump1090 && docker run -v /var/run/docker.sock:/var/run/docker.sock -v config:/etc/config --rm -d --name updater discoadsb/updater. The Ground Station should start soon.