☰
Ubuntu 24.04 安装 ROS2 Jazzy 完整指南与避坑实践
2026/10/3 11:29:08 网站建设 项目流程

先交代一下背景:我最近在一台刚装好 Ubuntu 24.04 LTS 的机器上折腾 ROS2,目标很明确,就是要装当前官方同步支持的 Jazzy 版本。整个过程其实不算复杂,但网上资料东一块西一块,有的写 22.04 的 Humble,有的直接贴命令不解释理由,跟着抄很容易踩坑。这篇记录我打算按自己的实际操作顺序来写,把每一步为什么要这么做、命令在干什么、遇到问题怎么排查都讲清楚,希望能帮你少走点弯路。不管你是在物理机、虚拟机还是 WSL 里装,只要系统是 Ubuntu 24.04,这套流程基本通吃。

1. 安装前的准备工作:别急着敲命令

1.1 为什么要选 Ubuntu 24.04 + ROS2 Jazzy

很多人其实没搞明白 ROS2 版本和 Ubuntu 版本之间是有严格对应关系的。ROS2 Jazzy Jalisco 是 2024 年 5 月随 Ubuntu 24.04 LTS 一起发布的 LTS 版本,官方支持周期到 2029 年。这个“LTS 对 LTS”意味着什么?意味着你不需要像以前用 ROS1 那样,系统一升级整个 ROS 环境就废掉,也不会有操作系统还在维护但 ROS 版本已经停止更新的尴尬情况。

如果你去 ROS 官方文档看发行列表,会发现每个 ROS2 版本都有明确的平台支持矩阵。比如 Humble 对应 Ubuntu 22.04,Iron 对应 24.04 但它是非 LTS 版本,而 Jazzy 是第一个长期支持的 24.04 ROS2 版本。所以对于要跑长期项目、做毕设、或者部署机器人实机的朋友来说,Ubuntu 24.04 + ROS2 Jazzy 是目前最稳妥的组合之一。选这个组合,本质上是在选择一个“未来几年都不用再大动干戈”的开发底座。

1.2 环境选型:物理机、虚拟机还是 WSL

我在这次安装前专门对比了三种常见环境,因为选错环境会在后续使用中带来完全不同的体验,这里直接给结论。

环境优点缺点推荐场景
物理机原生 Ubuntu性能最好,GPU 直通,ROS2 底层通信无额外延迟可能需要放弃 Windows 环境,驱动有时要折腾长期开发、实机部署、跑仿真和视觉
VMware/VirtualBox 虚拟机不影响宿主机系统,可随时快照回滚3D 加速弱,Gazebo 重负载场景可能卡顿初学者练手、临时测试、课程作业
WSL2启动快,和 Windows 文件系统互通,适合写代码网络模式特殊,部分 GUI 和外接 USB 设备要额外处理轻量开发、纯代码调试、不想完全脱离 Windows

如果你像我一样用虚拟机做演示,建议至少分配 4 核 CPU、8GB 内存和 40GB 磁盘,这样跑起来不至于太憋屈。如果只是练手验证,虚拟机完全够用;但如果你后面要跑 Gazebo Harmonic 做机械臂仿真、或者接激光雷达跑导航,我建议直接上物理机或者 WSL2,别在虚拟机里跟自己过不去。

1.3 系统初始化:更新、磁盘与源

安装之前先做两件事。第一,确保持久系统是最新状态,打开终端执行:

sudo apt update && sudo apt upgrade -y

这一步很多人会跳过去,我建议别跳。ROS2 依赖的底层库非常多,如果系统本身的包索引都是旧的,后面装 ROS 依赖时很容易遇到版本冲突或者找不到包。第二,确认磁盘空间。完整桌面版的 ROS2 Jazzy 安装完大概要占 3~5GB,加上编译缓存和依赖,建议系统盘至少留出 15GB 空闲。我见过有人装到一半就卡住,就是因为/usr分区满了,那种状况处理起来特别麻烦。

另外提醒一句,如果你在虚拟机里安装,建议先把 VMware Tools 或 VirtualBox Guest Additions 装好,再开始装 ROS。因为后续所有操作都要靠复制粘贴命令,没有增强工具的话,鼠标切入切出和粘贴板共享会非常折磨人。

2. 核心安装步骤逐条拆解

2.1 添加 ROS2 软件源:官方源安装

ROS2 不像普通软件那样可以直接用 Ubuntu 自带的 apt 源安装,你需要把 ROS2 的官方软件仓库添加到系统里。这个做法的本质和你在 Ubuntu 里添加 Docker、VS Code 等第三方源是一样的,没有什么黑魔法。

先安装依赖的工具包:

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

第一条命令装的是后面添加源需要的curl等工具,第二条是启用 Ubuntu 的 universe 软件仓库。ROS2 在 Ubuntu 上依赖了很多这个仓库里的包,不启用的话后面会不断报依赖缺失。

然后添加 ROS2 官方的 GPG 密钥:

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

接着把 ROS2 的 apt 源写入系统配置文件:

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

这里我解释一下arch=$(dpkg --print-architecture)和$(. /etc/os-release && echo $UBUNTU_CODENAME)这两个自动替换的含义。前者会自动识别你的 CPU 架构,在 24.04 上通常是 amd64,少数 ARM 设备上会变成 arm64,这样就不用针对不同平台手写不同的源;后者会从/etc/os-release文件里读取当前系统的版本代号,Ubuntu 24.04 对应的代号是noble,所以最终写入的源路径会解析成http://packages.ros.org/ros2/ubuntu noble main。这也是为什么这篇文章的流程对所有基于 24.04 的衍生系统同样有效的原因,只要系统代号是 noble,这条命令就能正确工作。

配置完成后执行:

sudo apt update

如果源配置正确,你会看到输出里出现Packages.ros.org的仓库更新信息。如果没有出现,或者提示找不到 Release 文件,那你就要回头检查系统版本代号和网络连通性了。这一步是后续所有安装能够成功的分水岭。

2.2 安装 ros-jazzy-desktop 完整桌面版

ROS2 Jazzy 的 apt 包按功能拆成了很多层级,最核心的三种安装方式如下:

# 方式一:只装基础通信框架,没有 GUI 工具 sudo apt install ros-jazzy-ros-base # 方式二:完整桌面版,包含所有常用工具和库(推荐) sudo apt install ros-jazzy-desktop # 方式三:指定某个功能包,按需安装 sudo apt install ros-jazzy-rviz2

我这次装的是ros-jazzy-desktop,因为我对 rviz2、demo 节点、tf2 这些工具都有需求,一次装齐省得后面再补。完整安装大概会拉取两百多个依赖包,下载体积在 1GB 左右,安装完占用磁盘约 3~4GB。安装时间取决于你的网络速度和磁盘性能,我在虚拟机里大概花了十分钟左右,物理机上会快很多。

这里有个经验分享:如果你只是需要某个特定功能包,不要偷懒装 desktop,也不建议装 ros-base 之后再一个个补。用ros-jazzy-ros-base打底,然后按需apt install ros-jazzy-具体包名,这样对系统的侵入最小,以后排查问题也更容易定位。我见过很多新手把ros-jazzy-desktop装完之后,又另外装了一堆五花八门的包,结果系统里出现两套不同版本的依赖,轻则报环境变量冲突,重则直接把系统搞挂。

2.3 配置环境变量并验证

安装完成之后,ROS2 的命令还不会被自动识别,因为它的可执行文件放在/opt/ros/jazzy/目录下,需要手动激活环境。每次打开新终端执行:

source /opt/ros/jazzy/setup.bash

手动敲太麻烦,所以直接把这一行加到 shell 配置文件的末尾:

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

之后每次打开终端就自动加载 ROS2 环境了。注意如果你用的是 zsh,要改成~/.zshrc,我当时差点在这个细节上翻车。配置完成后,用下面几条命令做个快速体检:

printenv | grep ROS ros2 --help ros2 daemon stop && ros2 daemon start

第一条命令会输出ROS_DISTRO=jazzy这样的环境变量,如果输出为空,说明 source 没生效;第二条命令能跑起来说明主程序没问题;第三条是重启 ROS2 的守护进程,很多时候刚装完环境,ros2命令会卡在Unable to contact my own daemon,执行一下这个命令能解决大部分服务端通信问题。

3. 安装成功后的基础验证:跑通第一个 ROS2 程序

3.1 用 talker/listener 验证节点通信

装完之后很多人不知道下一步该干嘛,这里我推荐一条完整的验证链路:先跑内置的 talker/listener 示例,确认 ROS2 最基本的发布订阅通信是否正常。

打开两个终端,都确保 ROS2 环境已经激活。第一个终端运行:

ros2 run demo_nodes_cpp talker

第二个终端运行:

ros2 run demo_nodes_cpp listener

如果一切正常,第一个终端会持续输出:

[INFO] [1700000000.123456789] [talker]: Publishing: 'Hello, world! 1' [INFO] [1700000000.623456789] [talker]: Publishing: 'Hello, world! 2'

第二个终端会同步打印收到的消息。看到这种输出,说明你的 ROS2 安装已经完全可用了。这里顺便教大家一个排查思路:如果 talker 正常但 listener 收不到消息,先别急着怀疑安装,重启一下 ROS2 守护进程试试,很多时候是这个后台服务在系统休眠或网络切换后抽风了:

ros2 daemon stop ros2 daemon start

3.2 小乌龟测试:turtlesim 的完整玩法

talker/listener 验证的是纯通信机制,但对大多数人来说太抽象了,跑起来没什么成就感。接下来我们上一只乌龟,这是 ROS2 教程里最经典的可视化验证程序。

安装小乌龟包:

sudo apt install ros-jazzy-turtlesim

然后运行:

ros2 run turtlesim turtlesim_node

这时会弹出一个蓝色背景的窗口,里面有一只乌龟。新开一个终端运行:

ros2 run turtlesim turtle_teleop_key

在这个终端里用键盘方向键控制乌龟移动。这个测试看起来简单,但它验证了几个关键东西:ROS2 的节点发现机制、话题通信、GUI 程序的显示环境。如果在虚拟机里测试,乌龟窗口没弹出来,优先检查虚拟机图形环境配置,不要直接怀疑 ROS2 装错了。

小乌龟还可以顺带验证 ROS2 的话题系统。在第三个终端执行:

ros2 topic list ros2 topic echo /turtle1/cmd_vel

ros2 topic list会显示当前所有话题,你按方向键时,/turtle1/cmd_vel话题上会有实时数据流,ros2 topic echo能看到以几何消息格式发布的线速度和角速度数据。这一套跑通,你对 ROS2 的“节点-话题-消息”三大核心概念就有了直观认知。

3.3 Rviz2 可视化验证

如果小乌龟没问题,再来验证一下 ROS2 的 3D 可视化工具 Rviz2:

ros2 run rviz2 rviz2

看到图形界面成功启动,就说明 ROS2 的图形工具链也没问题。Rviz2 是 ROS2 生态里最基础也是最常用的可视化工具,后续做 SLAM、视觉识别、路径规划都离不开它,所以这一步验证很有必要。如果你打算做机械臂相关项目,后面还可以装ros-jazzy-urdf-tutorial之类的包,加载官方 URDF 模型,直接在 Rviz2 里拖动关节看效果,这算是 Rviz2 最直观的上手方式了。

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

4.1 找不到安装候选包

执行sudo apt install ros-jazzy-desktop时,如果提示Package 'ros-jazzy-desktop' has no installation candidate,大多数情况有两种原因。第一,系统版本代号不对,你的系统不是 Ubuntu 24.04 或者基于 24.04 的发行版,导致源路径解析错误;第二,你添加源的命令执行时有语法错误,配置文件内容有问题。

排查方法是先看源文件:

cat /etc/apt/sources.list.d/ros2.list

正常的话,你应该看到包含noble main字样的记录。如果没有,或者显示的是其他版本代号,就要重新执行 2.1 节的添加源命令。另外也可以执行:

apt-cache search ros-jazzy | head

如果能搜到包,说明源是通的,只是包名拼写问题;搜不到,就回过头检查源配置。

4.2 source 之后 ros2 命令仍然找不到

这个问题最常见的原因是你当前终端不是登录 shell,或者~/.bashrc没有被正确加载。对应的解决办法是手动执行:

source /opt/ros/jazzy/setup.bash

然后再试ros2 --help。还有一个隐藏很深的坑,就是终端模拟器可能默认没有读取.bashrc,这种情况下即使你写入了配置也不会自动生效。解决方法是直接在终端里执行bash进入子 shell,或者干脆重启终端。

如果source之后ros2还是找不到,那就检查/opt/ros/jazzy/目录是否存在:

ls /opt/ros/jazzy/

如果目录里只有setup.sh但缺少setup.bash,说明你可能之前用过 zsh 交互流程,安装过程中某些环境变量被污染了。最简单的恢复办法是重新安装一遍ros-jazzy-ros-base,它会补齐所有基础文件。

4.3 虚拟机里运行卡顿和窗口崩溃

如果你和我一样在 VMware 里安装,可能会遇到两个典型问题。一是小乌龟和 Rviz2 的 3D 渲染帧率极低,这是因为默认的虚拟显卡性能太弱。VMware 里可以开启 3D 加速,并把显存调到 128MB 以上,VirtualBox 的话在“设置-显示-显存”里同样可以调高。二是窗口偶发崩溃,这通常是 Wayland 和 X11 兼容性的问题,可以在登录界面的齿轮菜单里选择Ubuntu on Xorg会话登录,ROS2 的 GUI 工具在 Xorg 环境下要稳定得多。

4.4 与 Python 3.12 和 pip 相关的问题

Ubuntu 24.04 自带的是 Python 3.12,这比 22.04 的 3.10 新了不少,ROS2 Jazzy 虽然同步支持 3.12,但 apt 安装的 ROS2 包默认是用系统 Python 环境的。如果你后面想用 pip 装一些 ROS2 相关的辅助库,比如numpy、scipy、transformations,千万不要直接pip install到系统环境里,很容易和 ROS2 自身的依赖产生冲突。

我建议使用虚拟环境,或者至少加上--user参数:

pip install --user numpy

另外,如果系统里同时装了unset PYTHONPATH之后才能正常使用某些工具,这说明了 Python 路径系统混乱。可以用:

echo $PYTHONPATH

检查是否有异常路径,如果输出了一堆不知道哪来的路径,建议先清理掉再测试 ROS2 功能。

4.5 网络问题导致下载缓慢或失败

ROS2 的包主要托管在packages.ros.org,国内访问速度有时不太理想。这里提供几个稳妥的应对思路:一是使用带断点续传功能的下载工具,比如apt本身支持断点续传,但如果你用curl手动下载东西,建议加上-C -参数让它支持续传;二是如果某次apt update失败是偶发性的,直接重试几次,很多时候是网络抖动;三是在 apt 配置里设置超时时间:

echo 'Acquire::http::Timeout "5";' | sudo tee /etc/apt/apt.conf.d/99timeout

把超时时间改短,这样网络卡住时会快速报错而不是傻等,然后重新执行sudo apt update即可。这一步在真实使用中非常管用。

5. 进一步探索:搭建第一个 colcon 工作区和节点

5.1 安装 colcon 构建工具

ROS2 的项目工程标准工具是 colcon,它取代了 ROS1 时代的 catkin。虽然在 ROS2 官方仓库里它已经自带了一部分构建工具,但要自己创建功能包,还是建议安装完整的 colcon:

sudo apt install python3-colcon-common-extensions

然后创建一个工作区目录:

mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build

第一次在工作区根目录执行colcon build时,即使没有源码,也会生成本地的install、build、log三个目录。install目录里会有和你这个工作区对应的setup.bash,运行你自己的节点之前需要先激活它。

5.2 用 Python 写一个最简单的发布-订阅节点

工作区建好之后,我们来创建一个最简单的 Python 功能包。在src目录下:

cd ~/ros2_ws/src ros2 pkg create my_first_pkg --build-type ament_python --node-name talker_node

这会生成一个名为my_first_pkg的功能包,同时创建一个空的talker_node.py节点文件。然后编辑talker_node.py,写入以下内容:

import rclpy from rclpy.node import Node from std_msgs.msg import String class Talker(Node): def __init__(self): super().__init__('talker_node') self.publisher = self.create_publisher(String, 'my_topic', 10) self.timer = self.create_timer(1.0, self.timer_callback) self.count = 0 def timer_callback(self): msg = String() msg.data = f'Hello from my_first_pkg: {self.count}' self.publisher.publish(msg) self.get_logger().info(f'Publishing: {msg.data}') self.count += 1 def main(args=None): rclpy.init(args=args) node = Talker() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()

这段代码做的事情很简单:Timer每秒钟触发一次回调函数,回调里构造一个String类型消息,发布到名为my_topic的话题上。写完之后回到工作区根目录,执行:

cd ~/ros2_ws colcon build --packages-select my_first_pkg source install/setup.bash ros2 run my_first_pkg talker_node

你会看到节点每秒打印一条发布日志。这时候你再开一个终端,执行:

ros2 topic echo /my_topic

就能看到自己发布的消息了。到这一步,你就真正完成了从“安装 ROS2 环境”到“运行自己的第一个 ROS2 程序”的完整闭环。

如果你对这些内容感兴趣,下一步可以尝试做几件事:用ros2 node list和ros2 node info /talker_node查看节点信息;写一个订阅端节点接收自己的消息;或者直接用rviz2加载一个 URDF 机器人模型,感受一下 ROS2 在机器人建模方面的能力。我个人在实际操作中的体会是,ROS2 的安装其实只是万里长征第一步,真正有价值的是安装完成之后怎么把环境用起来。建议你装好之后立刻创建自己的工作区,哪怕是抄最简单的官方示例,也要亲手在终端里敲一遍,这个流程走通之后,你对 ROS2 的整个架构和操作习惯会有一个质的提升。最后再分享一个维护技巧:每次关闭系统前,记得看一眼/var/log/目录有没有异常大的日志文件,ROS2 在频繁运行节点时产生的日志量比想象中大,隔段时间清理一次能避免磁盘被无声无息地占满。装好环境只是开始,祝你后续的机器人开发之路顺顺利利。

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

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

立即咨询