Files
NODEDC_MISSION_CORE/docs/audits/2026-09-21-ai-polygon-integration.md
T

218 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AI-полигон: отдельный профиль Gaussian / Isaac
Этот документ фиксирует первый интеграционный этап. Текущее состояние UI,
две скачанные локации, исправление Stop и измерения полного цикла описаны в
[операторской ревизии](2026-09-21-ai-polygon-operator-revision.md).
Действующий release — `0af432ce95816402`; результаты старых release ниже
сохранены как история экспериментов.
Решение владельца: лабораторная симуляция с виртуальным дифференциальным ровером,
камерой и существующими AI-моделями на Worker 006. Работа с VESC/ASVD, физическими
аппаратами и перенос inference на борт в этот этап не входит. World Labs исключён.
Основной источник визуальных миров — скачиваемые Gaussian-сканы с явной лицензией.
## Продуктовая поверхность
Оператор открывает «Симуляции», выбирает профиль, импортирует локацию, проверяет её
ориентацию, масштаб, высоту грунта и старт, затем наблюдает камеру и решения AI.
Выбран существующий workspace с верхним Select профиля: это прямое решение
владельца. Альтернатива — новый workspace/пункт главной навигации — разделила бы
одну операторскую работу между разными поверхностями. Нового продуктового корня
или элемента Design Guideline нет: используются существующие Select, Window,
GlassSurface, Button, IconButton, StatusBadge, LoadingRegion и ToastStack.
LCC Gaussian Mirror сохраняет прежний renderer, каталог и pipeline. AI-полигон
имеет отдельные world/run namespaces. Старый lab-archive скрыт из обычной
навигации; сохранённые быстрые действия переводятся на AI Inference. Исторические
данные, пакеты моделей и контейнеры не удаляются.
Состояния: пустая библиотека → загрузка/возобновление → проверка локации →
подготовленная локация; simulator disconnected/connected; starting, running,
paused, stopping, completed/stopped/failed. Камера и просмотр локации имеют
expand/restore; перед первым кадром показывается ожидание, а не фиктивное видео.
## Существующий Worker
Изучены Ops MISSIONCOR-75 «AI Inference · Принципы работы и архитектура»,
MISSIONCOR-73, прежние материалы Worker и фактический Docker Desktop Windows.
Активная modular generation — observatory-ai-modules/20260904-v14. Это выполнение
записанных задач; уже работающий основной Triton не содержит DDRNet/RF-DETR.
Логический image digest модуля отличается от component image установленного
пакета: профиль использует фактически установленные component images.
До изменений: 21 контейнер, 8 запущены, 108 образов, 9 volumes; RTX 4090 24 GiB,
driver 610.47. Сохранены ID, mounts, ports и package bindings без переменных
окружения/токенов в private outputs этой задачи. Прежние контейнеры, Compose,
модельные конфигурации, immutable releases, source-CAS и rollback не изменяются.
Исправлен устаревший DNS только в существующем SSH-профиле mission-gpu, с резервной
копией и сохранением проверки host key.
## Новый runtime
На Windows используется официальный native Isaac Sim 6.1.0. Его Docker/Web Viewer
вариант не выбран: официальный Compose Web Viewer не поддерживает Windows/WSL.
Архив 10 370 228 313 bytes проверен vendor MD5 и локальным SHA-256
`dc7cfc966cd0aea105e97bb1b9b30a8e91306a3254f231bca9caa5c97ae74ae9`.
Подготовка находится только в `D:\NDC_MISSIONCORE\runtime\simulation`;
драйвер, PATH и существующие services не менялись.
Два новых временных Docker service запускаются один раз на episode:
- DDRNet: исходная PyTorch-модель GOOSE из установленного component image,
checkpoint, preprocessing runner и таблица классов сверяются по SHA-256.
- RF-DETR: сохранённый стандартный FP16 TensorRT engine с входом 704×704.
Это отдельный pinhole-профиль, без KB4 valid-FOV mask. Действующий native-KB4
пакет AI Inference не подменяется.
Найденный DDRNet TensorRT export не допущен: его сохранённая проверка показывает
4 009 отличающихся пикселей на 128 кадрах и пометку experimental-unqualified.
Полная декларация нового профиля — `simulation/ai-polygon/models.worker-006.json`.
Новый Compose использует ndc- namespace, labels и loopback 18091/18092; mounts
weights/configs read-only. Новые images/volumes не создаются и старые не чистятся.
Core выдаёт GPU reservation через существующую SQLite очередь AI Inference до
запуска native simulator и моделей. Потеря heartbeat прекращает episode и не
считает GPU автоматически свободным. Release принимается после выхода Isaac
и удаления собственных временных model containers по точным ID. Не завершённый
active.json требует reconciliation; старые команды автоматически не повторяются.
## Камера, движение и доказательства
Core ↔ Worker использует отдельный SSH reverse forward на Windows loopback 18081,
Bearer credential нового профиля; существующий Observatory 18080 не меняется.
Credential хранится mode 0600 на Mac и с owner-only ACL на Worker.
Сцена импортируется штатным NVIDIA `omni.kit.converter.gsplat` 0.1.16 из Isaac.
Робот — готовый Jetbot и DifferentialController. Это проверка дифференциального
управления в симуляции, а не цифровой двойник конкретного ровера пользователя.
Восемь штатных USD-зависимостей Jetbot (31 942 456 bytes) подготовлены отдельным
`Prepare-RobotAssets.ps1`: повторный запуск больше не ждёт сетевой загрузки робота.
Перед регистрацией Worker сверяет все файлы с локальным SHA-256 manifest.
Трава — только визуальные splats. Начальный физический ground — скрытая плоскость;
рельеф, сцепление и сгибание растительности этим не моделируются.
Каждый шаг: новая камера RGB → DDRNet + RF-DETR → RoadPolicy → журнал решения →
speed/yaw-rate → 6 физических тактов по 1/60 с → отдельное подтверждение pose/time.
Физика не должна идти во время inference или рендера. Проверяется счётчик шагов.
Позы физического движка используются для размещения камеры и диагностики,
не передаются в RoadPolicy. Сохраняются кадры с SHA-256, decisions.jsonl,
motion.jsonl, snapshot локации/профиля и терминальный результат.
RoadPolicy — начальный camera-only follower: видимый связный участок дороги,
остановка при препятствии/отсутствии дороги и три свободных кадра до возобновления.
Это не Nav2, не метрическая оценка дистанции и не доказанный объезд препятствий.
Динамические люди/животные, тормозной путь, обход и повторы/coverage должны
проверяться отдельными сценариями. Первый природный проезд описан ниже.
## Фактически выполненная проверка
Первый bounded native probe: настоящий RTX RGB 800×600 → обе реальные модели.
Inference 156 / 78 / 79 ms на трёх одинаковых технических кадрах; решение no-road,
нулевая команда. Пауза не увеличила счётчик физики; явный step увеличил его на 6.
Это не FPS benchmark и не navigation acceptance. После probe подтверждено
отсутствие его kit process и model containers, сохранены прежние 21 container ID.
Локально: 69 backend tests по lifecycle/импорту/shared queue; дополнительно 51
проверка существующих AI Inference/LCC; 888 frontend tests до последнего малого
изменения ярлыка, затем 7 focused environment tests; production build и Ruff.
Браузером проверены оба профиля, прежние три LCC-локации, сохранение профиля,
форма импорта, сворачивание окна, отсутствие legacy в обычной навигации.
Первый полный PLY episode выявил отсутствие нового Python API
UsdVol.ParticleField3DGaussianSplat в bundled USD Isaac; заменён на штатный
совместимый GSplat Converter. Следующая попытка зависла на внешнем stock USD
робота и была завершена ограниченным таймаутом; поэтому зависимости сохранены
локально. Полный episode `airun-de5fdd342cff4d8994b0016ded5348f0` завершился с
3 samples / 3 applied steps / 18 физических тактов. Просмотр кадра выявил поворот
камеры; исправлен world-to-camera look-at transform, не изменяя модели.
Повтор `airun-6dc2d164cde04c70bec3348486bd63cc` использует исправленную камеру:
на изображении подтверждён горизонтальный грунт. Пауза удержала 4 applied steps,
один шаг увеличил счётчик строго до 5, Stop завершил прогон. Это 0.5 секунды
симуляции, все решения no-road, скорость 0.0. Проверенный release
`84302295451de631`, archive SHA-256
`440f6241af119ac9f63df94a68c99e2d7b724f0796dd999f12d23586a0b117b3`.
Совместная команда launcher+tunnel также проверена: отдельный episode остановлен
во время подготовки с нулём кадров и корректным освобождением ресурсов.
После GPU-проверок сохранён private `worker-preservation-report.json`: тот же
набор всех 21 container ID, без изменений image/status/restart/mounts/ports;
те же 108 image identities/tags и 9 volumes. Временных simulation processes нет.
Сравнение mounts нормализовано по Destination, поскольку Docker меняет порядок
их перечисления. Существующие конфигурационные файлы моделей не изменены.
Запуск и аварийное восстановление описаны в
`docs/runbooks/AI_POLYGON_WORKER_006.md`. Автоматический постоянный service не
устанавливался: coordinator запускается одной foreground-командой, idle не
занимает GPU. Глобальная эксклюзивность относительно отдельного Gaussian pipeline
не доказана; его задачи нельзя выполнять параллельно с этим профилем.
## Природный мир Forest Scan
После входа владельца в SuperSplat получен Forest Scan, Joshua Trapani (draftmode),
[источник](https://superspl.at/scene/259c0051), CC BY 4.0. Автор и лицензия
проверены по Download UI и `license.txt` экспортируемого архива. Browser export
оборвался; разрешённые публичные SOG assets той же сцены сохранены versioned
`fetch_sog.py` с SHA-256 manifest. Credentials/cookies не извлекались.
Исходные SOG/WebP assets занимают 31 446 214 bytes. Официальный
`@playcanvas/splat-transform` 3.4.0 подготовлен `Prepare-SplatTools.ps1` в отдельном
simulation/tools с pinned package-lock; глобальные npm/system settings не менялись.
Конвертация дала стандартный PLY: 2 142 439 splats, 505 617 082 bytes,
SHA-256 `432ee329fc75d86b50d0b577542adca579b0749b4939044fc3980f27b2618ece`.
PLY импортирован через штатный возобновляемый API и повторно проверен Worker.
В библиотеке доступен `aiworld-689fce22369f41158ffd1030bad35c0a`.
На момент первого этапа Bamboo Trail ещё не был загружен. В последующей
операторской ревизии он скачан, импортирован и проверен реальным episode.
Авторская камера и фактическое преобразование viewer сопоставлены с Isaac Z-up:
rotation [-90, 0, 180], spawn [0.522299, -0.517838], heading 137.690214°,
ground Z -0.065, camera height 0.8, max speed 0.15. Масштаб 1 unit = 1 m принят
условно: метрическая калибровка по измеренному объекту ещё не выполнена.
Короткий episode `airun-5ff180262220435faa39a814260dae7b` дал 5 samples / 5 applied
и ненулевую команду по видимой лесной тропе. Следующий
`airun-321bb7cb732b4ab59aee77d60ee978af` завершён: 100 samples / 100 applied /
600 physics ticks, 10 секунд времени симуляции. Первые 2 решения uncertain с
нулевой скоростью, затем 98 road с движением. Длина траектории по физическим
позам — 1.421741 м в принятом масштабе сцены. Inference: min 94, median 156,
p95 172, max 296 ms. Проверены последовательность receipts, шаг времени и SHA-256
всех 100 кадров. Это latency моделей в lockstep, не FPS реального времени.
На исходной картинке есть деревянная ступень поперёк тропы. Текущая модель не
считала её препятствием; у неё нет collision, поскольку физический ground пока
плоский. Поездка подтверждает связку реальная Gaussian-камера → существующие
модели → решения → движение, но не безопасное преодоление ступеней, объезд,
тормозной путь или реакцию на людей/животных. Такие сценарии остаются открытыми.
Private evidence: `outputs/ai-polygon-2026-09-21/forest-drive-report.json`,
`forest-drive-run.json`, `forest-drive-decisions.jsonl`, `forest-drive-motion.jsonl`,
`forest-drive-final.jpg`, source manifest и `worker-preservation-final.json`.
После природного episode прежние 21 контейнер / 108 образов / 9 volumes сохранены;
свои native processes, временные model containers и active/lock markers очищены.
Техническая синтетическая сцена и её 5 прогонов архивированы отдельно от обычной
библиотеки; Forest и оба природных результата оставлены оператору.
Камера результата и preview используют общий fullscreen hook; Escape возвращает
обычный размер и не вызывает действие оболочки. Направление preview исправлено:
CameraControls получает focus point по стартовому heading, а не центр координат.
Полноэкранный лесной preview и Escape проверены после final production build;
затем 3D закрыт для освобождения ресурсов Mac. В кадре показаны скорость и
поворот, отсутствие кадров после раннего Stop обозначено явно.
Для операторского handoff оставлен foreground coordinator через `start_worker.py`
без `--once`: он поддерживает соединение, но не запускает Isaac/модели до команды
в UI. OS service/автозапуск не установлен. Core 8000 оставлен работающим.
## Первичные источники
- https://docs.isaacsim.omniverse.nvidia.com/6.1.0/installation/download.html
- https://docs.isaacsim.omniverse.nvidia.com/6.1.0/installation/install_workstation.html
- https://docs.omniverse.nvidia.com/materials-and-rendering/latest/particle-fields.html
- https://superspl.at/scene/259c0051
- https://superspl.at/scene/dd49e9a8
Контрольная точка не выдаёт допуск к физическому аппарату. Все команды имеют
virtual-only authority; VESC/ASVD adapters отсутствуют.