先说明一点:这篇文章不是什么资源导流帖,不提供任何网盘链接和所谓“破解版”资料,只讲一件事——赵虚左老师这套全网公认的ROS2入门讲义,到底该怎么找、怎么拿、拿到之后怎么用起来。
在B站搜ROS2教程,赵虚左的课常年霸榜。他的视频有个特点:信息密度高,语速快,命令一条接一条,光靠看视频根本记不住,于是“讲义”就成了刚需。我见过太多人在评论区问“讲义在哪下”“PPT能分享吗”“代码仓库地址有没有”,也见过更多人在拿到资料之后,把PDF扔进网盘吃灰,因为环境根本跑不起来。
这篇博文就沿着“获取”这个动作往后讲——从课程资源的定位、获取路径,到环境搭建、学习路线,再到我实际踩过的高频翻车点。适合正准备入门ROS2、或者已经装了资料但卡在环境这一步的同学。内容不依赖具体版本,Foxy、Humble、Jazzy通吃,读完之后你应该能自己走完“拿到讲义→跑通示例→进入实战”这条完整链路。
1. 这套讲义为什么值得专门去“获取”:一个被问了无数遍的资源定位问题
先说清楚这套资源在整个ROS2学习社区里的位置,不然你根本不知道自己在拿什么。
1.1 不只是一份PDF,而是一整套“视频+讲义+代码”的组合
赵虚左的ROS2课程,是ROS2时代国内最早一批成体系的视频教程。在ROS1时代,很多人靠古月居的课入门;到了ROS2时代,赵老师的课成了大批人的第一站。课程覆盖面从环境安装、节点通信、turtlesim小海龟,一路到URDF建模、Gazebo仿真、SLAM建图、Nav2导航、MoveIt机械臂,基本把ROS2机器人开发的主干线讲全了。
但视频只是其中一层。真正让这套课“拿得到但用不好”的,是它的配套资料结构:
- 讲义(PDF):不是PPT截图,而是按知识点拆开的文字稿,包含概念解释、架构图、常用命令、关键代码片段、每讲的练习。
- 代码仓库:每个章节都有对应的ROS2功能包,跟视频内容是对应的。理论上你可以把整个仓库clone下来,一条条命令跟着跑。
- 视频正文:讲义是静态的,代码仓库是动态的,视频则是把它们串起来的线。
这三样缺一个,学习效率都会明显下降。只拿PDF不看视频,很多命令不知道上下文;只看视频不拿代码,每条命令都手敲会敲到怀疑人生。所以大家都在找“讲义”,本质上找的不是一份PDF,而是一套可复现的学习环境。
1.2 为什么是“赵虚左”而不是官方文档
有些新人会问:ROS2官方文档、官方Tutorials不香吗?为什么要绕一圈去找个人讲师的资料?
我的看法是:官方文档适合“查”,不适合“学”。官方Tutorials的案例确实是权威的,但它的组织方式是按功能模块拆开的,不是一个有递进关系的课程体系。对零基础的人来说,看完“Installation”之后下一步该看什么、看完“Turtlesim”之后跟导航有什么关系,官方文档不会告诉你。赵虚左的课程不一样,它按“从零到能跑一个导航机器人”的顺序组织,先讲节点、话题、服务、动作四大通信原语,再做仿真,最后上SLAM和Nav2,整个过程是线性的、有依赖关系的。
另外,这套讲义的代码是经过完整跑通的。很多开源教程的代码在某个发行版上能编译,换一个发行版就报错,赵老师的讲义在这方面做过大量踩坑处理,这也是它在社区里口碑好的原因之一。
1.3 一个容易被忽略的事实:讲义解决的是“记不住”,不是“学不会”
我见过太多人拿到讲义后,第一反应是“我要从头到尾精读一遍”,结果读了两章就放弃了。这里有个经验:
讲义不是用来读的,是用来对照的。
ROS2的知识密度太大,命令太多,光靠看视频记笔记,速度完全跟不上。赵老师的视频语速偏快,一节课下来如果有40分钟,你大概率会漏掉三分之一的内容。正确的用法是:先看视频,遇到没跟上的命令,暂停,打开讲义对应章节,看清楚的上下文,把命令复制进去跑一遍;跑不通的时候,去代码仓库里看原始包代码。讲义是“回放时的记忆辅助”,不是“第一次学习的入口”。
搞清楚这个定位之后,再去看怎么获取它,就会理智很多——你不是在找一个“万能学习资料”,你只是在找一个“更好用的笔记助手”。这也是为什么我后来一直强调:别囤资料,先装环境。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 拿到讲义的正确姿势:从B站课程到配套资料仓库的完整路径
先给一个总览式的结论:这套讲义没有统一的“官方官网”,它的分发方式是典型的社区课程形态——“视频平台 + 网盘 + 代码托管平台”三件套。好消息是,这三部分都是公开的,不需要任何付费或者特殊渠道。下面按顺序说。
2.1 第一步:用对搜索词,别被仿冒账号带偏
在B站搜索赵虚左的课程,最直接的关键词是“ROS2 赵虚左”或“ROS2机器人开发实践”,留意一下UP主名称和账号认证,选播放量最高、评论区和弹幕最活跃的那个视频集。这听起来像废话,但实际搜索时有个常见问题:会有不少账号搬运课程视频或者同名仿冒账号,搬运版往往少了一部分内容,弹幕和评论区也失去了参考价值。我的建议是优先认准原始UP主,认准视频合集标题里带“合集”标识的完整课程。
找到合集之后,先不要急着看第一集。花10分钟把整个视频列表从头翻到尾,看看目录结构。这套课程的章节划分大致是:环境介绍、通信机制、常用工具、机器人建模、仿真、导航、机械臂,后面还有进阶内容。知道这个全貌非常重要,能让你在学习时保持方向感。
2.2 第二步:讲义PDF从哪拿
这是被问得最多的一个问题,答案其实就藏在上课的路径里。常见的公开渠道有三处:
- 视频简介区:每一集的简介里通常会放对应章节的讲义链接、代码仓库地址。注意,不是只有第一集有,很多集都有独立简介。
- 评论区置顶:UP主或热心同学会把最新版资料链接放在置顶评论里,方便随时更新。我见过有人只看视频不看评论,结果拿着上一年的旧版教案对不上号。
- UP主动态/专栏:如果课程有大版本更新,动态和专栏里通常会有说明,包括代码仓库是否切换分支、PDF是否修订。
需要提醒一句:这些链接的载体大多是网盘。**在拿网盘链接时,看清楚来源,只认UP主本人的简介、评论和动态,不要相信任何“加群获取全套资料”的转发。**社区里有一些打着“打包整理”旗号的资源搬运,拿到手的东西版本旧、缺章节,还容易夹带非官方内容。这套课程本来就是免费的公开资料,不存在“限时领取”的说法。
2.3 第三步:代码仓库怎么找、怎么下
代码仓库是整套讲义里最容易被忽视、但对实操最重要的部分。找法也很简单:在Gitee或GitHub上搜索“赵虚左”或者“ROS2”加课程名称关键词,优先选star数最高、最近仍有更新的仓库。因为国内网络环境的原因,Gitee上的镜像或原仓库访问速度明显优于GitHub,这是绝大多数人的实际选择,如果课程作者在主仓库上更新不勤,Gitee上反而经常有热心同学维护的同步版本。
clone的时候建议用浅克隆,整套课程代码和示例包加起来体积不小,完整克隆会拖慢速度:
bash复制git clone --depth=1 https://gitee.com/xxx/ros2-course.git
cd ros2-course
ls -l
仓库拿到手之后,先看根目录的README,一般会说明目录结构、环境要求、每个章节对应的分支或目录。我见过不少同学把仓库clone下来直接colcon build,结果报一堆错,然后回头骂资料不行。其实问题多半出在没看README,仓库可能要求先切换到特定分支,或者需要先rosdep安装依赖,这些信息都在README里写了。
2.4 获取完成之后的第一件事:做一份“本地资源清单”
这一步很笨,但非常有效。很多人拿到资料后,文件散落在各个下载目录里,结果学到后面找代码找半天。建议你拿到所有资源后,花几分钟建一个固定目录,把PDF讲义、代码仓库、视频选集(离线情况下)按章节整理好。
我的习惯是这样:
text复制ros2-learning/
├── docs/ # PDF讲义,按章节编号重命名
├── src/ # 代码仓库clone目录
├── notes/ # 自己的学习笔记,这目录通常最有用
└── env/ # 环境配置相关的脚本和记录
目录建好之后,先去把环境搭起来。很多人的误区是“先看PDF,把理论学完再动手”,但ROS2是实操性极强的框架,干看PDF效率极低,只有命令行跑通了,再回头看讲义里的原理,才有真正的理解。这也是我把环境搭建放在下一章的原因——不是顺序上的“先学环境”,而是“讲义获取”这个动作真正的完成标志是环境能跑起来。
3. 讲义配套环境的搭建顺序:Ubuntu版本、ROS2发行版与鱼香一键安装的取舍
学ROS2最劝退的环节,就是环境安装。这章把版本对应关系、安装方式选择、验证手段一次说清。
3.1 先搞清楚你的Ubuntu版本,再选ROS2发行版
ROS2每个发行版都有官方支持的Ubuntu版本,选错版本意味着后续所有依赖都会出问题。很多人在交流群里求救,一问版本,Ubuntu 24.04装了ROS2 Foxy,那必然装不上,因为Foxy官方只支持Ubuntu 20.04。先认清三个最常见的对应关系:
| Ubuntu版本 | 对应ROS2发行版 | 支持状态 |
|---|---|---|
| Ubuntu 20.04 | Foxy Fitzroy | 已停止维护(2023年EOL),但仍有很多老教程基于它 |
| Ubuntu 22.04 | Humble Hawksbill | 长期支持版(LTS),目前最常用的学习版 |
| Ubuntu 24.04 | Jazzy Jalisco | 长期支持版(LTS),新项目正在往这迁移 |
| Ubuntu 24.04 | Rolling | 滚动版本,不推荐学习使用 |
赵虚左的讲义主体是基于某个特定发行版讲解的,你在获取资料时大概率会看到视频里提到“我用的版本是XXXX”。我的建议很直接:如果你的系统版本和讲义主版本不一致,优先考虑用Docker或虚拟机去匹配讲义版本,而不是强行在当前系统上装一个不匹配的发行版。学习阶段最重要的是“能跟着教程跑通”,版本不一致会导致很多命令输出对不上,对新人非常不友好。
先运行这条命令确认自己的系统版本:
bash复制lsb_release -a
如果显示Ubuntu版本和你想装的ROS2版本对不上,先去把系统搞定,装双系统或者虚拟机,再继续。
3.2 官方安装方式:步骤不少,但每一步都可控
官方安装流程是标准流程,用apt安装。大致是:设置软件源、添加ROS2的GPG密钥、添加APT仓库、更新、安装ROS2基础包、设置环境变量。这是最“正统”的方式,优点是你清楚每一步做了什么,缺点是源和密钥配置在国内网络下经常超时。
这个过程中最容易踩坑的是“添加GPG密钥”和“添加APT仓库”两步,网络不稳定会导致密钥接收失败。解决办法是换用国内可访问的镜像源,把packages.ros.org替换成可用的镜像地址,再把sources.list里ROS2仓库源也替换成对应镜像。这些操作按图索骥并不难,但第一次接触容易迷路。
3.3 鱼香ROS一键安装:省时间,但你得知道它替你做了什么
社区里流传最广的“鱼香ROS一键安装”,确实是把ROS2环境安装做到了极致简化。运行一个脚本,交互式选择要装的组件,然后等它跑完,环境和依赖基本就齐了。对于学习阶段来说,这是性价比很高的选择。
用它的注意点有三个:
- 装的时候别闭着眼睛一路回车。脚本会让你选择安装版本、是否安装桌面版、是否添加环境变量,每个选项都看一下,比如你只想装Humble,就选Humble,别默认装最新版。
- 装完还是要手动source环境。一键安装脚本一般会在你的shell配置里自动加上
source /opt/ros/<版本>/setup.bash,但如果你的shell不是bash(比如用zsh),就可能漏掉,需要手动在~/.zshrc里补。 - 出了问题要知道去哪查。一键安装因为是脚本自动处理,很多包被放在系统目录或用户目录,报错时先看脚本日志,再针对性处理,不要遇到问题就重装。
我个人的实践建议是:新手用鱼香一键安装跑通环境,因为“头一次能把环境跑起来”带来的信心比任何省事的细节都重要。等你跑通一段时间后,再回头按官方文档手动装一遍,那时候你对ROS2的结构会有完全不同的理解。这不是“正道”和“歪门邪道”的区别,而是“先用起来再理解”和“先理解再用起来”两条不同的学习路径,后者对新人太残忍了。
3.4 安装完成之后,跑通小海龟才是唯一的验证标准
环境装好之后,不要急着打开讲义,先做一个冒烟测试——小海龟。它能验证你最核心的“节点能不能运行、话题能不能通信、发布订阅能不能正常工作”。
bash复制# 终端1:启动小海龟仿真器
ros2 run turtlesim turtlesim_node
# 终端2:启动一个键盘控制节点
ros2 run turtlesim turtle_teleop_key
如果小海龟窗口能弹出来,并且按方向键海龟能动,说明你的ROS2基本环境是通的。接下来再验证一下常用命令工具:
bash复制ros2 node list # 应该能看到 /turtlesim 和 /teleop_turtle
ros2 topic list # 应该能看到 /turtle1/cmd_vel 等话题
ros2 topic echo /turtle1/cmd_vel # 按下方向键,这里会持续输出Twist消息
**这里有一个新手最爱犯的错误:只在终端1启动了turtlesim,然后在终端2直接敲ros2 topic echo,发现没输出,转头去查安装日志。**其实只是没开另一个终端去启动teleop节点,数据流根本还没建立。遇到问题先检查“你有没有把该跑的东西都跑起来”,再检查安装本身。
3.5 不依赖GPU的机器怎么跑图形界面
热搜词里有个很实在的需求——“不依赖GPU的”。RViz2、Gazebo这类图形工具在OpenGL性能差的机器上(虚拟机、老笔记本、NUC)会比较吃力,但不代表不能学。
- 虚拟机用户:在VMware或VirtualBox里尽量开启3D加速,给虚拟机分配至少4GB内存和2核CPU,RViz2基本可用。
- 纯CPU实机:Gazebo可以跑,但别加载太重的地图,空地图或小房间场景没问题。
- 远程开发:如果本机实在带不动,可以考虑在云服务器或工作站上装Ubuntu服务器版+ROS2,用X11转发跑图形界面,但延迟明显,实操体验一般。
对绝大多数人来说,最好的选择其实是:**实体机装Ubuntu双系统,不装虚拟机,不吃图形性能损耗,直接用GPU跑RViz2。**这一步投入的时间,比后面所有报错排查的时间加起来都少得多。
4. 讲义内容怎么高效刷:从海龟仿真到Nav2、MoveIt的路线图
这一章不是让你照着讲义目录一章一章背,而是给你一条“按项目递进”的学习主线。赵虚左的讲义本身也是按这个逻辑组织的,我只是把它提炼出来。
4.1 第一阶段:用turtlesim理解“节点、话题、服务、动作”四大通信原语
这阶段的目标不是学会某个工具,而是理解ROS2的底层通信模型。很多人学到后面卡壳,根本原因不是导航算法多难,而是没搞清楚“话题和服务”的区别。
- 节点(Node):ROS2里的最小执行单元,类似一个独立的小程序。
ros2 node list就能看到当前所有节点。 - 话题(Topic):异步通信,发布者只管发,订阅者只管收,双方不关心对方是否存在。turtlesim里
/turtle1/cmd_vel就是典型话题。 - 服务(Service):同步通信,客户端发起请求,服务端处理并返回响应,是一问一答模式。
- 动作(Action):用于长时间任务,比如导航去一个目标点,需要持续反馈进度。
学这一阶段时,配合讲义动手做三件事:
- 用
rqt_graph看清楚节点和话题的拓扑关系——你会发现,两个节点之间并不直接“认识”,它们只是“读”和“写”同一个话题。 - 用命令手动发一条话题数据,验证自己不写代码也能控制海龟:
bash复制ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0}, angular: {z: 1.8}}" --once
- 用Python或C++各写一个最简的publisher和subscriber节点(讲义里有完整代码),跑通“自己写节点—编译—运行—用rqt看到数据”的闭环。
这个阶段的目标是让四个概念变成你的直觉,看到任何功能你都能下意识地判断“这应该用话题、服务还是动作”。
4.2 第二阶段:工作空间、colcon与功能包 —— 所有工程的骨架
学会了通信原语,下一个必须掌握的是ROS2工程的代码组织方式。赵虚左讲义里这一章通常讲三个东西:工作空间(Workspace)、编译工具(colcon)、功能包(Package)。
最基础的工作空间结构长这样:
text复制your_ws/
├── src/ # 源码目录
│ └── your_pkg/ # 每个功能包
├── build/ # 编译中间文件(自动生成)
├── install/ # 安装后的二进制和setup文件(自动生成)
└── log/ # 日志(自动生成)
从src进入编译到能运行,核心命令只有几条:
bash复制cd ~/your_ws
colcon build --packages-select your_pkg # 只编译一个包,比完整编译快
source install/setup.bash # 让当前终端能找到新编译的包
ros2 run your_pkg your_node
这里有一个很多人第一次接触时都会懵的点:**colcon build之后为什么还要source?**因为ROS2的可执行文件不在系统PATH里,它放在install/your_pkg/下面,只有source了setup.bash,当前终端才知道去哪里找这个可执行文件。打开新终端之后,如果没有重新source,就会提示“Package not found”或者命令找不到。
另一个高频坑:在src目录下直接colcon build。 colcon build应该在工作空间根目录(即your_ws/)下执行,如果在src里执行,它会找不到ros2的包结构。这个坑我在各种交流群里见过不下十次。
学完这阶段,建议你把讲义里的几个示例包自己build一遍,然后改一点代码(比如改话题名称、改发布频率),重新编译运行,确认改动生效。这一步能让你彻底理解“代码修改—编译—运行”的循环,以后所有进度都会快起来。
4.3 第三阶段:URDF建模 + tf2坐标变换 + Gazebo仿真 —— 从控制海龟到控制机器人
海龟玩得再溜,它也不是一个真正的机器人。从这阶段开始,你会进入“机器人本身”的世界。三条主线并行:
URDF(统一机器人描述格式):用XML描述机器人的形状、关节、惯性、传感器位置。赵虚左讲义里会有完整的两轮小车URDF示例,你可以照着改成四轮或加一个激光雷达。写URDF的核心是理解“link(连杆)”和“joint(关节)”的树状关系——底盘是root link,轮子是child link,joint描述它们之间的相对位置和转动关系。
tf2(坐标变换库):机器人不是孤立的点,它的每个link都有自己的坐标系。激光雷达扫描的点、摄像头拍到的目标、机械臂要抓的位置,最终都得转换到同一个坐标系下才能计算。tf2就是管理这些坐标变换的库。用ros2 run tf2_tools view_frames可以生成树状图,看清所有坐标系的关系。
Gazebo仿真:把URDF模型放进物理引擎里,加载传感器数据,就可以在没有实体机器人的情况下开发算法。Gazebo的核心收获是:你能看到传感器数据(激光扫描、里程计、图像)是怎么以话题形式流出来的,为后续SLAM和导航打基础。
这一阶段最推荐的实践是:**把讲义里的URDF模型加载进Gazebo和RViz2,同时打开,确认RViz2里的模型和Gazebo里的模型动作一致。**如果不一致,最常见的原因是tf2没配置对,坐标系没对齐。
4.4 第四阶段:SLAM建图与Nav2导航 —— ROS2最具代表性的完整闭环
到了这里,你才有资格说“我在用ROS2做机器人开发”。SLAM(同步定位与建图)和Nav2导航是整个RO2生态里最能体现框架优势的部分。
SLAM建图:用激光雷达数据,一边探测环境一边构建地图。常用方案有slam_toolbox(2D激光雷达建图,适合入门)和Cartographer(Google开源的激光SLAM,精度更高但配置复杂)。在仿真环境里跑通SLAM的路径大致是:启动Gazebo仿真环境 → 启动激光雷达话题发布 → 启动slam_toolbox → 用键盘控制机器人走动,观察地图逐渐被构建出来 → 保存地图:
bash复制ros2 run nav2_map_server map_saver_cli -f ~/map/my_map
Nav2导航:地图建好之后,Nav2负责“你告诉它去哪,它负责怎么走”。它内部包含定位(AMCL)、全局路径规划、局部路径规划、代价地图、行为树等组件。如果你跟着讲义把Nav2完整跑通过,你会发现它能做到:指定一个目标点 → 机器人规划路径 → 自动避障 → 到达目标。
这一阶段是综合性的,会用到前面所有知识,也是很多人第一次产生“我去,还能这样”的兴奋感。赵虚左讲义里这部分的代码量很大,我建议你修改几个关键参数实验一下效果,比如把代价地图的膨胀半径改大,观察机器人的路径偏好变化;把速度限制改小,观察它转弯的姿态差异。“改参数看效果”是这一章最有效的学习方法。
4.5 第五阶段:MoveIt机械臂与相机标定
如果你对机械臂更感兴趣,讲义后面的MoveIt章节是绕不开的。MoveIt是ROS里做机械臂运动规划的事实标准。核心流程是:
- 用URDF/Xacro描述机械臂模型(如果用的是现成机械臂,比如UR5或者一些开源臂,直接用现成模型)。
- 用MoveIt Setup Assistant生成配置包,包括碰撞矩阵、规划组、预设位姿。
- 在RViz2里拖拽目标点,查看运动规划结果。
- 用
move_group接口做轨迹规划,控制机械臂实现抓取等动作。
MoveIt章节的难点在于配置流程繁琐,新手最容易在“添加规划组”时会漏掉一些关节,或忘记设置末端执行器坐标系。讲义里会一步步截图说明,你只需要跟着做。
相机标定方面,ROS2的标准工具是camera_calibration,流程不复杂:打印一张棋盘格标定板,用相机采集多角度图像,然后运行标定节点,检查标定结果。但精度高低差别很大,后文会单独讲。
4.6 一个具体的四周边学习计划建议
给一个可参考的节奏,前提是每天能投入2-3小时:
| 周次 | 学习内容 | 完成标志 |
|---|---|---|
| 第1周 | 环境安装、turtlesim、节点/话题/服务/动作 | 能自己写一个publisher/subscriber并运行 |
| 第2周 | 工作空间、colcon、功能包 | 成功build并运行一个修改过的示例包 |
| 第3-4周 | URDF、tf2、Gazebo仿真 | 在Gazebo里加载自己的URDF车模,RViz2中能正确显示tf树 |
之后的SLAM、Nav2、MoveIt每块大概需要2-3周。这个时间表仅供参考,如果你有C++或Python基础会快很多。要强调的是:学ROS2最忌讳跟进度赶时间,一定要动手跑,跑通了再进下一章。
5. 学习讲义时的高频翻车现场:我见过最多的几个问题与排查思路
最后一章说点实际的。我在各种ROS2交流群里泡了挺久,把大家在学习这套讲义过程中问得最多、最容易卡住的问题集中排查了一遍,每个问题给你一个可落地的解法。
5.1 colcon build报错:八成是依赖问题,不是代码问题
colcon build报错是ROS2新手最大的拦路虎。报错信息千奇百怪,但归纳起来绝大多数是同一个原因:缺依赖包。
bash复制# 从功能包的package.xml里声明的依赖开始安装
rosdep install --from-paths src --ignore-src -r -y
这个命令会扫描src下所有功能包的package.xml,把声明过的依赖全部通过apt安装。跑这一步之前,首先要确认rosdep的初始化完成:
bash复制sudo rosdep init
rosdep update
rosdep和src下的功能包对应上之后,再跑一次colcon build,大部分问题都能顺过去。如果还报错,看报错信息里最下面几行提到的具体包名或头文件,比如Could not find a package configuration file provided by "nav2_msgs",那意思就是缺nav2_msgs包,apt搜索安装它就行:
bash复制sudo apt install ros-humble-nav2-msgs
注意版本号: 把命令里的humble换成你实际安装的发行版(foxy、jazzy等)。
5.2 Humble工程拿到Jazzy上编译,为什么会报一堆API错误
这个问题越来越常见了,因为Ubuntu 24.04用户逐渐增多,Jazzy的上手率也在提升。如果你在Humble下写的代码想拿到Jazzy环境编译,经常会遇到一堆莫名其妙的错误,比如某个消息定义变了、某个API被废弃、某个头文件路径变了。
最典型的是rclcpp和std_msgs相关API的变化。比如某些rclcpp接口在Humble里是传入std::make_shared,在Jazzy里改成了直接对类型做模板参数化,编译时就会报模板参数不匹配或引用了旧头文件。另一个高发点是tf2相关头文件的位置调整,或者geometry_msgs的字段类型变化。
遇到这种情况的解决思路是:
- 先看编译报错里第一个error,别管后面的warning。
- 去ROS2官方文档的Migration Guide页面,搜索“Humble to Jazzy”,逐条对照。
- 如果代码量不大,直接改代码适配新版本;如果是大工程,建议直接在容器里用Humble镜像跑,不要强行升级。
我的建议是:初学阶段,保持“一个工程对应一个发行版”的原则。 讲义用的版本,你就用那个版本的环境去跑。这是最省时间的方式。
5.3 在Ubuntu上删除或更新ROS2版本的正确姿势
很多人在装ROS2时纠结“我要不要先卸载旧版本”,或者在装了Humble之后又想换Jazzy。这里给个安全操作顺序:
卸载ROS2(以Humble为例):
bash复制sudo apt remove ros-humble-*
sudo apt autoremove
autoremove这个步骤容易漏,导致卸载不干净,后续装新版本时出现依赖冲突。
更推荐的做法是:不要在同一台机器上折腾多个LTS版本。 如果你确实需要同时使用Humble和Jazzy,建议用Docker或者干脆开两个虚拟机,互不干扰。因为每次新开终端source环境变量时,不同版本的setup.bash会相互覆盖,产生“我明明source了Humble,为什么运行的是Jazzy”的灵异事件。
5.4 ROS1 bag转ROS2 bag,一句命令搞定
老项目迁移时会遇到bag格式转换问题。ROS1的.bag文件和ROS2的.db3文件格式完全不同,不能直接用。社区标准的转换工具是rosbags:
bash复制pip install rosbags
# 转换bag文件
rosbags-convert your_ros1_bag.bag --dst ./converted_bag
rosbags会从原始bag里读取话题类型,转换后自动生成新的metadata.yaml和db3文件,基本是零配置操作。转换完再验证一下:
bash复制ros2 bag info ./converted_bag
如果某个话题转换失败,通常是消息类型不在rosbags的映射范围内,需要手动给rosbags添加自定义消息类型映射。对初学者来说,大多数标准传感器话题(laser_scan、imu、odom等)都支持得很好,不用过度担心。
5.5 相机标定精度不够:不是软件问题,是采集习惯问题
如果你在跑讲义中的相机标定章节,标定出来的结果感觉不准,先别怀疑代码,排查三个操作上的问题:
- 标定板的格子尺寸是否实际测量过。 打印出来的棋盘格尺寸会因为打印缩放和纸张伸缩而变化,必须用尺子量出实际边长,而不是直接按PDF标称值填。
- 采集图片数量是否足够。 少于20张有效图像,标定结果往往不稳定。并且要覆盖多个角度、多个距离,矩阵视野边角也要拍到。
- 标定板的姿态是否足够多样。 只对着相机正面拍基本没用,要有明显的倾斜、旋转和前后移动。
判断标定结果是否可靠,核心看重投影误差(RMS),一般低于0.5像素说明内参估计较好,超过1.0就需要重新采集数据。标定程序输出的相机内参矩阵和畸变系数,是后续做视觉定位、机械臂手眼标定的基础,精度直接影响下游效果。
5.6 通用排查思路:遇到报错先做这四步
最后送一个适用于所有ROS2问题的排查顺序,这比任何具体命令都有用:
- 看完整报错信息,不要只看最上面两行,很多关键信息在报错末尾或中段。
- 确认依赖包是否安装,用
rosdep check或者直接搜包名。 - 确认环境变量,
echo $ROS_DISTRO看看当前终端生效的发行版是不是你以为的那个。 - 搜类似问题,把报错的核心句子贴到搜索引擎里,加上
ros2关键词,绝大多数问题GitHub issue里都有人遇到过。
这套排查流程能覆盖我见过的大部分问题。
我在实际学习过程中最大的体会是:赵虚左这套讲义的价值不在于“资料全”,而在于它把ROS2那些复杂、零散的概念编排成了一条可以跟下来的路线。但任何路线都替代不了你自己动手跑通的那一下。拿到讲义只是第一步,把环境装好、把示例跑起来、把参数改一遍,这些动作才是真正让你学会ROS2的东西。希望这篇从“获取”讲到“实践”的文章,能帮你少走几步弯路,把时间花在真正有用的敲命令上。
