Перейти к содержанию

Проверки валидатора

Валидатор — отдельный сервис, который не доверяет планировщику: он берёт тот же сценарий и готовый план, сам заново пересчитывает геометрию, высоты, энергию и ветер и выносит вердикт «план допущен / не допущен». Сейчас в нём 39 проверок в семи группах G1–G7.

Группа Что проверяет Проверок
G1 Воздушное пространство: бесполётные зоны, граница разрешённого пространства, буфер, 150 м 5
G2 Высоты: потолок и минимум борта, рельеф, профиль взлёта и посадки, глиссада 8
G3 Энергия и вылеты: бюджет вылета с резервом, оборот на площадке, пропускная способность площадки 5
G4 Ветер: предел борта, боковая составляющая, путевая скорость 3
G5 Назначение: нагрузка, уникальность галсов, площадки, развороты, полосы 12
G6 Покрытие и честность метрик: покрытие ≥ 99 %, время разворотов, перекрытие с учётом ветра 5
G7 Сближение бортов в воздухе 1
Итого 39

Ещё девять проверок группы G7 (G7-02…G7-10) заявлены, но не реализованы; отчёт перечисляет их в отдельном списке missing_checks, в число 39 они не входят.

Как выносится вердикт

У каждой проверки один из трёх статусов: pass, warn или fail.

  • План допущен, если суммарная величина нарушений равна нулю и нет ни одной проверки со статусом fail. Предупреждения (warn) допуску не мешают.

  • В строгом режиме (--strict в командной строке валидатора) любое предупреждение тоже блокирует.

  • «Жёсткие» нарушения сгруппированы по видам — nfz, airspace, endurance, wind, payload, altitude, turnaround — и копятся как величины (метры, секунды, штуки), а не как флажки. Часть проверок (например, G1-04, G2-05, G5-02) блокирует план только статусом fail, без вида нарушения.

  • Настройка стенда VALIDATOR_TURN_CHECKS=warn смягчает G5-07 и G5-08 до предупреждения; по умолчанию — fail.

flowchart LR
  S[Сценарий] --> R[Пересчёт геометрии,<br>высот, энергии, ветра]
  P[План] --> R
  R --> C[39 проверок G1…G7]
  C --> V{Нарушений 0<br>и нет fail?}
  V -->|да| OK[План допущен]
  V -->|нет| NO[Не допущен:<br>список нарушений]

Общие правила, которые используют проверки

Правило Значение
Резерв энергии по умолчанию 20 % (objective.energy_reserve = 0.20)
Буфер безопасности у зон по умолчанию 25 м (objective.safety_buffer_m)
Запас по высоте над и под высотным слоем зоны 50 м (objective.zone_vertical_margin_m)
Когда зона действует на участок траектории высота участка в пределах altitude_min − запас … altitude_max + запас; при avoid_zones_laterally = true зона действует на любой высоте
Какие этапы проверяются на зоны и границу перелёт, галс, разворот, возврат, заход; взлёт и посадка — нет
Шум пересечений куски пересечения короче 0,1 м не считаются

G1 — воздушное пространство

ID Что проверяется При нарушении Порог
G1-01 Длина траектории внутри бесполётной зоны, активной на высоте участка (с запасом по высоте) fail, вид nfz 0 м
G1-02 Длина траектории вне разрешённого воздушного пространства fail, вид airspace 0 м
G1-03 Справочно: сколько раз маршрут проходит над или под зоной вне её высотного слоя всегда pass —
G1-04 Длина траектории в кольце буфера безопасности вокруг зоны (без двойного счёта с G1-01) fail 0 м; буфер 25 м по умолчанию
G1-05 Высота полёта выше 150 м — нужно разрешение на ИВП warn 150 м

G2 — высоты

ID Что проверяется При нарушении Порог
G2-01 Высота над землёй не выше потолка модели борта (altitude_agl_max) fail, altitude потолок модели
G2-02 Высота не ниже минимальной высоты модели (altitude_agl_min, у борта 201 — 100 м) fail, altitude минимум модели
G2-03 Для моделей, которым нельзя опускаться ниже точки старта, — высота не ниже отметки площадки fail, altitude отметка площадки
G2-04 Запас над рельефом по цифровой модели рельефа: высота интерполируется между точками маршрута, выборка каждые 30 м fail; warn, если рельеф недоступен 50 м
G2-05 Первая и последняя точка вылета — у площадки взлёта и посадки; для полосы — у её оси fail 30 м; для полосы — половина ширины + 30 м
G2-06 Этап набора или снижения не короче физически возможного по скороподъёмности и скорости снижения модели (для парашютной посадки — спираль до высоты раскрытия и спуск на парашюте) fail, altitude допуск 1 %
G2-07 Точки профиля набора и снижения (каждые 20 м) не попадают в зону на высоте её слоя fail, nfz 0 попаданий
G2-08 Угол снижения на заходе не круче глиссады модели (только для бортов с посадкой на полосу) fail, altitude глиссада + 0,2°

G3 — энергия и вылеты

ID Что проверяется При нарушении Порог
G3-01 Длительность вылета не больше запас хода × (1 − резерв) × холодовой коэффициент; первый вылет ещё умножается на начальный заряд АКБ fail, endurance; warn, если запас хода неизвестен резерв 20 % по умолчанию
G3-02 В каждом вылете есть взлёт и посадка (или возврат) fail —
G3-03 Между вылетами одного борта — не меньше времени оборота: с запасной АКБ на площадке — время оборота площадки (с очередью по пулу АКБ), без неё — время зарядки; для топливных бортов — большее из оборота и заправки fail, turnaround —
G3-04 Заявленная доля израсходованной энергии вылета совпадает с длительность / запас хода fail абсолютная разница 0,05
G3-05 Одновременное обслуживание бортов на площадке не превышает её число мест обслуживания fail service_slots площадки

Запас хода: у топливных бортов — объём бака / расход × 3600, у остальных — endurance_max_s из справочника. При температуре ниже нуля ёмкость АКБ уменьшается линейно, но не ниже заданного для модели минимума.

G4 — ветер

ID Что проверяется При нарушении Порог
G4-01 Ветер сценария не выше предела wind_max каждого задействованного борта fail, wind; warn, если предел неизвестен wind_max модели
G4-02 На каждом галсе поперечная составляющая ветра меньше воздушной скорости fail, wind отношение 1,0
G4-03 Путевая скорость, пересчитанная по треугольнику скоростей, положительна; расхождение с заявленной скоростью плана больше 10 % — предупреждение fail / warn 10 %

G5 — назначение, площадки, развороты

ID Что проверяется При нарушении Порог
G5-01 Тип съёмки участка совпадает с типом установленной на борту нагрузки fail, payload —
G5-02 Каждый галс пройден ровно один раз; этап съёмки без идентификатора галса — тоже ошибка fail —
G5-03 У каждого нераспределённого галса указан код причины fail —
G5-04 Галс не может быть одновременно пройден и нераспределён fail —
G5-05 Вылет укладывается во временное окно участка (если в сценарии задано start_time) fail —
G5-06 Непрерывность площадок: следующий вылет начинается там, где закончился предыдущий fail —
G5-07 Радиус дугового разворота самолётного борта не меньше 0,95 R, где R = max((V + W)² / (g · tg φ), минимальный радиус модели) fail (можно смягчить до warn) 0,95 R
G5-08 Стык галса и разворота: разрыв не больше 1 м, излом не больше 15° (излом — для дуговых разворотов) fail (можно смягчить до warn) 1 м / 15°
G5-09 Площадка принимает тип борта; с резервной посадочной площадки не взлетают fail —
G5-10 Длина полосы не меньше потребной длины разбега и пробега модели fail —
G5-11 Боковой ветер на полосе не выше допустимого для модели fail, wind crosswind_max_ms модели
G5-12 В коридоре захода 3000 м от торца полосы (полуширина — половина ширины полосы + 60 м) нет зон, чей высотный слой пересекает глиссаду (по умолчанию 3°) fail, nfz 3000 м / 60 м / 3°

G6 — покрытие и честность метрик

ID Что проверяется При нарушении Порог
G6-01 Покрытие площади участков, пересчитанное по полосам захвата, не ниже 99 % и совпадает с заявленным fail / warn, если ширина захвата взята из плана 0,99; расхождение 0,01
G6-02 Суммарный налёт плана строго больше «наивного» времени прохода галсов (сумма длина / путевая скорость) — план не занижает время fail строго больше
G6-03 Доля времени на разворотах положительна и совпадает с заявленной fail 0,01
G6-04 Заявленные метрики совпадают с пересчитанными: время работ и налёт — в пределах 1 %; число галсов, снимков, бортов, вылетов — точно; время работ не больше налёта плюс наземного времени fail 1 % / точно
G6-05 Поперечное перекрытие соседних галсов с учётом сноса ветром: 1 − шаг / (захват · cos β), sin β = W⊥ / Vₐ fail / warn нехватка 0,02

G7 — сближение бортов

ID Что проверяется При нарушении Порог
G7-01 Два борта одновременно в воздухе ближе 300 м по горизонтали и 50 м по вертикали; выборка каждые 2 с, взлёт и посадка не учитываются. Только предупреждение warn 300 м / 50 м / 2 с

Какие метрики пересчитывает валидатор

Метрика Как считается
coverage_frac площадь объединения полос захвата внутри участков / площадь участков (участок обрезан по разрешённому пространству, из него вычтены активные зоны с буфером)
total_flight_time_s сумма длительностей вылетов
makespan_s время от начала первого до конца последнего вылета
turn_time_frac доля разворотов в суммарном налёте
transects_total, turns_total, photos_total, uavs_used, sorties_total, total_distance_m счётчики по плану

GSD валидатор использует только для того, чтобы восстановить высоту и ширину полосы захвата: отдельной проверки GSD нет.

Как запустить проверку

  • В интерфейсе — экран «Отчёт валидатора»; он вызывается автоматически после расчёта.
  • Через API — POST /api/validate с телом {"scenario": …, "plan": …}: ответ {"report": …} (см. REST-справочник). Так можно проверить внешний план, рассчитанный не в Аэрозвено.
  • Локально — python -m validator check --scenario <сценарий.json> --plan <план.json> [--json] [--strict]. Коды выхода: 0 — допущен, 2 — неверный вход, 3 — нерешаемо, 4 — нарушения, 5 — нет плана.

Поля отчёта: scenario_id, criterion, validator_version, validated_in_s, solve_time_s, admitted, metrics, declared_metrics, checks[], unassigned, warnings, notes, missing_checks[]. У каждой проверки: id, group, title, status, value, limit, units, message, objects, violation, violation_amount, details.