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

19 KiB
Raw Blame History

AI-полигон: отдельный профиль Gaussian / Isaac

Этот документ фиксирует первый интеграционный этап. Текущее состояние UI, две скачанные локации, исправление Stop и измерения полного цикла описаны в операторской ревизии. Действующий 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), источник, 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 оставлен работающим.

Первичные источники

Контрольная точка не выдаёт допуск к физическому аппарату. Все команды имеют virtual-only authority; VESC/ASVD adapters отсутствуют.