Add D455 sensor host and shared Node/Core preparation surface

This commit is contained in:
DCCONSTRUCTIONS
2026-09-05 22:27:07 +03:00
parent 3616acc648
commit b1aaa40508
41 changed files with 2293 additions and 19 deletions
@@ -0,0 +1,79 @@
# Сенсорный контур Node и два интерфейса управления
Решение владельца от 05.09.2026. Развивает исходные требования MISSIONCOR-76.
Первый адаптер — RealSense D455; K1 остаётся отдельным следующим адаптером,
только Wi-Fi Bridge общей сети. USB-инвентаризация системы не равна устройству,
готовому к захвату.
## Операторский сценарий
Ручное сопряжение БК с Core обязательно и предшествует удалённому управлению.
Node обнаруживает поддерживаемую модель, даже если её драйвер ещё не развёрнут.
В «Устройствах» Node и внутри аппарата Core отображается одна и та же строка:
название, модель, фактическое состояние, круглая кнопка «Подготовить и проверить»
(download), отдельные настройки (settings), переход к просмотру (eye).
Подготовка запускается непосредственно из строки, без предварительной модалки.
Настройки имени остаются компактным окном. Глазик открывает следующий уровень
с камерой и её слоями; это основной экран, а не модальное окно.
Это согласованная владельцем предметная композиция list/detail внутри уже
принятого раздела. Вариант с подготовкой только в модалке отвергнут владельцем:
он добавляет лишнее действие. Полноценный просмотр в модалке не подходит для
постоянной работы с захватом и слоями. ResourceRow/List, IconButton, Window,
SettingsCard, Select, SegmentedControl, ActivityIndicator и StatusBadge берутся
из Design Guideline. Общий предметный React-модуль используется обоими
приложениями через транспортный адаптер; визуальные компоненты не дублируются.
## Единственный владелец состояния
Node владеет обнаружением, подготовкой драйвера, конфигурацией, сеансом,
захватом и исходной записью. Core является вторым авторизованным клиентом.
Оба интерфейса читают один результат. Открытие глазика, обновление страницы,
переподключение и heartbeat никогда не запускают захват. START/STOP требуют
явного действия, идентификатора операции и дедупликации на борту. Потерянный
ответ не означает ошибку выполнения: неопределённый исход не повторяется
автоматически. Отзыв сопряжения прекращает приём новых команд от Core.
Обнаружение, enrollment, connectivity, acquisition, DeviceInstanceRef,
DeviceSessionSnapshot и ExecutionBinding используют SDK v0alpha2. Адрес USB
является transport alias. Стабильная идентичность D455 выводится из аппаратного
серийного номера; сами серийные номера и реальные кадры не попадают в Git/Ops.
## Подготовка модели
Общая «Настройка окружения» готовит БК. Поддерживаемая модель имеет отдельный
версионный профиль подготовки, фиксированные зависимости с хешами и проверки.
Драйверный payload входит в .deb; оператор не выбирает пакеты, URL и команды.
Кнопка работает и локально, и через сопряжённый Core. Привилегия ограничена
запуском одного фиксированного systemd-задания подготовки модели. Node остаётся
без capabilities, с PrivateDevices и NoNewPrivileges. Драйвер работает отдельным
пользователем и получает доступ к D455 через узкие udev-правила. Нет глобального
pip, chmod 666 для всех камер, firmware-update или патча ядра.
Этапы и ошибки сохраняются. Повторное действие проверяет установленный payload
и результат; две панели не запускают две установки. Успех установки отдельно
от успеха проверки камеры. «Готово» требует открытия SDK и получения реальных
кадров выбранного устройства; отсутствие камеры/профиля/прав даёт конкретный
неуспех. Закрытие UI не обрывает системное задание или запись.
## Данные и просмотр
RGB, depth, IR1/IR2 и IMU перечисляются из реального SDK. Профили, доступность
параметров и диапазоны получаются у камеры, несовместимые комбинации отвергаются
до START. Глубина остаётся метрической исходной Z16; цветная глубина и облако
точек — производные представления с калибровкой. Preview ограничен по частоте
и плотности; исходная запись не подменяется видеокодеком или предпросмотром.
Управляющий канал отделён от WebRTC. Сигналинг проходит через локальную сессию
Node либо существующее mTLS-доверие Core. Нет публичного rendezvous/STUN/TURN;
используются частные адреса LAN/tailnet. Tailscale — сменный транспорт, а не
идентичность оборудования. WebRTC не инициирует аппаратный захват.
## Приёмка
Настройка из строки, прогресс и повторное открытие, одинаковое состояние в
Node/Core, переименование, глазик, профили, действительные кадры и все доступные
слои проверяются через интерфейс. Проверки кода и SSH-диагностика дополняют GUI,
но не заменяют её. Реальные эксперименты имеют приватный manifest с UTC,
monotonic, границами и SHA-256. Чистая установка остаётся отложенным владельцем
критерием; текущий подготовленный Mini не выдаётся за чистую систему.