Docker

Dockerはアプリケーションを、そのユーザースペース全体の環境 — OSライブラリ、コンパイラ、Pythonのバージョン、CUDAツールキット — とともにコンテナイメージにパッケージ化し、どのLinuxホスト上でも同一に動作させる。SLAMの実務では、これが分野で最もよくある実務的な悩みを解決する。すなわち、Ubuntu、OpenCV、Eigen、Ceres、ROSの特定のバージョンの組み合わせでしかビルドできない研究コードの問題である。

典型的なSLAM用Dockerfileは、まさにその組み合わせを固定する。

FROM ros:humble
RUN apt-get update && apt-get install -y \
    libeigen3-dev libopencv-dev libceres-dev \
 && rm -rf /var/lib/apt/lists/*
COPY . /ws/src/my_slam
RUN cd /ws && . /opt/ros/humble/setup.sh && colcon build

そして典型的な開発用のrun実行コマンドは、必要になるであろうほとんどのフラグを組み合わせる。

docker build -t my_slam .
docker run -it --rm \
  --gpus all \                              # NVIDIA Container Toolkit: GPU inside
  -v ~/data:/data \                         # datasets live on the host
  -v $(pwd):/ws/src/my_slam \               # live-edit source from the host
  -e DISPLAY=$DISPLAY \
  -v /tmp/.X11-unix:/tmp/.X11-unix \        # X11 forwarding for visualizers
  --network host \                          # ROS discovery across host/container
  my_slam bash

慣れておくべき重要な考え方は次の通り。

基本を超えて

実務上、今やほとんどすべての本格的なオープンソースSLAMリポジトリはDockerfileを備えており、論文の結果を再現する作業は通常docker buildから始まる。Dockerはまた、SLAMが大規模に評価される仕組みでもある。CIパイプラインはコンテナ内でデータセットベンチマークを実行し、ロボットはクリーンな更新とロールバックのために知覚スタックをコンテナとしてデプロイすることが増えている。

よくある落とし穴

SLAMにおける意義

SLAMシステムは悪名高いほど重く脆弱な依存関係スタック(プロジェクト間で衝突する特定のOpenCV/Eigen/Ceres/ROSバージョン)を持つ。Dockerを使えば、ORB-SLAM3、VINS-Fusion、PyTorchベースのフロントエンドを1台のマシン上で、それぞれの依存関係を衝突させずに保持できる。また自分の研究を他者にも再現可能にし、CIベンチマークと実ロボットへのデプロイの両方における標準的なパッケージング単位である。

関連ノート