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

Модель мира симулятора БВС — требования

Как устроен виртуальный мир внутри симулятора: из каких слоёв он собран, в какой системе координат считается, с какой точностью и производительностью отвечает на запросы «высота земли под бортом», «внутри ли зоны», «есть ли прямая видимость» — и что требуется, чтобы два прогона дали бит-в-бит одно и то же.

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

Предшествующий документ — 01-geodata-sources.md — отвечает на вопрос откуда берутся данные (источники, лицензии, точности, требования SIM-GEO-01…24). Здесь ответ на следующий вопрос: как из этих данных собран мир и какие запросы он обязан обслуживать. Требования SIM-GEO не дублируются, а используются как основание; ссылки вида «(SIM-GEO-11)» означают, что базовое требование уже сформулировано там.

Терминология — docs/task5/00-brief/03-glossary.md (ПАФС, ЛАФС, галс, ЛЗП, GSD, превышение, makespan). ТТХ парка — docs/task5/10-hardware/fleet.yaml и payloads.yaml, единственный источник правды. Контракт с планировщиком — docs/task5/40-formats/03-our-mission-schema.md.

Единицы: длина, высота, разрешение сетки — метры; площадь — км²; время — секунды и минуты; скорость — м/с; энергия — Вт·ч; частота — МГц; объём данных — МБ/ГБ.


1. Слои модели мира

Мир — не «карта», а набор типизированных слоёв с явными метаданными. Каждый слой обязан нести source_id, release, crs, vertical_datum, resolution_m (для растров), sha256 — это уже зафиксировано манифестом снапшота (SIM-GEO-17). Ниже — из чего слой берётся и кто его читает.

Слой Источник данных Представление в движке Кто читает в симуляции
terrain — рельеф Топосъёмка заказчика → ArcticDEM 10 м → GLO-30 → GLO-90 (пирамида SIM-GEO-01/02/03) heightfield float32, тайлы 512×512, сетка в UTM-зоне сценария клиренс и CFIT, расчёт AGL, наклонная дальность камеры, профиль LOS, рендер
surface — полог леса и застройка ETH Canopy Height 10 м + маска ESA WorldCover; OSM building + Microsoft ML Footprints (SIM-GEO-12/13) доп. heightfield 10 м + вектор с атрибутом высоты → экструзия клиренс, LOS, окклюзия кадра, пригодность площадки посадки
obstacles — точечные и линейные высотные объекты OSM power=tower/pole/line/minor_line, man_made=mast/tower/chimney (SIM-GEO-12) BVH из примитивов: вертикальный цилиндр, призма, пролёт-«стена» между опорами проверка столкновений, клиренс, LOS, правило сектора взлёта
zones — воздушное пространство scenario.airspace от планировщика; отрисовка оператором; выгрузка из fpln.ru вручную призмы и объёмные тела + R-tree по 2D-следу, ось времени нарушения violations.nfz / .airspace, поведение борта «НАРУШЕНИЕ ЗОНЫ», warning 150 м
sites — площадки взлёта и посадки scenario.launch_sites / landing_sites + ЦМР + WorldCover + OSM (дороги, вода, ЛЭП) точка + курс + сектор ±30° + растр пригодности 10 м взлёт с катапульты, заход на посадку, эллипс сноса парашюта, оборот на площадке
weather — метео-поле Open-Meteo (рантайм), ERA5 (воспроизводимые прогоны), скаляр из сценария (SIM-GEO-14/15) 4D-решётка (x, y, z, t), узлы 10/80/120/180 м + уровни давления, шаг 1 ч динамика борта, снос, путевая скорость V_g, время галса, допуск к вылету
basemap — подложка По умолчанию гипсометрия + отмывка из terrain; ортофото заказчика, если предоставлено растровые тайлы PMTiles (terrain-RGB и quantized-mesh, 50-stack/04-frontend-3d.md) 3D-вьюер, текстура для кадров виртуальной камеры
quality — маска качества ЦМР Собирается сборщиком мира uint8 растр, один байт на ячейку: код источника + признак заполнения дыры пометка выдаваемых чисел, отчёт мира, «известные ограничения»

Слой quality не декоративный: без него число «клиренс 103 м» неотличимо от «клиренс 103 м, но ячейка под бортом была дырой в ЦМР и заполнена интерполяцией». Для документа «перечень известных ограничений», обязательного по ТЗ, это единственный способ отделить измеренное от достроенного.


2. Геопривязка

2.1. Рабочая СК внутри движка

Физика и геометрия считаются в локальной геодезической ENU (East-North-Up) с явно заданным origin. ENU строится через ECEF, а не плоской аппроксимацией «градус = 111 320 м».

Правило перехода, ровно как контракт:

origin:      (lon0, lat0, h0), h0 — ЭЛЛИПСОИДАЛЬНАЯ высота, не AMSL
WGS84 → ENU: (lon, lat, h) → ECEF(X,Y,Z) по эллипсоиду WGS84 (a = 6 378 137 м, 1/f = 298,257223563)
             → ENU = R(lon0, lat0) · (ECEF − ECEF0)
ENU → WGS84: обратный поворот → ECEF → (lon, lat, h) методом Bowring, сходимость ≤ 1e-9 м

Почему не UTM как рабочая СК, хотя хранение и обмен — именно в UTM:

Аргумент Число Следствие
Точечный масштабный коэффициент UTM отклоняется от 1 не более чем на 4·10⁻⁴ (k₀ = 0,9996 на осевом меридиане, ≈ 1,00004 у края зоны на широте 55°) 4·10⁻⁴ На предельной протяжённости маршрута Геоскан 201 210 км (fleet.yaml) длина искажается до 84 м
Искажение площади ≈ 2·(k−1) 8·10⁻⁴ = 0,08 % Почти исчерпывает допуск ±0,1 % из теста «площадь в проекции против геодезической» (40-formats/03) — на UTM запас практически нулевой
Плоская («flat earth») аппроксимация даёт провал по высоте d²/(2R) на 10 км — 7,8 м, на 100 км — 785 м, на 200 км — 3 139 м Плоская аппроксимация запрещена: на масштабе района 200 км² и буфера связи 40 км она даёт ошибку, на порядки превышающую допуск клиренса 100 м

То есть ENU через ECEF — не педантизм, а способ не тратить весь допуск на проекцию раньше, чем начались расчёты. UTM остаётся форматом хранения растров (float32 COG) и обмена, ENU — рабочим фреймом интегрирования траектории, коллизий и LOS.

Origin ENU фиксируется в снапшоте мира. По умолчанию — центроид bbox разрешённого ВП (airspace.allowed), округлённый до 1e-6 градуса. Origin входит в world_snapshot_id (раздел 8), потому что численный результат от него зависит.

2.2. Плановые СК на импорте

Базовый набор — SIM-GEO-06/07: EPSG:4326, UTM 35N–60N, EPSG:4284 (Пулково-1942) с зонами Гаусса-Крюгера, EPSG:7683 (ГСК-2011) с ГСК 3GK, МСК только при явно переданных пользователем параметрах перехода. Здесь добавляются два правила, которых там нет:

  1. Распознавание зоны Гаусса-Крюгера по ложному смещению. В зональных СК РФ восточная координата имеет вид зона × 1 000 000 + 500 000 + x. Координата X = 7 435 000 означает 7-ю зону, а не 7,4 млн метров от осевого меридиана. Импортёр обязан извлечь номер зоны из координат, сверить с заявленным EPSG и с bbox; несовпадение → ошибка CRS_ZONE_MISMATCH, а не молчаливое смещение слоя на сотни километров.
  2. Исходная СК слоя сохраняется в метаданных и используется при обратной выгрузке, чтобы round-trip «импорт → редактирование → экспорт» не переводил данные заказчика в чужую СК.

2.3. Датумы высот и пересчёт AGL ↔ AMSL ↔ эллипсоидальная

Три высоты и связь между ними (подробный разбор цены ошибки — 01-geodata-sources.md, раздел 3.3):

h   — эллипсоидальная (WGS84), её выдаёт GNSS борта (ZED-F9P у 201 и Gemini)
H   — нормальная / ортометрическая (AMSL), её несут ЦМР, топокарты, авиационные документы
AGL — превышение над рельефом, в нём задаётся полётное задание (колонка «Превышение» у Planner)

h   = H   + ξ(lon, lat)          ξ — аномалия высоты по объявленной модели геоида
H   = AGL + H_terrain(x, y)      H_terrain — из рабочего ЦМР, в том же датуме, что и сцена
AGL = h_aircraft − h_terrain     обе величины приведены к одному фрейму ДО вычитания

Правила, обязательные к исполнению:

Правило Почему
1 В ENU высота — всегда эллипсоидальная. Любое AMSL-значение приводится к h на входе в движок, а не при отрисовке Смешение фреймов внутри физики — самый дорогой класс ошибок (см. 01, раздел 3.3)
2 Конверсия только через PROJ с явной моделью геоида; конверсия константой отклоняется (SIM-GEO-08) ξ достигает десятков метров: подтверждённое значение 19,43 м (EGM2008, 40° с.ш. / 46° в.д.)
3 Балтийская 1977 (EPSG:5705) без предоставленной модели квазигеоида не пересчитывается. PROJ-data не содержит модели квазигеоида для РФ (ГАО-2012 и аналоги распространяются отдельно) Ошибка VDATUM_MODEL_REQUIRED. Допустим пользовательский сдвиг-константа, но он помечается assumed и попадает в «известные ограничения»
4 Каждая зона, каждая площадка и каждая путевая точка несут altitude_frame (SIM-GEO-09) В схеме сценария планировщика у no_fly[] этого поля нет — расхождение зафиксировано в разделе 10
5 В одной сцене — один опорный датум высот (SIM-GEO-08) Иначе клиренс смещён систематически и молча

2.4. Допустимая погрешность геопривязки

Что Допуск Чем обосновано
Собственная ошибка преобразований движка, round-trip WGS84 ↔ ENU ≤ 0,01 м в радиусе 200 км от origin Заявленная точность PPK у 201 и Gemini — 10 мм + 1 ppm (ТТХ). Движок не имеет права быть источником ошибки того же порядка, что измерительная система борта
Взаимное положение слоёв внутри мира (co-registration) ≤ 1,0 м в плане, ≤ 0,5 м по высоте Габарит опоры ЛЭП ~1 м. Смещение слоёв больше габарита объекта делает проверку столкновения бессмысленной (ДОП-W-04)
Абсолютная геопривязка мира на открытых данных ≤ 6,0 м CE90 / ≤ 4,0 м LE90 Наследуется от Copernicus GLO-30 (спецификация набора, см. 01)
Абсолютная геопривязка на топосъёмке заказчика ≤ 0,5 м в плане / ≤ 0,3 м по высоте Типично для съёмки с БВС с PPK (ДОП-W-05)

Две проверки на здравый смысл, из которых следуют требования:

  • 4 м LE90 против допуска клиренса 100 м — это 4 %. Приемлемо, но не игнорируемо: клиренс обязан возвращаться интервалом значение ± LE90, а violations.altitude ставится по нижней границе. Иначе «клиренс 102 м» на GLO-30 юридически не отличается от нарушения правила РЭ-201.
  • 6 м CE90 против objective.safety_buffer_m = 25 м по умолчанию — это 24 % буфера. Если пользователь задал буфер меньше 2 × CE90 (для GLO-30 — меньше 12 м), буфер перестаёт быть буфером и превращается в погрешность данных. Мир обязан это сказать числом.

3. Рельеф

3.1. Разрешение рабочей сетки — от масштаба задачи

Одного разрешения на все задачи не существует: сценарии проекта охватывают от площадки 1×1 км (s01) до района 200 км² (sc-area, 70-plan/02-test-scenarios.md), а буфер для радиовидимости тянется ещё на 40 км — радиус связи Геоскан 201 (fleet.yaml, radio_range_km: 40).

Масштаб Площадь Шаг сетки рабочего ЦМР Чем обоснован шаг
Площадка старта / посадки, сектор взлёта ≤ 1 км² ≤ 1 м (топосъёмка) / ≤ 10 м (открытые данные) Правило РЭ-201 «в секторе ±30° на расстоянии L нет объектов выше 0,1·L»: на L = 100 м порог — объект 10 м. GLO-30 сглаживает такой объект полностью
Полигон съёмки 1–50 км² ≤ 10 м Шаг галсов при штатных перекрытиях — 62 м (Pollux) … 117 м (PF1B) на 100 м (payloads.yaml). Рельеф должен разрешаться мельче шага галсов, иначе GSD на весь галс считается по одной высоте
Район работ, перелёты 50–200 км² ≤ 30 м (GLO-30) Абсолютная точность < 4 м LE90 против допуска клиренса 100 м = 4 %
Буфер радиовидимости и возврата +40 км от границы района ≤ 90 м (GLO-90) Используется только для профиля LOS и оценки автономного возврата, не для клиренса

Все числа шагов, кроме 30 м и 90 м (спецификации наборов), — инженерная оценка (ДОП-W-01).

3.2. LOD и стриминг тайлов

Требование Содержание
Пирамида Уровни LOD степенями 2 от нулевого (полное разрешение) до обзорного ≤ 256 px; для рендера — terrain-RGB и quantized-mesh в PMTiles (50-stack/04-frontend-3d.md)
Физика читает только нулевой уровень Клиренс, коллизии, LOS, AGL считаются по полному разрешению. LOD — исключительно рендер. Приёмка: тест сравнивает клиренс на LOD0 и LOD2 и требует, чтобы движок явно сообщал уровень, с которого читал
Тайл 512×512 ячеек float32 = 1,0 МБ; маска качества 512×512 uint8 = 0,25 МБ
Кэш LRU с настраиваемым бюджетом (раздел 7). Промах кэша — чтение с локального диска, никогда из сети (SIM-GEO-16)
Предзагрузка Перед прогоном загружаются все тайлы, покрывающие bbox задания + буфер safety_buffer_m + запас на снос ветром. Прогон не начинается, пока набор неполон — иначе стриминг становится источником недетерминизма

3.3. Интерполяция высоты в произвольной точке

Параметр Значение Обоснование / проверка
Метод Билинейная по 4 соседним узлам, вычисление в float64 Непрерывность значения обязательна: разрыв в heightfield физика примет за уступ
В узле сетки Возвращает значение узла бит-в-бит Тест на 20 контрольных узлах
Между узлами Функция непрерывна; на границе тайлов разрыв = 0 Тест: проход по линии через 3 стыка тайлов, максимальный скачок ≤ 1e-6 м
Ошибка интерполяции Медианное расхождение при прореживании сетки вдвое ≤ 0,5 м на рельефе с уклоном ≤ 20 % Уклон 20 % — граница, на которой спецификация GLO-30 меняет относительную точность с < 2 м на < 4 м
Производительность ≥ 1·10⁶ запросов/с на одном ядре при прогретом кэше Траектория 210 км при шаге дискретизации 10 м (SIM-GEO-11) = 21 000 точек на вылет; 20 бортов × 5 вылетов = 2,1 млн точек → ≤ 2,1 с на полную проверку сценария
Выдача клиренса Пара (значение, ±LE90 слоя); нарушение ставится по центральному значению (SIM-WORLD-06) См. 2.4

3.4. Провалы и дыры в ЦМР

GLO-30 содержит области без данных (вода, редактирование, тени рельефа). Молчаливое заполнение нулём даёт «яму» глубиной в абсолютную высоту района — и ложное «клиренс огромный» вместо ошибки.

Ситуация Правило Отметка в quality
Дыра ≤ 8 ячеек подряд Заполнение интерполяцией по границе (IDW) filled_interp
Дыра > 8 ячеек Заполнение из следующего слоя пирамиды (GLO-90 / ArcticDEM) с feathering 3 ячейки грубого слоя (SIM-GEO-01/02) filled_from_<source_id>
Класс WorldCover = Permanent water bodies Плоская поверхность на высоте медианы береговой линии water_flat
Доля заполненных ячеек > 5 % площади сценария Сборка мира завершается предупреждением DEM_VOID_FRACTION_HIGH с числом
Доля заполненных ячеек > 20 % Сборка мира завершается ошибкой
Любое число, посчитанное над заполненной ячейкой В ответе несёт флаг terrain_qualitymeasured

Пороги 8 ячеек, 5 % и 20 % — инженерная оценка (ДОП-W-03).


4. Зоны

4.1. Контракт зоны — перечень полей

Поле Смысл Единицы / тип Обяз.
id Идентификатор зоны строка да
zone_kind no_fly | restricted | allowed_airspace | temporary | aerodrome_area | border_strip enum да
geometry_kind prism (2D-полигон + вертикальные границы) | volume (объёмное тело) enum да
geometry Polygon / MultiPolygon / Circle(center, radius_m) / Corridor(line, width_m) — для prism; набор слоёв-призм или триангулированная оболочка — для volume GeoJSON-совместимое да
altitude_min_m, altitude_max_m Нижняя и верхняя границы зоны м да
altitude_frame AGL | AMSL | ELLIPSOIDAL enum да
valid_from, valid_to Окно действия; null = действует всегда ISO-8601 UTC нет
violation_rule hard | warn | conditional enum да
buffer_m Собственный буфер зоны поверх objective.safety_buffer_m м нет
source scenario | operator | fpln.ru | derived строка да
authority_note Какое разрешение снимает ограничение (ИВП, ФСБ, ОМС) строка нет

altitude_frame — поле, которого нет в схеме сценария планировщика, где no_fly[] несёт только altitude_min_m / altitude_max_m. Зона «до 150 м над рельефом» и зона «до 150 м AMSL» на полигоне с перепадом 50 м — это две разные зоны; без фрейма пара чисел не интерпретируется. Симулятор требует поле обязательным (расхождение № 1 в разделе 10).

4.2. Типы зон и правило нарушения

zone_kind Что это по ФП-138 Правило Код Поведение борта в симуляции
no_fly Запретная зона Вход запрещён. Длина траектории внутри обязана быть 0 NFZ_ENTERviolations.nfz РЭ-201: «отключение фотокамеры, БВС выполняет полет к месту посадки»
allowed_airspace Границы разрешённого ВП (inclusion, R-IN-5 из ТЗ) Выход запрещён. Длина вне полигона обязана быть 0 AIRSPACE_EXITviolations.airspace То же
restricted Зона ограничения полётов Вход допустим при выполнении условия; в базовой версии трактуется как запрет, но код отличается ZONE_RESTRICTED → warning Продолжает задание, факт в отчёте
temporary Временный / местный режим (ВР ≥ 5 суток, МР ≥ 3 суток) Внутри [valid_from, valid_to] — как no_fly; вне окна ограничения нет NFZ_ENTER / — Как no_fly внутри окна
aerodrome_area Район аэродрома: < 5 км от неконтролируемого аэродрома — разрешение на ИВП требуется Вход = warning + признак «нужно разрешение» AERODROME_5KM → warning Продолжает задание
border_strip Приграничная полоса 25 км Полёт без плана, разрешения на ИВП и радиосвязи запрещён; нужно разрешение территориального органа ФСБ BORDER_25KM → warning Продолжает задание
virtual_150m Не зона, а правило ФП-138: высота ≤ 150 м над рельефом — условие полёта без разрешения на ИВП Виртуальная поверхность на 150 м AGL; превышение = warning, не violation ALT_ABOVE_150M Продолжает задание

Порог 150 м остаётся warning'ом по прямой причине из базы знаний: Gemini с PF1B при GSD 3 см даёт расчётную высоту 153 м (30-domain/06-airspace-ru.md) — то есть нормальная производственная задача выходит за упрощённый режим на 3 м. Превращение этого в violation обнулило бы половину осмысленных сценариев; молчание — скрыло бы необходимость оформлять разрешение. Код warning'а совпадает с кодом планировщика (warnings[].code = ALT_ABOVE_150M), чтобы два сервиса говорили одинаково.

Отдельно фиксируется, что поведение борта при нарушении зоны у Геоскан 201 не совпадает с ArduPilot: в РЭ-201 это отключение камеры и полёт к месту посадки, в ArduPilot geofence — переход в GUIDED с возвратом в точку и барражированием. Модель зоны обязана нести реакцию борта как атрибут платформы, а не считать её универсальной.

4.3. Геометрия: призма и объём

Поддерживаются оба представления, и это не вопрос удобства.

Представление Когда нужно Запрос «точка внутри»
prism — 2D-полигон + altitude_min_m / altitude_max_m Подавляющее большинство зон приходит именно так: и из сценария планировщика, и с fpln.ru point-in-polygon по 2D-следу ∧ проверка вертикального интервала в приведённом фрейме
volume — набор слоёв-призм с разными контурами либо триангулированная оболочка Район аэродрома в виде перевёрнутой «чаши»; коридор набора высоты; зона, у которой контур меняется с высотой point-in-volume по слоям либо ray-casting по оболочке

Требование к точности вычисления нарушения: длина участка траектории внутри зоны считается аналитически — пересечением отрезков траектории с боковыми гранями и горизонтальными плоскостями призмы, с допуском 1e-6 м. Дискретизация с шагом 10 м здесь недопустима: валидатор требует ровно violations.nfz = 0, а дискретизация может проскочить угол зоны между выборками и выдать ноль там, где нарушение есть. Дискретизация остаётся только для клиренса, где непрерывного аналитического решения нет.

4.4. Буфер безопасности

Буфер берётся как max(objective.safety_buffer_m, zone.buffer_m, 2 × CE90 геопривязки мира). Нижняя граница 2 × CE90 — прямое следствие раздела 2.4: буфер меньше двойной погрешности геопривязки не защищает ни от чего. Если пользователь задал меньше, мир выдаёт предупреждение BUFFER_BELOW_GEOREF с обоими числами и продолжает работу с поднятым буфером.


5. Редактирование и импорт

5.1. Принимаемые форматы

Формат Что несёт Приоритет Особенности
GeoJSON (RFC 7946) Зоны, полигон съёмки, площадки, маршрут плана MUST CRS всегда WGS84 по стандарту; 7 знаков координат (40-formats/01)
KML / KMZ (OGC 2.2) То же; основной формат выгрузки планировщика и вход Geoscan Planner MUST altitudeMode по умолчанию clampToGround — молчаливая потеря высот
GeoTIFF / COG ЦМР, ЦММ, ортофото заказчика MUST (SIM-GEO-03) CRS и вертикальные единицы из заголовка; ≤ 4 ГБ
LAS / LAZ 1.2–1.4, COPC Облако точек SHOULD (SIM-GEO-04) Растеризация в ЦМР и ЦМП с шагом 0,25–5,0 м
Shapefile Зоны, границы, коммуникации SHOULD Обязателен .prj; при его отсутствии — запрос СК у пользователя
DXF Границы участков, коммуникации COULD Единицы в DXF часто безразмерны — требуется явное указание
SXF / MTW («Панорама») Российская топооснова и матрица высот COULD (SIM-GEO-05) Драйвер SXF read-only, нужен RSC-классификатор; MTW через драйвер RMF

5.2. Что валидируется на импорте

Ни одна из этих проверок не может завершаться «догадкой» — только успех или явная ошибка с кодом.

Категория Проверка Код ошибки
Геометрия Самопересечение внешнего или внутреннего кольца (OGC simple) GEOM_SELF_INTERSECTION
Геометрия Незамкнутое кольцо, дублирующиеся подряд вершины, кольцо < 4 точек, нулевая площадь GEOM_INVALID_RING
Геометрия Внутреннее кольцо (дырка) вне внешнего или пересекает его GEOM_HOLE_OUTSIDE
Геометрия Ориентация колец по RFC 7946 (внешнее — против часовой) — исправляется автоматически с записью в отчёт — (warning)
Геометрия Координаты вне [−180, 180] / [−90, 90] — типичный признак перепутанных lon/lat GEOM_COORD_RANGE
СК СК не определена ни в файле, ни пользователем CRS_REQUIRED
СК МСК без параметров перехода (SIM-GEO-07) CRS_MSK_KEYS_REQUIRED
СК Номер зоны ГК из ложного смещения не совпадает с EPSG или bbox (раздел 2.2) CRS_ZONE_MISMATCH
Единицы Вертикальные единицы растра не определены UNITS_REQUIRED
Единицы Высоты в футах при заявленных метрах — эвристика: медиана высот района отличается от ЦМР в 3,28 ± 0,1 раза UNITS_SUSPECT_FEET (warning)
Высоты Слой без vertical_datum (SIM-GEO-08) VDATUM_REQUIRED
Высоты KML без явного altitudeMode — трактуется как clampToGround (эквивалент AGL = 0), не как AMSL KML_ALTITUDE_MODE_DEFAULT (warning)
Высоты БСВ-77 без модели квазигеоида (раздел 2.3) VDATUM_MODEL_REQUIRED
Лимиты Число вершин одного полигона > 10 000; число зон > 200 LIMIT_EXCEEDED (warning с предложением упростить)
Согласованность Полигон задачи не полностью внутри allowed_airspace; площадка внутри no_fly TOPOLOGY_CONFLICT (warning — решение за оператором)

5.3. Редактор зон и полигона съёмки

Возможность Требование
Примитивы рисования Полигон, прямоугольник, окружность (→ цилиндр: центр + радиус + вертикальные границы), коридор (линия + ширина — для ЛАФС и ЛЭП), вырез (внутреннее кольцо)
Правка Перетаскивание, вставка и удаление вершин; перенос зоны целиком; изменение вертикальных границ и фрейма
Snap Привязка к вершинам существующих объектов и к узлам сетки ЦМР с допуском в экранных пикселях
Валидация в момент правки Самопересекающуюся геометрию невозможно сохранить: кнопка сохранения недоступна, конфликтный сегмент подсвечен
Undo / redo Не менее 50 шагов истории на сессию редактирования
Измерения Площадь и периметр в метрической проекции, а не в градусах; расхождение с геодезической площадью ≤ 0,1 %
Вертикальные границы Задаются вместе с фреймом; интерфейс не позволяет сохранить зону без фрейма

6. Препятствия и столкновения

6.1. Что моделируем и какой геометрией

Объект Геометрический примитив Источник высоты Зачем
Рельеф heightfield (раздел 3) ЦМР CFIT, AGL, LOS
Здание Призма: footprint × height OSM heightbuilding:levels × 3 м → MS ML estimate → assumed Клиренс, LOS, окклюзия кадра
Мачта, вышка, труба Вертикальный цилиндр (r, z_base, z_top) OSM height; при отсутствии — значение по умолчанию с флагом height_source: assumed (ДОП-W-10, см. также ДОП-3 в 01) Прямое исполнение правила РЭ-201 «100 м выше вышек, труб, опор ЛЭП»
Опора ЛЭП Вертикальный цилиндр То же То же
Пролёт ЛЭП Связный пролёт между соседними опорами: вертикальная «стена» от отметки земли до высоты меньшей из двух опор Из геометрии опор и power=line Провод между опорами — препятствие, которого в точечной модели нет вообще; борт пролетит «между столбами»
Полог леса Дополнительный heightfield 10 м там, где WorldCover = Tree cover ETH Canopy Height (RMSE 6,0 м) Клиренс, LOS, пригодность площадки посадки

Провис провода по цепной линии в первой версии не моделируется — «стена» до высоты опоры даёт консервативную оценку (препятствие завышено, не занижено). Это осознанное упрощение в «известные ограничения».

6.2. Запрос столкновения

Параметр Требование
Запрос collide(segment A→B) → факт столкновения + точка + идентификатор объекта + минимальная дистанция до оболочки по всему отрезку
Структура BVH / R-tree по 2D-следу объектов, у каждого листа — z_base / z_top; рельеф проверяется отдельно ray-march'ем по heightfield с шагом ≤ 10 м (SIM-GEO-11)
Толерантность Любое проникновение в оболочку = столкновение; «клиренс до объекта» возвращается отдельным числом
Производительность ≥ 4·10⁵ сегмент-запросов/с на ядре. Обоснование: 21 000 сегментов на вылет × 100 вылетов (20 бортов × 5 вылетов) = 2,1 млн → ≤ 5,3 с на полную проверку сценария

6.3. Запрос прямой видимости A → B

Нужен домену связи: у 201 радиус 40 км, у 801 — 10 км (это видеоканал, не управление), у Gemini — 5 км (fleet.yaml). Круг радиуса R — заведомо неверная модель в пересечённой местности; симулятор обязан давать радиовидимость по рельефу.

Параметр Значение Обоснование
Метод Профиль по отрезку A→B с шагом ≤ 15 м Половина шага сетки 30 м — критерий Найквиста: препятствие размером в одну ячейку не должно проскакивать между выборками
Кривизна и рефракция Эквивалентный радиус Земли 8 500 км (k = 4/3) Стандартная радиоинженерная практика; в источниках проекта числа нет (ДОП-W-08)
Критерий «видно» Профиль не пересекает линию A→B и зазор ≥ 0,6·F₁ первой зоны Френеля Стандартный инженерный критерий (ДОП-W-09)
Первая зона Френеля На частоте 869,75 МГц (середина диапазона 867,75–872,25 МГц по РЭ-201), λ = 0,345 м: на трассе 40 км в середине F₁ = 58,7 м, порог 0,6·F₁ = 35,2 м Частота из РЭ-201. Для 801 и Gemini частоты в источниках нет (ДОП-W-07)
Учитываемые слои terrain + surface (полог, застройка) + obstacles Лес высотой 20 м на середине трассы съедает больше половины зазора Френеля
Выход visible: bool, clearance_m (минимальный зазор), blocking_point (где перекрыто), fresnel_ratio Домен связи получает не «да/нет», а число, по которому можно ранжировать маршруты
Производительность ≥ 5·10³ запросов/с при d = 40 км (2 667 выборок на запрос → ≥ 1,3·10⁷ выборок профиля в секунду) Телеметрия 1 Гц на 20 бортов = 20 запросов/с; запас ×250 позволяет считать радиовидимость на каждом шаге интегрирования, а не раз в минуту

7. Масштаб и производительность

7.1. Целевые размеры мира

Параметр Значение Источник
Максимальная площадь полигонов съёмки в сценарии 200 км² sc-area из 70-plan/02-test-scenarios.md
Максимальное число бортов 20 sc-fleet там же
Максимальное число зон 20 NFZ в тестах, 200 — предел импорта sc-nfz; раздел 5.2
Буфер мира вокруг района работ +40 км Радиус связи 201, fleet.yaml (ДОП-W-02)
Итоговый bbox мира до 120 × 120 км ≈ 14 400 км² Производная от двух строк выше

7.2. Бюджет памяти

Компонент Объём Расчёт
ЦМР 30 м на 14 400 км² 64 МБ 14 400·10⁶ / 900 = 16,0 млн ячеек × 4 байта
ЦМР 10 м на 200 км² 8 МБ 2,0 млн ячеек × 4 байта
ЦМР 1 м на 1 км² (площадки) 4 МБ 1,0 млн ячеек × 4 байта
Маска качества (uint8, все уровни) 19 МБ 1 байт на ячейку
Полог леса 10 м на 200 км² 8 МБ 2,0 млн ячеек × 4 байта
BVH препятствий, 10⁵ объектов ≤ 40 МБ 400 байт на объект (ДОП-W-06)
Зоны (≤ 200 зон, ≤ 10⁴ вершин суммарно) < 1 МБ
Метео-решётка 0,0625°, 23 уровня, 24 ч, u/v ≈ 6 МБ ~510 узлов × 23 × 24 × 2 × 4 байта
Рабочий набор мира без кэша рендера ≤ 256 МБ Сумма выше = 150 МБ, запас ×1,7
Кэш тайлов рендера, LRU ≤ 512 МБ, настраивается
Бюджет RSS процесса мира ≤ 2 ГБ Рабочий набор + кэш + рабочие буферы (ДОП-W-06)

7.3. Время подготовки и прогона

Операция Бюджет Комментарий
Сборка мира 14 400 км² из локального зеркала ≤ 15 мин на 8 ядрах Перепроецирование, мозаика, заполнение дыр, слой препятствий, тайлинг (ДОП-W-06)
Растеризация LAS/LAZ 100 млн точек ≤ 15 мин SIM-GEO-04
Загрузка готового снапшота перед прогоном ≤ 10 с Иначе headless-цикл «правка → прогон → метрика» становится неудобным
Пересборка только слоя зон (правка оператором) ≤ 2 с Рельеф и препятствия не пересобираются
Полная геометрическая проверка сценария (20 бортов, 100 вылетов) ≤ 10 с Из разделов 3.3 и 6.2: 2,1 с на клиренс + 5,3 с на коллизии + запас

8. Детерминированность

Требование проекта — метод «валидатор раньше продукта»: любое утверждение о качестве плана должно быть числом, а число имеет смысл, только если воспроизводится. Мир — самая большая часть входа, и именно он чаще всего «плывёт».

Мир из одних и тех же входных данных обязан собираться бит-в-бит одинаково. Что для этого нужно:

Что фиксируется Как
Входные наборы sha256 каждого файла + release набора (SIM-GEO-17); сборка прерывается при несовпадении суммы (SIM-GEO-24)
Параметры сборки Origin ENU, рабочая UTM-зона, vertical_datum, шаги сеток по уровням, пороги заполнения дыр, правила пирамиды приоритета, дефолтные высоты препятствий
Версии инструментов Версии PROJ, GDAL, модели геоида (egm08-1, egm96-15), версия сборщика мира, версия схемы
Идентификатор world_snapshot_id = sha256(отсортированный список входов ‖ параметры ‖ версии). Время сборки generated_at в хэш не входит
Числовая арифметика Внутри — float64; хранение ЦМР — float32, интерполяция — float64. Порядок суммирования и редукций фиксирован по индексу, а не по потоку. Сборка запрещает -ffast-math и неявное контрактирование FMA
Порядок обхода Все итерации по коллекциям — по отсортированному ключу. Итерация по хэш-таблице в произвольном порядке запрещена
Генераторы случайных чисел Только явный seed из solver.seed и из настроек прогона; системное время и адреса памяти как источник энтропии запрещены
Стриминг Полная предзагрузка тайлов до старта прогона (раздел 3.2) — иначе порядок подгрузки влияет на результат

Приёмка: два прогона подряд дают побитово одинаковый JSON метрик и одинаковый world_snapshot_id; прогон через 7 суток на том же снапшоте — тоже (SIM-GEO-18). Воспроизводимость между машинами гарантируется в пределах одной архитектуры CPU и одного образа (ДОП-W-11): на другой архитектуре различие порядка FMA может дать расхождение в последних битах, и это ограничение записывается явно, а не замалчивается.


9. Требования SIM-WORLD

Критерии приёмки SIM-WORLD-* — 90-final/02-requirements-registry.md (ревью D, 2026-09-16). Таблица ниже не дублирует числовые пороги реестра.

Приоритеты: MUST — без этого модель мира не выполняет свою функцию; SHOULD — заметно усиливает результат; COULD — при остатке времени.

Колонка «Источник»: ТЗ — ТЗ хакатона; РЭ-201 — руководство по эксплуатации Геоскан 201; fleet/payloads — YAML парка; schema40-formats/03-our-mission-schema.md; validator70-plan/01-validator-first.md; airspace30-domain/06-airspace-ru.md; SIM-GEO-nn — требование из 01-geodata-sources.md; ДОП-W-n — допущение из раздела 11.

ID Требование Приоритет Критерий приёмки Источник
SIM-WORLD-01 Мир состоит из фиксированного перечня слоёв (terrain, surface, obstacles, zones, sites, weather, basemap, quality); каждый слой несёт source_id, release, crs, vertical_datum, resolution_m, sha256 MUST Ответ API world/{id} перечисляет все 8 слоёв; слой без любого из шести обязательных полей приводит к ошибке сборки мира SIM-GEO-17, раздел 1
SIM-WORLD-02 Рабочая СК движка — локальная геодезическая ENU, построенная через ECEF; плоская аппроксимация запрещена MUST Round-trip WGS84 → ENU → WGS84 в радиусе 200 км от origin даёт расхождение ≤ 0,01 м; точка на эллипсоиде в 100 км от origin имеет в ENU z = −785 ± 5 м (проверка, что кривизна учтена) ТТХ PPK 10 мм, раздел 2.1
SIM-WORLD-03 Origin ENU задаётся явно; по умолчанию — центроид bbox airspace.allowed, округлённый до 1e-6°; входит в world_snapshot_id MUST Смена origin меняет world_snapshot_id; повтор прогона с тем же origin даёт тот же id validator, раздел 8
SIM-WORLD-04 UTM используется только как формат хранения растров и обмена; физика, коллизии и LOS считаются в ENU MUST Тест сравнивает длину маршрута 210 км в UTM и в ENU, фиксирует расхождение ≤ 84 м и подтверждает, что интегрирование шло в ENU; площадь полигона в проекции отличается от геодезической ≤ 0,1 % fleet (range_max: 210), schema
SIM-WORLD-05 Манифест мира объявляет бюджет геопривязки числом: georef_ce90_m, georef_le90_m, наследуемые от худшего слоя пирамиды MUST Для мира на GLO-30 манифест содержит 6.0 / 4.0; для мира на топосъёмке заказчика — значения из её паспорта; отсутствие полей = ошибка сборки SIM-GEO-01, раздел 2.4
SIM-WORLD-06 Клиренс возвращается интервалом значение ± LE90 слоя; violations.altitude ставится по нижней границе интервала MUST Для geoscan_201 на GLO-30 клиренс 102 м даёт нарушение (102 − 4 < 100); клиренс 105 м — не даёт; оба числа и ширина интервала присутствуют в ответе РЭ-201 (100 м), SIM-GEO-11
SIM-WORLD-07 Пересчёт высот AGL ↔ AMSL ↔ эллипсоидальная выполняется через ЦМР и модель геоида; в ENU высота всегда эллипсоидальная MUST Регрессионный тест на 5 сценариях: перевод AGL → AMSL → ELLIPSOIDAL → обратно даёт расхождение ≤ 0,01 м; конверсия константой отклоняется SIM-GEO-08/09, раздел 2.3
SIM-WORLD-08 Балтийская 1977 (EPSG:5705) без предоставленной модели квазигеоида не пересчитывается MUST Импорт слоя с vertical_datum: EPSG:5705 без модели даёт ошибку VDATUM_MODEL_REQUIRED; при задании пользовательского сдвига-константы слой помечается assumed и попадает в отчёт «известные ограничения» ПП РФ № 1240, раздел 2.3
SIM-WORLD-09 Номер зоны Гаусса-Крюгера распознаётся из ложного восточного смещения и сверяется с EPSG и bbox MUST Файл в зоне 7, помеченный как зона 6, отклоняется с кодом CRS_ZONE_MISMATCH; тест на паре реальных зон SIM-GEO-06, раздел 2.2
SIM-WORLD-10 Шаг рабочего ЦМР выбирается по масштабу задачи: ≤ 1 м (площадка) / ≤ 10 м (полигон) / ≤ 30 м (район) / ≤ 90 м (буфер связи) MUST На сценарии s01 (1×1 км) итоговый шаг ≤ 10 м при открытых данных и ≤ 1 м при топосъёмке; на sc-area = 200 км² — ≤ 30 м; фактический шаг каждого уровня записан в манифест ДОП-W-01, payloads (шаг галсов 62–117 м)
SIM-WORLD-11 Мир строится с буфером 40 км вокруг bbox задач и площадок SHOULD Для сценария с площадкой на краю района профиль LOS на 40 км не упирается в границу данных; факт и размер буфера в манифесте fleet (radio_range_km: 40), ДОП-W-02
SIM-WORLD-12 Запрос высоты рельефа в произвольной точке: билинейная интерполяция в float64, узловая точность бит-в-бит, непрерывность на стыках тайлов MUST В 20 узлах возвращается значение узла без изменений; проход через 3 стыка тайлов даёт максимальный скачок ≤ 1e-6 м; прореживание сетки вдвое даёт медианное расхождение ≤ 0,5 м при уклоне ≤ 20 % раздел 3.3
SIM-WORLD-13 Производительность запроса высоты — не ниже 1·10⁶ запросов/с на ядре при прогретом кэше MUST Бенчмарк на 2,1 млн точек (20 бортов × 5 вылетов × 21 000 точек) завершается ≤ 2,1 с ДОП-W-06, SIM-GEO-11
SIM-WORLD-14 LOD применяется только к рендеру; физика, клиренс, коллизии и LOS читают нулевой уровень пирамиды MUST Тест сравнивает клиренс, посчитанный на LOD0 и LOD2, и требует, чтобы движок сообщал в ответе уровень; ответ с уровнем ≠ 0 для физики = провал теста раздел 3.2
SIM-WORLD-15 Все тайлы, нужные прогону, загружаются до старта; во время прогона обращений к диску за новыми тайлами нет MUST Трассировка ввода-вывода headless-прогона показывает 0 открытий новых тайлов после старта; при неполном наборе прогон не стартует раздел 8 (детерминизм)
SIM-WORLD-16 Маска качества ЦМР обязательна: каждая ячейка помечена источником и признаком заполнения дыры MUST Любое число, посчитанное над заполненной ячейкой, несёт terrain_quality ≠ measured; доля заполненных ячеек присутствует в отчёте мира раздел 3.4
SIM-WORLD-17 Дыры в ЦМР заполняются по правилам: ≤ 8 ячеек — интерполяцией, больше — из следующего слоя пирамиды с feathering 3 ячейки; вода — плоской поверхностью MUST Доля заполненных ячеек > 5 % даёт предупреждение DEM_VOID_FRACTION_HIGH с числом, > 20 % — ошибку сборки SIM-GEO-01/02, ДОП-W-03
SIM-WORLD-18 Зона несёт обязательный altitude_frame ∈ {AGL, AMSL, ELLIPSOIDAL} MUST Зона без фрейма отклоняется с кодом ZONE_ALT_FRAME_REQUIRED; тест показывает, что зона «0–150 м AGL» и «0–150 м AMSL» на полигоне с перепадом 50 м дают разные наборы нарушений schema (поля нет — расхождение № 1), airspace
SIM-WORLD-19 Поддержаны шесть типов зон: no_fly, restricted, allowed_airspace, temporary, aerodrome_area, border_strip MUST Каждый тип имеет собственный код нарушения из таблицы 4.2; сценарий со всеми шестью типами проходит и выдаёт 6 различимых кодов ФП-138, airspace, ТЗ
SIM-WORLD-20 Поддержаны обе геометрии зоны: prism (2D-полигон + вертикальные границы) и volume (объёмное тело) MUST Тест: зона-«чаша» района аэродрома, заданная тремя слоями-призмами, корректно пропускает траекторию, проходящую над её нижним слоем, но внутри 2D-следа airspace, раздел 4.3
SIM-WORLD-21 Длина участка траектории внутри зоны считается аналитически (пересечение отрезков с гранями), а не дискретизацией MUST Тест «срез угла»: траектория, задевающая угол NFZ на длине 3 м, даёт violations.nfz ≠ 0; дискретизация с шагом 10 м этот случай пропускает — тест это показывает validator (violations.nfz = 0)
SIM-WORLD-22 Временной режим зоны учитывается: вне окна [valid_from, valid_to] зона не действует MUST Один и тот же маршрут, прогнанный в двух временах, даёт нарушение внутри окна и не даёт вне его airspace, schema
SIM-WORLD-23 Правило 150 м ФП-138 реализовано как виртуальная поверхность 150 м AGL с кодом ALT_ABOVE_150M и статусом warning, не violation MUST Сценарий Gemini + PF1B при GSD 3 см (расчётная высота 153 м) даёт ровно один warning и ноль нарушений; код совпадает с кодом планировщика ФП-138, airspace (153 м), schema (warnings[])
SIM-WORLD-24 Буфер безопасности берётся как max(objective.safety_buffer_m, zone.buffer_m, 2 × CE90); при заданном буфере ниже 2 × CE90 выдаётся BUFFER_BELOW_GEOREF SHOULD При safety_buffer_m = 5 и CE90 = 6 м мир применяет буфер 12 м и сообщает оба числа schema (safety_buffer_m: 25), раздел 2.4
SIM-WORLD-25 Импорт зон и полигонов: GeoJSON и KML/KMZ — обязательно; GeoTIFF/COG, LAS/LAZ, Shapefile — по SIM-GEO-03/04/05 MUST Файл, выгруженный планировщиком в KML и в GeoJSON, загружается без ручной правки; round-trip экспорт → импорт сохраняет геометрию ≤ 0,01 м ТЗ, schema, SIM-GEO-05
SIM-WORLD-26 На импорте валидируются геометрия, СК, единицы и высотный фрейм; молчаливых дефолтов нет MUST Все 15 проверок таблицы 5.2 покрыты тестами с фикстурами; каждая даёт свой код; KML без altitudeMode даёт KML_ALTITUDE_MODE_DEFAULT и трактуется как clampToGround 40-formats/01, SIM-GEO-07/08
SIM-WORLD-27 Редактор зон поддерживает полигон, прямоугольник, окружность, коридор и вырез; невалидную геометрию сохранить невозможно MUST Попытка сохранить полигон-«бабочку» блокируется, конфликтный сегмент подсвечен; окружность сохраняется как цилиндр с вертикальными границами и фреймом ТЗ (ввод зон), раздел 5.3
SIM-WORLD-28 Слой препятствий содержит здания (призмы), мачты/трубы/опоры (цилиндры) и связные пролёты ЛЭП между соседними опорами MUST На демо-полигоне траектория, проходящая между двумя опорами ЛЭП ниже их вершин, даёт столкновение; в точечной модели такого столкновения нет — тест это показывает РЭ-201 («опор ЛЭП»), SIM-GEO-12
SIM-WORLD-29 Полог леса учитывается как дополнительный heightfield 10 м по маске WorldCover SHOULD Клиренс над массивом Tree cover уменьшается на высоту полога; расхождение с DSM GLO-30 > 12 м (2 × RMSE 6,0 м) фиксируется предупреждением SIM-GEO-13
SIM-WORLD-30 Запрос столкновения segment A→B возвращает факт, точку, объект и минимальную дистанцию; производительность ≥ 4·10⁵ запросов/с MUST Бенчмарк на 2,1 млн сегментов завершается ≤ 5,3 с на ядре ДОП-W-06, раздел 6.2
SIM-WORLD-31 Запрос прямой видимости A→B считает профиль с шагом ≤ 15 м, учитывает рефракцию (эквивалентный радиус 8 500 км) и зону Френеля 0,6·F₁ MUST На трассе 40 км при 869,75 МГц порог зазора = 35,2 ± 0,5 м; ответ содержит visible, clearance_m, blocking_point, fresnel_ratio; производительность ≥ 5·10³ запросов/с РЭ-201 (867,75–872,25 МГц), ДОП-W-07/08/09
SIM-WORLD-32 Слой площадок отвечает на запрос пригодности: сектор взлёта ±30° по правилу «нет объектов выше 0,1·L», ровность и покров под точкой посадки и под эллипсом сноса MUST Для площадки с курсом ψ проверка проходит по d ∈ [0, 1000 м] и возвращает max(h_obstacle(d) − 0,1·d); значение > 0 = площадка непригодна с указанием объекта. Под эллипсом сноса выдаётся состав покрова: дороги, ЛЭП, вода, лес, застройка РЭ-201 (сектор ±30°, требования к площадке), ДОП-W-12
SIM-WORLD-33 Метео-поле — слой мира: 4D-решётка (x, y, z, t) с интерполяцией в произвольную точку и время MUST Запрос ветра в произвольной точке на высоте 100 м и времени между узлами возвращает вектор; интерполяция по высоте линейна по геопотенциалу, по времени — линейна между часовыми срезами SIM-GEO-14/15
SIM-WORLD-34 Целевой масштаб мира: bbox до 120 × 120 км, рабочий набор ≤ 256 МБ без кэша рендера, RSS процесса ≤ 2 ГБ SHOULD Прогон на bbox 120 × 120 км при отключённом кэше рендера удерживает RSS ≤ 2 ГБ; замер публикуется в отчёте ДОП-W-06, раздел 7.2
SIM-WORLD-35 Время подготовки мира: полная сборка 14 400 км² ≤ 15 мин на 8 ядрах; загрузка готового снапшота ≤ 10 с; пересборка слоя зон ≤ 2 с SHOULD Замеры в CI на эталонном bbox; превышение бюджета более чем в 1,5 раза — провал ДОП-W-06, раздел 7.3
SIM-WORLD-36 world_snapshot_id = sha256 от отсортированного списка входов, параметров сборки и версий инструментов; generated_at в хэш не входит MUST Две сборки из одних входов дают одинаковый id; смена версии PROJ, модели геоида, origin ENU или шага сетки — разный id SIM-GEO-17/18
SIM-WORLD-37 Все расчёты мира детерминированы: float64 внутри, фиксированный порядок редукций, сортированный обход коллекций, запрет -ffast-math и неявного FMA, seed из конфигурации MUST Два прогона подряд дают побитово одинаковый JSON метрик; прогон через 7 суток — тоже; в сборке нет флагов быстрой математики (проверка CI) validator, R-PS-28/29
SIM-WORLD-38 Ограничение воспроизводимости между архитектурами CPU объявлено явно MUST Документ «известные ограничения» содержит пункт о том, что бит-в-бит гарантия действует в пределах x86-64 и одного образа; прогон на другой архитектуре, если он делается, сопровождается отчётом о расхождении ДОП-W-11

10. Расхождения между источниками

Зафиксировано, не замазано. Часть расхождений уже отмечена в 01-geodata-sources.md (раздел 7) и здесь не повторяется.

# Расхождение Следствие для модели мира
1 В схеме сценария планировщика airspace.no_fly[] несёт altitude_min_m / altitude_max_m без указания фрейма высот Пара чисел не интерпретируется: «0–150 м» над полигоном с перепадом 50 м — две разные зоны в AGL и в AMSL. Симулятор требует altitude_frame обязательным (SIM-WORLD-18) и, при работе со старым сценарием, отклоняет его, а не угадывает
2 launch_sites[].elevation_m в схеме — число без vertical_datum Та же проблема на площадках. SIM-GEO-20 уже сверяет это число с ЦМР, но без датума сравнение неоднозначно на величину аномалии высоты (десятки метров). Фрейм требуется явно
3 Поведение при нарушении зоны: РЭ-201 — «отключение фотокамеры, БВС выполняет полет к месту посадки»; ArduPilot geofence — переход в GUIDED, возврат в точку, барражирование Реакция на нарушение — атрибут платформы, а не мира. Модель зоны хранит факт и код нарушения; реакция берётся из профиля борта
4 Geoscan Planner загружает рельеф из интернета («рекомендуется использовать карту высот GEM, установлена по умолчанию» — РЭ-201), а требование симулятора — полностью офлайн-контур (SIM-GEO-16) Числа превышения у симулятора и у Planner могут расходиться на разницу ЦМР. Это объявляется в манифесте (какой набор использован) и в «известных ограничениях», а не скрывается. Что такое GEM и какова его точность — открытый вопрос (ОВ-2 в 01)
5 ТЗ даёт границы разрешённого ВП и бесполётные зоны как вход, а fpln.ru не имеет пригодного API для интеграции Автоматической актуализации зон нет. Зоны приходят из сценария либо рисуются оператором; источник фиксируется полем source. Это ограничение, а не недоработка
6 fleet.yaml задаёт altitude_agl_min: 100 только для geoscan_201; у 801 и Gemini поля нет, а РЭ-201 формулирует правило 100 м как общее требование безопасности Порог клиренса берётся пер-борт из fleet.yaml; универсальный порог не вводится (ДОП-6 в 01). Для 801 и Gemini мир возвращает клиренс числом, но не ставит нарушение
7 Планировщик считает геометрию в UTM (тест «площадь ±0,1 %»), а искажение площади UTM само достигает 0,08 % у края зоны Запас теста практически исчерпан проекцией. Мир считает в ENU и предоставляет планировщику эталонные геодезические площади для сверки

11. Допущения

Каждое допущение — что принято и чем грозит, если неверно. Все они обязаны попасть в документ «перечень известных ограничений», требуемый ТЗ.

  1. ДОП-W-01. Шаги рабочей сетки по масштабам (1 / 10 / 30 / 90 м). Числа 30 и 90 — из спецификаций GLO-30 и GLO-90, остальные — инженерная оценка. Если неверно: на шаге 10 м недостаточно разрешается рельеф под галсом при мелком GSD, и распределение GSD по кадрам выходит оптимистичным; на шаге 1 м вырастает время сборки и объём памяти.
  2. ДОП-W-02. Буфер мира 40 км. Принят равным радиусу связи Геоскан 201 (fleet.yaml). Если неверно: при ретрансляторах или другой методике буфер должен быть больше, и профиль LOS на краю упрётся в границу данных, давая ложное «нет видимости».
  3. ДОП-W-03. Пороги заполнения дыр: 8 ячеек, 5 %, 20 %. В источниках чисел нет. Если неверно: слишком мягкий порог пропустит мир, у которого пятая часть клиренсов достроена интерполяцией; слишком жёсткий заблокирует нормальные районы с водоёмами.
  4. ДОП-W-04. Допуск co-registration слоёв: 1,0 м в плане, 0,5 м по высоте. Выведен из габарита опоры ЛЭП (~1 м). Если неверно: при большем реальном рассогласовании слоёв проверка столкновения с точечными объектами теряет смысл, и требование SIM-WORLD-28 не выполняется фактически, хотя формально проходит.
  5. ДОП-W-05. Точность топосъёмки заказчика 0,5 м в плане / 0,3 м по высоте. Типичные значения для съёмки с БВС с PPK; паспорта конкретной съёмки нет. Если неверно: объявленный в манифесте бюджет геопривязки завышен, и интервал клиренса (SIM-WORLD-06) окажется уже реального.
  6. ДОП-W-06. Все бюджеты производительности и памяти (10⁶ запросов высоты/с, 4·10⁵ коллизий/с, 5·10³ LOS/с, 15 мин сборка, 256 МБ рабочий набор, 2 ГБ RSS, 400 байт на объект BVH) — инженерные оценки для 8 ядер. Если неверно: сценарий на 20 бортов перестаёт укладываться в интерактивное время, и демонстрация «правка → прогон → метрика» разваливается.
  7. ДОП-W-07. Частота 869,75 МГц взята как середина диапазона 867,75–872,25 МГц из РЭ-201 для расчёта зоны Френеля. Частоты каналов 801 и Gemini в источниках отсутствуют. Если неверно: порог зазора 35,2 м на 40 км смещается; для 801 и Gemini расчёт зоны Френеля вообще не имеет основания и должен быть помечен как оценка.
  8. ДОП-W-08. Коэффициент рефракции k = 4/3 (эквивалентный радиус 8 500 км). Стандартная радиоинженерная практика; в источниках проекта отсутствует. Если неверно: дальность радиовидимости смещается на единицы процентов — в условиях инверсии заметно больше.
  9. ДОП-W-09. Критерий радиовидимости 0,6·F₁. Стандартная практика; в источниках проекта отсутствует. Если неверно: граница «видно / не видно» смещается, и оценка автономного возврата при потере связи меняется.
  10. ДОП-W-10. Дефолтные высоты объектов без height=* (опора ЛЭП, мачта, труба) — см. ДОП-3 в 01-geodata-sources.md. Если неверно: клиренс над инфраструктурой систематически завышен или занижен; все такие объекты помечены height_source: assumed.
  11. ДОП-W-11. Детерминизм гарантируется в пределах архитектуры x86-64 и одного образа. Если неверно: прогоны на ARM дадут расхождение в последних битах метрик, и сравнение версий алгоритма между разными машинами станет некорректным.
  12. ДОП-W-12. Проверка сектора взлёта ведётся на d ∈ [0, 1000 м] — диапазон покрывает объекты высотой до 100 м по правилу 0,1·L. Ровность площадки посадки принята как уклон ≤ 5°: числа в РЭ-201 нет. Если неверно: площадки, признанные пригодными, могут не быть пригодными по факту.
  13. ДОП-W-13. Провис провода ЛЭП не моделируется, пролёт задан «стеной» до высоты меньшей из двух опор. Если неверно (в консервативную сторону): препятствие завышено, часть допустимых траекторий будет отвергнута — это безопасная ошибка, но она режет пространство решений.
  14. ДОП-W-14. Плоская вода: высота водной поверхности принята равной медиане высот береговой линии. Если неверно: на протяжённых реках с уклоном появляется ступенька на границе водоёма.
  15. ДОП-W-15. Размер тайла 512×512. Инженерный выбор, влияет на объём кэша и на гранулярность предзагрузки. Если неверно: растёт объём лишней предзагрузки либо число промахов кэша.

12. Открытые вопросы к заказчику

Формат: вопрос → что меняется в продукте от ответа. Вопросы, на которые нет ответа ни в ТЗ, ни в заводских руководствах, ни в базе знаний. Вопросы, уже заданные в 01-geodata-sources.md (ОВ-1…ОВ-3) и в docs/task5/00-brief/05-questions-to-customer.md (Q-09, Q-25, Q-33), здесь не повторяются — только дополняются.

QW-01. Какая абсолютная точность геопривязки считается приемлемой при приёмке работ — в CE90/LE90 или в другой метрике? → Определяет, можно ли вообще опираться на открытые данные: GLO-30 даёт 6 м CE90 / 4 м LE90. Если допуск приёмки жёстче, мир обязан строиться только на топосъёмке, и это меняет требование SIM-WORLD-05 с «объявить бюджет» на «отказать при превышении».

QW-02. Есть ли эталонная ЦМР или ЦММ на демо-полигон, к которой можно привести числа клиренса? → Без эталона симулятор не может показать, что его клиренс верен, — только что он самосогласован. С эталоном появляется таблица «наш клиренс против эталонного» — самая убедительная строка на защите.

QW-03. В каком виде приходят бесполётные зоны: выгрузка с fpln.ru, ручная отрисовка, файл из Geoscan Planner? Какой формат читает «файл полётных зон» автопилота 201? → Определяет, можем ли мы отдавать зоны в формате, который борт реально примет, и нужен ли импортёр этого формата. РЭ-201 упоминает файл полётных зон с групповым номером и сроком действия, но формата не раскрывает.

QW-04. Зоны в вашей практике задаются в AGL или в AMSL? → Прямо влияет на SIM-WORLD-18: какой фрейм ставить дефолтом для унаследованных сценариев без поля altitude_frame, и что писать в предупреждении.

QW-05. Какая высота по умолчанию принимается для опоры ЛЭП, мачты и трубы, когда данных нет? → Закрывает ДОП-W-10 и ДОП-3. Без ответа все такие объекты остаются assumed, и клиренс над инфраструктурой выдаётся с оговоркой.

QW-06. Лес считается непреодолимым препятствием на всю высоту полога, или практика допускает пролёт с клиренсом от крон? → Определяет, складывается ли высота полога с рельефом жёстко или учитывается отдельным, более мягким порогом. Для сценариев над лесными массивами это разница в десятки метров расчётной высоты и, через GSD, в шаге галсов.

QW-07. Моделировать ли приграничную полосу 25 км и район аэродрома 5 км автоматически по справочным данным, или они приходят на вход обычными зонами? → Автоматическое построение требует данных о границе и о реестре аэродромов, которых в контуре нет. Если ответ «приходят на вход» — типы border_strip и aerodrome_area остаются только как метка, а не как генератор геометрии.

QW-08. Максимальный реальный размер района работ: площадь, число зон, число площадок, число бортов в одном задании? → Прямо задаёт бюджеты раздела 7. Сейчас они выведены из тестовых сценариев (200 км², 20 бортов, 20 зон), а не из практики.

QW-09. Нужна ли выгрузка собранной 3D-модели района наружу (заказчику, в отчёт), и существуют ли режимные ограничения на такую выгрузку? → Связано с ОВ-1 из 01-geodata-sources.md. Если выгрузка нужна, появляется отдельный артефакт со своим набором лицензий и атрибуций (ODbL share-alike на слой препятствий), и требуется решение по режимности.

QW-10. Ведёт ли заказчик собственный реестр высотных препятствий (ЛЭП, вышки, трубы) и в каком формате? → Дополняет Q-09 из основного списка: если реестр есть, он встаёт в пирамиду приоритета выше OSM, и слой препятствий перестаёт быть «assumed». Если нет — качество слоя ограничено полнотой OSM, и это попадает в «известные ограничения».


Составлено 15.09.2026. Числа бюджетов производительности и памяти подлежат замеру на реальном демо-полигоне до фиксации в приёмочных тестах.