txt.at8eqeq3.me
// текстятина
О самолётах и данных: ADS-B, часть 2
Исходные данные
Как все давно в курсе, у меня есть ADS-B приёмник, с которым я время от времени играюсь. В этот раз мне показалось, что было бы интересно собрать в одну кучу все пролетавшие самолёты и посмотреть, как это выглядит.
Есть разные способы изъять нужные данные из dump1090, из них наиболее подходящим для меня стал формат SBS-3. Сервер включается опцией --net-sbs-port port
, где port
— это номер tcp-порта, куда надо будет подключаться. Любому, кто туда подключится, будет сливаться поток в виде строк с полями, разделёнными запятыми, что, несомненно, очень удобно для разбора. Формат позволяет передавать много различной информации, dump1090 отдаёт довольно много её видов (хоть и не все), но нам нужны только сообщения с координатами и высотой. Пытливый читатель без труда найдёт описание формата и всё поймёт самостоятельно (там не трудно), не пытливый скопирует строчку в терминал, не забыв подправить адрес и порт (ну, и имя файла, ежели угодно):
nc <ip-address> <port> | \
grep --line-buffered MSG,3 | \
cut -d ',' -f 12,15,16 | \
tee -a points.txt
Пережёвываем и визуализируем
Когда пачка команд, что выше, поработает достаточно долго, у нас будет приличных размеров файл формата CSV, содержащий, очевидно, высоту в футах (авиаторы — они такие, да) и координаты в виде градусов с десятичными долями. Почти всё хорошо, но есть два момента: иногда в сообщении есть только высота, но нет координат, а ещё высота и координаты имеют слишком разную размерность: первое запросто дойдёт до 40000, второе не бывает больше 180. Поэтому надо, во-первых, пофильтровать битые строки, а во-вторых немного сконвертировать цифры. Если заморочиться, то можно даже расчитать коэффициенты, чтобы пропорции соблюдались. У меня это делает стрёмный скриптик на Ruby, который я тут не буду показывать. Наверняка всё то же самое можно было сделать на python и pandas, но мне пока недосуг в это въезжать. В общем, непостижимым образом у нас получился всё тот же CSV, но подчищенный и причёсанный. Пора делать картинки.
Делать картинки мне помог чудесный инструмент PPTK, который делает ровно то, что мне надо: получает массив точек и отрисовывает их в 3D, и всё это можно приближать, отдалять и вертеть. Как-то так оно и происходит:
import numpy as np
import pandas as pd
import pptk
points = pd.read_csv('points.txt', header=None)
points.rename(inplace=True, columns={0: 'alt', 1: 'lat', 2: 'lon'})
P = np.c_[points['lon'], points['lat'], points['alt']]
v = pptk.viewer(P)
v.attributes(points['alt'])
В двух словах: подключаем нужные библиотеки, загружаем предварительно причёсанный CSV, переименовываем колонки, чтобы жилось проще и скармливаем в PPTK, последней строчкой наводя красоту. А теперь картинки.
Картинки
Эта картинка показывает транзитные рейсы: жёлто-красные прямые линии в верхней части — это оно и есть. Большая часть летит с запада на восток и с востока на запад, их-то лучше всего и видно. Кое-где их пересекают линии в других направлениях — это, соответственно, с юга на сервер и наоборот. Между линиями одинаковое расстояние, потому что вертикальное эшелонирование.
Тут я отрезал всё выше FL100, чтобы показать трафик около аэропортов. Самый большой пучок слева сверху — это, конечно же, Шереметьево. Маленький кудрявый куст чуть ниже — это Хелипорт Москва, вертолётики. Ещё ниже — это Внуково, их тут плохо слышно, поэтому так невзрачно. Правее Внуково — соответственно, Домодедово, а рядом с ним — Жуковский.
Это Шереметьево, две ровных горки — это самолёты, садящиеся на полосы 24L и 24C. Отдельная горка — это новая ВПП 24R. У взлетающих бортов чуть больше свободы, чем у садящихся, поэтому горка в противоположном направлении заметно более лохматая. Кстати, с новой полосы за целый день никто не взлетел, только садились. Полосатость — это потому что вертикальное разрешение 25 футов.
Всё то же Шереметьево, сверху. Трафик прямо таки повторяет схемы.
А тут весь (сильное утверждение: на самом деле только то, что слышно моему приёмнику) Московский авиаузел (по-прежнему, ниже FL100). Сразу видно, кто куда и как летит.
Бонус, которого не было на Medium. Это я пособирал данные в другой день. Самолёты взлетали из Шереметьево противоположным курсом, и в этот раз на 06L никто не садился, зато взлетали в полный рост. Видимо, с запада какое-то ограничение есть.
Заключение
В целом, задача мне видится решённой. Из возможных улучшений:
- улучшение покрытия приёмника. От этого всем будет хорошо. Когда-нибудь я-таки вытащу его на крышу, тогда заживём;
- картинки можно бы генерировать автоматически с некоторой периодичностью — вероятно, PPTK это позволяет. Можно камеры расставить даже в нужные места.