参考博客:https://www.helywin.com/posts/20260605124741/

核心原则

  • 所有镜像源使用华为云加速(Ubuntu apt、ROS apt、Docker 容器镜像)
  • 包管理只用 apt,不使用 rosdep
  • 使用 Podman + Distrobox 运行 rootless Ubuntu 18.04 容器

一、宿主机准备(EndeavourOS)

1.1 安装 Podman 和 Distrobox

EndeavourOS(Arch 系)使用 pacman 安装:

BASH
sudo pacman -S --needed podman distrobox

验证:

BASH
podman --version
distrobox --version

1.2 用户组配置(串口/摄像头权限,可选)

如果需要使用串口或摄像头,在宿主机执行:

BASH
sudo usermod -aG dialout $USER   # 串口权限
sudo usermod -aG video $USER     # 摄像头/GPU 权限

添加组后需要 完全注销并重新登录 才能生效。

二、创建 Ubuntu 18.04 容器

2.1 使用华为云镜像拉取 Ubuntu 18.04

华为云 SWR 提供 Docker Hub 镜像加速:

BASH
podman pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/ubuntu:18.04
podman tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/ubuntu:18.04 ubuntu:18.04

2.2 创建 Distrobox 容器

BASH
distrobox create \
  --image ubuntu:18.04 \
  --name ros-melodic-box \
  --home ~/distrobox-homes/ros-melodic \
  --yes

2.3 首次进入容器(初始化)

BASH
distrobox enter ros-melodic-box

首次进入会自动安装约 200 多个基础包,耗时 3~5 分钟,不要中断

三、容器内配置

3.1 配置华为云 Ubuntu 镜像源

容器内基础镜像缺少 CA 证书,先使用 HTTP 源安装证书,再切换到 HTTPS:

BASH
# 先使用 HTTP 源
sudo tee /etc/apt/sources.list << 'EOF'
deb http://mirrors.huaweicloud.com/repository/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.huaweicloud.com/repository/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.huaweicloud.com/repository/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.huaweicloud.com/repository/ubuntu/ bionic-security main restricted universe multiverse
EOF

sudo apt update
sudo apt install -y ca-certificates

# 切换到 HTTPS 源
sudo tee /etc/apt/sources.list << 'EOF'
deb https://mirrors.huaweicloud.com/repository/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.huaweicloud.com/repository/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.huaweicloud.com/repository/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.huaweicloud.com/repository/ubuntu/ bionic-security main restricted universe multiverse
EOF

sudo apt update

3.2 安装基础工具

BASH
sudo apt install -y \
    curl gnupg2 lsb-release software-properties-common \
    git build-essential \
    python-rosdep python-rosinstall \
    python-rosinstall-generator python-wstool \
    mesa-utils

python-catkin-tools 通过 pip 安装:

BASH
sudo apt install -y python-pip
sudo pip install catkin_tools

四、安装 ROS Melodic

4.1 添加华为 ROS 镜像源

BASH
sudo tee /etc/apt/sources.list.d/ros-latest.list << 'EOF'
deb https://mirrors.huaweicloud.com/ros/ubuntu/ bionic main
EOF

curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt update

4.2 安装 ROS Melodic 完整版

BASH
sudo DEBIAN_FRONTEND=noninteractive apt install -y ros-melodic-desktop-full

安装包约 500MB,解压后约 2.3GB,请耐心等待。

4.3 修复依赖冲突

安装完成后可能出现 python-rospkg-modules / python-rosdistro-modules 与旧包文件冲突,执行:

BASH
sudo apt -o Dpkg::Options::=--force-overwrite install -y \
    python-rospkg-modules python-rosdistro-modules python-catkin-pkg-modules

sudo apt --fix-broken install -y

4.4 验证安装

BASH
dpkg -l | grep ros-melodic-desktop-full
# ii  ros-melodic-desktop-full  1.4.1-0bionic.20230620.175308  amd64  ...

五、环境变量配置

将 ROS 环境变量添加到 ~/.bashrc

BASH
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc

验证版本:

BASH
rosversion -d
# 输出:melodic

六、创建 catkin 工作空间(可选)

BASH
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
# 在这里 git clone 需要的 ROS 包
cd ~/catkin_ws
catkin_make

如果有工作空间,也加到 ~/.bashrc

BASH
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

七、测试 ROS 环境

在容器内执行以下命令测试:

BASH
source /opt/ros/melodic/setup.bash

# 启动 ROS Master
roscore &
sleep 3

# 查看话题列表
rostopic list
# 预期输出:
# /rosout
# /rosout_agg

# 发布测试消息
rostopic pub -1 /test std_msgs/String 'data: "hello ros melodic"'

# 接收测试消息
rostopic echo -n 1 /test
# 预期输出:
# data: "hello ros melodic"
# ---

# 启动 talker / listener
rosrun roscpp_tutorials talker &
rosrun roscpp_tutorials listener

如果 rostopic echo 能收到消息、talker/listener 正常输出,说明 ROS 环境配置成功。

八、日常使用

8.1 进入容器

BASH
distrobox enter ros-melodic-box

8.2 在宿主机直接执行容器内 ROS 命令

BASH
# 编译工作空间
distrobox enter ros-melodic-box -- bash -c "source /opt/ros/melodic/setup.bash && cd ~/catkin_ws && catkin_make"

# 直接运行 launch 文件
distrobox enter ros-melodic-box -- bash -c "source /opt/ros/melodic/setup.bash && roslaunch your_package your.launch"

8.3 停止/删除容器

BASH
# 停止
distrobox stop ros-melodic-box

# 删除容器(保留家目录数据)
distrobox rm ros-melodic-box

# 完全删除容器和数据
podman stop ros-melodic-box
podman rm ros-melodic-box
rm -rf ~/distrobox-homes/ros-melodic

九、数据备份

所有代码和配置都保存在宿主机的 ~/distrobox-homes/ros-melodic/ 下:

BASH
# 备份整个环境
tar czvf ros-melodic-backup.tar.gz ~/distrobox-homes/ros-melodic/

即使容器被删除,只要保留该目录,重建容器时指定同一个 --home 即可恢复。

十、常见问题

问题 解决
容器首次进入失败/退出 等待初始化完成(3~5 分钟),不要按 Ctrl+C
apt update 证书错误 先换 HTTP 源安装 ca-certificates,再切 HTTPS
python-rospkg-modules 文件冲突 使用 --force-overwrite 安装
串口无权限 宿主机执行 sudo usermod -aG dialout $USER,注销重新登录
GUI 程序无法显示 确保在桌面环境运行,Distrobox 会自动透传 DISPLAY

十一、为什么不用 rosdep?

本方案固定使用 Ubuntu 18.04,所有依赖均可通过 apt 直接安装。rosdep 在国内网络环境下经常初始化失败,因此本教程选择只用 apt 管理依赖,简化环境搭建流程。