1. 为什么我推荐Ubuntu 22.04搭配ROS2 Humble,而不是别的组合
先说个很多新手容易忽视的问题:ROS2不是ROS1的简单升级版。两者的架构差异极大,安装方式、运行机制、调试手段几乎全变了。你在网上搜到的大多数老教程,可能还停留在ROS1的思路,照着做很容易卡壳。
1.1 架构变化直接决定了你的安装思路
ROS1时代,系统里必须跑一个roscore作为中心节点,所有节点都要跟它通信。一旦roscore挂了,整个系统就瘫了。ROS2的设计目标之一就是干掉这种单点依赖,改为基于DDS(数据分发服务)的分布式通信。每个节点之间点对点发现、直接通信,不再需要统一的"大脑"。
这套架构的好处是显而易见的:多机器人协同、跨设备通信、断线重连都变得更自然。但代价也很直接——安装和使用方式需要推翻重来。比如ROS1里你可能习惯了source /opt/ros/noetic/setup.bash,ROS2里同样要source,但后续的话题、服务、参数命令风格完全不一样了。所以在动手之前,先把"我学的那些ROS1知识得重新梳理一遍"这个心理预期建立起来,后面会顺利很多。
1.2 Ubuntu版本和ROS2发行版怎么对应
ROS2的每个发行版都绑定一个特定的Ubuntu LTS版本,不是你想装哪个就装哪个。这里把最常见的对应关系列一下:
| Ubuntu版本 | ROS2发行版 | 说明 |
|---|---|---|
| Ubuntu 20.04 Focal | Foxy Fitzroy | 首个LTS版ROS2,目前仍有人用 |
| Ubuntu 22.04 Jammy | Humble Hawksbill | LTS版,2022年5月发布,支持到2027年 |
| Ubuntu 24.04 Noble | Jazzy Jalisco | 较新,生态还在追赶中 |
我这篇讲的是Ubuntu 22.04 + ROS2 Humble这个组合。原因很朴素:22.04本身就是一个非常稳定的LTS系统,Humble则是ROS2里用户最多、教程最全、第三方库适配最成熟的发行版。无论是跑仿真还是后面接自己的算法,资料都好找。
1.3 选择Humble的具体理由
顺便说下为什么不推荐一上来就追新版Jazzy。Humble的补丁和支持周期还有好几年,绝大多数机器人相关库(比如导航、机械臂、视觉相关的中间件)都会优先兼容Humble。而新发行版刚出来时,很多依赖还在适配期,API变动也比较大,新手踩坑的代价很高。
提示:如果你是为了跑某个老项目的代码,先确认那个项目的官方文档指定的是哪个ROS2发行版,再回头选Ubuntu版本。反过来先装系统再找匹配的ROS2,有时候会白忙一场。
2. 安装前先做这三件事,避免后面踩坑
我见过太多人拿到教程就复制粘贴,结果在某个环节报错后完全懵掉。其实安装ROS2本身并不难,难的是安装前没有把系统环境检查清楚。下面这三件事,我每次在全新机器上装都会先过一遍,几乎能过滤掉八成的初级问题。
2.1 确认你的系统版本和架构
先确认你手上这台机器确实是Ubuntu 22.04,别因为当初装的是20.04升级上来的,或者用了某个精简版内核,就默认环境没问题。打开终端执行:
lsb_release -a如果输出里的Codename是jammy,说明系统版本对得上。接着看架构:
uname -m一般PC会输出x86_64,树莓派这类ARM板子会输出aarch64。这两个架构在后面的软件源配置里要用到,先记在心里。
2.2 设置正确的locale
这个坑真的很隐蔽。ROS2在启动阶段会做locale检查,如果你的系统locale不是UTF-8,后续跑节点时经常冒出奇怪的编码报错:要么是中文乱码,要么是Invalid byte sequence之类的异常。我一开始也以为这只是提示,不理会,结果实际跑turtlesim时终端输出直接花了。
建议提前把locale统一成UTF-8:
locale如果看到LANG=zh_CN.UTF-8或者LANG=en_US.UTF-8这种带UTF-8的就问题不大。如果显示的是C或者POSIX,就需要处理一下。以设置英文环境为例:
sudo apt update sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8设置完之后最好重启终端,或者重新登录一次,让环境变量生效。
2.3 做好软件源和系统更新
安装ROS2之前,我习惯先把系统的软件源切成网络状况更好的镜像源,具体怎么切看你所在网络环境的实际情况。这一步很推荐做,因为ROS2的依赖很多,如果系统源本身就很慢,后面下载安装包会非常痛苦。
sudo apt update sudo apt upgrade -y如果你不想等待漫长的系统升级,至少也要把apt update跑一遍,确保能正常获取软件包列表。之前有台机器卡在无法解析软件源的错误上,排查了半天才发现是软件源配置里混入了不可用的源地址,白白浪费了一晚上。
3. 正式安装ROSO2 Humble,完整步骤和命令
接下来进入正题。Ubuntu 22.04对应的ROS2发行版是Humble Hawksbill。官方推荐的安装方式是使用apt包管理器,也就是从ROS2软件源下载预编译好的二进制包。这种方式对绝大多数人来说是最稳妥的,不建议新手去源码编译,耗时耗力还很容易因为环境差异出问题。
3.1 添加ROS2软件源和密钥
这一步的作用是让系统知道去哪里找ROS2的安装包。首先要下载并保存官方仓库的密钥,然后用echo写入一个软件源配置文件。
sudo apt update sudo apt install software-properties-common curl sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null然后更新软件源:
sudo apt update执行完之后,可以用下面的命令简单验证一下源是否生效:
apt policy ros-humble-ros-base如果能看到候选版本,说明源已经识别到了。这一步最常见的错误是curl下载密钥失败,通常是网络原因,重试几次或者换个网络环境基本能解决。注意ros.key和源配置的路径必须是/usr/share/keyrings/和/etc/apt/sources.list.d/,不能随便改,否则apt的签名验证会失败。
3.2 选择安装桌面完整版还是最小版
这里很多人会纠结一下。安装包分好几种,常用的两个版本:
| 版本 | 包含内容 | 适合场景 |
|---|---|---|
| ros-humble-desktop | 含GUI工具、可视化插件、常用库和示例 | 新手学习和本地联调首选 |
| ros-humble-ros-base | 仅通信核心和基础库 | 部署到机器人本体、嵌入式设备、服务器 |
我第一次装的时候图省事只装了ros-base,结果后面想用rqt之类的可视化工具时还得一个个补装,反而更麻烦。如果你是在自己的电脑上学习,强烈建议直接装desktop版本:
sudo apt install ros-humble-desktop同时我还会把后面开发必需的几个工具一起装掉:
sudo apt install python3-rosdep python3-colcon-common-extensions python3-vcstoolcolcon是ROS2的构建工具,以后自己写功能包、编译工作空间时必用;rosdep用于自动安装功能包依赖的系统库;vcstool则是批量管理多仓库代码的,虽然不是必须,但装了不亏。安装过程下载量不小,耐心等待即可。
3.3 配置环境变量
安装完成后,ROS2的可执行文件在/opt/ros/humble目录下。你需要在当前终端里source它的setup.bash才能直接使用ros2命令:
source /opt/ros/humble/setup.bash这行命令只管当前终端,新开一个终端就得重新执行。为了避免每次都手动输入,建议把这一行写入~/.bashrc:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc这里顺便解释一下为什么用setup.bash而不是setup.sh。ROS2初始化环境时还会设置PYTHONPATH、LD_LIBRARY_PATH、AMENT_PREFIX_PATH等一堆变量。如果你是像我一样用终端操作,bash这份就够;如果以后写启动脚本、搞自动化部署,可能还要了解local_setup.bash和setup.bash的区别,那个后面专门写一篇再说。
3.4 初始化rosdep
rosdep的作用是帮你自动解决功能包的依赖问题。比如你从GitHub拉下来一个ROS2功能包,里面依赖几十个系统库,手动一个个apt安装很崩溃。有了rosdep,它会读取包的package.xml,自动解析并安装缺失的系统依赖。
首先要安装它:
sudo apt install python3-rosdep然后初始化:
sudo rosdep init rosdep updaterosdep init一般只需要执行一次,它会在/etc/ros/rosdep/sources.list.d/下生成源配置。rosdep update则相当于拉取最新的依赖索引数据,建议定期执行。如果update卡住太久,多半是网络问题,重试或者错峰执行即可,不涉及特殊配置。
4. 测试ROS2是否真正安装成功
装完之后千万不要以为能用ros2 --help就算成功。ros2命令出现只能说明基本工具链在,但不代表整个运行时畅通。我每次都会跑一遍从通信到可视化的完整演示,确认没有隐藏问题。
4.1 最直接的通信测试:talker和listener
先开一个终端,source环境后启动一个发布者节点:
source /opt/ros/humble/setup.bash ros2 run demo_nodes_cpp talker你会看到它每隔几百毫秒打印一条Publishing: 'Hello World: N'。此时再开一个终端,执行:
source /opt/ros/humble/setup.bash ros2 run demo_nodes_py listenerlistener会持续收到talker发来的消息,打印I heard: 'Hello World: N'。只要两端对应上,说明ROS2的节点发现、主题发布、订阅、数据序列化这一整套通信链路都没有问题。这也是ROS2安装后最标准、最快的一个冒烟测试。
有的教程喜欢让你直接跑两个C++示例。我这里特意用了一个C++节点、一个Python节点,就是为了验证不同语言实现的功能包之间也能正常通信。跨语言互通是ROS2的一个核心能力,如果这里就出问题,后面写代码时会非常痛苦。
4.2 用turtlesim来验证可视化链路
通信测试过了,再跑一个带界面交互的演示,进一步验证GUI、话题控制和键盘输入链路。turtlesim是一个内置的小乌龟模拟器,非常适合初学阶段理解节点和消息的关系。
启动乌龟模拟器:
ros2 run turtlesim turtlesim_node然后新开一个终端,启动键盘控制节点:
source /opt/ros/humble/setup.bash ros2 run turtlesim turtle_teleop_key在键盘控制终端里按方向键,你会发现模拟器窗口里的小乌龟会跟着动。这个过程其实背后发生的事情不少:
- 键盘节点监听你的按键
- 把按键转换为速度指令,发布到
/turtle1/cmd_vel话题 - 模拟器节点订阅
/turtle1/cmd_vel,更新乌龟位置
如果你没有图形桌面环境,这一步可能会失败。普通桌面版Ubuntu没问题,但纯净服务器或某些远程环境就需要另行处理,这一点我会在后面排查部分详说。
4.3 用CLI工具验证话题和节点状态
趁turtlesim跑着,顺便来熟悉一下ROS2命令行工具。在新开的终端里:
ros2 node list应该能看到/turtlesim和/teleop_turtle两个节点。再看一下话题:
ros2 topic list能看到/turtle1/cmd_vel、/turtle1/pose、/rosout等话题。还可以直接订阅某个话题看看实时数据:
ros2 topic echo /turtle1/pose屏幕上会不断刷新乌龟的x、y坐标和角度。这些都是日常调试最常用的命令,信息密度比GUI界面高很多。后面排查问题,很大程度就是靠这几个命令定位的。
4.4 不用键盘也能让乌龟动起来
再教你一个更"程序员"的玩法:直接往话题里发消息。终端里执行:
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {z: 1.8}}"这条命令会向/turtle1/cmd_vel话题发布一条线速度2.0、角速度1.8的速度指令。乌龟接收到后会边向前跑边转弯。细心的你可能会发现,刚才键盘控制时,是人在转动机器人的"操控指令",而这里没有了人的参与,直接用一条指令就能驱动节点运动。这背后就是ROS2里最简单的"节点与节点之间通过话题通信"模型。
### 5. 实测过程中容易踩的坑和排查链路安装步骤本身不难,真正让人头大的是各种莫名其妙的报错。我把自己在实际安装和测试过程中遇到过的典型问题整理出来,这些问题在我帮别人排查时也反复出现。
5.1 ros2命令找不到,终端提示command not found
这个问题九成是环境变量没配上。有些人以为安装完就自动能用,实际上不是。在终端里执行:
ls /opt/ros/如果能看到humble目录,说明安装包本身没有问题。接着检查~/.bashrc里有没有source那一行:
grep "setup.bash" ~/.bashrc没有的话,按前面的方法补上。如果这行存在但依然不行,可能是bash在登录或读取配置时出了问题。手动执行source /opt/ros/humble/setup.bash确认能用后,再检查~/.bashrc里是否被其他配置干扰了,比如有些环境管理脚本会在后面覆盖PATH或者PYTHONPATH,把source那行放到文件末尾能有效规避冲突。
5.2 turtlesim窗口无法弹出或者闪退
这个坑比较隐蔽。turtlesim依赖桌面图形环境,如果你用的是服务器版Ubuntu、WSL(Windows子系统)或者某些没有安装桌面系统的环境,直接跑ros2 run turtlesim turtlesim_node会报错,要么提示无法连接显示器,要么窗口一闪而过。
排查链路是这样的:首先确认自己是不是在有图形环境的环境里。如果是WSL,建议先装一个Windows侧的桌面端配合使用,或者改用远程桌面方案;如果是无头服务器,有两个思路,一是装一个轻量桌面,二是不跑GUI程序,直接使用前面提到的ros2 topic pub和ros2 topic echo来做通信测试。
实话说,如果你主要是调算法、跑训练,turtlesim只是辅助理解工具,不必为它专门折腾图形环境。能用talker/listener通信测试通过,安装就已经算成功了。
5.3 rosdep update一直卡着不动
rosdep的update需要访问一个托管在GitHub上的索引仓库。如果你的网络环境访问外网不稳定,它就可能长时间停在某个阶段。遇到这种情况,先确认一下基本网络连通性,而不是反复重试同样的命令。
如果基本连通没问题但还是超时,可以检查系统时间是否正确。我之前遇到过一台虚拟机的系统时间偏了好几个小时,HTTPS证书校验失败,rosdep、apt源全部报错,改完系统时间后一切都正常了。如果网络确实受限,我的建议是先保持网络通畅,尽量不要反复中断重试,有时候等一段时间它自己就完成了。
5.4 源添加报错或者找不到ros-humble包
执行apt install ros-humble-desktop时如果提示找不到软件包,请按这个顺序排查:
sudo apt update apt-cache search ros-humble | head -20如果一条都搜不到,大概率是软件源没有正确添加,或者添加后没有执行更新。再确认一下/etc/apt/sources.list.d/ros2.list文件里的内容,尤其注意$(lsb_release -cs)展开后的结果,如果是ubuntu版本不对,那就要先纠正系统源和版本。
5.5 话题对不上号:listener收不到talker的消息
还有一类问题不是安装导致的,而是运行环境的问题。比如listener开着,但talker发消息它一直没反应。先用ros2 topic list看看两个节点有没有出现在同一台机器上,再执行ros2 topic info /chatter看看发布者和订阅者数量是否都有记录。
如果listener确实订阅了,但收不到数据,建议检查是否开了多个ROS环境或者多个网络接口导致节点发现失败。ROS2的节点发现依赖组播通信,某些公司内网、虚拟机网络模式会禁止组播,导致节点之间互相看不到。解决办法是设置ROS2的通信接口环境变量,比如把ROS_AUTOMATIC_DISCOVERY_RANGE限定在本地,或者显式指定ROS_DOMAIN_ID。这个属于进阶问题,遇到再深入解决也不迟。
6. 安装完成后,我建议你顺手做这几件事
既然已经装好了,就别急着关终端。再往下走几步,你会发现后面正式开始用的时候会顺手很多。
6.1 创建你的第一个工作空间并编译验证colcon
ROS2的开发流程和ROS1有一个很大的区别:你自己写的功能包都要放在一个工作空间里,用colcon构建。建议现在就把工作空间建好,验证colcon能正常工作:
mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build刚开始这是一个空工作空间,build速度非常快。执行完之后会生成build、install、log三个目录。以后你写的功能包都放入src目录,重新colcon build即可。
注意,这里有个简单但容易犯的小错误:自己工作空间的install/setup.bash需要在系统ROS2的setup.bash之后source,顺序反了可能导致找不到系统安装的包。推荐在~/.bashrc里按这个顺序写:
source /opt/ros/humble/setup.bash source ~/ros2_ws/install/setup.bash6.2 学会用--help查看命令细节
ROS2命令行工具支持非常细的层级式帮助,这是你自己探索新命令的最佳入口。比如你搞不清某条指令怎么写:
ros2 topic pub --help它会列出参数类型、示例用法、必填项等信息。不管是节点、话题、服务还是参数,都可以用这种办法现查,比每次都翻网页快很多。
6.3 再体会一下话题和服务这两类通信方式的区别
在turtlesim里你其实已经接触了两类通信:话题是广播式的,一个发多个收,适合持续性的数据流,比如传感器数据、速度指令;服务则是问答式的,一个请求对应一个响应,适合一次性操作。turtlesim里就有一个现成的服务可以试:
ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.0, y: 5.0, theta: 3.14}"这条命令会在坐标(5,5)附近再生成一只新乌龟。理解话题和服务两种机制的差异,是ROS2开发里最重要的一个分水岭,建议你在跑完这篇里的演示后,再花点时间亲自操作一下这些命令。
6.4 订一个适合自己的ROS2命令学习顺序
最后分享一个我觉得不错的学习路径:先熟练ros2 node list和ros2 topic list,把"系统中到底有哪些节点和话题"这个意识建立起来;然后用ros2 topic echo去"偷看"别人节点的数据;再用ros2 topic pub自己发数据"指挥"节点干活;最后再用ros2 service call去调用节点的服务。等这几步都玩熟了,ROS2的运行模型你基本就心中有数了。后面无论是阅读别人的代码还是自己写功能包,思路都会清晰得多。
我在自己那台测试机上从装系统到跑通全部测试,大概花了小半天。时间主要耗在下载依赖和摸索图形环境上,真正动手操作其实很快。如果你也正在走这条路,希望这篇记录能帮你少绕几个弯。装好之后不妨多折腾一会儿,ROSO2这个系统不像普通软件,装完就完事了,它值得你在第一天就多玩几个Demo。