txt.at8eqeq3.me
// текстятина
О самолётах и данных: ADS-B, часть 3
Задача
Поскольку наличие в углу такого замечательного источника интересных данных не даёт мне покоя, на каникулах я снова обратился к теме их визуального представления.
Для затравки — видео с конечным (на нынешней итерации) результатом (тыц картинку):
В общем — да, смотреть на статические картинки, особенно с разных интересных точек — хорошо и здорово, но хочется же и динамику наблюдать. Собственно задача была примерно такой: сделать анимацию получаемых с приёмника данных; данные должны быть накопленными за заданный интервал времени (моментальные снимки не интересны в принципе), а устаревшие данные отображаться не должны (а то слишком шумно).
Решение
Исходнички на гитхабе, невозбранно: https://github.com/at8eqeq3/adsb-viz
Часть с накоплением и удалением решилась неожиданно просто: для этого понадобился Redis и команда SETEX
(https://redis.io/commands/setex). Мне это показалось более красивым визуально решением, чем какой-нибудь ограниченный по размеру FIFO буфер, потому что если уж действительно в небе ничего нет, то так оно и будет на итоговой картинке, а не залипшие, потому что их нечем вытеснить, точки. Из-за этого программу пришлось поделить на 2 части (одна кладёт в Redis, другая берёт из него), но и не страшно. Ну, а поскольку я и так решил злоупотреблять редисом, мне придумалось хранить полезную нагрузку сразу в ключах — оно так заметно быстрее работает и удобнее извлекается со SCAN
.
С получением красивых картинок получилось не очень гладко. Поскольку хочется иметь это дело работающим на headless-машинке, использованный в предыдущей статье PPTK нам, увы, не поможет. В теории, мог бы решить задачу Open3D, который вроде как умеет работать без окна, но у меня пока не получилось склонить его к этому.
Пришлось изобрести совершенно деревянный способ, показывающий только вид сверху (ну, можно поизгаляться и вид сбоку приспособить, но это не очень интересно) — pillow и Image.putpixel
для всех точек, что приехали из Redis. На выходе получаем серию изображений (равномерные интервалы нам, кстати, делает питоний schedule
), которые можно ffmpeg
собрать в видео — примерно как вверху статьи. Там много магии с геометрическими преобразованиями и молчаливой ловлей исключений, чем я не особо-то и горжусь.
Заключение
Улучшить, по-прежнему, есть что:
- хочется добавить всякие там радиомаяки и прочие фиксы. А можно и схемы (возвращаясь к 1 части);
- всё-таки надо сделать 3D. Написать какой-нибудь простенький минимальный рейтрейсер или что-то такое.