Модель мира симулятора БВС — требования¶
Как устроен виртуальный мир внутри симулятора: из каких слоёв он собран, в какой системе координат считается, с какой точностью и производительностью отвечает на запросы «высота земли под бортом», «внутри ли зоны», «есть ли прямая видимость» — и что требуется, чтобы два прогона дали бит-в-бит одно и то же.
Документ требований, не проектного решения и не кода. Схемы данных приводятся только как контракт: перечень полей, смысл, единицы.
Предшествующий документ — 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 000 000 + 500 000 + x. КоординатаX = 7 435 000означает 7-ю зону, а не 7,4 млн метров от осевого меридиана. Импортёр обязан извлечь номер зоны из координат, сверить с заявленным EPSG и с bbox; несовпадение → ошибкаCRS_ZONE_MISMATCH, а не молчаливое смещение слоя на сотни километров. - Исходная СК слоя сохраняется в метаданных и используется при обратной выгрузке, чтобы 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_quality ≠ measured |
— |
Пороги 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_ENTER → violations.nfz |
РЭ-201: «отключение фотокамеры, БВС выполняет полет к месту посадки» |
allowed_airspace |
Границы разрешённого ВП (inclusion, R-IN-5 из ТЗ) | Выход запрещён. Длина вне полигона обязана быть 0 | AIRSPACE_EXIT → violations.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 height → building: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 парка; schema — 40-formats/03-our-mission-schema.md;
validator — 70-plan/01-validator-first.md; airspace — 30-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. Допущения¶
Каждое допущение — что принято и чем грозит, если неверно. Все они обязаны попасть в документ «перечень известных ограничений», требуемый ТЗ.
- ДОП-W-01. Шаги рабочей сетки по масштабам (1 / 10 / 30 / 90 м). Числа 30 и 90 — из спецификаций GLO-30 и GLO-90, остальные — инженерная оценка. Если неверно: на шаге 10 м недостаточно разрешается рельеф под галсом при мелком GSD, и распределение GSD по кадрам выходит оптимистичным; на шаге 1 м вырастает время сборки и объём памяти.
- ДОП-W-02. Буфер мира 40 км. Принят равным радиусу связи Геоскан 201 (
fleet.yaml). Если неверно: при ретрансляторах или другой методике буфер должен быть больше, и профиль LOS на краю упрётся в границу данных, давая ложное «нет видимости». - ДОП-W-03. Пороги заполнения дыр: 8 ячеек, 5 %, 20 %. В источниках чисел нет. Если неверно: слишком мягкий порог пропустит мир, у которого пятая часть клиренсов достроена интерполяцией; слишком жёсткий заблокирует нормальные районы с водоёмами.
- ДОП-W-04. Допуск co-registration слоёв: 1,0 м в плане, 0,5 м по высоте. Выведен из габарита опоры ЛЭП (~1 м). Если неверно: при большем реальном рассогласовании слоёв проверка столкновения с точечными объектами теряет смысл, и требование SIM-WORLD-28 не выполняется фактически, хотя формально проходит.
- ДОП-W-05. Точность топосъёмки заказчика 0,5 м в плане / 0,3 м по высоте. Типичные значения для съёмки с БВС с PPK; паспорта конкретной съёмки нет. Если неверно: объявленный в манифесте бюджет геопривязки завышен, и интервал клиренса (SIM-WORLD-06) окажется уже реального.
- ДОП-W-06. Все бюджеты производительности и памяти (10⁶ запросов высоты/с, 4·10⁵ коллизий/с, 5·10³ LOS/с, 15 мин сборка, 256 МБ рабочий набор, 2 ГБ RSS, 400 байт на объект BVH) — инженерные оценки для 8 ядер. Если неверно: сценарий на 20 бортов перестаёт укладываться в интерактивное время, и демонстрация «правка → прогон → метрика» разваливается.
- ДОП-W-07. Частота 869,75 МГц взята как середина диапазона 867,75–872,25 МГц из РЭ-201 для расчёта зоны Френеля. Частоты каналов 801 и Gemini в источниках отсутствуют. Если неверно: порог зазора 35,2 м на 40 км смещается; для 801 и Gemini расчёт зоны Френеля вообще не имеет основания и должен быть помечен как оценка.
- ДОП-W-08. Коэффициент рефракции k = 4/3 (эквивалентный радиус 8 500 км). Стандартная радиоинженерная практика; в источниках проекта отсутствует. Если неверно: дальность радиовидимости смещается на единицы процентов — в условиях инверсии заметно больше.
- ДОП-W-09. Критерий радиовидимости 0,6·F₁. Стандартная практика; в источниках проекта отсутствует. Если неверно: граница «видно / не видно» смещается, и оценка автономного возврата при потере связи меняется.
- ДОП-W-10. Дефолтные высоты объектов без
height=*(опора ЛЭП, мачта, труба) — см. ДОП-3 в01-geodata-sources.md. Если неверно: клиренс над инфраструктурой систематически завышен или занижен; все такие объекты помеченыheight_source: assumed. - ДОП-W-11. Детерминизм гарантируется в пределах архитектуры x86-64 и одного образа. Если неверно: прогоны на ARM дадут расхождение в последних битах метрик, и сравнение версий алгоритма между разными машинами станет некорректным.
- ДОП-W-12. Проверка сектора взлёта ведётся на
d ∈ [0, 1000 м]— диапазон покрывает объекты высотой до 100 м по правилу 0,1·L. Ровность площадки посадки принята как уклон ≤ 5°: числа в РЭ-201 нет. Если неверно: площадки, признанные пригодными, могут не быть пригодными по факту. - ДОП-W-13. Провис провода ЛЭП не моделируется, пролёт задан «стеной» до высоты меньшей из двух опор. Если неверно (в консервативную сторону): препятствие завышено, часть допустимых траекторий будет отвергнута — это безопасная ошибка, но она режет пространство решений.
- ДОП-W-14. Плоская вода: высота водной поверхности принята равной медиане высот береговой линии. Если неверно: на протяжённых реках с уклоном появляется ступенька на границе водоёма.
- ДОП-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. Числа бюджетов производительности и памяти подлежат замеру на реальном демо-полигоне до фиксации в приёмочных тестах.