一种优雅的ROS开发方式:使用distrobox容器
不少小伙伴最近在用 ROS / ROS2 开发的时候,都碰到一个很现实的问题:新硬件越来越新,但 ROS 往往又和 Ubuntu 20.04 / 22.04 这类特定版本绑得比较死,内核、驱动和软件栈之间三角互怼,迟早出问题。
于是我想介绍一种自己用下来觉得还挺顺手的方式:在较新的 Linux 发行版上,用 distrobox 容器来跑 ROS 开发环境。
这样做几个好处很直接:
- 宿主机可以放心用新发行版,不用为了 ROS 把系统钉死在旧 Ubuntu
- 容器里保留 ROS 官方支持更好的 Ubuntu 环境
- 新硬件支持更完整,NVIDIA 显卡之类的也能正常用
- 开发环境和宿主机隔离,出问题重建也方便
下面用 Fedora 43 + ROS 2 Humble 演示。
为什么选 distrobox
distrobox 本质上是对容器的进一步封装,底层跑 Podman 或 Docker,但用起来更像是在本机里”多开了一个发行版”。
对 ROS 开发来说这个思路挺合适的:宿主机跑你喜欢的现代发行版,容器里跑 Ubuntu 22.04 和 ROS 2 Humble 的生态,文件系统、终端、GUI、显卡、开发工具都能自然接进来。比虚拟机轻,比直接装在宿主机上干净。
安装 distrobox
Fedora 自带 podman,安装很直接:
1 | |
确认一下两个工具都可用:
1 | |
如果你用的是 Debian / Ubuntu 系,可以先装 Docker 再装 Distrobox:
1 | |
装完把当前用户加入 docker 用户组,省得每次都要 sudo:
1 | |
配置 NVIDIA 容器支持
如果需要在容器里调用 NVIDIA 显卡——无论是为了 CUDA、cuDNN、ORT,还是只是图形能力——需要额外装一下 NVIDIA 的容器桥接工具。
1. 添加 NVIDIA 官方软件源
1 | |
2. 安装工具包
1 | |
3. 生成 CDI 配置文件
让 Podman 能正确识别显卡设备:
1 | |
4. 验证
1 | |
输出里能看到你的 NVIDIA 设备就说明没问题。
创建 ROS 2 Humble 开发容器
创建一个带 NVIDIA 支持的 Ubuntu 22.04 容器,顺手把软件源换成清华源:
1 | |
进入容器:
1 | |
安装 ROS 前的基础依赖
1 | |
用鱼香 ROS 一键安装
1 | |
跟着脚本走就行。国内网络环境下,这套流程比手动配源逐项装省心不少。
装完可以跑个小海龟简单测一下。
在 VS Code 里接入容器
只用终端的话到这里已经够了。如果想要完整的 IDE 体验,可以把 VS Code 直接接到容器里。
1. 启动 Podman 后台服务
1 | |
2. 安装插件
VS Code 里装 Dev Containers 扩展。
3. 把 Docker 路径改成 Podman
打开设置,搜 docker path,找到:
Dev > Containers: Docker Path
把 docker 改成:
1 | |
4. 连接容器
Ctrl + Shift + P 输入:
1 | |
回车后选 ros2_humble,VS Code 会新开一个窗口,左下角显示 Attached Container: ros2_humble。
5. 验证
Ctrl + ~ 打开集成终端,提示符类似:
1 | |
这样就进去了。
处理 VS Code 里用户不对的问题
有时候终端里显示的是:
1 | |
遇到这种情况,先在容器里以 root 身份执行:
1 | |
yourname 换成你实际的用户名。
然后在 VS Code 远程资源管理器里右键容器,选 Open Container Configuration File,加上:
1 | |
后续扩展
这套基础环境跑通之后,CUDA、cuDNN、ONNX Runtime 这些都可以继续往容器里装,宿主机始终保持干净,项目之间也互不干扰。
总的来说,如果你正被”新硬件 + 老 Ubuntu + ROS 版本绑定”这个组合反复折磨,不妨试试这条路。宿主机用新内核、新驱动,容器里保留 ROS 熟悉的 Ubuntu 环境,折腾一次,后面会省事很多。