☰
Ubuntu 22.04安装ROS2 Humble完整指南:环境配置与三大通信机制实测
2026/10/9 4:40:14 网站建设 项目流程

我需要先说明一下:ROS2和相关开源机器人生态属于常规技术开发领域,与网络安全无关。Ubuntu 22.04 下安装 ROS2 Humble 是机器人开发者最常用的技术栈,下面我就以这套环境为核心,把从零安装到完成通信测试的完整过程梳理出来,包含版本选型、环境准备、实操命令、三大核心通信机制验证,以及我在实际安装中踩过的坑。

1. 环境准备与版本选型

1.1 为什么是 Ubuntu 22.04 + ROS2 Humble

ROS2 的版本和 Ubuntu 版本有严格的对应关系,这一点非常关键,装错版本会直接导致依赖冲突、编译失败甚至系统崩溃。Ubuntu 22.04 Jammy 对应的正式支持版本是 ROS2 Humble Hawksbill,这是一个 LTS 长期支持版本,官方支持周期到 2027 年,是目前生产环境中最稳妥的选择。

很多人会问,为什么不用更新的 ROS2 Jazzy?Jazzy 对应的是 Ubuntu 24.04,但这个组合在 2024 年才正式发布,第三方库的适配、教学资源、社区问答沉淀都还没有完全跟上。相比之下,Humble 经过了两三年的社区实战检验,Gazebo、Nav2、MoveIt2、MicroROS 这些核心组件的版本匹配度最高。我自己在实际项目中遇到过 Jazzy 下 MoveIt2 和 Nav2 的依赖相互拉扯的问题,而 Humble 下同样的功能包几乎开箱即用。

另外,ROS2 Humble 还把 Python 版本锁定在了 3.10,这个版本对深度学习、SLAM 建图、OpenCV 等常用库的兼容性都很好。我做导航测试时,要同时装 OpenCV、PCL、Eigen3 这些底层库,在 Humble 上都没有遇到编译层面的障碍。

1.2 三种运行环境怎么选:双系统、虚拟机、WSL2

安装 ROS2 之前,先要确定运行环境。我在不同机器上分别试过双系统、VirtualBox 虚拟机、WSL2 三种方式,它们的适用场景差别非常大。

环境图形界面性能建图导航测试推荐人群
双系统最好,完全占用硬件最推荐以 ROS2 为长期主攻方向,需要跑 Gazebo 仿真和 RViz2 点云可视化的人
虚拟机一般,3D 加速受限勉强能用,卡顿明显只是学习语法、跑小乌龟、测试话题服务动作的人
WSL2看配置,WSLg 能凑合跑 GUI不推荐做 SLAM 测试主要写 ROS2 代码、不想重启切换系统的人

我最推荐虚拟机和双系统,这是一个老生常谈但真实的问题。虚拟机方案适合入门,因为系统随便折腾,装坏了直接快照恢复,完全不影响主系统。但如果你要跑 cartographer 建图、gazebo 加载机器人模型,虚拟机在图形渲染和 CPU 调度上会有明显瓶颈,越到后期越难受。

我的建议是:如果是头脑一热想试试 ROS2,先用虚拟机或 WSL2 完成本文的全部流程;如果确认要吃这碗饭,直接装双系统,省得后面迁移环境,我当年就是从虚拟机迁到双系统的,光是重配一遍 rosdep 就花了一下午。

需要注意一点,WSL2 下跑 ROS2 的话题测试和命令行操作完全没问题,但 RViz2 的渲染性能取决于 WSLg,如果你用的是集成显卡的老笔记本,界面会有明显的延迟感。此时可以把图形任务放到真机上做。

1.3 镜像源选择:别在第一步卡住

安装 ROS2 要下载几百 MB 的包,国内网络环境下直接连官方源经常会遇到超时、断连,所以第一步就是把 apt 软件源换成镜像源。我用的是清华源的 Ubuntu 22.04 镜像,配置方法和国内各个平台的标准流程一致,按你本地的常用镜像源操作即可。

具体操作是编辑/etc/apt/sources.list,把archive.ubuntu.com和security.ubuntu.com替换为对应镜像地址。改完之后一定要执行sudo apt update,确认源能正常拉取索引。这一步如果报错,通常是网络问题或者格式问题,不要急着往下走,先把 update 跑通再说。

另外,ROS2 的软件源是独立于 Ubuntu 源的,后面安装 ROS2 包时会专门添加packages.ros.org的源。在实际环境里,这个源在某些网络条件下连接也不稳定,这时可以考虑把 ROS2 源也配置为相关镜像站的 ROS 源。配置思路和 Ubuntu 源类似,关键是确保后续apt install ros-humble-desktop能顺利跑完。

2. 正式安装流程

2.1 安装前的系统更新与依赖检查

安装 ROS2 之前,先把系统基础依赖提前装好,避免中途报各种奇怪的错误。我习惯按这个顺序来,逻辑是先刷新索引、升级系统、再装基础工具链。

sudo apt update sudo apt upgrade -y sudo apt install -y curl gnupg lsb-release build-essential cmake git

curl是用来下载 GPG 密钥的,gnupg用来管理密钥,lsb-release用来识别系统版本号。这些工具看着基础,缺了任何一个都会在后续步骤中突然报错。

这里有一个重要的经验:sudo apt upgrade可能会升级内核,升级完最好重启一下系统再继续。我遇到过因为内核和模块版本不匹配导致网卡驱动失效的情况,重启后问题直接消失。如果你用的是 Ubuntu 22.04,这个概率虽然不高,但稳妥起见重启一下不吃亏。

然后确认系统编码,ROS2 对 locale 有要求,虽然不设置也能运行,但日志里全是警告,看着心烦:

locale # 检查 LANG 是否为 en_US.UTF-8 或 zh_CN.UTF-8

如果不是 UTF-8 编码,执行:

sudo apt install -y locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8

设置完 locale 后重新打开终端,执行locale确认生效。这一步的核心目的是避免后续 rosdep 和 colcon 在解析路径时出现乱码。

2.2 配置 ROS2 软件源与 GPG 密钥

ROS2 官方提供了专门的 apt 软件源,需要先把公钥导入系统。先安装software-properties-common,这个工具提供了add-apt-repository命令,用来添加第三方源:

sudo apt install -y software-properties-common sudo add-apt-repository universe -y

universe源是 Ubuntu 的社区维护软件源,ROS2 的一些依赖包就在里面,不加的话后面会报“无法定位软件包”。

然后下载并添加 ROS2 官方 GPG 密钥。不同网络环境下密钥获取方式略有差异,如果直接访问官方地址遇到超时,可以尝试重试或稍后再试,这个环节依赖网络连通性:

sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

密钥放到了/usr/share/keyrings/目录,这是新的 Debian/Ubuntu 推荐做法,旧教程里用apt-key add,但apt-key在 22.04 已经被标记为废弃,不建议再用。

接着把 ROS2 软件源写入 apt 源列表。官方命令是:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

这条命令可以拆开理解,避免出错:

  • arch=$(dpkg --print-architecture):自动判断架构,x86_64 或 arm64 都适用
  • signed-by=...:指定 GPG 密钥路径,让 apt 用这把钥匙验证包的真实性
  • $(source /etc/os-release && echo $UBUNTU_CODENAME):自动获取系统代号,Ubuntu 22.04 会输出 jammy

添加之后执行:

sudo apt update

这一步常见的问题是:“获取:1 http://packages.ros.org/ros2/ubuntu jammy InRelease [4,682 B] 错误:1 ... 由于没有公钥,无法验证下列签名”。这个错误说明 GPG 密钥没有正确添加,或者路径不对。排查方法很简单:

ls -l /usr/share/keyrings/ros-archive-keyring.gpg

如果文件存在但依然报公钥错误,可能是因为你之前的密钥是通过apt-key添加的,和signed-by指定的密钥不匹配。此时可以先把旧密钥清理掉,再重新添加:

sudo rm /etc/apt/sources.list.d/ros2.list # 重新执行上面的 echo 写入命令 sudo apt update

2.3 安装 ROS2 本体:Desktop 还是 Base

ROS2 提供了两种安装包:

  • ros-humble-desktop:包含 RViz2、Gazebo、demo 示例、可视化工具,体积大(约 2-3 GB),适合开发和学习
  • ros-humble-ros-base:只包含核心通信库和命令行工具,体积小,适合做纯嵌入式或服务器开发

我的建议是直接装 Desktop 版。因为初学阶段大概率要跑 Gazebo 仿真、要看 RViz2 里的点云和机器人模型,分开装反而容易漏依赖。如果空间确实紧张,可以装 Base,后面用apt install ros-humble-rviz2按需补装。

sudo apt install -y ros-humble-desktop

这一步是整个安装过程中耗时最长的环节,取决于网络速度,可能持续 5-20 分钟。期间如果出现E: Unable to locate package ros-humble-desktop,说明 ROS2 源没有正确生效,回退到 2.2 节重新检查源配置。

安装完成后,自动补装开发工具:

sudo apt install -y python3-rosdep python3-colcon-common-extensions python3-vcstool
  • rosdep:用于安装功能包所需的系统依赖,编译源码前必用
  • colcon:ROS2 的编译工具,用来构建工作空间
  • vcstool:批量拉取多仓库源码的工具,一般用不上,但备着无妨

2.4 初始化 rosdep 与环境变量

rosdep 初始化也是老生常谈的坑点。执行:

sudo rosdep init rosdep update

rosdep init会从网络拉取 rosdep 源的数据,这一步在部分网络环境下可能超时或失败。如果遇到类似“ERROR: cannot download default sources list from ...”的报错,可以考虑使用国内镜像源配置 rosdep,具体可以参考国内开源镜像站的 ROS 配置说明,这里不做展开。

rosdep update更新依赖索引。这一步可能会卡住,通常和网络环境有关,遇到卡顿可以尝试多次执行,或检查网络连通性后重试。我在实际环境中尝试过,多执行几次能成功。

然后设置环境变量。ROS2 的环境变量脚本需要每次在新终端中手动 source,为了方便,把它写入 shell 配置:

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

如果你用的是 zsh:

echo "source /opt/ros/humble/setup.bash" >> ~/.zshrc source ~/.zshrc

写入.bashrc之后,每次打开终端都会自动加载 ROS2 环境,省掉手动 source 的烦恼。不过要注意,如果你后面配置了多个 ROS2 版本(比如 Humble 和 Rolling 共存),就不能这样直接写入,需要手动切换。

2.5 验证安装:先跑通小乌龟

安装完成后,先用 ROS2 标志性的小乌龟程序验证基本功能是否正常。打开两个终端:

终端一:

ros2 run turtlesim turtlesim_node

终端二:

ros2 run turtlesim turtle_teleop_key

如果小乌龟窗口成功弹出,并且能用键盘方向键控制乌龟移动,说明核心通信、节点发现、话题订阅这些基础功能都正常。这是最直观的第一次成功体验。

同时可以用ros2 node list查看当前活跃节点,应该能看到/turtlesim和/teleop_turtle两个节点。用ros2 topic list可以查看六个话题,包括控制乌龟的/turtle1/cmd_vel话题。

这一步是整个安装流程的“及格线”,走到这里,你已经有了一个能跑通的 ROS2 环境。

3. 三大核心通信机制实测

ROS2 官方把它的一套机制拆成了三个核心抽象:话题、服务、动作。很多入门的人会在这一步卡住,就是因为光看书不理解它们各自的适用场景。小乌龟测试完之后,正好用一些简单命令把这三套机制都过一遍。

3.1 话题通信:单向数据流

话题是 ROS2 最基础的通信方式,特点是一对多、单向、持续发布。最适合传输传感器数据、状态信息这种高频数据流。

以小乌龟为例,先运行turtlesim_node,然后在另一个终端发布速度命令:

ros2 topic pub -r 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

-r 1表示以 1Hz 的频率循环发布,这样乌龟会以 2.0 m/s 的线速度和 1.8 rad/s 的角速度转圈。你可以看到乌龟在窗口中画圆圈。

查看话题数据的标准姿势:

ros2 topic echo /turtle1/cmd_vel

这条命令会把所有发布者发到该话题的消息实时打印出来。用于排查“为什么节点不动”这种问题时,它会直接告诉你:数据到底有没有发出来。

话题通信的核心知识点是 QoS 策略。发布者和订阅者的 QoS 必须兼容,否则订阅不到数据。ros2 topic info /turtle1/cmd_vel --verbose可以查看详细 QoS 信息,后面调试自己的节点时非常有用。

3.2 服务通信:请求-响应

服务适合请求-响应这种同步交互场景,比如发起一个动作、获取一个结果。特点是短连接、有去有回。

小乌龟自带的 spawn 服务就是典型例子。先查看服务列表:

ros2 service list

你会看到/spawn、/kill、/turtle1/set_pen等服务。调用/spawn创建一只新乌龟:

ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.0, y: 5.0, theta: 0.0, name: 'turtle2'}"

输出会显示success: true,同时在图形界面的 (5.0, 5.0) 位置出现新乌龟。这就是一次完整的服务调用:客户端发送请求,服务器处理并返回响应。

这里要说一个新手常犯的错误:直接调用/spawn时不带参数,然后报错说缺参数。ROS2 的服务调用必须严格遵守接口定义,每个字段都要填。用ros2 interface show turtlesim/srv/Spawn可以查看接口参数的完整结构。

服务通信和话题通信的区别要记牢:服务是一次性的短交互,适合按需触发;话题是持续的数据流,适合周期性更新。在真实的机器人控制里,速度控制指令用话题,开关机械爪这种动作指令用服务。

3.3 动作通信:长时任务跟踪

动作是 ROS2 针对长时任务的升级方案,典型的场景是“让机器人走到某个点”,这个任务可能需要几秒钟甚至几分钟,期间用户需要持续反馈进度,并且随时可以取消。

小乌龟没有内置动作服务,但 ROS2 自带了一个action_tutorials示例包,不过需要单独编译。最简单的方式是用一个现成的测试包:

ros2 run action_tutorials_interfaces demo_action_client

一个更直接的体验方式是配合 RViz2 和 Nav2 套件来理解动作机制。启动导航后,你给机器人发布一个目标点,Nav2 的NavigateToPose动作服务器就会持续反馈当前状态,整个过程就是一次标准的动作通信。这也是热词里“ros2 slam建图和自主导航”为什么绕不开动作机制的原因。

命令行的动作工具不多,最常用的是:

ros2 action list ros2 action info /navigate_to_pose

如果你想自己写一个动作客户端,官方推荐用 Python 的rclpy库封装ActionClient,这个在后面的项目里展开。

3.4 RViz2 可视化验证

RViz2 是 ROS2 的杀手级可视化工具,也是所有机器人项目中出镜率最高的软件。

启动 RViz2:

rviz2

默认界面是空白的,需要手动添加显示类型。点击左下角Add,选择By topic,然后勾选你想要的显示项,例如:

  • TF:查看坐标变换树
  • RobotModel:查看机器人模型
  • LaserScan:查看激光雷达数据
  • Map:查看地图

RViz2 的配置可以保存为.rviz文件,下次直接加载,不用每次重新设置。我习惯在项目目录里存一份常用的default.rviz,配合.bashrc里的别名:

alias rviz='rviz2 -d ~/ros2_ws/src/my_project/config/default.rviz'

RViz2 如果打开后是黑屏,最常见的原因是话题数据没有发布,或者 TF 树不完整。这些排查方法在 ROS2 的问答社区里有很多讨论,基本思路就是先用ros2 topic hz确认话题有没有在发数据。

4. 常见问题与排查技巧实录

4.1 GPG 公钥错误与软件源失效

安装过程中最常见的错误就是文章前面提到的:

错误:1 http://packages.ros.org/ros2/ubuntu jammy InRelease 由于没有公钥,无法验证下列签名

这个问题的根源只有一个:apt 在验证包签名时找不到对应的公钥。排查步骤按顺序来:

# 1. 检查密钥文件是否存在 ls -l /usr/share/keyrings/ros-archive-keyring.gpg # 2. 手动下载密钥并重新安装 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg # 3. 重新添加 ros2.list 源,检查 signed-by 路径是否一致 cat /etc/apt/sources.list.d/ros2.list # 4. 再次更新 sudo apt update

在部分网络环境下直接下载官方密钥可能不稳定,建议多尝试几次。使用镜像源的思路同样适用,对应镜像站一般会提供密钥文件的替代下载地址,配置方式类似。

4.2 rosdep update 失败与依赖缺失

rosdep 注入失败的报错五花八门,最常见的是无法拉取默认源列表。这一问题本质是网络可达性和镜像源配置的问题,多尝试几次或换用国内可访问的镜像配置即可解决。

如果rosdep update部分更新成功但某些条目失败,可以手动指定更新单个源:

rosdep update --include-eol-distros

另外,编译源码时如果提示缺少系统依赖,不要急着搜“为什么编译失败”,先问 rosdep:

cd ~/ros2_ws rosdep install -i --from-path src --rosdistro humble -y

这个命令会根据package.xml里声明的依赖自动通过 apt 安装所有缺失的系统库。这是最省心的做法,比手动一个个装依赖靠谱得多。

4.3 WSL2 环境中的特殊坑

在 WSL2 里跑 ROS2 的界面程序,经常遇到两个问题:

第一个问题是cannot open display,这说明图形接口没有连接成功。原因是你的 WSL2 没有安装 WSLg,或者在旧版本 WSL 上跑了老内核。解决方法是升级 WSL:

wsl --update

升级后重新启动 WSL,echo $DISPLAY应该能看到:0或:1之类的输出。如果还是没有,可以在/etc/wsl.conf里确认是否开启了 systemd(WSL 较新版本默认开启 systemd,ROS2 的守护进程依赖这个)。

第二个问题是Failed to connect to bus,说明 D-Bus 服务没有启动。在 WSL2 中,如果缺少 systemd 支持,无法通过sudo service dbus start解决的话,可以考虑升级 WSL 到支持 systemd 的版本。

WSL2 里跑 turtle 大概率会遇到这类问题,这时候不用怀疑你的 ROS2 有没有装对,是显示链路的问题。

4.4 网卡识别与虚拟机网络配置

热词里有“ubuntu22.04 识别不对有线网卡”,这个在 VMware 虚拟机里跑 ROS2 时很常见。如果你在 Ubuntu 22.04 的虚拟机设置里选择了 NAT 模式,虚拟机内部获得的 IP 通常是/24网段,ROS2 的 DDS 默认走组播通信,在某些网络模式下组播不通,就会导致两个节点之间互相发现不了。

排查方法:

ip addr show colcon build # 编译通过 ros2 run demo_nodes_cpp talker

终端一跑 talker,终端二跑 listener,如果两边都起来了但 listener 收不到数据,先查网络模式:

  • NAT 模式下一般没问题,虚拟机里多个节点之间通信正常
  • 桥接模式下要确认网卡能正常上网
  • WSL2 的镜像网络模式下,DDS 组播可能受到限制

如果 ROS2 的节点之间发现不了,最直接的排查建议是检查防火墙配置,确保本地回环和外网链路都通畅。ROS2 底层用 DDS 通信,组播是否畅通是判断网络环境的关键。

4.5 常见问题速查表

问题现象大概率原因处理动作
apt 更新报“没有公钥”GPG 密钥未导入或路径不对检查 ros-archive-keyring.gpg,重新添加源
无法定位 ros-humble-desktop 包ROS2 源未添加或 apt 索引未更新确认 ros2.list 内容,执行 apt update
rosdep update 卡住或失败默认源拉不下来多次重试或配置可访问的镜像源
WSL2 界面程序打不开没有 WSLg 或 DISPLAY 未设置wsl --update 升级后重启
turtle 收不到话题数据DDS 组播受限或 QoS 不匹配检查网络模式,用 topic info 查看 QoS
编译功能包报缺少依赖系统库缺失,还没跑 rosdep installrosdep install 自动补齐
locale 警告刷屏系统不是 UTF-8按 2.1 节的 locale 配置操作

5. 真正会用:一个随手可跑的通信测试

说了这么多,最后给一套我每次装完 ROS2 都会跑的完整自检命令。这段流程能验证环境的方方面面,比单独跑小乌龟更有说服力。

终端一,启动监听器:

ros2 run demo_nodes_cpp listener

终端二,启动发布器:

ros2 run demo_nodes_cpp talker

如果终端一持续输出I heard: Hello World,说明核心通信正常。

然后按 Ctrl+C 关掉两个进程,用命令行把话题跑起来:

# 查看所有话题 ros2 topic list # 查看某个话题的实时频率 ros2 topic hz /chatter

正常情况下/chatter的频率会稳定在 1Hz 左右,因为 talker 默认每秒发一条消息。如果频率波动极大或直接为 0,说明 DDS 网络有故障,回到 4.4 节查网络。

再测一次服务:

ros2 run demo_nodes_cpp add_two_ints_server

另一个终端:

ros2 run demo_nodes_cpp add_two_ints_client

看到客户端输出 sum 结果,说明服务通信正常。

这组测试跑通之后,ROS2 的核心功能就算全部验证完了。我在实际使用中还有一个习惯,准备一个最小工作空间备用:

mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build source install/setup.bash

colcon build第一次可能比较慢,因为它要创建日志和构建目录。构建完成后再让它跑一次,构建时间基本会在几秒到十几秒之间。这个空工作空间后面开发功能包时就是你的主战场了。至少我自己踩过几次坑之后最大的体会是:装 ROS2 不要追求一次装完所有功能,先把核心跑通,后面每加一个功能包就测一个,环境出问题的时候定位范围会小很多,排查起来也更从容。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询