1055 字
5 分钟
在容器中开发ROS/ROS2
2025-12-11

引言#

ROS1以及ROS2 Humble这类常用的版本要求的Ubuntu都太老了,这些老系统在新的电脑尤其是笔记本上总会有很多问题,最经典的就是X11不支持笔记本的核显独显双显卡(只能装其中一个的驱动),而且ROS的巨量依赖直接装系统里也挺脏的,所以说还是关在容器里比较好

需要的工具#

安装distroboxpodmandocker也可以,但是我觉得podman比较轻量)

生成nvidia的cdi配置(不需要独显可以跳过)#

先安装nvdia-container-toolkit

Terminal window
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
sudo nvidia-ctk runtime configure --runtime=docker #虽说这里是docker但是podman也得用
# 如果用docker还需要重启docker服务
sudo systemctl restart docker

nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml这行命令貌似每次更新nvidia驱动都需要执行一次,nvidia的文档里也有自动生成的办法,不过更新也不频繁我觉得手动就行了

创建容器#

Terminal window
distrobox create --name <实例名称> --additional-flags "--device nvidia.com/gpu=all" --image docker.io/nvidia/cuda:12.9.1-cudnn-runtime-ubuntu22.04

这里就用nvidia的带cudnn-runtime的镜像了,如果你不需要可以直接用ubuntu的官方镜像

如果不需要nvidia独显,无需添加--additional-flags "--device nvidia.com/gpu=all"

TIP

如果担心容器和宿主机共享home会污染环境,可以用--home /path指定容器home的位置,而且这个只是用户目录本身,Documents目录等仍然会映射到宿主机对应位置

WARNING

使用nvidia的镜像时会弹广告,这个广告内容会被旧版的distrobox当成命令执行导致报错,所以记得更新distrobox到最新版

TIP

至于为什么不用distrobox--nvidia参数启用nvidia独显,因为它会把宿主机的libicudata挂载进容器,导致容器中无法安装libicu-dev

进入容器#

Terminal window
distrobox enter <实例名称>

之后像正常使用Ubuntu一样安装ROS就好了

VsCode连接容器进行开发#

无需在容器中安装vscode

安装插件#

在宿主机的vscode中安装Dev Containers插件

Dev Containers插件

修改设置#

打开vscode设置->扩展->开发容器

  • dev.containers.dockerPath值改为podman(如果你用的是docker就不用改)
  • dev.containers.dockerSocketPath值改为/var/run/podman.sock

连接容器#

点击vscode左下角远程图标->附加到正在运行的容器(提前distrobox enter

用户设置#

默认进入容器后是以UID 10000作为用户,会导致在宿主机上无法直接操作vscode创建的文件夹,可以在连接容器的配置中指定用户名

连接到容器后,按Ctrl+Shift+P,找到Dev Containers: Open Attached Container Configuration File,选择打开对应的配置文件(应该就一个,没得选),添加内容

"remoteUser": "<宿主机用户名>"

连接容器时启用ROS环境#

按照这项修改后vscode中的clangd和cmake即可正常找到ROS相关的头文件和库

修改容器使用的shell对应的rc文件(~/.bashrc~/.zshrc等),在最后添加

当然得是容器实际使用的rc文件,如果你在创建容器时用--home /path指定了其他位置作为容器的home的话就得是/path下的

Terminal window
source /opt/ros/<ros版本>/setup.<shell类型>

常见问题#

dpkg报错xserver-*无法安装#

类似于

dpkg: error processing package xserver-xorg-input-all (--configure):
dependency problems - leaving unconfigured
Errors were encountered while processing:
keyboard-configuration
xserver-xorg-core
xserver-xorg-video-ati
xserver-xorg-video-radeon
xserver-xorg-input-wacom
xserver-xorg-video-fbdev
xserver-xorg-video-vmware
xserver-xorg-video-intel
xserver-xorg-video-all
xserver-xorg-video-vesa
xserver-xorg-video-qxl
xserver-xorg-video-amdgpu
xserver-xorg
xserver-xorg-video-nouveau
xserver-xorg-input-libinput
xserver-xorg-input-all
E: Sub-process /usr/bin/dpkg returned an error code (1)

这个问题应该只会出现在安装ROS1的desktop-full时,因为是容器所以用不上这些包,就算要在容器里显示图形界面软件也用不上,可以直接移除掉

Terminal window
sudo apt remove --purge xserver-xorg-core
sudo apt autoremove

每次使用apt都有未设置语言环境的警告#

先用apt安个编辑器vim,nano之类的都可以

Terminal window
sudo vim /etc/locale.gen

en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8取消注释

Terminal window
sudo locale-gen

容器内的图形软件不用独显渲染#

这个其实不是容器的问题,在哪都一样

需要在运行软件前设置环境变量

Terminal window
__NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia <命令>

为了方便可以在~/.bashrc或者~/.zshrc之类的里面加个别名(取决于你用什么shell)

Terminal window
alias prime-run='__NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia '

之后直接用prime-run <命令>就行

在容器中开发ROS/ROS2
https://a1kari8.github.io/posts/ros_in_container/
作者
A1kari8
发布于
2025-12-11
许可协议
CC BY-NC-SA 4.0