Проверки валидатора¶
Валидатор — отдельный сервис, который не доверяет планировщику: он берёт тот же сценарий и готовый план, сам заново пересчитывает геометрию, высоты, энергию и ветер и выносит вердикт «план допущен / не допущен». Сейчас в нём 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.