Zastanawialiście się kiedyś nad tym, jak działają serwisy typu flightradar24.com? Okazuje się, że nie kryją się za nimi żadne skomplikowane urządzenia, radary czy inne cuda techniki (przynajmniej bezpośrednio). Dziś dowiesz się jak zmapować niebo nad Twoją głową bez wstawania sprzed komputera.

ADS-B

Czyli automatic dependent surveillance – broadcast, to system montowany na pokładach samolotów, który okresowo (co sekundę) nadaje aktualne parametry lotu drogą radiową. Komunikaty te nie są w żaden sposób szyfrowane więc każdy może je odebrać i odczytać informacje, które ze sobą niosą. Jakie to informacje? Między innymi pozycja GPS, wysokość, prędkość i identyfikator samolotu. Jak odebrać te informacje? Nadajniki ADS-B pracują na częstotliwościach 978 i 1090 MHz. Okazuje się, że bardzo łatwo, małym kosztem można nasłuchiwać na falach w przedziale częstotliwości około 24 MHz – 1,7 GHz. W tym celu można posłużyć się tanimi tunerami cyfrowej telewizji naziemnej (DVB-T) na USB, opartymi o popularny chipsety RTL2832U i R820T. Przykładowy tutorial znajdziesz tutaj. Zadeklarowałem się jednak, że masz mieć radar nie wstając sprzed komputera! Oczywiście wywiążę się z obietnicy.

Tuner DVB-T z interfejsem USB

Rozwiązanie alternatywne

Na szczęście kupno odbiornika to nie jedyna droga do posługiwania się danymi serwowanymi przez ADS-B. W sieci powstał serwis gromadzący wolontariuszy z całego świata, którzy za darmo udostępniają dane przechwycone przez swoje odbiorniki. ADS-B Exchange, bo o tym serwisie mowa, udostępnia nam proste API do odczytu danych przekazywanych przez wolontariuszy. Aby pobrać te dane wystarczy odwołać się do poniższego pliku:

https://public-api.adsbexchange.com/VirtualRadar/AircraftList.json

Zawiera on przetworzone już informacje w formacie JSON. W momencie pisania tego posta serwis posiadał informacje na temat ponad 5000 samolotów z całego świata a plik ważył około 3,5 MB. Zważywszy na to, że dane te są aktualizowane co sekundę to sporo. Na szczęście API pozwala nam na odfiltrowanie rekordów ze względu na obszar, który nas najbardziej interesuje. Niech będzie to terytorium Polski. Deklaracja obszaru (w formie okręgu) odbywa się poprzez przekazanie trzech parametrów wraz z zapytaniem do API. Są to:

  • lat – szerokość geograficzna środka okręgu,
  • lng – długość geograficzna środka okręgu,
  • fDstU – promień okręgu wyrażony w km.

Jakie parametry dobrać dla Polski? Geometryczny środek Polski znajduje się w miejscowości Piątek zatem parametry okręgu to:

  • lat = 52.0688114
  • lng = 19.4709897
  • fDstU = 450

Dlaczego długość promienia okręgu przyjąłem za 450 km? Wartość tę dobrałem doświadczalnie mierząc największą odległość od miejscowości Piątek do granic Polski z drobnym marginesem.

Geometryczny środek Polski

Podsumowując nasze zapytanie do serwera będzie wyglądało tak:

https://public-api.adsbexchange.com/VirtualRadar/AircraftList.json?lat=52.0688114&lng=19.4709897&fDstU=460

170 KB i 220 samolotów. Lepiej!

Pokaż mi te samoloty!

Mamy już listę samolotów, które znajdują się nad Polską i w jej najbliższym sąsiedztwie. Przyszła pora aby przyjrzeć się bliżej pobranym danym.


Tablica acList zawiera listę statków powietrznych z wybranego przez nas obszaru. Pozwoliłem sobie wyrzucić nadmiar danych z powyższego listingu żeby nie ograniczać jego czytelności. Pozostawiłem tylko jeden statek powietrzny. Akurat padło na helikopter. Czego ciekawego możemy się dowiedzieć o naszym helikopterze? Oto lista najbardziej interesujących (według mnie) informacji, które są zaszyte w pobranym przez nas JSONie:

  • "Icao": "3E120C" - numer identyfikacyjny,
  • "Reg": "D-HYAM" - numer rejestracyjny,
  • "Alt": 675 - wysokość barometryczna w stopach w odniesieniu do ciśnienia standardowego,
  • "Lat": 51.498917 - aktualna szerokość geograficzna,
  • "Long": 13.73291 - aktualna długość geograficzna,
  • "Vsi": 0 - prędkość pionowa w stopach na minutę,
  • "WTC": 1 - siła turbulencji w skali od 0 do 3 (0 - brak, 1 - lekkie, 2 - średnie, 3 - silne),
  • "Engines": "2" - ilość silników,
  • "Mil": false - informacja o tym czy operatorem jest wojsko,
  • "Cou": "Germany" - kraj pochodzenia,
  • "Spd": 132 - prękość względem ziemi wyrażona w węzłach,
  • "Trak": 260 - kąt wyrażony w stopniach między osią podłużną statku powietrznego a północą geograficzną. Jeśli pole TrkH ma wartość true wtedy jest to kurs statku powietrznego,
  • "Sqk": "" - kod na transponderze. W tym przypadku pilot nie ustawił żadnej wartości lub nie posiada transpondera.

Więcej pól opisane jest tutaj.

Generujemy mapę

Zważywszy na to, że chcemy lokalizować i identyfikować samoloty, posłużymy się tylko kilkoma z powyższych parametrów. Będą to parametry: Icao, Lat, Long, Alt, Trak, Spd i Op. Tyle wystarczy aby narysować sensowną mapę z kilkoma najważniejszymi informacjami.

Przykładowy kod znajduje się w moim repozytorium na GitHubie.

Do rysowania mapy chciałem wykorzystać bibliotekę Basemap Toolkit, ale niestety nie mogę jej zainstalować (używam Pythona 3.6.1). Wyniki obserwacji naszego „radaru” postanowiłem zrzucić do pliku KML, który może być później otwarty np. w Google Earth. Do szybkiego podglądu wygenerowanych przez nasz skrypt plików KML proponuję wykorzystać darmowe narzędzie KML Viewer, które jest dostępne online. Oto efekt pracy naszego skryptu:

Example radar map

Po kliknięciu na pinezkę wyświetlają się nam informacje na temat wybranego samolotu.

Na zakończenie

Jak widać interesujące dane leżą na wyciągnięcie ręki. Z ciekawostek, odpowiednikiem ADS-B montowanym na pokładach jednostek pływających jest AIS, czyli Automatic Identification System. Analogicznie do ADS-B Exchange funkcjonuje serwis AISHub, który również udostępnia swoje publiczne API. FlightRadar dla statków? MarineTraffic.

Znasz jeszcze jakieś ciekawe źródła danych? Zapraszam do dyskusji!