Перейти к содержанию
Скачать руководство PDF

Запуск в Docker

Docker-режим запускает драйверы, ROS-мост, веб-сервер и модели в одном контейнере. На Linux-хосте нужны Docker Engine и Compose. Docker Engine должен работать на том же компьютере, где находятся исходники, камеры и каталог данных. ROS, Node.js и Python приложения устанавливаются в образ. Управление выполняется той же командой smartcamera.

Подготовка

Сначала установите CLI, затем проверьте Docker:

docker version
docker compose version
docker info

Если Docker отсутствует, smartcamera docker-setup запускает установочный скрипт через sudo для Ubuntu 24.04. Скрипт использует официальный APT-репозиторий Docker. Конфликтующие пакеты не удаляются автоматически. Уже установленный Docker не переустанавливается. Если после установки пользователь не имеет доступа к сокету, настройте доступ по инструкции Docker, войдите в сеанс заново и повторите команду. CLI не добавляет пользователя в группы самостоятельно.

Для других дистрибутивов установите Docker по официальной инструкции. Далее CLI может использовать работающий Docker Engine. Docker Desktop на macOS и Windows не проверен для проброса камер и ROS DDS.

CPU: сборка и первый запуск

smartcamera docker-setup --yes --profile cpu

smartcamera run --detach

smartcamera status

Сборка выполняется из каталога исходников, выбранного при установке CLI или переданного через --source. Используются также локальные незакоммиченные файлы. При сборке контейнера используются эти исходники; повторного скачивания проекта нет.

Первая сборка скачивает базовые образы, системные пакеты и PyTorch. Это требует интернета, нескольких гигабайт свободного места и заметного времени. Готовый образ получает локальное имя smartcamera:cpu; он никуда не публикуется.

Откройте http://127.0.0.1:8000. Первый запуск без добавленных камер нужен для проверки веб-сервера. run --detach ожидает успешного HTTP health-check; если контейнер не готов за 120 секунд, команда завершится ошибкой. Посмотрите журнал:

smartcamera logs --follow
smartcamera stop

После неудачного запуска stop удаляет контейнер и служебное состояние CLI. Пользовательский каталог данных сохраняется. Команда run без --detach после проверки готовности показывает журнал; Ctrl+C останавливает контейнер.

USB-камера V4L2

По умолчанию контейнеру не передаётся ни одна камера. Разрешите нужное устройство:

smartcamera stop
smartcamera configure --yes --device /dev/video0
smartcamera run --detach

--device можно повторить для нескольких устройств. Переданный список заменяет предыдущий. --clear-devices очищает список. Контейнер получает UID/GID пользователя хоста и группы выбранных устройств. На хосте у пользователя тоже должен быть доступ к камере.

В веб-интерфейсе добавьте V4L2-камеру с тем же путём /dev/video0. Если используете /dev/v4l/by-id/..., передайте именно этот путь через --device и укажите его в конфигурации камеры. После переподключения V4L2-камеры остановите и снова запустите контейнер: номер устройства и привязка Docker могли измениться.

RealSense

Для доступа к USB-шине:

smartcamera stop
smartcamera configure --yes --usb
smartcamera run --detach

В этом режиме монтируется /dev/bus/usb и разрешаются USB character devices (major 189). Режим privileged не используется. --usb даёт доступ к USB-шине, а не только к одному серийному номеру. Конкретную камеру затем выбирают в SmartCamera. Для отключения доступа используйте configure --yes --no-usb.

Правила udev устанавливаются на хосте, не внутри контейнера. На Docker-хосте без локальной установки SmartCamera настройте правила RealSense отдельно:

curl --fail --location \
  https://raw.githubusercontent.com/IntelRealSense/librealsense/v2.50.0/config/99-realsense-libusb.rules \
  --output /tmp/99-realsense-libusb.rules
sudo install -m 644 /tmp/99-realsense-libusb.rules /etc/udev/rules.d/99-realsense-libusb.rules
sudo udevadm control --reload-rules

Затем переподключите камеру. Образ собирается с librealsense 2.50.0, как профиль L515 в проекте. Для камер, использующих V4L2-узлы, также передайте соответствующие /dev/videoN через --device. Возможность горячего переподключения зависит от SDK, ядра и устройства; после потери доступа пересоздайте контейнер.

NVIDIA GPU

Установите на хосте совместимый NVIDIA-драйвер и NVIDIA Container Toolkit. Профиль проекта использует PyTorch с CUDA 13.0; драйвер должен поддерживать эту версию. Наличие установленного CUDA Toolkit на хосте само по себе не означает, что контейнеру доступен GPU.

nvidia-smi
smartcamera stop
smartcamera docker-setup --yes --profile cuda
smartcamera run --detach

Образ получает имя smartcamera:cuda. Compose запрашивает NVIDIA GPU, а entrypoint проверяет torch.cuda.is_available() перед запуском ROS. Если GPU недоступен, контейнер останавливается с объяснением в журнале. Сборка CUDA-образа не требует доступа к GPU; проверка выполняется именно при запуске.

Профиль cuda подготавливает окружение, но не меняет устройство у уже сохранённых запусков моделей. В карточке модели на камере выберите Устройство → cuda:0 и примените настройки, как описано в запуске модели.

Механизм передачи GPU описан в документации Compose. CPU-образ не запрашивает NVIDIA runtime.

ROS 2 и сеть

Используется сеть хоста (network_mode: host), чтобы контейнер и ROS-узлы хоста могли участвовать в DDS discovery. Сопоставление портов -p не требуется. Порт 8000 должен быть свободен. Настройте одинаковый ROS_DOMAIN_ID:

smartcamera stop
smartcamera configure --yes --domain-id 10
smartcamera run --detach
export ROS_DOMAIN_ID=10
source /opt/ros/jazzy/setup.bash
ros2 topic list

Для своих программ на хосте установите и соберите smart_camera_interfaces. Примеры команд и QoS приведены в разделе ROS 2. Для доступа к веб-интерфейсу с другого компьютера задайте configure --yes --host 0.0.0.0; приложение будет слушать сетевые интерфейсы хоста.

Постоянные файлы

Каталог данных монтируется по тому же абсолютному пути внутри контейнера, чтобы пути к снимкам и моделям не менялись только из-за перехода в Docker. Исходники не монтируются поверх собранного приложения. После изменения кода выполните stop, rebuild, затем run.

Настройки веб-интерфейса могут содержать другой каталог записи. В контейнере доступны только смонтированные пути: выбирайте папки внутри каталога данных. Перенос существующей установки с моделями и калибровками требует проверки абсолютных путей; CLI не переписывает их автоматически.

Для просмотра Compose-конфигурации без создания файлов:

smartcamera run --mode docker --dry-run

Сгенерированная конфигурация рабочего запуска хранится рядом с настройками CLI. Команды stop и logs используют её, поэтому завершают именно зарегистрированный экземпляр. Перед изменением настроек или сборкой выполните stop.