ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

使用docker为slambook2配置环境

使用docker为slambook2配置环境

1. 安装与配置Docker

安装docker

sudo apt update sudo apt install -y ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc

添加docker官方软件源

sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF Types: deb URIs: https://download.docker.com/linux/ubuntu Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") Components: stable Architectures: $(dpkg --print-architecture) Signed-By: /etc/apt/keyrings/docker.asc EOF

安装 Docker Engine、Docker Compose 和 Buildx

sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-plugin
  • Docker Engine:核心运行环境,负责构建、运行和管理容器。
  • Docker Compose:用一个 compose.yml 文件定义并一键启动多个协作服务,例如 Web、数据库、缓存。
  • Buildx:增强版镜像构建器,支持多平台镜像(如 amd64 与 arm64)、更高效缓存等高级构建能力。

验证服务与安装结果

sudo systemctl is-active docker sudo docker run --rm hello-world

分别输出 active 和 Hello from Docker! 即表示安装成功。

2. 配置docker代理

Docker daemon 不会自动使用终端中的代理环境变量,需要单独配置。

创建 systemd 配置目录和代理配置文件:

sudo mkdir -p /etc/systemd/system/docker.service.d sudoedit /etc/systemd/system/docker.service.d/proxy.conf

写入以下内容,将 127.0.0.1:7897 替换为实际代理地址和端口:

[Service] Environment="HTTP_PROXY=http://127.0.0.1:7897" Environment="HTTPS_PROXY=http://127.0.0.1:7897" Environment="NO_PROXY=localhost,127.0.0.1,::1"

重新加载 systemd 并重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

验证代理配置:

sudo systemctl show --property=Environment docker sudo docker pull hello-world

若镜像可以正常拉取,说明 Docker 代理配置生效。

3. 获取slambook2的源码

cd mkdir slam cd slam git clone --recurse-submodules \ https://github.com/gaoxiang12/slambook2.git \

4. 创建算法镜像

为 slambook2 构建一张基于 Ubuntu 22.04 + ROS 2 Humble Desktop 的派生开发镜像。 Docker 只负责提供稳定、隔离的编译与运行环境;源码、数据集、配置、构建缓存和实验结果全部保留在宿主机,便于调试、迭代与复现。

构建 ROS Humble Desktop 基础镜像

创建专用目录

mkdir -p ~/robotics-containers/ros-humble-desktop cd ~/robotics-containers/ros-humble-desktop

创建 Dockerfile

FROM osrf/ros:humble-desktop-full-jammy SHELL ["/bin/bash", "-o", "pipefail", "-c"] ARG USERNAME=slam ARG USER_UID=1000 ARG USER_GID=1000 ENV DEBIAN_FRONTEND=noninteractive \ LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 \ ROS_DISTRO=humble RUN apt-get update \ && apt-get install -y --no-install-recommends \ bash-completion \ build-essential \ ca-certificates \ cmake \ git \ locales \ pkg-config \ python3-argcomplete \ python3-colcon-common-extensions \ python3-rosdep \ python3-vcstool \ sudo \ wget \ && locale-gen en_US.UTF-8 \ && rm -rf /var/lib/apt/lists/* RUN groupadd --gid "${USER_GID}" "${USERNAME}" \ && useradd --uid "${USER_UID}" --gid "${USER_GID}" \ --create-home --shell /bin/bash "${USERNAME}" \ && echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" \ > "/etc/sudoers.d/${USERNAME}" \ && chmod 0440 "/etc/sudoers.d/${USERNAME}" WORKDIR /home/${USERNAME} USER ${USERNAME} ENTRYPOINT ["/ros_entrypoint.sh"] CMD ["bash"]

构建基础镜像

sudo docker build \ --build-arg USERNAME=slam \ --build-arg USER_UID="$(id -u)" \ --build-arg USER_GID="$(id -g)" \ --tag robotics/ros-humble-desktop:humble-jammy-2026.10.1 \ --file Dockerfile \ .

确认镜像构建完成

sudo docker image ls robotics/ros-humble-desktop

验证容器内用户与 ROS 环境

sudo docker run --rm robotics/ros-humble-desktop:humble-jammy-2026.10.1 \ bash -lc 'id; echo "ROS_DISTRO=$ROS_DISTRO"; ros2 --help >/dev/null'

构建派生镜像

创建Dockerfile

在~/robotics-containers/slambook2下创建Dockerfile并写入下述内容

FROM robotics/ros-humble-desktop:humble-jammy-2026.10.1 SHELL ["/bin/bash", "-o", "pipefail", "-c"] USER root ARG DEBIAN_FRONTEND=noninteractive # 固定第三方库版本:与 slambook2 当前子模块记录对应。 ARG SOPHUS_COMMIT=13fb3288311485dc94e3226b69c9b59cd06ff94e ARG G2O_COMMIT=9b41a4ea5ade8e1250b9c1b279f3a9c098811b5a ARG PANGOLIN_COMMIT=1ec721d59ff6b799b9c24b8817f3b7ad2c929b83 ARG DBOW3_COMMIT=c5ae539abddcef43ef64fa130555e2d521098369 # 系统依赖:覆盖 ch2 至 ch13 的主要编译需求。 RUN apt-get update \ && apt-get install -y --no-install-recommends \ build-essential \ cmake \ ninja-build \ git \ pkg-config \ libeigen3-dev \ libopencv-dev \ libceres-dev \ libsuitesparse-dev \ libboost-all-dev \ libgoogle-glog-dev \ libgflags-dev \ libgtest-dev \ libpcl-dev \ liboctomap-dev \ libgl1-mesa-dev \ libglu1-mesa-dev \ libglvnd-dev \ libglew-dev \ freeglut3-dev \ libx11-dev \ libxcursor-dev \ libxi-dev \ libxinerama-dev \ libxrandr-dev \ libavcodec-dev \ libavformat-dev \ libavutil-dev \ libswscale-dev \ libjpeg-dev \ libpng-dev \ libtiff-dev \ libopenexr-dev \ && rm -rf /var/lib/apt/lists/* # Sophus RUN git clone https://github.com/strasdat/Sophus.git /tmp/Sophus \ && git -C /tmp/Sophus checkout "${SOPHUS_COMMIT}" \ && cmake -S /tmp/Sophus -B /tmp/Sophus/build -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_TESTING=OFF \ -DBUILD_SOPHUS_EXAMPLES=OFF \ && cmake --build /tmp/Sophus/build --parallel \ && cmake --install /tmp/Sophus/build \ && rm -rf /tmp/Sophus # g2o RUN git clone https://github.com/RainerKuemmerle/g2o.git /tmp/g2o \ && git -C /tmp/g2o checkout "${G2O_COMMIT}" \ && cmake -S /tmp/g2o -B /tmp/g2o/build -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DG2O_BUILD_APPS=OFF \ -DG2O_BUILD_EXAMPLES=OFF \ -DG2O_BUILD_TESTS=OFF \ -DG2O_BUILD_SLAM2D_TYPES=ON \ -DG2O_BUILD_SLAM3D_TYPES=ON \ -DG2O_BUILD_SBA_TYPES=ON \ -DG2O_USE_CHOLMOD=ON \ && cmake --build /tmp/g2o/build --parallel \ && cmake --install /tmp/g2o/build \ && rm -rf /tmp/g2o # Pangolin RUN git clone https://github.com/stevenlovegrove/Pangolin.git /tmp/Pangolin \ && git -C /tmp/Pangolin checkout "${PANGOLIN_COMMIT}" \ && cmake -S /tmp/Pangolin -B /tmp/Pangolin/build -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_EXAMPLES=OFF \ -DBUILD_TESTS=OFF \ -DBUILD_TOOLS=OFF \ && cmake --build /tmp/Pangolin/build --parallel \ && cmake --install /tmp/Pangolin/build \ && rm -rf /tmp/Pangolin # DBoW3:关闭共享库,确保 ch11 所需的 libDBoW3.a 被安装到 /usr/local/lib。 RUN git clone https://github.com/rmsalinas/DBow3.git /tmp/DBoW3 \ && git -C /tmp/DBoW3 checkout "${DBOW3_COMMIT}" \ && cmake -S /tmp/DBoW3 -B /tmp/DBoW3/build -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=OFF \ && cmake --build /tmp/DBoW3/build --parallel \ && cmake --install /tmp/DBoW3/build \ && rm -rf /tmp/DBoW3 # 让运行时动态链接器发现 /usr/local/lib 下的新共享库。 RUN ldconfig # 不复制 slambook2 源码、数据、配置或输出。 USER slam WORKDIR /home/slam

构建镜像

sudo docker build \ --tag robotics/slambook2:humble-jammy-2026.10.1 \ .

进行镜像

sudo docker run --rm -it \ --mount type=bind,src=/home/cp/learn/slam/slambook2,dst=/workspace/src,readonly \ --mount type=bind,src=/home/cp/outputs/slambook2,dst=/workspace/output \ robotics/slambook2:humble-jammy-2026.10.1 \ bash

配置与编译源码

sudo docker run -d \ --name slambook2-dev \ --mount type=bind,src=/home/cp/workspaces/slambook2,dst=/workspace/src,readonly \ --mount type=bind,src=/home/cp/outputs/slambook2,dst=/workspace/output \ "$IMAGE" \ sleep infinity

查看实际输入输出绑定

sudo docker inspect slambook2-dev \ --format '{{range .Mounts}}{{printf "%s -> %s type=%s rw=%t\n" .Source .Destination .Type .RW}}{{end}}'

确认无误后,先编译 ch2。它只验证最基础的 CMake/C++,不依赖数据集:

sudo docker run -d \ --name slambook2-dev \ --mount type=bind,src=/home/cp/workspaces/slambook2,dst=/workspace/src,readonly \ --mount type=bind,src=/home/cp/outputs/slambook2,dst=/workspace/output \ "$IMAGE" \ sleep infinity

结果测试

sudo docker exec slambook2-dev \ /workspace/output/build/ch2/helloSLAM

关闭容器

sudo docker stop slambook2-dev
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进