diff --git a/docs/audits/2026-09-21-ai-polygon-integration.md b/docs/audits/2026-09-21-ai-polygon-integration.md new file mode 100644 index 0000000..8ea428e --- /dev/null +++ b/docs/audits/2026-09-21-ai-polygon-integration.md @@ -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 отсутствуют. diff --git a/docs/audits/2026-09-21-ai-polygon-operator-revision.md b/docs/audits/2026-09-21-ai-polygon-operator-revision.md new file mode 100644 index 0000000..af273ba --- /dev/null +++ b/docs/audits/2026-09-21-ai-polygon-operator-revision.md @@ -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-аппараты в этом контуре отсутствуют. diff --git a/docs/audits/2026-09-21-ai-polygon-realtime-placement.md b/docs/audits/2026-09-21-ai-polygon-realtime-placement.md new file mode 100644 index 0000000..44e5041 --- /dev/null +++ b/docs/audits/2026-09-21-ai-polygon-realtime-placement.md @@ -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). diff --git a/docs/audits/2026-09-22-ai-polygon-composed-terrain-navigation.md b/docs/audits/2026-09-22-ai-polygon-composed-terrain-navigation.md new file mode 100644 index 0000000..eea6587 --- /dev/null +++ b/docs/audits/2026-09-22-ai-polygon-composed-terrain-navigation.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//` на 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). diff --git a/docs/audits/2026-09-22-ai-polygon-layout-and-bamboo-stop.md b/docs/audits/2026-09-22-ai-polygon-layout-and-bamboo-stop.md new file mode 100644 index 0000000..42517e7 --- /dev/null +++ b/docs/audits/2026-09-22-ai-polygon-layout-and-bamboo-stop.md @@ -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-форм, а масштаб скана ещё не подтверждён измеренной опорой. + +Следующая работа по автономии должна отдельно квалифицировать распознавание +проезжаемого грунта и принятие решений на неровностях. Для проверки подъёма +на камни потребуется метрически согласованная поверхность контакта и +измеренный профиль аппарата. Порог не понижался ради демонстрации движения; +успешное прохождение тропы и физическая проходимость этим изменением не заявляются. diff --git a/docs/audits/2026-09-22-ai-polygon-route-recovery.md b/docs/audits/2026-09-22-ai-polygon-route-recovery.md new file mode 100644 index 0000000..b702c3e --- /dev/null +++ b/docs/audits/2026-09-22-ai-polygon-route-recovery.md @@ -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. diff --git a/docs/audits/2026-09-23-ai-polygon-continuous-motion.md b/docs/audits/2026-09-23-ai-polygon-continuous-motion.md new file mode 100644 index 0000000..7656287 --- /dev/null +++ b/docs/audits/2026-09-23-ai-polygon-continuous-motion.md @@ -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. diff --git a/docs/runbooks/AI_POLYGON_WORKER_006.md b/docs/runbooks/AI_POLYGON_WORKER_006.md new file mode 100644 index 0000000..b530ddc --- /dev/null +++ b/docs/runbooks/AI_POLYGON_WORKER_006.md @@ -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 ` создаёт архив и манифест хешей. +Доставить их в `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.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/.ply`, collision manifest — в +`assets/prepared-worlds//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, бездорожья или реального привода.