Руководство пользователя¶
Для внешнего пилота и члена жюри, которые открывают сервис впервые. Термины — отраслевые (ПАФС, ЛАФС, галс, ЛЗП, GSD, ВПП) по глоссарию.
Интерфейс описан по коду src/frontend/apps/** (маршруты shell, подписи левого рельса). Макеты в
docs/task5/80-design/ могут отличаться — список расхождений в приложении.
Что делает сервис¶
Геоскан · Планировщик принимает:
- область площадной аэрофотосъёмки (ПАФС) — один или несколько полигонов;
- парк БВС с выбранными полётными заданиями (ПЗ) на каждый борт;
- взлётно-посадочные пункты (ВПП) и при необходимости резервные площадки;
- тип съёмки (RGB, мультиспектр, ИК и др.), требуемый GSD;
- границы разрешённого воздушного пространства и бесполётные зоны;
- ветер (скорость и направление).
На выходе — согласованные маршруты: галсы, перелёты, вылеты с учётом запаса хода, плюс выгрузка KML и GeoJSON (и дополнительные форматы в интерфейсе).
Критерий оптимизации на выбор:
- Время работ (makespan) — когда последний борт завершил работу;
- Суммарный налёт — сумма лётного времени всех бортов;
- Мультикритериальный анализ — компромисс по параметру λ на экране Парето.
Чего сервис не делает¶
- Не заменяет Geoscan Planner, Mission Planner или QGroundControl: не ведёт один борт по MAVLink в полёте, а планирует распределение работ по группе бортов.
- Не подтягивает актуальные NOTAM, зоны из СППИ и карты ограничений Росавиации — зоны задаёт оператор вручную (см. 03-limitations.md).
- Не гарантирует выполнимость в реальном полёте без вашей проверки: расчёт сверяется валидатором по модели из документации, а не по бортовым логам.
- Не подбирает борт под LiDAR и геофизику, если в парке нет совместимой нагрузки.
Карта интерфейса¶
Левый рельс (постоянные режимы):
| Пункт | URL | Назначение |
|---|---|---|
| Сценарии | / |
Старт: мастер, импорт, таблица s01–s10 |
| Область съёмки и парк | /scenario |
Полигоны ПАФС, задания, парк, критерий, ветер |
| Воздушное пространство и БПЗ | /airspace |
Разрешённое ВП, бесполётные зоны, эшелоны |
| План полётов | /plan |
Карта галсов, метрики, диаграмма Ганта |
| Мультикритериальный анализ | /pareto |
Фронт Парето makespan ↔ налёт |
| Отчёт валидатора | /validator |
Независимые проверки и «готовность к вылету» |
| Экспорт и импорт | /export |
KML, GeoJSON, QGC .plan, CSV |
| 3D-пролёт | /viewer3d |
Просмотр траекторий в 3D |
Верхняя строка: имя сценария, вкладки Сценарий / План / 3D-пролёт, статус расчёта, кнопки Сбросить, Экспорт, Рассчитать.
Сквозной сценарий¶
1. Выбрать или создать сценарий¶
На Сценариях (/):
- Новый сценарий (карточка «Мастер») или Демо-сценарии — открывают готовый шаблон (в коде по
умолчанию ведёт на
s04); - Импорт проекта — файл GeoJSON/KML с полигонами WGS 84;
- таблица s01–s10 — тестовые сценарии с кнопкой Открыть (двойной щелчок по строке тоже открывает).
Рекомендация для первого знакомства: s01 (один борт, эталон арифметики) или s04 (несколько бортов).
2. Область съёмки, тип съёмки, GSD¶
Экран Область съёмки и парк (/scenario):
- на карте — полигоны заданий ПАФС; инструменты рисования для новой области и бесполётной зоны;
- в боковой панели — список заданий: тип съёмки, GSD (см), перекрытия, расчётная высота и шаг галсов (считаются из камеры и GSD, не вводятся «с потолка»);
- парк БВС: какие борта участвуют, какая нагрузка установлена на каждом (важно для ИК и мультиспектра).
3. Воздушное пространство и бесполётные зоны¶
Экран Воздушное пространство и БПЗ (/airspace):
- контур разрешённого ВП (вершины, азимуты, длины сторон);
- бесполётные зоны с высотными слоями и буфером;
- проверки пересечений зон на карте.
Площадки старта/посадки отображаются на карте сценария; убедитесь, что они внутри разрешённого ВП.
4. Ветер и критерий¶
На /scenario в блоке оптимизации:
- Время работ / Суммарный налёт / режим Парето (ползунок λ);
- Резерв энергии, буфер от запреток, режим разворота (с выходом на ЛЗП или пролётом);
- поле ветра (скорость и направление).
При сильном ветре часть парка может стать недоступной до расчёта — см. раздел про 422 ниже.
5. Рассчитать план¶
Нажмите Рассчитать вверху (или на пустом экране плана — Рассчитать план). Статус в шапке:
- Черновик — плана ещё нет;
- Расчёт… — идёт расчёт;
- План рассчитан — можно смотреть метрики и экспорт;
- Требует пересчёта — сценарий меняли после расчёта;
- код ошибки — если расчёт невозможен (в режиме API — см. HTTP 422).
После успешного расчёта откроется План полётов (/plan).
6. Прочитать план¶
На /plan:
- карта: галсы по цветам бортов, перелёты, полосы захвата, точки съёмки (переключаются в HUD «Слои плана»);
- диаграмма Ганта — вылеты по времени, воспроизведение;
- панель бортов — налёт, дистанция, число галсов и вылетов;
- кнопка с иконкой молнии — смоделировать выбытие борта и пересчитать (локальный replan без отдельного API в мок-режиме);
- блок Нераспределённые галсы — если решатель не назначил часть работ.
7. Отчёт валидатора¶
Отчёт валидатора (/validator) — отдельный счётчик метрик по геометрии плана. Статус
Готово к вылету / Есть блокирующие нарушения. У части предупреждений есть кнопки
коррекции (например, ослабить GSD при превышении порога 150 м).
В браузерном dev-контуре отчёт строится пакетом
@geoscan/domain(группы «эшелонирование», «рельеф» и т.д.). На сервере действует тот же смысл проверок, но с кодами G1–G6 — см. ниже.
8. Мультикритериальный анализ¶
/pareto — кривая компромисса между временем работ и суммарным налётом для текущего сценария.
9. Экспорт¶
Экспорт и импорт (/export):
| Формат | Назначение |
|---|---|
| KML | Geoscan Planner, Google Earth (relativeToGround, AGL) |
| GeoJSON | ГИС, веб-карты |
| QGC .plan | QGroundControl (бонус) |
| CSV | Сверка путевых точек |
В режиме подключения к API KML запрашивается с GET /api/plans/{id}/export/kml; GeoJSON и
остальное может собираться локально или с API в зависимости от настройки dataSource в приложении.
Как читать числа¶
В интерфейсе (панель «Метрики плана»)¶
| Показатель | Смысл |
|---|---|
| Время работ | Makespan — секунды до окончания работы последнего борта (формат ЧЧ:ММ:СС в UI). |
| Суммарный налёт | Сумма длительностей полётов всех бортов (может быть больше makespan при параллельных вылетах). |
| Покрытие | Доля площади заданий, закрытая галсами (1,0 = 100 %). Ниже ~99 % — повод проверить НФЗ, ветер или неназначенные галсы. |
| Нарушений | Сводка счётчиков нарушений в объекте плана (ноль — хороший знак, но валидатор может найти иное). |
Сравнение «Против наивного деления» — выигрыш по времени работ относительно равного деления площади между бортами.
В API и JSON плана (snake_case)¶
Те же величины: makespan_s, total_flight_time_s, coverage_fraction, total_distance_m,
uav_used, sorties. Подробнее — 91-system/03-public-api.md и
контракт волны M1 (API-CONTRACT.md).
«Борт не назначен» — unassigned¶
Если галс не попал ни в одно ПЗ, в плане появляется запись в unassigned[]:
transect_id— идентификатор галса;task_id— задание ПАФС;reason— машинный код причины (в UI выводится как текст).
Код reason |
Что означает для оператора |
|---|---|
no_compatible_payload |
Нет борта с подходящей установленной нагрузкой (например, ИК только на 801). |
endurance_exceeded |
Галс или цепочка не укладывается в запас хода с резервом энергии. |
outside_allowed_airspace |
Геометрия галса выходит за разрешённое ВП. |
inside_no_fly_zone |
Галс попадает в бесполётную зону. |
wind_above_limit |
Ветер выше wind_max борта или недопустимая боковая составляющая. |
time_window_missed |
Не уложились в допустимое окно времени (если задано в сценарии). |
solver_time_limit |
Решатель остановлен по лимиту времени — план может быть неполным. |
transect_too_short |
Отрезок после нарезки слишком короткий для осмысленного прохода. |
Источник кодов: geoscan_contracts.enums.UnassignedReason в репозитории.
Когда сервис отвечает «нерешаемо» (HTTP 422)¶
При работе через gateway постановка задачи с невыполнимыми ограничениями даёт 422 и тело
{ "errorCode", "message", "details?" } (не 500).
Типовые ситуации:
| Ситуация | Пример кода / причины |
|---|---|
| Требуемый GSD требует высоты выше потолка борта или ниже минимума | ALTITUDE_ABOVE_MAX, ALTITUDE_BELOW_MIN, GSD_UNREACHABLE |
| Для GSD нужна высота > 150 м AGL — нужно разрешение на ИВП | предупреждение валидатора G1-05, не всегда блокирует API |
| Нет борта под тип съёмки | PAYLOAD_INCOMPATIBLE, no_compatible_payload в плане |
| ВПП или галс вне разрешённого ВП | нарушение G1-02, outside_allowed_airspace |
| Ветер | wind_above_limit, проверки G4-01…G4-03 |
| Боковой ветер ≥ воздушной скорости | CROSSWIND_EXCEEDS_AIRSPEED |
Что делать: ослабить GSD, сменить борт/нагрузку, увеличить парк, ослабить ветер в сценарии (если это прогноз), расширить разрешённое ВП или убрать конфликтующую НФЗ, уменьшить область съёмки.
Частые ошибки оператора¶
Ниже — проверки серверного валидатора (validator/checks/g1…g6). При срабатывании жёсткой
проверки план не допускается (admitted: false), даже если в сводке «нарушения: нет».
G1 — воздушное пространство¶
| ID | Суть |
|---|---|
| G1-01 | Траектория заходит в бесполётную зону (длина внутри > 0). |
| G1-02 | Траектория вне разрешённого ВП. |
| G1-03 | Полёт вне высотного слоя зоны. |
| G1-04 | Нарушен буфер безопасности у границ зон. |
| G1-05 | Высота выше 150 м — предупреждение про разрешение на ИВП (ФП-138). |
G2 — высота¶
| ID | Суть |
|---|---|
| G2-01 | Превышен потолок борта. |
| G2-02 | Ниже минимальной безопасной высоты. |
| G2-03 | Полёт ниже точки старта, если борт этого не допускает. |
| G2-04 | Недостаточный запас над рельефом (модель рельефа — см. ограничения). |
G3 — энергия и вылеты¶
| ID | Суть |
|---|---|
| G3-01 | Превышен бюджет вылета с учётом резерва. |
| G3-02 | Неполный вылет (нет взлёта/перелёта/посадки в бюджете). |
| G3-03 | Не учтён оборот на площадке. |
| G3-04 | Несогласованность доли израсходованной энергии в метриках плана. |
G4 — ветер¶
| ID | Суть |
|---|---|
| G4-01 | Ветер выше предела борта. |
| G4-02 | Слишком большая поперечная составляющая. |
| G4-03 | Путевая скорость неположительна (ветер слишком сильный для курса). |
G5 — назначение¶
| ID | Суть |
|---|---|
| G5-01 | Тип съёмки галса не совпадает с установленной нагрузкой. |
| G5-02 | Галс пройден больше одного раза или без идентификатора. |
| G5-03 | В unassigned нет кода причины (ошибка качества плана). |
| G5-04 | Один галс и в полёте, и в unassigned. |
G6 — покрытие и время¶
| ID | Суть |
|---|---|
| G6-01 | Покрытие площади не сходится с геометрией. |
| G6-02 | Время без учёта разворотов (занижение). |
| G6-03 | Доля времени на разворотах не сходится с планом. |
| G6-04 | Makespan и суммарный налёт несогласованы с длительностями бортов. |
Коды ошибок API (gateway)¶
При работе с REST полезны коды из реестра gateway: SCHEMA_VALIDATION_FAILED, SCENARIO_NOT_FOUND,
PLAN_NOT_FOUND, PLAN_NOT_READY, PLAN_FAILED, GSD_UNREACHABLE, PAYLOAD_INCOMPATIBLE,
UPSTREAM_UNAVAILABLE (planner/validator недоступны), QUEUE_FULL, SOLVER_INTERRUPTED.
Приложение: расхождения с макетами¶
| В макетах / ожидании | В коде сейчас |
|---|---|
| Единый «мастер» по шагам | Стартовые карточки ведут на сценарий; пошагового wizard-роутинга нет |
| Подпись «VRP-Opt» как продакшен-решатель | На стартовом экране: VRP-Opt v0.1 (мок) — в dev расчёт в @geoscan/domain |
| Иконки «Единицы, CRS» и «Масштаб 1:25 000» в рельсе | Отображаются, но не кликабельны (нет экрана настроек) |
| PDF-отчёт валидатора | Кнопка PDF-отчёт на /validator без привязки к выгрузке файла в коде |
| Аватар пользователя в шапке | Декоративный «АВ», входа в систему нет |
| KML только с бэкенда | В мок-режиме часть форматов собирается локально в браузере (ExportScreen) |
Полный инвентарь макетов: 80-design/03-mockups-inventory.md (../80-design/03-mockups-inventory.md).