一、ROS2与Nav2初识:课程导论、环境总览、核心概念扫盲
各位同学,欢迎来到《ROS2与Nav2系统联调实战》的第一章。
我是你们这门课的主讲。在机器人行业摸爬滚打了快十年,从ROS1时代一路走到ROS2,踩过的坑、熬过的夜,真不算少。今天咱们要聊的,是整个课程的地基——ROS2和Nav2到底是什么,以及它们背后那套核心概念。
说白了,ROS2就是机器人的操作系统,而Nav2是它上面最成熟的导航框架。你想想看,一个机器人要自己走路,总得知道“我在哪”、“要去哪”、“怎么去”吧?Nav2就是干这个的。
1.1 课程导论:我们到底要学什么?
这门课不是纯理论,也不是简单的API调用。我的目标是:让你能亲手把一套完整的导航系统跑起来,并且知道出了问题怎么修。
我个人习惯把学习路径分成三段:
- 基础扫盲(就是本章):搞懂ROS2的通信机制和Nav2的架构。
- 环境搭建:装好所有依赖,让仿真环境跑起来。
- 联调实战:修改参数、调试行为、处理异常。
我在项目中遇到过不少同学,装完ROS2就卡住了,为什么?因为不理解节点和话题的关系,出了问题根本不知道从哪查起。所以,咱们先把概念夯实了。
核心观点:ROS2是骨架,Nav2是血肉。不懂骨架,血肉就无处附着。
1.2 环境总览:你的工具箱里有什么?
先看看我们手头有哪些家伙事儿。我建议你至少准备以下环境:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| Ubuntu | 22.04 LTS | 稳定,社区支持好 |
| ROS2 | Humble Hawksbill | LTS版本,与Nav2兼容最佳 |
| Nav2 | Humble对应版本 | 跟随ROS2版本 |
| Gazebo | Ignition Fortress 或 Gazebo Classic 11 | 仿真环境 |
嗯,这里要注意:ROS2的版本和Ubuntu版本是绑定的。你用Ubuntu 22.04,就老老实实用Humble。我曾经见过有人硬要在20.04上装Humble,结果依赖冲突搞了三天——别走弯路。
我的建议:如果你刚入门,直接用Ubuntu 22.04 + ROS2 Humble。这是目前最稳的组合。
1.3 核心概念扫盲:节点、话题、服务、动作
这四个概念,是ROS2的基石。你想想看,一个机器人系统里,有激光雷达、有电机驱动、有路径规划……它们之间怎么说话?就是靠这四样东西。
1.3.1 节点(Node)
节点就是一个个独立的可执行程序。每个节点负责一件事。比如,/lidar_node只管发布激光数据,/motor_node只管接收速度指令去驱动轮子。
我刚开始学的时候,总想把所有功能写在一个文件里。后来发现,拆成节点才是正道——哪个节点崩了,不影响其他的,调试起来也方便。
1.3.2 话题(Topic)
话题是节点之间通信的“总线”。一个节点往话题上发数据(发布者),另一个节点从话题上收数据(订阅者)。这是ROS2里最常用的通信方式。
举个例子:激光雷达节点发布/scan话题,导航节点订阅它。数据流是单向的、持续的。
# 查看所有话题
ros2 topic list
# 查看某个话题的数据
ros2 topic echo /scan
避坑指南:我曾经在调试时发现话题数据一直收不到,查了半天,原来是发布者和订阅者的话题名字拼写不一致。ROS2不会报错,只会默默丢数据。所以,ros2 topic list是你的好朋友。
1.3.3 服务(Service)
服务是“请求-响应”模式。客户端发一个请求,服务端处理完返回一个结果。它适合那些需要即时反馈的操作,比如“打开摄像头”、“重置里程计”。
和话题不同,服务不是持续的流,而是一次性的问答。
# 调用服务示例
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2}"
1.3.4 动作(Action)
动作是服务的升级版。它也是“请求-响应”,但响应是异步的,而且可以反馈中间状态。Nav2里大量使用动作,比如“导航到目标点”。
你想想看,机器人去一个地方,路上可能遇到障碍、可能需要重新规划。动作可以告诉你“走到哪了”、“还剩多远”。服务做不到这一点。
一句话总结:话题用于持续数据流,服务用于一次性请求,动作用于长时间任务。
1.4 知识体系总览:一张图看懂
下面这张图,是我自己梳理的ROS2与Nav2核心关系。你看完应该能明白,这些概念是怎么串起来的。
你看,从底层的节点通信,到上层的导航规划,整个链路是通的。理解了这张图,你就掌握了ROS2+Nav2的骨架。
1.5 本章小结
这一章,我们做了三件事:
- 明确了课程目标——实战联调,不是纸上谈兵。
- 梳理了环境需求——Ubuntu 22.04 + ROS2 Humble + Nav2。
- 扫盲了四个核心概念——节点、话题、服务、动作。
我个人觉得,最难的不是记住概念,而是理解它们各自适合什么场景。记住我那句总结:话题用于流,服务用于问,动作用于跑。
下一章,我们会动手搭建开发环境。到时候,你就能亲手敲命令,看到节点在跑了。