告别环境冲突!用Docker在Ubuntu 22.04上5分钟搞定ROS2 Humble和Rviz

你是否曾在尝试新版本ROS时,因为依赖冲突而不得不重装系统?或是为了测试某个功能,不得不忍受漫长的环境配置过程?ROS开发者最头疼的问题莫过于"环境污染"和"版本冲突"。本文将介绍如何利用Docker容器技术,在Ubuntu 22.04系统上快速搭建ROS2 Humble开发环境,并顺利运行Rviz可视化工具,整个过程只需5分钟,且完全不会影响你的主系统环境。

1. 为什么选择Docker容器化ROS开发环境

传统ROS安装方式直接作用于主机系统,会带来几个显著问题:

  • 依赖冲突:不同ROS版本对系统库的要求可能相互矛盾
  • 环境污染:长期使用后系统会积累大量ROS相关文件,难以彻底清理
  • 重复配置:每次在新机器上都需要重新执行繁琐的安装步骤
  • 多版本并存困难:同时维护多个ROS版本几乎不可能

相比之下,Docker容器化方案具有明显优势:

特性 传统安装 Docker容器化
隔离性 完全隔离
可重复性 镜像可共享复用
清理难度 困难 一键删除
多版本支持 复杂 简单
系统影响 零影响

提示:Docker容器特别适合需要频繁切换ROS版本或进行短期实验的场景,它能让你像使用"应用沙盒"一样管理ROS环境。

2. 环境准备与Docker基础配置

在开始之前,请确保你的Ubuntu 22.04系统已经安装Docker引擎。如果尚未安装,可以通过以下命令快速完成:

# 安装Docker官方GPG密钥
sudo apt-get update
sudo apt-get install 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仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证安装
sudo docker run hello-world

安装完成后,建议将当前用户加入docker组,避免每次都需要sudo:

sudo usermod -aG docker $USER
newgrp docker  # 立即生效,无需重新登录

3. 获取ROS2 Humble容器镜像

官方已经提供了预配置好的ROS2 Humble镜像,我们可以直接拉取:

docker pull osrf/ros:humble-desktop-full-jammy

这个镜像包含了ROS2 Humble的完整桌面环境,包括:

  • ROS2核心组件
  • Rviz2可视化工具
  • Gazebo仿真环境
  • 常用开发工具

镜像下载完成后,可以通过以下命令验证:

docker images | grep humble-desktop

你应该能看到类似这样的输出:

osrf/ros   humble-desktop-full-jammy   a1b2c3d4e5f6   2 weeks ago   2.3GB

4. 创建并运行ROS2容器

现在我们可以启动一个交互式容器来使用ROS2环境:

docker run -it --name ros2_humble_demo osrf/ros:humble-desktop-full-jammy /ros_entrypoint.sh bash

这个命令做了以下几件事:

  1. -it:以交互模式运行容器
  2. --name ros2_humble_demo:为容器指定一个易记的名称
  3. osrf/ros:humble-desktop-full-jammy:使用的镜像名称
  4. /ros_entrypoint.sh bash:启动时执行的命令

进入容器后,你可以立即验证ROS2环境:

source /opt/ros/humble/setup.bash
ros2 --help

5. 在容器中运行Rviz2

要在Docker容器中运行图形界面程序如Rviz2,需要额外配置X11转发。首先在主机终端执行:

xhost +local:docker

然后使用以下命令启动带有GUI支持的容器:

docker run -it --rm \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    --name ros2_humble_rviz \
    osrf/ros:humble-desktop-full-jammy \
    /ros_entrypoint.sh bash

在容器内部,执行以下命令启动Rviz2:

source /opt/ros/humble/setup.bash
rviz2

如果一切正常,你应该能看到Rviz2的图形界面弹出。

6. 容器化ROS开发的高级技巧

6.1 持久化工作空间

默认情况下,容器停止后所有修改都会丢失。要保存你的工作空间,可以使用数据卷:

# 创建持久化卷
docker volume create ros2_ws

# 启动容器时挂载卷
docker run -it --rm \
    -v ros2_ws:/home/ros/ros2_ws \
    --name ros2_humble_ws \
    osrf/ros:humble-desktop-full-jammy \
    /ros_entrypoint.sh bash

6.2 使用Docker Compose管理复杂环境

对于更复杂的ROS多节点场景,可以创建docker-compose.yml文件:

version: '3'
services:
  ros2-core:
    image: osrf/ros:humble-desktop-full-jammy
    command: /ros_entrypoint.sh ros2 run demo_nodes_cpp talker
    environment:
      - DISPLAY=${DISPLAY}
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix
      - ros2_ws:/home/ros/ros2_ws

  ros2-visualization:
    image: osrf/ros:humble-desktop-full-jammy
    command: /ros_entrypoint.sh ros2 run demo_nodes_cpp listener
    depends_on:
      - ros2-core

volumes:
  ros2_ws:

然后通过docker-compose up启动整个系统。

6.3 自定义Docker镜像

如果需要额外工具,可以基于官方镜像构建自定义镜像。创建Dockerfile:

FROM osrf/ros:humble-desktop-full-jammy

# 安装额外工具
RUN apt-get update && apt-get install -y \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*

# 安装Python包
RUN pip3 install --no-cache-dir \
    numpy \
    pandas

# 设置工作目录
WORKDIR /home/ros/ros2_ws

构建并运行自定义镜像:

docker build -t my_ros2_humble .
docker run -it my_ros2_humble /ros_entrypoint.sh bash

7. 常见问题与解决方案

Q:Rviz2启动后窗口是空白的?

A:这通常是权限问题,尝试在主机执行:

xhost +

Q:如何彻底清理ROS2容器环境?

A:执行以下命令序列:

# 停止所有容器
docker stop $(docker ps -aq)

# 删除所有容器
docker rm $(docker ps -aq)

# 删除ROS2镜像
docker rmi osrf/ros:humble-desktop-full-jammy

# 清理未使用的资源
docker system prune -a

Q:容器内的时间与主机不同步?

A:启动容器时添加--privileged--pid=host参数:

docker run -it --privileged --pid=host ...

Q:如何在VSCode中使用容器开发?

A:安装"Remote - Containers"扩展,然后:

  1. 按F1选择"Remote-Containers: Attach to Running Container"
  2. 选择你的ROS2容器
  3. 在容器内安装必要的VSCode扩展

在实际项目中,我发现最实用的技巧是为常用命令创建shell别名,比如:

alias ros2-docker='docker run -it --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix osrf/ros:humble-desktop-full-jammy /ros_entrypoint.sh bash'

这样只需输入ros2-docker就能快速启动一个带GUI支持的ROS2环境。

更多推荐