Docker

Docker将一个应用与其整个用户空间环境——操作系统库、编译器、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
  -v ~/data:/data \                         # 数据集存放在主机上
  -v $(pwd):/ws/src/my_slam \               # 从主机实时编辑源代码
  -e DISPLAY=$DISPLAY \
  -v /tmp/.X11-unix:/tmp/.X11-unix \        # 用于可视化工具的X11转发
  --network host \                          # 跨主机/容器的ROS发现机制
  my_slam bash

需要熟悉的关键概念:

超越基础

在实践中,几乎每一个严肃的开源SLAM仓库现在都会附带一个Dockerfile,复现一篇论文的结果通常从docker build开始。Docker也是大规模评估SLAM的方式:CI流水线在容器内运行数据集基准测试,机器人也越来越多地将感知栈以容器形式部署,以实现干净的更新和回滚。

常见陷阱

对SLAM的意义

SLAM系统的依赖栈素来庞大而脆弱(特定版本的OpenCV/Eigen/Ceres/ROS在不同项目间相互冲突)。Docker让你能在同一台机器上共存ORB-SLAM3、VINS-Fusion和一个基于PyTorch的前端,而不会让它们的依赖相互打架,能让你自己的研究对他人可复现,并且是CI基准测试和真实机器人部署的标准打包单元。

相关条目