Треки полёта
Вкладка «Полёты» на паспорте борта (/hangar/view/<id>) позволяет
загрузить файл GPS-трека и посмотреть маршрут полёта на карте.
Треки — это карта и анализ полёта, не счётчик налёта. «Налёт борта» и
суммарный налёт/дистанция флота на дашборде считаются ТОЛЬКО по одометру
полётного контроллера (кнопка «Синхронизировать налёт» на паспорте борта) —
загрузка трека на эту цифру не влияет никак, ни суммой, ни максимумом. Чтобы
налёт борта рос, синхронизируйте его по USB; трек здесь даёт маршрут на
карте и рекорды (макс. высота/скорость/время одного полёта, «самый летающий
борт») на дашборде.
Что можно загрузить
| Формат | Расширение | Статус |
|---|---|---|
| GPX (GPS Exchange) | .gpx |
✅ разбирается, показывается на карте |
| KML (Google Earth) | .kml |
✅ разбирается (LineString и gx:Track) |
| INAV/Betaflight blackbox | .bbl, .bfl, .txt |
✅ из лога извлекается GPS-трек |
| ArduPilot DataFlash | .bin |
✅ из лога извлекается GPS-трек + события полёта |
| ArduPilot DataFlash (текст) | .log |
✅ тот же трек текстовым CSV-дампом («Log → text») |
| ArduPilot/MAVLink телеметрия | .tlog |
⏳ пока не поддерживается (см. ниже) |
Формат определяется автоматически — по содержимому файла и расширению.
Из трека берутся координаты (широта/долгота), а если есть — высота, время
точки и скорость. Максимальный размер файла — 512 МБ (реальный blackbox-лог
часового полёта — обычно 80–300 МБ); при превышении платформа честно сообщит
лимит в МБ (файл при этом не грузится в память целиком).
Blackbox-логи полётного контроллера. Файл blackbox (
.bbl/.bfl, а
также.txt— так по умолчанию называет лог SD-карта INAV) декодируется на
платформе локально — из него берётся GPS-трек (координаты, высота,
скорость, время). Если полётник писал лог без GPS-модуля (или не было
фикса спутников), точек в логе нет — платформа честно сообщит об этом.
Обрезанный или частично повреждённый лог тоже разберётся: покажется та
часть маршрута, что успела записаться. Если же лог пустой или битый
целиком (типичная причина — SD-карта не успела дописать данные, например
при обрыве питания) — платформа так и скажет: «лог пустой или повреждён —
запись не удалась», не путая это с неподдерживаемым форматом. Прочая
телеметрия из blackbox (напряжение, ток, RSSI, режимы) пока не извлекается —
см. планы ниже.ArduPilot — вторая платформа наравне с INAV. Бинарный DataFlash-лог
(.bin, самоописывающийся формат FMT-заголовков) декодируется на платформе
локально, тем же принципом честности, что и blackbox: лог без GPS-модуля/
фикса — понятное сообщение, а не пустой трек; обрезанный лог разберётся
частично (та часть маршрута, что успела записаться). Кроме точек трека, из
лога извлекаются дискретные события полёта (смена режима, ошибки
подсистем, текстовые сообщения прошивки) — они показываются маркерами на
карте/3D-сцене и тиками на шкале реплея (см. «События на треке» ниже).
Текстовый CSV-дамп («Log → text», расширение.log) — тот же трек, но без
событий (секонд-формат). MAVLink-телеметрия (.tlog) распознаётся, но
разбор пока не реализован — сообщение об этом при загрузке явно так и
говорит («пока не поддерживается»), вместо намёка на неизвестный формат;
используйте DataFlash-лог (.bin) с полётного контроллера вместо.tlog.
Как загрузить
- Откройте борт → вкладка «Полёты».
- Нажмите «Загрузить трек» и выберите файл GPX, KML, blackbox-лог
(.bbl/.bfl/.txt) или ArduPilot DataFlash-лог (.bin/.log). - После разбора трек появится в списке и сразу отрисуется на карте с
авто-зумом по границам маршрута: зелёный маркер — старт, красный —
финиш, синяя линия — путь.
Для каждого трека в списке видно: имя файла, формат, число точек, дистанцию,
длительность и дату. Кнопки: «На карте» (показать), «Скачать» (сырой
файл как загружен), «Завести событие» / «🚨 Открыть событие» (см. ниже)
и «Удалить».
Полёт закончился событием? Кнопка «Завести событие» у трека
открывает форму нового события с уже
выбранным бортом и предзаполненным временем происшествия (конец GPS-трека) —
после сохранения событие свяжется с ЭТИМ ЖЕ треком, файл лога не
копируется (общийtrack_idна обе карточки). Если трек уже связан с
событием, вместо этой кнопки — прямая ссылка «🚨 Открыть событие».
Обратное тоже работает: загрузка лога прямо из карточки [события]
(../events/events.md) сразу заводит полноценный полёт на этой вкладке
(раздел «Трек полёта и место падения»).Дата — это время полёта, а не время загрузки файла. Если в логе есть
GPS-время (GPX почти всегда, blackbox — если был фикс спутников), в колонке
«Дата» показывается момент первой GPS-точки трека — то есть когда
реально состоялся полёт, а не когда вы загрузили файл на платформу (это
могут быть разные дни). Наведите курсор на дату — подсказка уточнит,
откуда она взята. Если в логе времени нет (KML часто его не пишет, у
blackbox без фикса спутников времени тоже нет) — колонка честно показывает
момент загрузки, ничего не придумывая.
Реплей полёта
Под картой есть плеер реплёя — можно «проиграть» полёт: маркер-самолётик
(✈️) едет по маршруту, как самолёт двигался по времени.
- ▶ / ⏸ — воспроизведение и пауза.
- Ползунок — перемотка в любую точку трека.
- Скорость —
1×,2×,4×,8×(во сколько раз быстрее реального времени). - «Следить камерой» — карта едет за маркером (по желанию).
Во время реплёя рядом показываются параметры текущей точки: высота, скорость
и время. Если у точек трека есть метки времени — маркер движется по реальному
времени полёта (с интерполяцией между точками); если времени в файле нет —
равномерно по точкам.
Тот же плеер работает и в карточке события (если событие привязано к треку)
— можно проиграть полёт, закончившийся крашем.
События на треке (смена режима, ошибки, фейлсейф)
Для треков ArduPilot DataFlash (.bin) на карте, в 3D-сцене и на шкале
реплея появляются маркеры дискретных событий полёта — то, что писал в лог
полётный контроллер отдельно от GPS-точек: смена режима полёта, ошибки
подсистем (EKF, GPS и т.п.) и текстовые сообщения прошивки. Это ключевой
инструмент разбора события: например, флайэвей после потери линка — по
маркерам видно, в какой момент маршрута сработал фейлсейф и что борт делал
после.
- Цвет — по важности события, не по акценту темы: обычная смена режима —
нейтральный серо-голубой; предупреждение — жёлтый; ошибка/фейлсейф —
красный. Три уровня видно сразу, не вчитываясь в подписи. - На шкале реплея (и 2D, и 3D) — маленькие цветные точки-тики поверх
ползунка позиции, на своём моменте трека. - На карте/3D-сцене — маркер стоит НА маршруте в точке, где событие
произошло (интерполяция по времени, как и у движущегося маркера-самолётика). - Клик по маркеру или тику — реплей ставится на паузу и перематывается
ровно к этому моменту.
Треки без событий (GPX, KML, INAV/Betaflight blackbox, а также ArduPilot
.log-текстовый дамп) показываются как обычно — просто без маркеров и тиков,
без какой-либо заглушки на месте отсутствующих данных.
3D-просмотр трека
Над картой — переключатель «🗺️ 2D map» / «🧊 3D scene»: тот же трек можно
посмотреть как объёмную сцену (как в ArduPilot Mission Planner), а не только
плоскую линию на карте.
- Трек рисуется 3D-ломаной: широта/долгота превращаются в горизонтальную
плоскость (метры от центра трека), высота — в вертикальную ось. На длинных
маршрутах с небольшим набором высоты в реальных пропорциях (метр высоты =
метр по горизонтали) трек выглядит почти плоским, поэтому по умолчанию
высота преувеличена автоматически — коэффициент подбирается по аспекту
трека (горизонтальный размах / перепад высот), чтобы профиль полёта было
видно сразу. Ползунок «Vertical exaggeration» рядом позволяет подкрутить
преувеличение вручную (×1…×10) — текущий коэффициент всегда подписан
числом, чтобы было видно, что высота преувеличена (это не настоящий рельеф);
×1 — реальные пропорции. - Высота сцены — заметно выше плоской 2D-карты (на широком экране), чтобы
объёмный трек не превращался в сжатую полосу. - Цвет линии — градиент по высоте или скорости (переключатель «Color
by»), рядом легенда с мин/макс значением. Тёмный конец шкалы — низкое
значение, светлый — высокое. - Камера — орбита (зажать и тянуть), пан (правая кнопка), зум (колесо
мыши) — стандартное управление 3D-вьюером, как у конструктора крыла. - Реплей — тот же принцип, что у 2D (play/pause, ползунок, скорость
1×/2×/4×/8×, «следить камерой»): маркер едет по 3D-треку, вертикальная
линия-«флагшток» до сетки пола показывает высоту наглядно, рядом — текущая
высота/AGL/скорость/время (AGL — см. ниже). - Земля — настоящий рельеф местности (карта высот): под треком строится
меш по данным о высоте участка, где летали, а не условная плоскость. Это
особенно важно для полётов в горах — видно, где земля поднимается навстречу
треку, а где остаётся запас высоты. Если данные о рельефе получить не
удалось (нет сети до сервиса высот, площадка вне покрытия) — платформа
честно об этом сообщает и показывает прежнюю сетку-плоскость вместо того,
чтобы выдумывать несуществующий рельеф.Высоты тянет и кеширует сама платформа (не браузер) — сторонний сервис
карт высот не получает никаких данных о вашем треке напрямую, и повторный
показ того же места (аэродрома) не требует нового обращения наружу.
Источник — открытые данные о рельефе (без API-ключа и платы). Спутниковый
снимок поверх рельефа — в планах (см. ниже), сама геометрия земли уже
здесь. - AGL (высота над землёй) — раз рельеф известен, реплей может показывать
не только высоту над уровнем моря, но и реальный запас до земли ИМЕННО под
бортом в этой точке маршрута — появляется в реплее автоматически, когда для
места есть данные о рельефе.
3D-сцена (Three.js) грузится, только если у борта есть хотя бы один трек —
на пустой вкладке лишние ~600 КБ библиотеки не подгружаются.
Приватность
Треки приватны — их видит только владелец борта, как и остальные данные
борта (конфигурации, расходы, события). Чужой трек недоступен. При удалении
борта все его треки (и сырые файлы) удаляются вместе с ним; если удалённый
трек (единичное удаление или удаление всего борта) был связан с событием —
связь честно отвязывается (трек и место падения пропадают из карточки
события), само событие не удаляется и не портится.
Карта и внешние тайлы. Сама библиотека карты (Leaflet) и её стили
хостятся локально на платформе. А вот тайлы карты (картинки местности)
подгружаются с внешнего CDN — это внешний вызов: при открытии карты трека
браузер обращается кbasemaps.cartocdn.com. Сами координаты вашего трека
при этом наружу не отправляются (уходит лишь запрос на квадраты карты нужного
региона), но факт обращения к внешнему сервису стоит иметь в виду.Платформа работает в тёмной теме, поэтому карта использует тёмный
баземап CARTO «Dark Matter» (dark_all) — это
нормальная тёмная карта, а не инверсия светлой (раньше светлые тайлы
OpenStreetMap инвертировались фильтром и выглядели «негативом»). Тайлы —
рендер данных OpenStreetMap; подпись на
карте: «© OpenStreetMap, © CARTO».Лицензия. Тайлы CARTO берутся с публичного CDN без API-ключа; базовые
стили CARTO бесплатны для некоммерческого использования (для коммерческого
нужна лицензия CARTO Enterprise — учесть при монетизации платформы). Провайдер
легко заменить: URL тайлов задан вflight_tracks.jsиincident_track_map.js,
хост — в CSPimg-src(web/app.py).Рельеф под 3D-треком — иначе, чем 2D-тайлы выше: браузер НЕ обращается
к стороннему сервису напрямую (координаты трека наружу из браузера не
уходят вовсе) — данные о высоте местности запрашивает и кеширует сама
платформа, а фронту отдаёт уже готовую сетку. Источник — AWS Terrain
Tiles (открытые данные о
рельефе: SRTM/NED/GMTED2010 от USGS, ETOPO1 от NOAA — все общественное
достояние), без API-ключа и платы. Кеш — по участку местности (не по
пользователю): повторный показ того же аэродрома у любого пилота платформы
не требует нового обращения наружу.
Что дальше (планы)
- спутниковый снимок поверх рельефа под 3D-треком (геометрия земли уже есть,
см. выше — текстура сверху — отдельный шаг); - графики высоты/скорости вдоль трека с курсором, синхронным с реплеем;
- привязка события к точке на треке («здесь разбился»);
- телеметрия из blackbox (напряжение, RSSI, режимы) и сравнение нескольких
полётов; - разбор MAVLink-телеметрии (
.tlog) — не входит в текущий парсер, отдельный
тикет (см. блок про ArduPilot выше); - инструмент подключения/настройки ArduPilot по MAVLink (аналог
/tools/ inav-connect) — отдельная будущая тема, ArduPilot-парсер логов её не
включает.