docs(simulation): record polygon experiments and bounded route acceptance

This commit is contained in:
DCCONSTRUCTIONS
2026-09-25 16:40:46 +03:00
parent e627500295
commit dad11b47d7
8 changed files with 1962 additions and 0 deletions
@@ -0,0 +1,217 @@
# 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 отсутствуют.
@@ -0,0 +1,142 @@
# AI-полигон: операторская ревизия
## Причина и результат
Владелец обнаружил реальные дефекты первой поверхности: разделение на «Мои» и
«Готовые» локации, внешние синие ссылки вместо подготовленных файлов, автоматически
открытый кадр старого прогона, отсутствие видимого ровера и неясное состояние Stop.
Техническая связка камеры и моделей ещё не давала удобной наблюдаемой симуляции.
Теперь библиотека содержит только «Доступные локации»: скачанные Forest Scan и
Bamboo Trail с действием «Открыть». Нижний preview, внешний каталог, список
исторических кадров и raw links удалены из этой поверхности. Авторство и лицензия
сохранены у каждой сцены. LCC Gaussian Mirror и AI Inference остаются отдельными.
Открытая локация имеет явный заголовок, включая fullscreen. Один viewer переключает
«За ровером», «Обзор» и «Камера AI». Первый показывает упрощённый ровер с размерами
колёс/колеи Jetbot по фактическим XY/yaw из applied receipt; второй даёт свободный
обзор; третий показывает именно RGB из Isaac, переданный моделям. Это не экспорт
точной модели Jetbot и не цифровой двойник физического аппарата владельца.
Отрисовка интерполирует только уже полученные позы, не вычисляет свои команды или
физику и не подменяет кадры inference. В режиме камеры 3D rendering приостановлен.
Кнопки паузы/шага/Stop и состояние находятся внутри fullscreen viewer. Подготовка
показывает стадии мира, моделей и камеры. Stop сначала показывает остановку,
после cleanup — «Остановлено · inference выключен». Пауза показывает нулевое
движение, без устаревшего показателя скорости. Конечная поза текущего прогона
сохраняется; старые прогоны сами в библиотеке не открываются. При отсутствии
первого кадра завершённый прогон не продолжает показывать ожидание камеры.
Использованы существующие Button, IconButton, SegmentedControl, StatusBadge,
LoadingRegion, GlassSurface из NODEDC Design Guideline и отдельный domain renderer.
Новых продуктовых корней или локальных замен дизайн-компонентов нет.
## Bamboo Trail
[Источник](https://superspl.at/scene/dd49e9a8), автор luckysplat, CC BY 4.0.
Лицензия и разрешённая загрузка проверены в авторизованном SuperSplat Download UI.
Его Source action не дал файл; сохранены публичные assets именно опубликованного
viewer и SHA manifest, без извлечения cookies или credentials.
`fetch_lod.py` выбирает полный опубликованный LOD0 из manifest и архивирует 11 SOG
chunks через `fetch_sog.py`. Добавлена обработка gzip JSON. Официальный закреплённый
SplatTransform 3.4.0 через `Prepare-Scene.ps1` собрал обычный PLY без перезаписи
предыдущего результата; LOD0 содержит 5 818 957 splats, SH degree 0.
- PLY: 325 861 955 bytes.
- SHA-256: `d7f2aad3240cc1a7369eb0d8b0d4c96a9cadbe07ee352c25d297b1037a812824`.
- World: `aiworld-7a58431a5551469cbbf0e8a4efef2a8b`.
- Rotation [-90, 0, 180], ground Z -2.418, spawn [-0.696364224, -0.696364224],
heading 22.55°, camera height 0.8, max speed 0.15, условный scale 1.
Файл импортирован штатными блоками по 4 MiB, хеш проверен при завершении и на
Worker. Native Isaac успешно создал camera RGB; конвертированный USD закеширован.
Первый запуск был долгим из-за конвертации 5.8 млн splats. При исходном heading
47.55° камера смотрела на край тропы и камни, первые 15 решений были no-road.
Heading повёрнут на 25° вдоль видимой тропы, после чего выполнен полный тест ниже.
## Причины задержки и сбоя Stop
В пользовательском `airun-2b1d079ab6b04df3a39019d664c75329` фактически выполнено
54 samples / 54 applied. Native process завершился одновременно с taskkill;
его exit code 255 был ошибочно принят coordinator как сбой. Isaac и временные
модельные контейнеры уже отсутствовали, но UI получил failed вместо stopped.
`worker.py` теперь ожидает действительное завершение дочернего процесса и допускает
гонку с уже вышедшим процессом. После cleanup он заново читает control/state, чтобы
конкурентный Stop не превратился в completed или failed. `model_stack.py` проверяет
отмену при подготовке моделей. Core принимает промежуточные стадии подготовки,
не объявляя running до первого sample. Reservation освобождается только после
завершения native process и удаления собственных container IDs.
UI ранее опрашивал каталог раз в 1.5 с и пропускал промежуточные кадры; теперь
активный прогон опрашивается с интервалом 200 мс, с одним последовательным запросом.
Постоянные HTTP connections сокращают повторные TCP handshakes; соединение
пересоздаётся после простоя >2 с, чтобы не переиспользовать истёкший server keepalive.
Неопределённые mutation requests автоматически не повторяются. RTX subframes: 1.
Applied receipts получили yaw и измерения полного цикла/render/transport.
Physics остаётся lockstep: ровно 100 мс симуляции за решение, 6 ticks по 1/60 с;
во время ожидания моделей мир не движется. Плавность browser viewer не означает
такую же частоту камеры или решений. Это ещё не realtime 1×.
## Проверки на Worker
| Проверка | Фактический результат |
| --- | --- |
| Forest через UI, `airun-5950929b54754077a3f21ae64ea1e8a5` | 87 samples / 87 applied; stopped |
| Пауза Forest | Счётчик удержан на 86 через 1.2 с; один шаг дал строго 87 |
| Полный цикл Forest | Медиана 313 мс; render 62 мс; transport до receipt 47 мс; inference 156 мс |
| Bamboo, `airun-a10fe72eddca48548ab8ec23e4f59d38` | 120 samples / 120 applied; completed; 26 road, 17 uncertain, 77 no-road |
| Полный цикл Bamboo | Медиана 297 мс; inference 156 мс |
| Stop во время движения, `airun-9015f6ab095848e78db24b6dcda5045d` | 6 samples / 6 applied; stopped через 2.17 с после запроса |
| Stop при загрузке моделей, `airun-1c2c258e1211459dbbfe471a9fb1b958` | 0 samples; stopped; подготовка отменена |
| Stop из fullscreen, `airun-e9be1e3e45e84f71862a9c0b7eddcda0` | 0 samples; «Останавливаем…» → «Остановлено · inference выключен» |
Проверены SHA-256 всех 87 Forest-кадров. Bamboo дал движение, затем остановку
при недостатке уверенно распознанной дороги; это не прохождение всей тропы.
Полный цикл соответствует примерно 3.2–3.4 решениям/с и 0.32–0.34× simulation time.
Ранее указанные 156 мс — только latency моделей, не полный FPS системы.
Локально: 71 backend test (AI-полигон и shared recorded queue) прошёл, после
корректировки starting/running повторены 19 AI-полигон tests. Добавлены регрессии
для startup progress и гонки taskkill. Frontend full pass: 891/892; единственная
ошибка была старым ожиданием соседнего Rerun camera-journal теста. Оно исправлено
в его задаче; затем все 11 focused architecture/simulation/camera-journal tests
прошли. Финальные production build/typecheck, Ruff и diff whitespace check прошли.
В фактическом браузере проверены обе сцены, движущийся pose marker, камера AI,
пауза, step, Stop, свободный обзор, fullscreen с доступным Stop и Escape. После
финального build проверены название в fullscreen и библиотека без нижнего preview.
Тяжёлый 3D закрыт, оставлена библиотека из двух локаций на Core 8000.
## Сохранение окружения и handoff
Release `0af432ce95816402`, SHA-256 архива
`47230a1d1a2cffe3dd448e5e0fb5aef354bba4ee4ad6a0d7008791593cd1e0b9`.
После проверки сохранены все прежние 21 container ID и их image/status/restart,
mounts, memory/GPU bindings и настроенные PortBindings; все прежние 108 image
identities/tags и 9 volumes. Runtime NetworkSettings.Ports не подменяет сравнение
настроенных PortBindings. Отдельная соседняя задача добавила CPU-only контейнер
`ndc-rerun-navigation-build` и свой образ; они не относятся к AI-полигону.
В 18:48 UTC собственных kit.exe и model containers нет, active_run null.
Оставлен один idle coordinator PID 19724 с worker.lock, через foreground launcher
session 21791 и private reverse forward 18081. Автозапуска OS нет. Core 8000 жив;
8765 не слушает. Существующие AI Inference/KB4 конфигурации не менялись.
Запуск/остановка описаны в [runbook](../runbooks/AI_POLYGON_WORKER_006.md).
Private evidence: `outputs/ai-polygon-2026-09-21/revision-2/`: forest-performance,
bamboo-performance, pause-verification, stop-qualification, worker-inventory,
worker-preservation, operator-handoff JSON; исходные receipts и RGB рядом.
Архивы Bamboo и manifests находятся в родительском private outputs directory.
Промежуточные неуспешные попытки и пользовательский failed run сохранены.
## Оставшаяся граница
Это наблюдаемая лабораторная симуляция с реальным inference, но ещё не принятая
автономная навигация. Масштаб некалиброван, физическая земля плоская. Деревянная
ступень Forest не имеет collision и раньше не была распознана как препятствие.
Трава только визуальная. Объезд, тормозной путь, устойчивое движение по длинной
тропе, динамические люди/животные и глобальный GPU arbitration требуют отдельных
контролируемых сценариев. Физические VESC/ASVD-аппараты в этом контуре отсутствуют.
@@ -0,0 +1,190 @@
# AI-полигон: исполнение на Worker и потоковый операторский просмотр
## Решение и текущий статус
Требование владельца от 21.09.2026 реализовано: в профиле AI-полигона мир,
физика, камера, AI, управление виртуальным ровером и журналы исполняются на
Worker 006. Mac принимает готовое NVIDIA WebRTC-видео и небольшой snapshot.
Локальный `AiWorldPreview` с PlayCanvas/PLY удалён. LCC Gaussian Mirror остаётся
отдельным профилем; изменения не переносятся на его собственный renderer.
Размещение принято на основе MISSIONCOR-76 / Mission Core Node: один локальный
владелец исполнения, отдельные control/media/telemetry и локальное хранение.
Повторно использованы существующие Worker tunnel18080 и модельные образы.
Go/Linux Node service не скопирован на Windows; готового AI-autonomy service в
Node нет. Добавлен узкий host coordinator симулятора.
Новый runtime — лабораторная основа для проверки AI. Его realtime-размещение
и цикл подтверждены; прохождение длинной грунтовой дороги, объезд, точный
тормозной путь и реакции на динамических людей/животных пока не приняты.
## Схема
```text
Worker 006, Windows / RTX4090
Isaac6.1: Gaussian + метрический ровер + physics60Hz + sensor800×600
RGB -> очередь последнего кадра -> локальные DDRNet / RF-DETR
-> RoadPolicy -> виртуальные приводы
viewport -> NVIDIA encoder -> Tailscale WebRTC -> HTML video на Mac
timestamps / motion / decisions / camera archive -> локальный диск
persistent coordinator <-> существующий tunnel18080 <-> Core8000
Mac: операторские команды, подтверждённые состояния, telemetry и video decoder
```
В render/physics loop нет CoreClient, HTTP к Mac, per-frame ACK или ожидания
моделей. Coordinator обменивается управляющими файлами/snapshots с native child;
зависший управляющий HTTP не является частью физического tick. AI имеет отдельный
поток и одно ожидающее изображение: новый кадр заменяет старый, очередь не растёт.
Наблюдение/команда старше500мс дают нулевую команду, физическое время идёт дальше.
Pause инвалидирует уже начатый inference; Resume требует новые ясные наблюдения.
Штатный Isaac6.1 throttling при Play включал manual loop, из-за чего первая
проверка дала0.47×. Исправлены все три управляющие настройки — fixed timeline,
manual main loop и enable_manualmode расширения throttling. PhysX продолжает
исполнять дискретные шаги1/60с, накапливая их по wall-clock. Измерение основано
на фактическом числе physics steps; 30FPS видео отдельно измеряет браузер.
## Runtime и установка
- Native Isaac6.1.0 и существующий `observatory-ai-modules/20260904-v14` сохранены.
- NVIDIA `@nvidia/ov-web-rtc`6.7.0 взят из официального registry, версия закреплена.
- Windows Scheduled Task `ndc-ai-polygon-worker`: при входе текущего пользователя,
не зависит от foreground SSH или viewer. Не заявляется работа до Windows login.
- Windows Job Object закрывает native потомков при аварии coordinator; точные
container IDs сохраняются для восстановления и очистки. Core не освобождает
GPU reservation только по пропавшему heartbeat: требуется реальный finish.
- Управление через существующий приватный туннель18080; отдельного18081 больше нет.
- Direct stream1280×720 по TCP49100/UDP47998. Allow ограничен процессом Kit,
приватным адресом Worker и текущим Tailscale-адресом Mac. Существующие Windows
Block rules сохраняются для всех остальных портов/адресов; rollback записан.
- Операторский video input inert: клавиатура/мышь не управляют произвольным KitUI.
Camera переключается явной командой Worker. NVIDIA допускает один viewer.
Финальный release: `a25fa4f008a18cbf`, 551 файлов; SHA-256 архива:
`177aeb640398ef2aeac46f07ddbe731078ea36f85c811111d57a82ea3b5ddd55`.
Проверены архив и все файловые hashes до установки. Модельный профиль:
`e505cc842575d96a4993765cfba19fea8a95e6c98ff613996d87e3887be79ecb`.
Scene provenance включает runtime, очередь, IPC, inference adapter, policy и
контракты; robot и models имеют отдельные hashes. Private archives/manifests:
`outputs/ai-polygon-2026-09-21/realtime/`.
Промежуточный Forest performance release `ed210b04d0fd858b` имел те же clocks,
renderer и robot; финальный release дополнительно сбрасывает накопленную ясность
дороги при Resume, корректно различает первоначальную загрузку AI и последующий
отказ inference, расширяет source identity и ограниченно повторяет локальный IPC при кратком Windows sharing conflict. Установщик сам проверяет плоский файловый manifest и сохраняет verified_files; пустой manifest не допускается.
## Геометрия и данные
Ровер заменён с Jetbot на four-wheel differential articulation. Полный footprint
1×1м; radius0.15м, track0.9м, масса24кг — явно временные параметры. Визуальная
геометрия и collision находятся в одном профиле. Камера расположена перед мачтой:
первая проверка обнаружила самоокклюзию, после исправления модели видят дорогу.
Физические VESC/ASVD и управление настоящими аппаратами отсутствуют.
Forest:2 142 439 splats,505 617 082bytes,CCBY4.0,draftmode,
SHA432ee329fc75d86b50d0b577542adca579b0749b4939044fc3980f27b2618ece.
Bamboo:5 818 957splats,325 861 955bytes,CCBY4.0,luckysplat,
SHAd7f2aad3240cc1a7369eb0d8b0d4c96a9cadbe07ee352c25d297b1037a812824.
PLY/USD кэшируются на Worker; при открытии браузер их не загружает.
Grass visual-only, физическая земля — скрытая плоскость. Единицы Gaussian пока
не подтверждены измеренной опорой. Это не калиброванный физический двойник.
Inference получает локальный несжатый RGB до streaming encoder. Evidence
сохраняется на Worker: motion/decisions timestamps, commands, boxes, JPEG90
копии использованных кадров и ихSHA. JPEG архив не называется lossless raw.
Полного автоматического archive sync на Mac в этом этапе нет.
## Операторский интерфейс
Сохранена существующая поверхность «Симуляции» с переключателем профиля.
Библиотека содержит только доступные Forest/Bamboo, без магазинных ссылок,
нижних превью и автоматически показанных старых кадров. «Открыть» отдельно
от «Запустить AI». Круглая стрелка назад закрывает просмотр, сохраняя episode.
Повторное открытие присоединяет тот же run. Pause и Stop имеют подтверждение
Worker; Stop становится терминальным после освобождения native/model ресурсов.
Fullscreen сохраняет кнопки и имя сцены. Камеры follow/overview/AI исполняются
на Worker. Поля FPS/AIHz/RTF/возраст кадра больше не смешиваются.
## Измеренная приёмка
Forest run `airun-b2275571be9941e7b2e45ad104af1ec9`,35 snapshots в steady-state:
| Метрика | Минимум | Медиана | Максимум |
|---|---:|---:|---:|
| Физическое/реальное время |0.969×|1.000×|1.033×|
| Render loop |23.62FPS|28.00FPS|28.00FPS|
| Камера→очередь AI |9.69FPS|11.29FPS|12.00FPS|
| Завершённые решения |8.00Hz|10.83Hz|12.00Hz|
| Inference |62мс|93мс|109мс|
| Возраст кадра |140мс|172мс|219мс|
Браузер показывал27–30декодируемыхFPS. Внутри замера ровер изменил позицию;
наблюдались решения road/uncertain/no-road/obstacle. Обнаружение obstacle здесь
не доказательство правильного распознавания реального препятствия: требуется
отдельная размеченная приёмка.
Pause удержал6сек: sim70.9с,4254physics steps,686решений и одна pose без изменений.
При закрытом viewer за6сек physics time вырос98.8→104.583с, решения993→1059;
повторное открытие восстановило видео того же run. Stop завершился за3.23с
включая освобождение native process и двух model containers.
Backend26/26: ownership/ACK, идемпотентность, disconnect/restart reconciliation,
сохранение reservation, отсутствие Mac frames, bounded queue, stale-source stop,
отсечение результата послеPause и свежие наблюдения послеResume. Frontend895/895,
architecture4/4,typecheck,production build прошли последовательно. Ruff прошёл.
Bamboo run `airun-43bc42b3def04d5091330c5ea3c28062` на release7536f11d4ae78371:
25 steady-state snapshots, RTF0.969–1.022× (медиана1.000), render28FPS,
camera12FPS, AI11Hz, inference79мс, frame age172мс (медианы). До выборки
были11road и13uncertain решений, затем no-road и остановка. Это не прохождение
всей тропы. Во время сцены GPU50%, VRAM7606MiB из24564MiB.
После финального frontend build браузером проверены follow/overview/AI,
fullscreen с именем и управлением, Escape и Stop изfullscreen. DOM во время
реального Bamboo-видео содержал0canvas; сцена в браузере не рисуется.
Переключение вида меняет Workercamera, видео восстанавливается после возврата.
Последующее исправление Windows IPC не меняет scene/clock/model algorithms.
Финальный smoke `airun-99d524b99f8444819ba299841805353b` на release
a25fa4f008a18cbf естественно завершился: 30сек,297решений,медианаRTF1.0.
Отдельная проверка `airun-9669437638ec499fa63b165ad75e63b6` подтвердила29FPS
видеопотока после конечной установки firewall: прежние Kit rules явноBlock,
остальные адреса на streaming ports блокируются, Allow только оператору.
Оба прогона завершены. Installer receipt: verified_files=551.
Финальная Docker-сверка: все21исходных container ID, полныеConfig/HostConfig,
109image identities/tags и9volumes сохранены без различий. Private evidence:
`preservation-proof.json`, `worker-before.json`, `worker-after.json`. После QA
нет active.json, nativeKit и временных AI modelcontainers; сервисWorker idle,
Core8000 доступен, обе локации available. Ops MISSIONCOR-83 обновлён фактическими
результатами; общая автономия остаётся InProgress.
## Ограничения и следующий этап
Функциональная симуляция с наблюдением принята отдельно от качества autonomy.
RoadPolicy — camera-only baseline, не маршрутный планировщик и не оценка
метрической дистанции. Нужны калиброванный масштаб, грунтовый collision/terrain,
профиль динамики аппарата, сценарии obstacle/braking/avoidance/dynamic actors.
Одновременно квалифицирован один виртуальный ровер и один комплект моделей;
две параллельные симуляции требуют отдельного GPU-бюджета.
Разрыв viewer проверен на работающем Worker. Core restart/lease recovery проверены
контрактными тестами; общий действующий tunnel не отключался ради эксперимента.
Полный end-to-end hard network outage и host crash drill не заявлены пройденными.
При потере Core лабораторный run продолжает последнюю команду до локального
лимита времени с локальным AI watchdog; потеря связи не означает подтверждённыйStop.
Existing AI Inference reservation соблюдён. Отдельные Gaussian jobs пока не
используют общий GPU broker и не запускаются параллельно. Задержки на4090 не
доказывают быстродействие будущего onboard hardware. Docker profiles/images/
weights сохранены; неподтверждённый ускоренный DDRNetTRT не подменяет reference.
## Официальные источники
- [Native streaming](https://docs.isaacsim.omniverse.nvidia.com/6.1.0/installation/manual_livestream_clients.html)
- [Web Streaming Library](https://docs.omniverse.nvidia.com/ov-web-sdk/latest/web-streaming-library/overview.html)
- [Isaac clocks](https://docs.isaacsim.omniverse.nvidia.com/latest/sensors/isaacsim_sensors_multitick_rendering.html)
- [Throttling/manual loop flags](https://docs.isaacsim.omniverse.nvidia.com/6.0.0/overview/troubleshooting.html)
- [Timing examples](https://docs.isaacsim.omniverse.nvidia.com/latest/replicator_tutorials/tutorial_replicator_isaac_snippets.html)
Рабочая инструкция: [Worker006 runbook](../runbooks/AI_POLYGON_WORKER_006.md).
@@ -0,0 +1,186 @@
# AI-полигон: композиция восприятия и движение по рельефу
Дата: 2026-09-22. Статус: работающий лабораторный контур; прохождение целой
тропы и перенос на физический аппарат не приняты.
Исправление оценки Forest, 2026-09-22: повторный разбор сохранённых quaternion
показал переворот (конечный крен около 178°, отклонение от вертикали около 168°).
Прежняя формулировка «остановка перед препятствием» была неверной. Этот заезд
не подтверждает проходимость; смещение включает движение опрокинутого аппарата.
Исходные журналы сохранены без изменений.
## Архитектура
Worker 006 выполняет native Isaac Sim 6.1, физику, Gaussian-рендер, синтетическую
камеру/лидар, три изолированных AI-модуля и архивирование. Mac получает WebRTC
видео и ограниченную телеметрию. Виртуальные команды не соединены с VESC/ASVD.
LCC остаётся отдельным профилем. Физика работает по реальному времени около
60 шагов/с; камера и inference имеют собственную частоту около 5 Гц. Очередь
наблюдений — один последний кадр, возраст команды/наблюдения ограничен 500 мс.
Пауза останавливает физическое время и новые решения; продолжение очищает
каузальное состояние навигации. Stop освобождает native-процесс и собственные
контейнеры, не затрагивая остальные стеки Worker.
Основной проверенный release: `be76ce84ecc2b5a4`, 573 файла. Полная identity:
`be76ce84ecc2b5a42047d12b3109ab334747310e5fdbb1be96387bb39cc02628`.
SHA-256 tgz: `feea17166735cdd676e46476e99336233c55ef22c931761cb5613e23dd9a0873`.
## Готовые компоненты и общая композиция
Используется общий `ModuleRegistry / ModuleSpec / CompositionSpec` с отдельными
портами pinhole-симуляции и режимом `worker-local-simulation`. Выбор фиксирует
идентичности образов, checkpoint, параметров и адаптеров; произвольный код
из формы не принимается. Два независимых модуля восприятия выполняются
параллельно, навигация запускается после получения зависимостей.
- NVIDIA SegFormer B2 ADE150: семантические кандидаты поверхности; исходные
class IDs сохраняются. Официальный checkpoint revision
`de01bae28967510f9ddd496c60a969357195400c`, SHA-256
`187ca07bea003a5717c63d04ea90b07f33cd033c0ebf44b4b89fce5070d6c8f3`.
Лицензия research/evaluation соответствует лабораторному применению;
коммерческое применение этим отчётом не разрешается.
- Существующий RF-DETR Large: обнаружение людей/животных. Изображение, checkpoint
и остальные профили не заменялись.
- CMU `terrain_analysis / localPlanner / pathFollower`, ROS2 Humble, upstream
`158e67b31b644ed1e8b06eb1d7f70e183cc62591`: готовый анализ рельефа, поиск локального
пути и команды скорости/поворота. C++ upstream не переписан. Интеграционный
монитор дополнительно проверяет квадратный корпус на дуге текущей команды.
DDRNet GOOSE64 сохранён как альтернативный модуль. На кадрах Bamboo он относил
значительную часть грунта к forest/snow. Проверка численного декодирования
не подтвердила объяснение через sigmoid: результат практически совпал с logits.
Добавлен другой готовый сегментатор; классы forest/snow не объявлены дорогой.
AI получает только камеру, калибровку, наблюдённый лидар и позу. Геометрия мира,
карта препятствий и готовая траектория в планировщик не передаются. Семантическая
локальная цель выбирается из наблюдённых точек; её достижимость проверяет CMU.
## Рельеф и аппарат
Collision mesh подготовлен SplatTransform 3.4.0 из тех же Gaussian-данных.
Проверяются SHA-256 источника/меша, преобразование осей, масштаб и охват тайла.
Параметры: voxel 0.06 м, opacity 0.25, floor-fill 0.3 м. Старт проверяет локальную
опорную плоскость под корпусом и остаточную неровность. Наклон плоскости больше
не принимается за высокий отдельный камень. Положение Bamboo сдвинуто на 0.447 м
к устойчивой опоре; масштаб и направление сцены не менялись.
Корпус 1 × 1 м, четыре колеса с независимым управлением левым/правым бортом,
радиус 0.25 м, база 0.5 м, колея 0.9 м, масса 24 кг. Материалы шин и грунта
задают явное трение. Это лабораторные допущения, а не калибровка настоящих
аппаратов. Подвеска и деформация гусениц не моделируются. Команды применяются
через live Articulation tensor API; положение также считывается из физики.
Текущие пределы навигации: препятствие выше 0.18 м, локальная цель с уклоном
до 25°, остановка при наклоне 30°. Поиск пути предлагает кандидаты; отдельный
монитор квадратного footprint учитывает углы корпуса при движении и повороте.
Отсутствующие дальномерные данные и обрывы ещё не прошли сценарную приёмку.
## Проверки
Пять независимых сценариев установленного CMU-модуля прошли: свободная плоскость;
поворот от стены; остановка в замкнутом ограждении; проезд метрового аппарата
по коридору шириной 1.3 м; отказ от коридора шириной 0.9 м. Это проверки навигации
по синтетическим наблюдениям, отдельно от сегментации и физики.
Native-физика: команда 0.3 м/с на плоскости за 5 с дала 1.491 м; после нулевой
команды за следующие 2 с дополнительное перемещение 0.00345 м, скорости всех
колёс — ноль. Это не измерение тормозного пути настоящего ровера на грунте.
| Заезд | Наблюдения | Смещение от старта | Сумма отрезков позы | Итог |
| --- | ---: | ---: | ---: | --- |
| Forest `airun-3664b7dec1024dbe984aaf82a11147cc` | 425 | 2.461 м | 3.572 м | переворот; проезд не принят |
| Bamboo `airun-ee35c3d01b88438484ed795e07bc5518` | 490 | 1.491 м | 3.575 м | движение, пауза/продолжение, затем остановка |
Forest выполнен на предыдущем `d73e7ff17e7dd6e0` с тем же профилем колёс,
материалов и навигацией, до перевода чтения позы на tensor API. Bamboo —
на `be76ce84ecc2b5a4`. Сумма отрезков включает покачивания корпуса: её нельзя
называть длиной успешно пройденного маршрута. Медиана inference обоих заездов
94 мс. Физическое время при движении близко к реальному; observer около
14–20 FPS в Forest и 18–21 FPS в Bamboo. Видео на паузе достигало 29 FPS.
Пауза Bamboo: два снимка с интервалом 5 с сохранили одинаковые 22.55 с
физического времени, 1353 физических шага, 106 решений и позу. После продолжения
физика и inference возобновились. Ошибки устаревшего ROS-состояния устранены
заменой всего процесса адаптера вместе с DDS-контекстом при reset;
перезапуска только трёх дочерних ROS-узлов было недостаточно. Внутренний DDS
использует loopback UDP. Изменение transport само по себе проблему не решало.
IPC coordinator/Isaac заменён на SQLite WAL: частая атомарная замена JSON
на Windows давала ошибки совместного доступа. Проверено 1000 конкурентных
операций чтения/записи на Worker.
Локальные проверки: 35 backend-тестов AI-полигона, 7 проверок общей композиции,
900 frontend-тестов, 4 architecture-теста, TypeScript и production build прошли;
ruff для изменённого simulation-кода прошёл. Тяжёлые локальные проверки шли
последовательно, Docker Desktop на Mac не запускался.
## Операторский интерфейс и WebRTC
Имя и круглая кнопка назад слева; «Старт и масштаб», запуск/пауза AI и завершение
справа в одной закреплённой строке. Автор/лицензия остаются в каталоге, из
активной сцены убраны. Скорость/время слева над viewport, подключение справа.
Viewport округлён; переключатели камер и fullscreen находятся внутри сверху.
Открытие карточки мира не стартует native-процесс: перед явным запуском можно
выбрать общую композицию. В активном прогоне настройки доступны для чтения.
При browser QA обнаружен отдельный сбой: холодный старт на паузе иногда не
получал первый WebRTC offer, хотя native-рендер и телеметрия уже работали.
Рабочий запуск с автоматическим Play давал видео. Observer теперь имеет
корректную позу до первых кадров прогрева. Клиент ждёт финального callback
подключения перед terminate: connect() NVIDIA SDK возвращает IN_PROGRESS,
а terminate во время STARTING не освобождает соединение. Повторные подключения
сериализованы; ожидание ограничено настройками SDK.
Исправление установлено в release `c6182301817d8e7d`, 573 файла:
identity `c6182301817d8e7dd88bf1879ee47dd7fa046a57c35deb2c7b4b43c68b94b844`,
tgz SHA-256 `47cfcd99cc4b959c857cce8ea82018e7be8192882a8be0f37241801b646b63ef`.
Заезд UI-приёмки: `airun-7d3cde3100a640b990a98e0f533d987f`.
Холодное открытие на паузе показало 29 FPS при нулевых физическом времени
и количестве inference. Возврат в каталог и повторное открытие присоединили
тот же прогон с 28 FPS. Fullscreen сохранил управление; Escape вернул обычный
размер. AI запустился с видео около 19–20 FPS. Финальный Stop подтвердился
состоянием stopped: active marker отсутствует, native Kit и контейнеров
симуляции нет, остались 8 прежних работающих контейнеров. Core8000 доступен.
TypeScript и production build повторно прошли после этой поправки.
Это ограниченная браузерная проверка, не длительный тест сетевых отказов.
## Сохранность окружения и ограничения
Сопоставлены 21 исходный container ID, имена, image IDs, restart-политики,
mounts (без учёта порядка), memory, GPU requests и port bindings: различий нет.
108 прежних image IDs и 9 томов сохранены. Полный старый Config-hash не использован
как доказательство: формат его исходной сериализации не восстановлен.
Новые образы добавлены отдельно; существующие профили не переписывались.
Во время диагностики найден собственный старый PowerShell-процесс, раздувшийся
при глубокой сериализации CIM до 71.74 ГБ RAM. Он идентифицирован по точной
команде и её хешу и завершён; затем свободная память Worker выросла до 84.84 ГБ.
Другие процессы по имени PowerShell не завершались. Диагностика далее сериализует
только примитивные поля.
Gaussian-меш пока не различает мягкую траву и твёрдые препятствия. Часть листвы
может стать коллизией; незакреплённый реальными измерениями масштаб сцены также
влияет на проходимость. Полное прохождение тропы, устойчивое восстановление
после тупика, обрывы, динамические люди/животные и реалистичный грунт не приняты.
Короткое движение и синтетические проверки не заменяют эти испытания.
## Артефакты и следующий этап
Исходные кадры, labels, range NPZ, решения, motion, composition, terrain и
robot-profile хранятся в `simulation/state/<run_id>/` на Worker. Кадры и частные
журналы не добавляются в Git. Локальные redacted-сводки и хеши сохраняются
в `outputs/ai-polygon-2026-09-22/composed-navigation/`.
Worker qualification-manifest SHA-256: Forest
`53c03503e0d0b1fd75f7c64a3bb78fbbf00f0733e6dd000aa62151b8fcfbccf7`
(1711 файлов, 62903005 bytes); Bamboo
`74dc5c3f369c51e8966d967a41c1c78db99ed5f164afa4ab4878ad337e507121`
(1974 файла, 88958576 bytes).
Следующая приёмка: метрическая опора сцены; семантическая обработка растительности
в collision proxy; длинный маршрут с заданной целью и восстановлением;
сценарии обрыва и пересечения пути динамическим объектом. Нельзя получать
«успешную езду» снятием проверки препятствий или уменьшением корпуса.
Источники: [SegFormer](https://huggingface.co/nvidia/segformer-b2-finetuned-ade-512-512),
[CMU autonomy stack](https://github.com/HongbiaoZ/autonomous_exploration_development_environment/tree/158e67b31b644ed1e8b06eb1d7f70e183cc62591),
[Omniverse WebRTC](https://docs.omniverse.nvidia.com/ov-web-sdk/latest/web-streaming-library/overview.html).
@@ -0,0 +1,62 @@
# AI-полигон: компоновка и остановка Bamboo
## Изменение интерфейса
По замечаниям оператора viewport использует `--nodedc-radius-panel` и обрезает
содержимое по этому радиусу. Статус, управление запуском/паузой/завершением и
телеметрия вынесены над viewport. Переключатель камер находится в его верхнем
левом углу, каноническое разворачивание — в верхнем правом. Общий fullscreen
контейнер сохраняет название локации и управление над изображением.
Заголовок локации исключён из прокручиваемой области: прокручивается только
содержимое под ним. Профиль и Bamboo Trail больше не перекрывают друг друга.
Контракты Worker, inference, модели, физика и пороги управления не изменялись.
## Проверка
Последовательно прошли architecture 4/4, TypeScript, frontend 895/895 и
production build. В браузере на каноническом `127.0.0.1:8000` проверены
скругление, перенос управления, прокрутка, follow/overview/AI-camera,
fullscreen и Escape. При прокрутке содержимого на 255 px заголовок остался
на y=250.375 px; управление геометрически находится выше viewport.
Видео показывало 28–30 FPS; в DOM нет canvas. GPU-рендеринг остаётся на Worker.
QA-сцена `airun-1f27d76ef73748cc89958dc70dc9b28b` оставлена открытой для
операторского просмотра: ready, follow, stream_ready=true, sim_time=0,
inference_count=0. AI во время UI-проверки не запускался. Core PID 10918
продолжает обслуживать 8000; второго backend на 8765 нет.
## Причина остановки в пользовательском прогоне
Источник: сохранённые Worker-журналы `motion.jsonl` и `camera/decisions.jsonl`
прогона `airun-0ca108e35bed49128b077f6844cbd8eb`, созданного
2026-09-21T21:03:30.999Z. Журналы прочитаны без повторного запуска inference.
Также просмотрены первый и последний сохранённые RGB-кадры; приватные кадры
и полные журналы не входят в Git.
- 262 решения: 10 `road`, 6 `uncertain`, 246 `no-road`.
- Смещение от старта 0.0721 м, длина пути по snapshots 0.0726 м.
- Последний motion snapshot: RTF 1.0, render 28 FPS, sensor 8 FPS, AI 8 Hz,
inference 94 мс, возраст кадра 172 мс, road_fraction 0.02468.
- Во всех сохранённых решениях obstacle_count=0. Остановка не была решением
детектора о препятствии; RoadPolicy обнулила скорость из-за road_fraction
ниже 0.35 в ближней области маски.
На RGB-кадрах визуально сохраняется тропа. Это свидетельство ограничения
сегментации/простого правила следования, а не доказательство непроходимости
тропы для метрового ровера. Полные семантические маски не архивировались,
поэтому конкретный ошибочный класс по этим журналам восстановить нельзя.
## Граница вывода
Текущая RoadPolicy — camera-only baseline: она ищет полосу из шести классов
GOOSE и задаёт скорость/поворот, но не оценивает высоту ступеньки, уклон,
клиренс, опорную поверхность и сцепление. Скан даёт внешний вид; физическая
опора в `run_realtime.py` — невидимая плоскость. Камни не имеют физических
collision-форм, а масштаб скана ещё не подтверждён измеренной опорой.
Следующая работа по автономии должна отдельно квалифицировать распознавание
проезжаемого грунта и принятие решений на неровностях. Для проверки подъёма
на камни потребуется метрически согласованная поверхность контакта и
измеренный профиль аппарата. Порог не понижался ради демонстрации движения;
успешное прохождение тропы и физическая проходимость этим изменением не заявляются.
@@ -0,0 +1,712 @@
# AI-полигон · привод, маршрут и проверка корпуса
Обновление23сентября: R29 и R30 прошли весь заданный маршрут Riverside Path
с `goal-reached` и остановкой. После оптимизации R30 завершён за32.67с вместо
63.97с; задержка inference по медиане234мс вместо414мс. Это парк с готовой
парой Gaussian/mesh, не грунтовка. Ниже сохранена история ошибок и последующих
исправлений, включая отрицательные результаты.
Полное автономное прохождение Forest/Bamboo пока не принято. Исправления ниже
подтверждают отдельные свойства симулятора; ни смещение перевёрнутого аппарата,
ни штатный Stop не считаются успешным маршрутом.
## Исправление прежнего результата
Forest `airun-3664b7dec1024dbe984aaf82a11147cc` закончился переворотом
(конечный roll около178°, наклон от вертикали около168°). Прежнее утверждение
«2.461м, затем остановка перед препятствием» отозвано в исходном audit и Ops.
Raw evidence сохранён. Теперь используется наклон оси корпуса относительно
вертикали из quaternion, поэтому инверсия не маскируется нормализацией углов.
## Исполнение и композиция
Isaac/PhysX, Gaussian, камера/лидар, модели, решения и журналы исполняются на
Worker006. Mac принимает видеопоток и компактное состояние. Физический привод
устройств не подключён. SegFormer B2 ADE150 и RF-DETR остались готовыми
провайдерами общей композиции; DDRNet и прежние образы/веса сохранены.
Добавлен модуль `simulation-waypoint-mission`: необязательные32точки XY,
проверка продвижения, до3попыток сменить наблюдаемую локальную цель, явные
`goal-reached`, `stuck`, `unstable`. Это локальное поведение, не глобальный
планировщик обхода и не подтверждённая автономность.
Состояние миссии теперь принадлежит эпизоду; пересоздание сетевого клиента модели
не сбрасывает индекс маршрута и terminal fault. Пауза замораживает время.
Близкая уже наблюдённая точка явного маршрута сохраняется в слепой полосе камеры,
если текущие наблюдения всё ещё содержат поверхность; CMU и монитор корпуса
сохраняют право остановки. Без свежего кадра800мс или команды500мс привод получает ноль.
## Измеренная физика
Квадратный footprint1×1м,4колеса радиусом0.25м,24кг, без подвески — временный
лабораторный профиль, не модель физических устройств пользователя.
11проверок на Worker: плоскость, ступени5/10/15/18/20/25см и уклоны10/15/20/25°.
Прошли плоскость,5/10см и все4уклона.15см и выше не прошли; поэтому предел
навигации снижен с прежнего неподтверждённого18см до10см.
Нулевая скорость сама по себе не удерживала колёса на склоне. Добавлен физический
position-hold колёсных шарниров: без фиксации корпуса, телепортаций и подмены позы.
На финальных уклонах10–25° дрейф после торможения за2с составил0.29–1.06мм.
Solver32/8 и contact offset5мм повторно прошли ту же capability-проверку.
Повтор одинаковых сохранённых команд на исходной Bamboo-геометрии уменьшил
максимальный наклон с50.86° до15.94°; это физический replay, не AI-route acceptance.
## Наблюдения и CMU
15колец виртуального лидара, первый физический контакт, частотаоколо5Гц.
Дополнительные лучи−80/−75/−70° сокращают слепую полосу перед колёсами.
Восстановлена upstream-память CMU: decay2с, noDecayDis4м. Исчезновение точки
за корпусом больше не объявляет пространство свободным. Очистка следов
движущихся участников не квалифицирована; память статического рельефа консервативна.
Готовые CMU terrainAnalysis/pathFollower и библиотека примитивов сохранены.
В localPlanner внесён ограниченный адаптер выбора: перед принятием кандидата
проверяется поворот к look-ahead0.7м и первый участок пути до1.2м с прямоугольником
1.1×1.1м (корпус плюс5см запаса с каждой стороны). Прежняя угловая проверка могла
разрешить задевание задним углом и одновременно запретить прямой выход.
Её заменяет этот фильтр. Отдельный монитор дуги фактически выдаваемой команды
остаётся включён. Изменения объявлены явно; C++ больше не считается неизменённым
upstream. Ограничение скорости0.15м/с и поворота20°/с сохранено.
Исходный CMU commit `158e67b31b644ed1e8b06eb1d7f70e183cc62591`;
базовый image `sha256:7693c28fac83df9e9e6ac6d89ffec81470f660cb8b30fc78fa88be228329dc0b`.
Отдельный image с фильтром:
`sha256:41784f6269f46907a4bb41323fe24ce8dcf439c797be94b1257d24f280c99453`.
Сборка из versioned `navigation/Dockerfile.footprint`, `missioncore_footprint.hpp`,
`patch_footprint.py`; повторная подготовка — `Prepare-RectangleNavigation.ps1`.
Старые model images не перезаписывались.
Семь независимых Worker-only проверок прошли: плоскость; объезд стены;
остановка в ограждении; коридор1.3м; отказ от0.9м; прямой выход от препятствия у
заднего угла; сохранение ближнего препятствия при исчезновении наблюдения.
Вариант только с более плотным terrainVoxelSize0.02 проблему не решил и не принят;
оставлено0.08. Первый вариант фильтра вместе со старой угловой проверкой не прошёл
новую регрессию; установлен только исправленный вариант.
## Плавные уклоны и сохранение препятствий
Установленный адаптер `navigation/terrain_costs.py` устраняет ещё одно измеренное
расхождение: физическое шасси проходит плавные уклоны до25°, но прежняя оценка
CMU блокировала15° и выше. Высота точки над нижним квантилем ячейки не равна
высоте ступени. Адаптер разрешает только наблюдённую локальную плоскость с
остатком не более2.5см, достаточной площадью опоры и уклоном2–25°; геометрия
не меняется. Резкие ступени, обрывы, недостаточные и неровные наблюдения
сохраняют прежнюю стоимость. Это не полная квалификация отрицательных препятствий.
На Worker прошли12сценариев: прежние7 и пять непрерывных уклонов5/10/15/20/25°.
Отдельная проверка через ROS-адаптер сохранила остановку перед ступенью15см
и перепадом вниз40см в коридоре1.3м. В R10 нормализатор не снял ни одного
из ближних препятствий: наблюдаемые перепады не удовлетворяют условию плоскости.
## Реальные заезды и ограничения
| Заезд | Наблюдение | Оценка |
|---|---|---|
| `airun-02e135f864d944888b3e40e5c5877182` | Bamboo, смещение0.994м, max tilt35.02° | Не принят: опасный наклон |
| `airun-7bd0bb24a42d400e83d291369ea32887` | Bamboo, память препятствий, остановка у старта | Не принят: путь не найден |
| `airun-cbb037ed6de44df0b87ec9874c120232` | Bamboo, смещение0.0085м, max tilt7.51° | Не принят: застревание |
| `airun-06e86d64d53245f6a3d9e14f706c6be5` | Forest, практически нулевое смещение, max tilt17.07° | Не принят: нет наблюдаемого прохода |
| `airun-0862bb2a6a9a4651a6bdf8a1d36e85d9` | Bamboo, прямоугольный фильтр, старт[0.95,0.3] | Не принят: путь не найден после3попыток |
| `airun-2ecadc20d2fe40e2ac1a31efc3559154` | Bamboo, старт[3.65,2.5], цель[5,2.5] | Не принят: путь не найден |
| `airun-457b2564987a41428108f8449b342dbc` | Bamboo, исправление уклонов; смещение0.44мм, max tilt13.62°,34.5с | Не принят:35решений obstacle,117no-road,12stuck |
| `airun-09859bf380b74119ba4afdf30798e0e3` | Forest, старт[-1.5,1], смещение9.86мм, max tilt8.68°,34.5с | Не принят:74obstacle,56no-road,12stuck |
Ровная площадка сама по себе не доказывает возможность выехать метровым корпусом:
на последнем старте range видит близкое превышение0.17–0.22м у переднего правого
угла и боковую геометрию. Проверки коллизий не ослаблялись. Scale остаётся1,
внешняя метрическая опора скана пока отсутствует. Collision proxy не разделяет
твёрдый рельеф и мягкую растительность. Новая точка старта выбиралась только
при подготовке сценария; inference не получает mesh или авторскую карту.
Текущий профиль не имеет глобального поиска пути, готового возврата задним ходом,
приёмки обрывов/неизвестной опоры и динамических людей/животных. Десять успешных
повторных маршрутов не получены. Нужна подготовка физически проходимого участка
и полноценное поведение восстановления; добавление моделей само по себе эти
два ограничения не решает.
## Версия и доказательства
Установлен release `b3f1e73eb597fba1`,584файла;
identity `b3f1e73eb597fba135f803591561be1f217a112b160699640c5a1b7133d71cab`;
tgz SHA-256 `8f89288cfc8d169f4468cb6c27faabfacb78a511d1f9e7cf8d7e55424ba61382`.
Установка подтверждена штатным Windows installer в06:20:14UTC. Core8000
согласованно перезапущен для загрузки изменённого реестра композиции; health и
регистрация Worker подтверждены перед R10. Предыдущая версия `2fff34f35bba9346`
сохранена для отката.
41backend AI-polygon tests и16launchd/tunnel tests прошли; Ruff для изменённых
файлов прошёл. Согласованная соседняя задача проверила ту же общую frontend-сборку:
architecture4/4,typecheck,unit903/903,production build,diff check — passed.
Здесь тяжёлая сборка повторно не запускалась. Операторская проверка AI-полигона:
шапка/прокрутка, настройка общей композиции, три камеры, fullscreen/Escape и
показ явной причины неуспешного прогона проверены. Настоящий Worker video в
паузе28–29FPS, это не частота inference и не результат движения. После выхода
из fullscreen выбранная камера сохраняется. Перед UI-проверкой: memory pressure1,swap0.
Raw RGB,labels,range,motion,composition,robot-profile и terrain остаются на Worker.
Каждый закрытый эксперимент получает SHA-манифест рядом с raw; время sealing
отделено от исходных UTC/monotonic эксперимента. Частные компактные сводки:
`outputs/ai-polygon-2026-09-22/route-recovery/`.
Отдельный инцидент запуска Core и его восстановление описаны в
[Core launch recovery](2026-09-22-core-launch-recovery.md).
## Отдельная проверка подготовки коллизий
Повтор старого эксперимента SplatTransform с carve снова упал при Building BVH.
Прямой bounded-запуск того же3.4.0 с `--filter-nan` и процессным Node heap12ГБ
построил кандидат за11.125с:4.65млн splats,736тыс треугольников,12.6МБ GLB.
Эти два изменения проверены вместе; отдельная причина сбоя не установлена.
[Штатный carve](https://developer.playcanvas.com/user-manual/splat-transform/collision/)
очищает недоступные внутренние поверхности; он не распознаёт мягкую растительность.
Кандидат НЕ установлен: отдельный физический прогон на старте R10 прошёл только
0.304м до аварийного наклона30.06°. Это не AI-заезд и не улучшение проходимости.
Исходный рабочий collider сохранён. Его замена без проверки контактной геометрии
маскировала бы ограничение скана вместо исправления навигации.
Сравнение Docker06:26:09UTC: сохранены21исходный container ID и конфигурации
(name/image/restart/mounts/memory/GPU/ports),104уникальных image ID из108записей
исходного каталога,9volumes. Отличий и пропавших объектов нет. Проверка не
утверждает неизменность полного Config JSON; перечисленные поля сравнены явно.
## Операторская проверка после восстановления
Прогон `airun-8255c7e50998477b9afaee41746372cb`: Pause через UI подтверждён
Worker; в течение22.344с неизменны simulation time26.566666667с,
physics steps1594,inference count96 и pose. Continue подтверждён; в отсутствие
первого нового решения привод оставался остановлен. Последующий UI Stop дал
`stopped / Движение и inference остановлены.`; active run/marker отсутствуют.
Повторное сравнение Docker06:43:36UTC снова не обнаружило изменений прежних
контейнеров/images/volumes. Core8000 health ok,Worker available;8765 не слушает.
Отчёт Ops с исправлением прежней ложной оценки и Core recovery был записан.
Последующие updates R10/R11 получили transport errors; результат пока не
подтверждён. Точное тело для идемпотентной повторной записи сохранено в private
`outputs/ai-polygon-2026-09-22/route-recovery/pending-ops-report.json`.
После закрытия видео финальная проверка Mac: pressure1,swap4370.88МБ.
Временных локальных test/build/simulation jobs этой задачи не осталось; по
RSS один Core8000 около539МБ, браузерный renderer около276МБ. Причина роста
swap не установлена; рядом появилась пользовательская Chrome-сессия, но это
не доказательство причинности. Смежная задача предупреждена перед своей
следующей сборкой. Системные лимиты и приложения пользователя не менялись.
Финальный Ops read также получил timeout60с; повторная запись не подтверждена.
## R12: observed reverse recovery and coordinate fault (07:12 UTC onward)
Release `63d59fd270b2a252` added signed virtual motion, CMU two-way driving with
reverse body-orientation clearance, and a bounded retreat/replan policy inside
the existing composition constructor. Retreat requires fresh range support over
the full swept width. A separate rear mount adds 660 first-hit rays; the chassis
continues to occlude rays. Route progress now uses improvement toward the target,
so backing away cannot replenish the retry budget. Core enforces the speed limit
by magnitude in both directions. Local targeted suite: 48 passed.
The new navigation image is
`sha256:1dd68dfb3fa6bf4148fec4f1caabb204e8ec39382c6dee60ac806378f553c9c7`,
separate tag `ndc-ai-polygon-cmu:rectangle-v2`. All 14 Worker navigation cases
passed, including reverse on clear ground and rejection of a rear wall. The
shipped physical chassis and mounted sensors completed a 0.504 m reverse on a
synthetic floor; braking drift was 0.00030 m. These are component qualifications,
not acceptance of a Gaussian-world route.
Bamboo R12 `airun-6c49b967377b4521b64637d462b81edb` remained blocked: 69 obstacle,
77 no-road and 11 terminal stuck decisions. The newly observed rear footprint
contained local height spreads up to 0.262 m, so recovery correctly stayed
inadmissible. This did not establish whether that physical surface matched the
image.
### Confirmed visual/collision registration defect
Inspection of the installed SplatTransform 3.4.0 source map established that PLY
input carries an implicit **Rz(180)** transform (`Transform.PLY`). The old
preparer neither cancelled that transform nor used the correct Z-up to Y-up
basis rotation. Its additional Rx(+90), followed by the runtime GLB conversion,
produced a physical mesh rotated 180 degrees horizontally relative to the USD
Gaussian visual.
A Worker-only single-Gaussian landmark confirmed the defect independently of
perception, navigation, chassis and scene complexity. The raw landmark (1,2,3)
with the configured USD rotation belongs at (-1,-3,-2). The old pipeline produced
(0.9875,3.0125,-2.0125), 6.332 m from its visual position. Cancelling Rz(180) before
the configured scene rotation and using Rx(-90) for glTF produced
(-1.0125,-2.9875,-2.0125), error 0.02165 m with a 0.025 m voxel.
**All earlier real-world route outcomes in this audit used mismatched visual and
collision geometry. They cannot qualify road recognition, visual navigation or
traversability of the visible Forest/Bamboo scene.** Synthetic chassis and CMU
component checks remain separate valid evidence. The prior terrain capability
conclusions are restricted to the physical proxy actually tested, not the
visible road. No additional terrain classifier was installed to conceal this
registration problem.
The versioned `Prepare-Terrain.ps1` now cancels the PLY convention explicitly,
uses the inverse of the runtime glTF basis, and crops in that same basis. Its
changed generator digest invalidates the previous terrain cache. Existing
meshes remain available as historical evidence. A versioned landmark regression
executes the actual preparer rather than merely duplicating its transform math.
### Coordinate correction acceptance and R13/R14
Release `0ad2b4bf9b3dcfa6` (587 files) was installed at 07:31:25 UTC. The actual
preparer's independent landmark test passed: horizontal expected (-1,-3),
measured (-0.990,-2.970), with the production 6 cm voxel. The admitted old caches
were corrected by an exact rigid transform, preserving every vertex and face.
`migrate_terrain_coordinates.py` accepts only the known old generator digest and
the exact rotation [-90,0,180]; its own SHA is pinned inside the preparer.
A synthetic binary GLB regression verifies positions and unchanged topology.
A fresh full-scene BVH build in SplatTransform failed natively with Windows code
3221226505, including a diagnostic retry with optimization disabled. That retry
was not installed. The existing-cache correction avoids this upstream rebuild
for Forest and Bamboo. Fresh imports without an admitted old cache still use
the corrected official converter and may encounter that unresolved upstream
failure. No scene was simplified to avoid the failure.
Bamboo R13 `airun-2645a317563e451e82f29477843a16e3` rejected its rotated initial
footprint before execution. R14 `airun-92bb42f79beb491584ea293a9f65fec2` used an
admitted pose (-1.35,-0.6), heading220°, and the corrected collider SHA
`434c68755d9bb6443eb2081014fb5a2f226947721d4c3ff7c28f046c00c74f9e`.
It started upright (support residual0.03664m) but still failed to make route
progress:135 obstacle,2 replanning,11 stuck decisions; net movement0.0093m,
maximum tilt8.04°. Its initial RGB frame visibly follows the bamboo trail, and
semantic road fraction was0.989. This is not an accepted autonomous route.
The same scene/profile/pose in a separate bounded physical contact test moved
1.189m in20 simulated seconds, maximum tilt14.34°, without a tilt stop. It drifted
in heading and was not a route-following test. This proves some physical motion
is possible from that pose; it does not prove completion of the requested route.
The remaining analysis concerns observed terrain costs and planning, rather
than missing ground classification. All original evidence remains on Worker.
### Short prefixes, observed reserve and command freshness
Release `fd4ffaa8c24983da` admitted a safe 0.5 m CMU path prefix, retaining the
whole rectangular body and command/braking monitor. Seventeen Worker navigation
cases passed, as did separate 12/15 cm step and 40 cm drop rejections. Bamboo R15
`airun-18877f2bce60420886b29a2677b292c3` still failed: eight road decisions followed
by 134 obstacle and 11 stuck decisions, with approximately 8 mm net movement.
The first small motion revealed terrain returns about 0.53 m behind the body,
inside its 5 cm reserve but outside the actual 1 m body. Requiring the complete
reserve clear at time zero incorrectly rejected even departure from these points.
The new filter retains actual body-overlap rejection. For a point already inside
the reserve, every sampled turn/translation must preserve or increase its initial
clearance; all other points retain the full 5 cm reserve. It therefore cannot
permit approach, reverse into that point or sweep a corner through it. Regression
cases cover departure, front obstruction, body overlap and the braking horizon.
R15 also recorded camera-result ages of roughly 0.4 s plus a roughly 0.2 s capture
period. The old 0.5 s source watchdog repeatedly stopped valid motion between
results (57 stale-camera versus 64 applied-command snapshots). The Worker source
budget is now 0.8 s, and the command collision envelope uses the same constant,
plus the existing braking distance and 0.5 s reserve. The independent 0.5 s
completed-command watchdog remains. This is a bounded local latency budget,
not permission to apply an indefinitely stale prediction. Fifty-two focused
local tests passed after these changes. Live route acceptance remains pending.
### R16/R17: remove the processing backlog, retain obstacle authority
Release `878206a9ae0d9467` passed20 CMU scenarios (including reserve departure,
front reserve and body-overlap rejection), three separate hazardous terrain
cases and R15 observation replay. Live R16
`airun-4beae79a310f43889388efb0d08c4c7b` moved0.181m, then stopped while terrain
processing fell behind. Measured cost normalization rose from31ms to540ms as the
local map accumulated roughly7,000 points. This was Worker-local processing,
not operator-network latency.
`terrain_costs.py` now indexes exact radius neighborhoods, rejects mathematically
impossible plane fits early, and bounds a cache of byte-identical neighborhood
fits to16,384 entries. Changed observations invalidate the relevant fit. It does
not store or erase occupancy; CMU remains its owner. Seven retained map snapshots
produced exactly equal normalized costs to the earlier algorithm. The measured
ROS callback fell to87–93ms in the late recorded scene. The new-obstacle cache
invalidation regression and 12/15cm ledge/40cm drop rejection passed.
Release `3bfe8f53075912f6` was installed at08:25:38UTC. Live R17
`airun-43c573ee22174735b1e42edd4c3717f4` removed the sustained stale-frame stops
(3 initial stale versus116 applied-command snapshots in the sampled trace),
but stopped after0.168m:16 road,95 obstacle,10 stuck decisions. CMU selected a
path while the final command's full-speed turning/braking arc was inadmissible.
This exposed the need for bounded speed regulation rather than repeatedly
requesting the same rejected full-speed command. No completed route is claimed.
### R18: regulation removes command rejection, terrain estimate still blocks
Release `b8fd58094d09f501` scales the CMU linear and angular command together,
preserving curvature. A bounded search admits only a speed whose complete body
and braking envelope passes the same monitor. It cannot create a new path or
ignore an obstacle. Twenty native navigation cases and the 12/15 cm ledge and
40 cm drop rejections passed. Progress recognition now admits 0.10 m in eight
seconds, retaining the same bounded recovery budget and jitter rejection.
Bamboo R18 `airun-14f6f5c770bb4a1aad9ef52c76f5dc16` still stopped after 0.212 m.
It ran 37.4 simulation seconds in 37.5 wall seconds; rendered about 13–16 FPS
and inferred about 3–4 Hz. The final source age was 344 ms. These measurements
separate local simulation performance from route completion: real-time execution
was possible, but the autonomous route did not pass.
### September 23: restart, isolated Forest contact and median-ground candidate
Worker was powered down by its owner and resumed on September 23. The scheduled
task was Ready with LastResult 1. Pinned model preflight passed, the existing
scheduled task was started, and Core reported Worker available. The historical
log is insufficient to identify the boot failure; it does not establish Docker
startup as the cause. Release `6974a7ef7a8d5d14`, installed at 05:02:31 UTC, adds
top-level coordinator exception logging and persisted native startup phases.
It changes no navigation model, wheel or terrain parameter.
Corrected Forest R19 `airun-7e504cc926d346a4adcfee17756e1ddb` never finished
startup. R20 `airun-7f4448035d0f4a60918d73d41def5acf` isolated the stall to
`initial-render-and-contact`. Native physics views, the stream and 2,142,439
Gaussians had initialized. A physics-only replay of the exact 1,347,252-triangle
collider also exceeded 100 seconds without completing. Both were bounded and
their owned process trees were terminated. No Forest AI route was run.
An isolated test enabled NVIDIA's official
[convex cylinder approximation](https://docs.omniverse.nvidia.com/kit/docs/omni_physics/110.0/dev_guide/rigid_bodies_articulations/collision.html).
The same Forest physics-only replay then completed: 12 simulation seconds in
4.92 measured stepping seconds, 80.03 seconds including process startup/shutdown.
It moved 0.734 m and stopped at the existing 30-degree tilt guard. This diagnoses
the contact representation and demonstrates bounded physical motion, not a
successful AI route. Wheel dimensions, terrain and tilt limits were unchanged.
R18 observations also exposed the ground-reference issue: CMU's 0.15 height
quantile in its 0.6 m neighbourhood can classify the upper side of shallow scan
depressions as a >10 cm obstacle. A candidate uses CMU's existing `quantileZ=0.5`
parameter, retaining absolute drop costs. On the same first 60 retained R18
observations, old processing produced 33 no-path results and 24 positive speeds;
the candidate produced 60 positive speeds and no no-path results. Replay does
not predict the subsequent changed live trajectory. Hazard, physical capability
and live-route acceptance must pass before this is an accepted deployment.
The median candidate `0795e3aa7f9d3a14` was rejected: 22 of 23 navigation cases
passed, but wall returns contaminated the reference ground in the 1.3 m corridor
and prevented motion. All three hazardous height boundaries still stopped the
rover. The candidate was not installed. The next candidate restores upstream
CMU `quantileZ=0.25`; its own full qualification and replay are separate.
The shared convex-wheel profile passed independent native physical checks:
1.471 m forward in five seconds, 1.63 mm drift over the following two-second
brake; observed reverse reached -0.495 m with 0.272 mm braking drift. Flat ground,
5/10 cm steps and continuous 10/15/20/25-degree grades passed the unchanged
physical capability gates. As before, 15/18 cm steps failed to traverse and
20/25 cm steps exceeded the stability bound. No capability limit was raised.
These are measurements of the declared virtual chassis, not the owner's vehicle.
Candidate `8f3fbe019a3803f8` uses the upstream quantile 0.25 and the same qualified
convex-wheel implementation (SHA
`021c77c002f1eac4451606329df097b19a94bf6b065b4425cf59d3544f1df6de`).
All 23 native navigation scenarios passed, including the corridor that rejected
the median candidate. The same 60-frame R18 replay produced 54 positive speeds,
no no-path results and six valid turning-only commands. Fifty-five focused local
tests and Ruff passed. These component results admit a bounded live test; they
do not establish route completion.
### R21/R22 and short-horizon controller mismatch
Release `8f3fbe019a3803f8` was installed at 05:26:04 UTC. Bamboo R21
`airun-677927b7cd3c4c8eadf7dd0f1b6bfb6c` failed after initial movement of about
0.2 m: 10 road, 106 obstacle and 12 stuck decisions. New observations differ
from the retained R18 replay; replay success did not generalize to live driving.
Forest R22 `airun-1584055d3c2a4a7bb2f315baba8ca1cd` now started and ran in real
time, ending after 33.1 simulation seconds with no useful motion. Its 124 no-road,
16 obstacle and 10 stuck decisions show an additional visual-width admission
problem. The RGB view is a narrow trail between vegetation and trees. Neither
run qualifies a completed route.
Private experiments at quantiles 0.35 and 0.40 failed the 1.3 m corridor and still
produced 25 no-path results in 35 retained R21 observations. They were not
installed. Intermediate native capability lanes at 12 and 14 cm also failed to
traverse. The 10 cm physical limit remains in force; no hazard threshold was
raised to make the scene pass.
Pinned upstream source inspection found `pathRangeStep=0.5`. Lowering only
`minPathRange` to 0.25 or 0.1 therefore skipped the shorter candidate ranges;
both experiments retained the same 25 no-path results. With a 0.1 m decrement
and 0.2 m minimum, all 35 retained observations produced an admissible path or
turn instead. Most late commands were turn-only, not forward-route success.
The follower also used a 0.25 m stop distance against the cropped local path,
which exceeds the new minimum. Candidate `84445a377102a3af` uses 0.08 m for
this local endpoint, retaining the mission's independent arrival tolerance and
the complete source-deadline/braking-envelope monitor. It requires native
regression and a new live run before acceptance.
The fine-prefix candidate passed all 23 scenarios and was installed at
05:40:09 UTC. R23 `airun-5b4752670cba4bc28c0ab1b1476f3df7` was opened paused
and started using the actual Control Station button. The browser displayed the
Worker stream at 28 FPS before AI start. Simulation time remained zero while
paused. The run moved about 0.36 m, then failed after 51.55 simulation seconds:
35 road, 89 obstacle, three replanning, one waiting and 12 stuck decisions.
The initial inference connection errors recovered, but are retained in the run's
`camera/errors.jsonl`. This is not a successful route.
R23's final map contains a blocking return inside the current body at local
(-0.375,-0.282) m, CMU cost0.10237m but only0.06592m above the measured chassis
support plane. All paths are rejected by the initial body-overlap check. An
isolated straight physical run on the same source moved1.069m before reaching
the30-degree tilt stop; blindly driving straight is therefore not accepted.
Candidate `d1e7783920f0928a` reconciles only observed low returns already inside
the current footprint, inset5cm. Its support band is±8cm relative to the declared
contact height and measured orientation, with a25-degree tilt bound. It changes
neither future terrain nor CMU's raw memory; tall returns and drops retain their
costs. The pose must match the terrain message's exact transaction timestamp.
Regression covers leading-edge/future points, wall,12cm step,40cm drop, excessive
tilt, yaw/translation invariance and preservation of the input map. This is an
explicit candidate awaiting native hazard and live-route validation, not a claim
that unseen ground is traversable.
The first underbody candidate passed the 23 hazard scenarios but applied zero
corrections in all 90 replayed observations. Inspection found that CMU converts
the message timestamp through double-precision seconds. Exact integer lookup
therefore missed the matching pose. Candidate `d3b2218217c56943` uses the same
1,000 ns round-trip tolerance already used by the transaction freshness check;
it never falls back to the latest unrelated pose. Its replay must explicitly
prove nonzero correction before native qualification can admit installation.
The corrected-timestamp replay applied51 underbody corrections. Of90 samples,
89 returned an admissible path/turn and one held at the controller; the51 no-path
results from the previous replay disappeared. All23 native navigation scenarios
passed again, including current-body obstruction and the12/15cm step/40cm drop
cases. The focused local suite now contains56 passing tests. These results admit
another live run without increasing the rover's qualified physical limits.
### R24/R25: scene admission, not another planner threshold increase
R24 `airun-92057c35ee3a4d43b27391d007fc51f1` on release
`d3b2218217c56943` removed the repeated no-path obstruction: 32 road, 60
replanning and 12 stuck decisions, but only about 0.158 m net displacement.
Turn commands continued while the measured heading stopped changing on the
scanned surface. This is still a failed route. The added native flat-ground
pivot test measured +0.458 and -0.486 rad in three seconds for commands of
±0.35 rad/s. Both directions work, but both fail the declared >0.5 rad test.
No gain, torque, friction or capability threshold was changed to hide that result.
A private Bamboo candidate moved the start by 2.5 m without changing scale.
Its physical straight test moved 0.679 m in 16 seconds with maximum tilt21.48°.
R25 `airun-bd3ff5c9c78d42948e176e900e357465` then failed without useful AI
motion. The streamed view showed a bamboo trunk beside/through the starting
footprint. Nine ground-height samples had missed the trunk between the rays.
Original operator settings were automatically restored; this candidate was not
accepted as a replacement route.
`spawn_clearance.py` now tests actual triangles against the full metre-square
occupied prism, using separating axes rather than vertices alone. It detects
crossing faces even when every vertex is outside. The check is scene admission
only: it does not change the mesh or feed future ground truth to AI. Synthetic
regressions cover thin trunks, crossing faces, empty AABB corners, admitted
5/10 cm surfaces, 12 cm obstruction, overhead geometry and translated/rotated
sloping ground. On retained real colliders it finds5 intersecting triangles at
the original Bamboo start,21 at Forest and37 at the R25 candidate. The current
preparer fails early for these occupied starts instead of launching a stuck run.
A bounded authoring search around the original starts (±6 m,0.5 m spacing,
24 headings,0.25 m path samples) found no two-metre straight candidate passing
the full-volume check. The longest tested Bamboo prefix was0.5 m; Forest had
isolated starting footprints only. This is not a proof that no curved path
exists anywhere in either world. It establishes that these two automatic
colliders have not supplied an admitted positive driving scenario.
### Prepared paired-source scene and Worker-local storage
The official [Habitat-GS dataset](https://huggingface.co/datasets/RukawaY/gs_scenes)
supplies Gaussian assets together with separate collision meshes and navigation
episodes. Scene62 was downloaded directly to Worker at pinned revision
`ea6453855938dd3d4395c4c449fedefb7e6603b7` under its declared Apache-2.0 license.
No Habitat engine, new model weights, paid service or avatar dependency was
installed. The navmesh was retained as source evidence; it is not supplied to
the inference graph or used to move the rover.
- Gaussian142,307,349bytes: `5429cf3fc6a7ee5088dada65aca4fb6cad73dbaa660f2aec209a43122ea546ae`.
- Original mesh34,840,636bytes: `fdd8ae7d6d45907bbcaded91246f45390ebcb3a5d6c04a72fd16f5ed54ddce54`.
- Derived GLB: `384573b1a7cb805e94124d42f4ed4c4e0d69fca357183803cd57ac4a42753835`.
The conversion retains all original vertices/triangles. Both the supplied Y-up
mesh and the Gaussian visual use the same Rx(+90) conversion to metric Z-up.
Five five-metre authoring candidates passed support and volume checks. The first,
based on supplied episode3, passed an independent native straight drive:
4.67955m over30simulationseconds, maximum tilt6.1906°, no stability stop.
This qualifies physical contact for that start, not AI navigation or the actual
owner's vehicle. Source metric calibration has not been independently surveyed.
The new authenticated `/worker/worlds` endpoint admits metadata from the current
registered Worker instance. `register_paired_scene.py` validates real PLY bytes,
count, both hashes and GLB structure, stages the pair on Worker and publishes
only its descriptor. Repeated registration preserves operator-edited settings;
changed immutable metadata is rejected. Core rejects source-file downloads for
Worker-local worlds, and the Worker refuses a missing/changed local asset rather
than requesting its large payload from the Mac. A paired collision manifest must
match the admitted source, collider and transform. Existing upload worlds and
model compositions remain supported.
Release `cdeff3dc45ac02f2` was installed2026-09-23T06:33:23.8998231Z
(589verifiedfiles; archiveSHA
`34b9b43fbdfaa59c53e35ddd6623ee3fe859e81d8ca90661273055c99ad88ab4`).
Focused source tests passed before installation. Core8000 was updated through
the canonical launch-agent workflow and passed health acceptance. The new world
is `aiworld-bf03be7256514c7a819a6b9dc908ef78`, operator name `Riverside Path`.
R26 is the first camera/AI test of this pair; physical qualification alone does
not make it a completed autonomous route.
### R26/R27: transaction deadline and moving route goal
R26 `airun-a5c7dcd4048b492199e7189d5c4e1fd0` moved on the paired scene,
but failed after83.17simulationseconds. Its26k-point accumulated map took
310–334ms to process; the HTTP observation transaction returned after300ms.
121decisions therefore reported `waiting-for-plan`, perpetually abandoning
each matching map just before it arrived. This was a coordination failure,
not evidence that the road was blocked.
Release `ada7b6ecfc9879bb`, installed2026-09-23T06:50:55.3713014Z, raises
that wait to600ms. The independent800ms camera deadman,500ms command deadman
and full braking envelope are unchanged. A late result cannot be reused.
The first150 R26 decisions yielded149 eligible replay observations:147 without
navigation failure and2 footprint rejections,134 positive-speed commands.
No last30 observation timed out. All23 native navigation scenarios passed.
The public decision now distinguishes waiting for a plan from uncertain vision.
R27 `airun-94c3ba1ad14647708b852c8891bec427` had no `waiting-for-plan`
results. It moved5.645m net,7.752m accumulated, but failed at80.13simulation
seconds: the semantic local goal repeatedly moved ahead after an intermediate
route waypoint had been missed. The route cursor remained at waypoint1.
Movement alone is not route acceptance. The operator stream showed about17FPS;
Worker rendering was roughly15–19FPS, with variable AI cadence.
The next candidate preserves the requested waypoint XY once at least three
nearby semantic/range observations support it within25cm. It verifies the
requested centre and both half-metre lateral edges in the current semantic
image. CMU and the swept collision monitor still own path/command admission.
An unobserved distant waypoint may use a local goal, but a newly selected goal
must reduce remaining task distance. Clear road ahead cannot authorize driving
away from a waypoint behind the rover. Regression tests cover fixed task
coordinates, the observed close-goal blind strip, lost visual support, a missed
waypoint and distant local progress. Thirty focused navigation/mission tests
passed; the native navigation server and physical profile remain byte-identical
to their qualified versions.
R28 `airun-58202c67c5c947d1870f79fdc077bf16` used release
`7a852d7e3e8b45ab` (installed06:55:49 UTC) and failed at97.98simulation
seconds. It exposed a remaining camera-memory defect: an exact, previously
observed route goal left the image around0.95m away, but the old retention
rule only started at0.8m. The goal was replaced by a forward candidate and
then lost. On recorded frame40 the task was0.786m away while its projected
centre was at image y711 (600-pixel height); frame50 returned no goal at0.456m.
This was not proof of a physical obstacle or successful route completion.
Candidate `020cf047a3872217` uses the measured camera projection for this blind
strip. It retains only an exact, previously observed task goal, within the
existing3.5m horizon and while current forward semantic support remains. Any
visible part classified non-drivable invalidates retention. Every command still
passes live CMU terrain and swept-body checks. The replay of the first50 R28
observations now retains the exact task goal on frame50; removing current
semantic support still returns no goal. Thirty focused mission/navigation tests
passed again. Worker evidence is `qualification-observed-route-goal/result.json`.
### R29: first accepted end-to-end route, with a latency limitation
Release `020cf047a3872217` was installed2026-09-23T07:01:15.5693574Z;
589files verified, archive SHA
`38f806b1f2dfb226ac9b79faf8d63ae984c305c712c1d785481d47b56ac458b4`.
R29 `airun-1aa8d69367224be6b67eb6bfbe482c9d` reached all three Riverside
waypoints in order and completed with `goal-reached`, not the duration limit.
There were156 road decisions and11 latched goal-reached decisions, no recovery
attempts. Accumulated travel4.7047m, net displacement4.6249m; goal latched at61.7s,
last physics report63.9667s. Final centre distance0.3672m is within the unchanged
0.4m arrival radius. All sampled applied commands after goal were zero; final
measured speed0.00198m/s. Maximum chassis tilt6.158°.
This establishes one working closed-loop, five-metre authored route on the
paired scene. The streamed view is a park with paved paths, grass, trees and a
bench; it is not dirt-road/off-road acceptance. Source metric scale has not
been independently surveyed, and Forest/Bamboo remain unqualified. No dynamic
person/animal scenarios have been accepted. No real vehicle or VESC was driven.
Operator video was visually verified at15–17FPS; median Worker rendering16.85FPS,
median telemetry AI cadence2.245decisions/s. The camera deadman held motion in
109 of216 sampled reports. Median reported age of the latest completed frame
was859ms (max1625ms); stale commands were stopped, not admitted. Thus the route
is functional but sustained smooth real-time motion is not yet accepted.
Per moving decision: CMU median304.5ms/p95515ms, RF-DETR63/141ms,
SegFormer47/141ms (the two vision models run in parallel), full inference414/625ms,
pre-inference wait94/203ms. Raw detailed timing and stop samples remain on Worker.
The exact models continue through the shared composition graph. No new weights,
paid services or Mac-side simulation were used. The native hazard qualification
remains23/23 on the byte-identical navigation server and physical profile;
there are30 focused passing tests for the changed mission/goal behavior.
A bounded CPU replay profiled130 accumulated maps (last28,258points).
Terrain normalization consumed27.124s cumulatively under profiling. Pairwise
NumPy norms consumed9.035s cumulatively. A private candidate replaces the
N×N×2 distance temporary with separate X/Y differences and the same
sum-and-square-root arithmetic. It changes no radius, step, slope, memory,
command or deadline threshold. The candidate is not admitted until comparison
of the complete normalized arrays and correction counts on the same live-source
maps agrees and the native hazard scenarios pass.
The paired A/B replay compared130 complete normalized maps and correction counts:
all were exactly equal. On the last40 dense maps, median old340.253ms versus
candidate156.618ms; maximum456.917ms versus191.607ms. Comparison uses the same
container, observations, source ordering and cache policy. Candidate moved to
source only after this equivalence check;20 navigation regressions then passed.
Evidence: `qualification-route-latency/comparison.json` and both replay journals.
### R30: installed optimization and final acceptance
All23 native hazard scenarios passed with the optimized source. Release
`0d4c0a73bbbe2066` was installed2026-09-23T07:34:31.4941743Z after589-file
verification; archiveSHA
`ea485c2b292b84bfd8f6bbf5aa0ead501915ac4d7fa352b803a72f8ad8d9a80f`.
R30 `airun-e15bae285fdf493e9c0507e4692c5628` reached all three waypoints
without recovery.122road decisions and11 latched goal-reached decisions.
Travel4.67475m, net4.67162m, final target distance0.3182m (arrival radius0.4m).
The goal observation was captured at30.5167simulationseconds; completion was
reported at32.6667s after the settling interval. First telemetry with zero applied
speed arrived62ms after the goal decision completed. All sampled commands after
that completion plus100ms were zero; final measured speed0.00145m/s. An earlier
telemetry sample still contains the preceding command while the goal observation
is in inference, so capture time must not be called actuation/latch time.
Maximum tilt6.1195°.
Full inference median234ms/p95359ms/max391ms. CMU140/234/266ms;
RF-DETR62/141/188ms; SegFormer47/141/172ms. Median pre-inference wait94ms.
Median latest-result frame age531ms, max875ms. The unchanged camera deadman held
3 of110 sampled telemetry reports (R29:109/216). Median Worker rendering16.54FPS,
AI3.774decisions/s. The operator receives video and compact state only; no heavy
source or sensor map is transmitted to drive this loop. Real-world end-to-end
network latency is not inferred from these Worker-local timing figures.
Core8000 health and registered Worker availability passed after completion,
with no active run. Docker baseline comparison at2026-09-23T07:37:12Z found
all21 original containers,104 image identities and9 volumes present; no changes
to compared names/images/restart policies/mounts/memory/GPU/port configurations.
No temporary qualification containers or owned realtime episode processes
remained. The temporary QA browser tab was closed; the canonical Core service
remained running. No git stage, commit or push was performed.
Remaining acceptance scope: correct admitted starts/geometry for Forest and
Bamboo, actual dirt/natural terrain routes, dynamic participants, and calibration
against the owner's physical rover. This positive park route and23 synthetic
navigation cases do not establish arbitrary off-road autonomy. The separate
flat-ground pivot threshold test remains failed as recorded above; it was not
silently relaxed by the performance change.
Ops reporting could not be updated in this continuation: agent instructions
were available, but two direct project-list calls timed out after60s. No card was
marked complete; this audit retains the full evidence and limitations locally.
Closed-evidence index:40 sessions,8,243files,1,158,280,493bytes on Worker.
`state/continuation-evidence-index-20260923.json` SHA-256
`2a2a438646656db920cb44e890ceaa2591241d289659c1c2324fd9e173be0464`.
Each session manifest records UTC/monotonic sealing time and raw-file hashes;
sealing time is explicitly distinct from experiment acquisition time. Raw
images, maps, logs and original assets remain private on Worker.
@@ -0,0 +1,126 @@
# Worker simulation: continuous actuation and complete dataset task
Owner request: explain and remove intermittent motion, maintain slow continuous
travel between inference results, and qualify a complete scene task rather than
claiming navigation from a short straight drive. Physical VESC control remains
out of scope. Simulation, rendering, inference, sensor archives and physics
telemetry remain on Worker006; Core8000 receives video and compact telemetry.
## Findings
The existing `LatestInference` already held the most recent valid decision;
ordinary pending inference did not force zero. The pre-physics observer pose
was used to render a post-physics rover, and displayed speed divided a prior
physics displacement by unrelated render wall intervals. This exaggerated
apparent speed variation. Native physics measurements are now authoritative.
After fixing that sampling mismatch, run `airun-a1f4bff97e284b2a89c81eee261407bb`
revealed ten actual motion-to-zero transitions caused by camera-age protection.
Heavy accumulated terrain processing, plus capture/model latency, exceeded the
unchanged 800 ms frame budget. Ignoring those stops would hide a real timing
failure. No inference exceptions occurred in this run. An earlier operator run
had transient HTTP disconnections; error records now include private stack
traces so any recurrence can be traced to the actual local provider.
## Implementation
- Native physics pre-step callback evaluates freshness and applies the latest
valid command at 60 Hz. Wheel-surface acceleration is limited to 0.2 m/s²;
both sides scale together, preserving requested curvature. Reductions and
safety stops bypass the acceleration envelope. No additional braking delay.
- Physics post-step updates the rover camera and observer before rendering.
RGB, raycast origins, pose and camera calibration share the resulting pose.
Speed is read from the articulation velocity, not render-frame differences.
- Callback failures stop the run; pause telemetry reports zero applied command.
Worker retains `physics-motion.jsonl` at physics frequency and an explicit
simulation-only motion-control profile.
- The terrain connectedness/close-pair hazard loop has a compiled C ABI helper.
Plane fitting, neighborhoods, hazard thresholds, path planning, detectors and
segmenters remain unchanged. Strict floating-point compilation avoids fused
operations/fast-math. NumPy remains the portable reference implementation.
A separate Docker image extends the pinned rectangular CMU image; model
profiles and original images/containers are preserved.
- Paired full-scene collision assets no longer inherit the generated 30 m
tile admission bounds. Source, collider and calibration identities remain
checked; physical start support/clearance stays mandatory. The first full-task
attempt was rejected before starting Isaac by this incorrect tile check.
- Mission memory retains the last observed waypoint when a frame rejects it,
while returning no current goal/zero motion for that rejected observation.
Revalidation on the next frame can recover the exact goal in the camera
blind strip. The same causal goal survives a pause of the frozen world;
new episodes, waypoint advancement and bounded recovery still reset it.
- Shared composition identity includes the numerical helper source and image.
No parallel model constructor or device-control path was introduced.
## Numeric qualification
The numerical/navigation image passed all 23 existing hazard scenarios.
418 float32/float64 cases, including exact 12 cm adjacency and 10.01 cm height
jump boundaries, matched the NumPy reference. All costs/counts matched on 130
real observed maps. Dense-map median normalization: 168.6 -> 116.1 ms (max
200.5 -> 150.4 ms). This comparison isolates the numeric stage, not end-to-end
AI latency. Spatial-index and cropped-window alternatives did not improve the
measured workload and are not shipped.
## Mission authoring
The dataset contains 100 start/goal tasks and a Detour navmesh, but no saved
waypoint trajectories. An isolated Worker-only tool uses packaged Detour to
extract complete routes. The original episode 3 route is 16.70 m including
triangle crossings; its last corner fails the current rover's mesh support
checks. It is not represented as a successfully traversable route.
Episode 97 is a complete 11.03 m source route (10.94 m source geodesic metadata).
Its 53 sampled footprint checks passed: supported ground, <=20-degree authoring
slope, <=7.5 cm plane residual, no triangle crossing the occupied body prism
above the qualified step. Intermediate mission points occur every 2 m, with
the original endpoint preserved. These are preparation checks, not proof that
perception, control or physical contact can complete the mission. The live
mission retains its existing 0.4 m arrival tolerance; the source task's 0.2 m
benchmark radius is not claimed as benchmark acceptance.
The first full live task (R33) stopped at waypoint 2 because a rejected RGB
frame erased the observed goal. Replay of frames 101–140 verified that the
corrected memory still rejects frames 101 and 113, and recovers on the next
valid observation. It does not override the semantic gate.
## Live acceptance and receipts
Installed release `22c28daad98da60b` (597 verified files), archive SHA-256
`d30c177939ee88e6f70581d41624635844198b4891ea5a43becf81dee0aa8527`.
Navigation image: `sha256:698228d0d378b166ceaf299aa86ab95b5e74179837532f2378c036c7f7621dcc`.
R34 `airun-8443e76e7fe94b5694009965dc591680` completed all six waypoints:
10.5925 m start-to-finish displacement, final endpoint error 0.3441 m, 86.2 s
simulation time, no recovery attempts or inference exceptions. Median body
speed while commanded >=0.14 m/s: 0.145 m/s (p95 0.169). Median inference
125 ms, p95 219 ms; median AI rate 4.57 Hz; median render rate 17.12 FPS.
The live operator WebRTC view was observed at 14–16 FPS. These are measured
rates, not a claim of 30 FPS video or 60 Hz AI.
Five motion-to-zero events were caused by rejected visual surface observations.
They remain conservative stops; perception temporal stability is not solved.
There were no in-motion freshness interruptions: the sole moving-to-stale event
spanned a 48.703 s operator pause. Startup and resume correctly wait for fresh
observations. Pause held the world at 76.5 s, applied command zero and AI rate
zero; continuing retained the mission and reached the endpoint. The operator
interface showed completed state and connected Worker afterward.
44 focused unit/lifecycle/composition tests passed; numerical and 23 native
navigation hazard gates are recorded above. Original Docker inventory at this
turn's baseline: 21 containers with unchanged Name/Config/HostConfig, 110 image
identities retained, 9 volumes retained. No temporary qualification containers
or own realtime simulator processes remain. The discarded SciPy candidate image
created by this experiment was removed. Core8000 and Worker registration were
healthy and idle at handoff; the temporary browser viewer was closed.
Private receipt `state/continuous-motion-evidence-20260923.json` covers seven
closed sessions, 3,961 files and 126,985,705 bytes. Receipt SHA-256:
`5c1d0bb5f081cb74d440c43cdaf4d41a8e82e488a5050834a9e727827752007b`.
Source journals, failures and comparisons are retained; no older sealed outputs
were overwritten. The direct Ops instruction MCP timed out after 60 s, so this
engineering report was saved locally and the Ops card was not updated.
Acceptance is limited to this complete paved park task. The original 16.7 m
route, Forest/Bamboo, whole-location coverage, dynamic actor encounters and
physical vehicle load/braking calibration are not established by this run.
+327
View File
@@ -0,0 +1,327 @@
# AI-полигон на Worker 006
Актуальная схема после миграции 21.09.2026: Worker исполняет мир, физику,
камеры, AI и команды виртуального ровера. Mission Core на Mac принимает видео,
компактную телеметрию и передаёт команды оператора. В AI-профиле нет локального
3D-движка, загрузки PLY в браузер или передачи RGB через Mac для inference.
LCC Gaussian Mirror и AI Inference остаются отдельными профилями.
## Установка и постоянный запуск
- Единственный Core: `http://127.0.0.1:8000`.
- Worker: существующий Windows / RTX 4090 / Docker Desktop, SSH `mission-gpu`.
- Native Isaac 6.1.0: `D:\NDC_MISSIONCORE\runtime\simulation\isaac-sim-6.1.0`.
- Служба: Windows Scheduled Task `ndc-ai-polygon-worker`, запускается при входе
текущего пользователя и восстанавливается после аварийного выхода. Это запуск
**при пользовательском входе**, не headless-запуск до входа в Windows.
- Управление использует существующий постоянный reverse tunnel:
Worker `127.0.0.1:18080` → Core `127.0.0.1:8000`. Старый foreground launcher
`start_worker.py` и дополнительный туннель 18081 больше не нужны.
- Поток: официальный NVIDIA Omniverse Web SDK 6.7.0, native livestream Isaac,
1280×720, запрос 30 FPS. TCP49100 / UDP47998 идут напрямую по Tailscale;
Windows Firewall разрешает только текущий приватный адрес операторского Mac.
Публичного доступа нет. Сам Isaac endpoint не предоставляет pairing/auth:
доверенная граница здесь — Tailscale и ограничение firewall. Один viewer.
`build_bundle.py --output <private-directory>` создаёт архив и манифест хешей.
Доставить их в `simulation/releases`, проверить SHA-256 архива и каждого файла,
распаковать в новый `ai-polygon-<16-hex-release>`. Из SSH-сеанса с приватного
операторского адреса выполнить поставляемый установщик:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\simulation\ai-polygon\Install-RealtimeWorker.ps1 -Release <16-hex-release>
```
Установщик отказывается менять службу при `state/active.json`. Он сохраняет
исходные Windows Kit Block rules в `private/stream-firewall-backup.json`,
ограничивает исключение двумя портами и одним операторским адресом, оставляя
остальные подключения заблокированными. Ошибка firewall откатывает изменения.
Обновление выполняется только при отсутствии активного прогона; после него
проверить регистрацию актуальных `runtime_sources` перед новым Start.
Откат: установить предыдущий проверенный release тем же установщиком. Удаление
службы: его параметр `-Remove` при отсутствии активного прогона. Он также
восстанавливает исходные Block rules и удаляет собственные исключения.
Isaac на новом Worker устанавливает `Prepare-IsaacRuntime.ps1`. Модельные
пакеты предварительно готовятся штатным AI Inference workflow. При старте
проверяются закреплённые images/checkpoints/runners/labels из
`models.worker-006.json`; существующие профили не заменяются. Новый realtime
ровер использует метрическую геометрию `rover_profile.py`, Jetbot не требуется.
Токен существует только в защищённых файлах: `ai-polygon/worker.token` текущего
Core data directory и `simulation/private/worker.token` на Worker. Не выводить
его и не передавать аргументом командной строки.
## Работа оператора
1. LAB → «Симуляции» → «AI-полигон» → «Доступные локации» → «Открыть».
Выбрать настройки и состав AI, затем «Открыть симуляцию».
Worker подготавливает выбранный мир; открывается настоящая удалённая сцена
с состоянием «Сцена открыта · AI выключен».
2. В «Старт и масштаб» задаются подготовка сцены и состав AI через общий
конструктор модулей. «Запустить AI» поднимает три временных контейнера
и включает локальные физику/камеру/inference. Пока модели не готовы,
виртуальный привод получает нулевую команду.
3. «За ровером», «Обзор», «Камера AI» переключают **камеру на Worker**.
Камера AI в потоке показывает тот же ракурс; модели получают локальный
несжатый RGB800×600 до операторского видеокодека.
4. «Пауза» после подтверждения Worker останавливает физику и новые inference-
запросы. Уже выполнявшийся запрос не может вернуть команду после паузы.
Контейнеры остаются готовы к продолжению. После продолжения сбрасываются
локальная визуальная цель и причинное состояние ROS-планировщика; требуется
новое наблюдение. Номер точки маршрута и зафиксированный отказ сохраняются.
5. «Завершить симуляцию» останавливает native runtime и удаляет только собственные
временные контейнеры по точным ID. Терминальный статус появляется после
подтверждения освобождения ресурсов.
6. Круглая стрелка возвращает к локациям и отсоединяет видео. **Сам прогон
продолжает работать на Worker**. Повторное «Открыть» присоединяет тот же run.
Для завершения нужен отдельный явный Stop. Развёрнутый viewer сохраняет
управление; Escape возвращает обычный размер.
Частоты разделены: «Видео» — реально декодируемые кадры браузера; «Камера» —
кадры сенсора, переданные очереди AI; «AI» — завершённые решения; «Симуляция» —
отношение физического времени к реальному. 30 FPS видео не означают AI30Hz.
Интерфейс также показывает inference и возраст кадра. Очередь хранит только
последний кадр. При возрасте наблюдения более800мс или готовой команды более500мс привод получает
ноль, но физический мир продолжает идти. Горизонт проверки корпуса включает те же
800мс, запас500мс и торможение; эти пределы нельзя менять независимо.
## Жизненный цикл и архив
Один coordinator владеет episode. Windows Job Object завершает его native
потомков при аварийном выходе coordinator. Сведения об exact container IDs
сохраняются до ожидания готовности моделей. После перезапуска coordinator
сверяет владельца, очищает собственные остатки и подтверждает завершение Core;
старое движение не воспроизводится заново.
Потеря Core/viewer не блокирует физический tick. При потере управляющей связи
Worker продолжает **ограниченный по времени лабораторный прогон** по последней
команде; локальный watchdog inference остаётся активен. UI показывает отсутствие
связи, а Core удерживает reservation до явного finish. После reconnect возвращается
тот же run, без повторного Start. Stop без связи не считается подтверждённым.
Стандартная длительность — 30 минут, API допускает 10 секунд–2 часа. Это политика
только виртуального полигона, не политика физического аппарата.
Журналы хранятся на Worker: `simulation/state/<run_id>/`:
- `run.json`, `robot-profile.json`, `motion.jsonl`, `result.json`, `worker-result.json`;
- `camera/decisions.jsonl`: monotonic и simulation timestamps, решения, boxes,
ссылки и SHA-256 сохранённых кадров;
- `camera/*.jpg`: кадры, использованные для решений, JPEG quality90. Это архивные
копии, не lossless RGB. Inference получает исходный массив до JPEG-кодирования.
- `composition.json`: точная композиция, контракты и идентичности модулей;
- `camera/*.labels.png`, `*.surface.png`, `*.range.npz`: исходная таксономия модели,
кандидаты поверхности, наблюдённый лидар и калибровка камеры;
- `terrain.json`, `initial-contact.json`: идентичность collision proxy и размещение;
- `local-state.sqlite3`: оперативный IPC coordinator/Isaac, WAL, не архив кадров.
Core получает только последний ограниченный snapshot, команды и итог. Полного
автоматического переноса архива на Mac в этом этапе нет. Прежний lockstep-архив
остаётся историческим и не является источником текущего видео.
## Миры и границы проверки
Forest Scan (draftmode, CC BY4.0): 2 142 439 splats, 505 617 082 bytes.
Bamboo Trail (luckysplat, CC BY4.0): LOD0, 5 818 957 splats, 325 861 955 bytes.
Оба PLY скачаны, проверены и кэшируются на Worker по SHA-256. Открытие не
пересылает их повторно при совпавшем кэше. Импорт дополнительных авторизованных
PLY остаётся отдельной операцией; author/license/source URL сохраняются.
Ровер имеет явный footprint1×1м и независимые левый/правый приводы. Радиус колёс
0.25м, база0.5м, колея0.9м, масса24кг и коэффициенты трения — лабораторные
допущения, не калибровка настоящего аппарата. Масштаб Gaussian-сцен пока не
подтверждён измеренной опорой. Скрытая плоскость заменена collision mesh,
полученным SplatTransform3.4.0: voxel0.06м, opacity0.25, floor-fill0.3м.
Загрузка сверяет источник, преобразование, охват тайла и SHA-256 меша.
Старт проверяет поддержку footprint, локальную плоскость и остаточную неровность.
Изменение камеры/старта внутри готового тайла не пересобирает коллизии.
Gaussian collision proxy не имеет семантики мягкой растительности: часть травы
и листвы может попасть в геометрию. Это известное ограничение, а не проверенная
модель деформируемой травы. Полное прохождение тропы, реальный тормозной путь,
скользкий грунт и динамические люди/животные требуют отдельной сценарной приёмки.
## Композиция восприятия и движения
Используется тот же `ModuleRegistry/ModuleSpec/CompositionSpec`, что в AI Inference,
с режимом `worker-local-simulation` и изолированным пространством портов pinhole.
Контракты recorded K1 не переиспользуются под другим смыслом. Выбор хранит
module id, SHA-256 и параметры; произвольный код в выборе не принимается.
По умолчанию: NVIDIA SegFormer B2 ADE150 → кандидаты грунта/камня/дороги,
RF-DETR → люди/животные, «Маршрут · контроль продвижения» → локальная цель
и состояние миссии, CMU terrain_analysis/localPlanner/pathFollower → путь
и скорость/поворот. DDRNet GOOSE64 остаётся доступной альтернативой; его прежний
image/checkpoint и профили не меняются. Два независимых провайдера исполняются
параллельно, навигация — после их результата. Исходные class IDs сохраняются.
SegFormer использует официальный pinned checkpoint и лицензию NVIDIA для
research/evaluation; этот профиль предназначен для лабораторных испытаний.
Виртуальный лидар: 15 вертикальных колец ×144 азимута, дальность8м, первый
физический контакт, наблюдения около5Гц. Дополнительные кольца −80/−75/−70°
наблюдают ближний грунт перед корпусом. Меш/карта мира не передаются AI.
Необязательные операторские точки XY задают задачу, но не разрешённую траекторию.
Семантический waypoint выбирается по RGB и диапазону,
готовый CMU-планировщик проверяет рельеф. Дополнительный монитор проверяет
квадратный корпус на дуге текущей команды с горизонтом watchdog и торможения.
Пределы лабораторного профиля: ступень0.10м, уклон25°, аварийный наклон30°.
Ступени0.15м и выше не прошли отдельную физическую проверку. Нулевая команда
удерживает физические колёсные шарниры приводом положения, без фиксации корпуса
или телепортации. На ровных уклонах10–25° проверено удержание после остановки.
Параметры solver/contact и привода фиксируются в `robot-profile.json`.
Колёса используют штатную выпуклую аппроксимацию цилиндров PhysX:
`SETTING_COLLISION_APPROXIMATE_CYLINDERS=true`. Точная форма цилиндра вызывала
зависание контакта с Forest; размеры колёс сохранены. Для новой формы повторены
проверки прямого/обратного движения, торможения, ступеней и уклонов.
В pinned localPlanner image добавлена проверка метрового прямоугольного корпуса
с запасом5см при выборе примитива и начального поворота. Если наблюдаемая точка
уже находится в запасе, допускается только сохранение или увеличение расстояния
от неё. Пересечение самого корпуса запрещено; отдельный монитор команды сохранён.
Это объявленное изменение upstream C++, воспроизводимое через
`navigation/Prepare-RectangleNavigation.ps1`, а не неизменённый CMU бинарник.
`terrain_costs.py` нормализует ложную высоту препятствия только для достаточно
наблюдённого гладкого уклона2–25°. Резкие ступени и неподтверждённые поверхности
остаются заблокированными; геометрия сцены не меняется.
Оценка грунта CMU использует штатный `quantileZ=0.25`. Экспериментальная медиана
0.5 отклонена: стены искажали оценку опоры в узком коридоре. Штатная настройка
прошла23 сценария, включая уступы12/15см и обрыв40см.
CMU сохраняет наблюдённые точки ближе4м, пока они скрыты корпусом; исчезновение
возврата не означает свободный путь. Это консервативная память статического
рельефа; очистка следов динамических участников отдельно не квалифицирована.
Наблюдения и решения должны быть свежими, иначе привод получает ноль.
Маршрут задаётся до открытия симуляции через существующую форму подготовки
сцены (до32точек XY). Пустой маршрут оставляет режим видимой тропы. После8с без продвижения к цели хотя бы0.10м модуль поведения проверяет
короткий отход назад по наблюдаемой опоре и выбирает другую цель. Отход ограничен
6с и скоростью0.1м/с; CMU и проверка корпуса сохраняют право остановки. Максимум
три попытки. Отход от цели не обновляет бюджет попыток. Это локальное восстановление,
не готовый глобальный объезд. Достижение последней точки, исчерпание попыток или
опасный наклон завершают прогон с явной причиной и освобождением ресурсов.
Физическое время используется для контроля продвижения; пауза его не расходует.
Подготовка новых зависимостей выполняется версионированными
`segformer/Prepare-Segformer.ps1`, `navigation/Prepare-Navigation.ps1`,
`navigation/Prepare-RectangleNavigation.ps1`, `navigation/Prepare-Terrain.ps1`. Образы и checkpoints закреплены в
`models.worker-006.json`. ROS-обмен остаётся внутри собственного контейнера;
его Fast DDS профиль использует loopback UDP и не зависит от старых SHM-сегментов.
Core резервирует существующую AI Inference queue. Другие Gaussian GPU jobs
пока не используют общий reservation: их нельзя запускать параллельно с этой
симуляцией. Не запускать второй coordinator, не удалять markers вручную и не
делать `docker system prune` или `compose down` чужих стеков.
Планировщик сокращает локальный путь шагом0.1м до минимальных0.2м, чтобы не
пропускать короткие манёвры на изгибе тропы. Дистанция остановки follower0.08м
относится к этому локальному отрезку; достижение маршрутной точки и полный
тормозной контур проверяются независимо. Простое снижение минимальной длины
при штатном шаге0.5м не включает эти короткие кандидаты.
Наблюдённые низкие точки уже внутри корпуса (отступ5см от краёв) сверяются с
измеренной позой и высотой опоры. Полоса±8см не расширяет предел ступени10см.
Точки впереди, высокие препятствия и провалы сохраняются; исходная память CMU
не изменяется. Поза должна принадлежать той же транзакции наблюдения, с допуском
округления ROS не более1000нс. Число коррекций записывается в журнал решений.
Последний установленный release `0d4c0a73bbbe2066` (2026-09-23 07:34:31 UTC); предыдущие версии сохранены
для воспроизводимости. Версии до `0ad2b4bf9b3dcfa6` используют неверное совпадение визуальной
и физической сцены; откат к ним не является рабочим режимом для Gaussian-навигации. При изменении Python registry композиции нужно
согласованно перезапустить Core8000 перед новым прогоном, затем проверить
health, Worker registration и module identities. Не выполнять перезапуск
во время активных операций других операторских задач.
Текущие проверки и ограничения (результаты каждой локации отдельно):
[Route recovery audit](../audits/2026-09-22-ai-polygon-route-recovery.md).
Исходная интеграция композиции и UI:
[Composed terrain navigation audit](../audits/2026-09-22-ai-polygon-composed-terrain-navigation.md).
Предыдущие результаты миграции:
[Realtime audit](../audits/2026-09-21-ai-polygon-realtime-placement.md).
Ранние lockstep-измерения остаются в integration/operator-revision audits и не
должны трактоваться как текущая архитектура.
### Совпадение Gaussian-изображения и коллизий
SplatTransform 3.4.0 присваивает входному PLY поворот Rz(180). Подготовка сначала
отменяет его, применяет пользовательское XYZ-вращение и масштаб, затем Rx(-90)
для glTF. Загрузка физики выполняет обратный переход `(x,y,z) → (x,-z,y)`.
Версионный `qualify_terrain_coordinates.py` проверяет реальный генератор на
контрольном объекте с известными координатами.
Только известный старый генератор и точная ориентация `[-90,0,180]` допускают
миграцию готового меша поворотом на180° по горизонтали. Это точное преобразование
всех вершин, без изменения препятствий; оригинал остаётся неизменным. SHA обоих
мешей и исходный manifest сохраняются в `coordinate-correction.json`. Область
подготовленной геометрии также переносится в правильные координаты. Прежние
стартовые положения и маршруты необходимо проверить заново.
### Готовая пара Gaussian и collision mesh на Worker
`register_paired_scene.py` принимает `--root`, `--source`, `--collider` и
`--descriptor` в подготовленном Python Worker. Descriptor соответствует
`WorkerWorldCreate`: происхождение и лицензия, размер, SHA-256 обоих файлов,
число splats и настройки сцены. После проверки реальных байтов инструмент
сохраняет исходник в `state/worlds/<sha>.ply`, collision manifest — в
`assets/prepared-worlds/<sha>/terrain.json`. В Core передаётся только описание.
Регистрация требует токен и текущий Worker-Instance. В этой ветке нет загрузки
больших файлов через операторскую машину; повреждённый локальный исходник
приводит к ошибке, а не к сетевому fallback.
Перед стартом проверяется весь метровый объём, включая узкие стволы между
лучами определения грунта. Старые стартовые точки Forest/Bamboo эту проверку
не проходят. Не отключать проверку и не повышать предел ступени ради запуска.
Riverside Path использует готовую пару Habitat-GS scene62; её физическая
проверка прошла4.68м. Полный маршрут R29 завершён по трём точкам с остановкой
у цели; ограничения и дальнейшие замеры зафиксированы в route audit.
Ожидание одной транзакции CMU —600мс: накопленная карта реальной сцены
может обрабатываться дольше300мс. Независимые deadman800мс для камеры и500мс
для команды сохраняются; это не разрешение исполнять просроченные результаты.
Когда заданная маршрутная точка подтверждена семантическими и дальномерными
наблюдениями, локальная цель сохраняет её XY. Уже наблюдённая точка может
войти в слепую полосу камеры; её граница определяется реальной проекцией,
а не фиксированной дистанцией. Текущая видимая поверхность, причинная карта
CMU и контроль полного корпуса продолжают ограничивать команды. Новая локальная
цель не должна уводить ровер дальше от пропущенной маршрутной точки.
Предыдущая проверка: R30 прошёл три точки Riverside Path и остановился у цели,
4.675м за32.67с. Медиана полного inference234мс, AI3.77решения/с,
рендер16.54FPS. Оптимизация расчёта расстояний побитно совпала на130 картах,
все23 проверки опасных сценариев прошли; deadman и пределы проходимости сохранены.
Это подтверждение данного паркового маршрута, а не Forest/Bamboo или бездорожья.
### Непрерывное управление и полное задание — 23 сентября
Текущая сборка `22c28daad98da60b`; подробные изменения и receipts:
[Continuous motion audit](../audits/2026-09-23-ai-polygon-continuous-motion.md).
Привод обновляется в native physics pre-step на 60 Гц, с ограничением
нарастания скорости поверхности колёс 0.2 м/с². Защитное снижение/остановка
не задерживаются. Камера и калибровка обновляются после физики; скорость берётся
из articulation velocity. `physics-motion.jsonl` и `motion-control.json`
остаются на Worker. Пауза останавливает физику и inference; продолжение требует
свежих наблюдений и сохраняет уже наблюдённую маршрутную цель.
Для CPU-ускорения существующего анализа связности используется отдельный образ
`ndc-ai-polygon-cmu:connectivity-v1`, image digest
`sha256:698228d0d378b166ceaf299aa86ab95b5e74179837532f2378c036c7f7621dcc`.
Подготовка — `navigation/Prepare-Connectivity.ps1` поверх проверенного
`rectangle-v3`. Не подменять numerical thresholds, не включать fast-math.
NumPy-эквивалентность и hazard qualification обязательны для новой сборки.
Полные paired-source коллайдеры допускают старт по всему исходному мешу;
ограничение 30-метрового generated tile к ним не применяется. Hash/calibration
и физическая проверка полной опоры/объёма сохраняются. `route_author` использует
готовый Detour для чтения Habitat navmesh; маршрут задаёт миссию и не передаёт
привилегированную геометрию в runtime inference.
Сейчас Riverside Path настроен на полное задание 97: шесть точек, путь около
11 м. R34 достиг исходного конечного положения в допуске миссии 0.4 м
(ошибка 0.344 м), перемещение 10.59 м за 86.2 с мира. Медиана inference125мс,
AI4.57Гц, рендер17.12FPS. Пять кратких остановок из-за семантической
неуверенности остаются; пауза/продолжение проверены. Это не подтверждение
всей карты, исходного задания3, бездорожья или реального привода.