2、ROS2核心概念:节点、话题、服务、动作、参数,以及它们之间的关系
说实话,刚接触ROS2的时候,我也被这一堆概念搞得有点晕。节点、话题、服务、动作、参数……它们到底是个什么关系?
别急,咱们一个一个捋清楚。我习惯把这些概念比作一个「机器人开发团队」,这样你理解起来会轻松很多。
2.1 节点(Node)—— 团队里的每个成员
节点,说白了就是ROS2系统里的一个独立进程。每个节点只负责一件事,比如控制电机、处理激光雷达数据、发布里程计信息。
我刚开始做项目时,喜欢把所有功能写在一个大程序里。结果呢?改一个地方,整个系统都得重新编译。后来我学乖了,把每个功能拆成独立的节点。这样调试起来方便,出了问题也容易定位。
节点特点:
- 每个节点是一个独立的可执行文件
- 节点之间通过话题、服务、动作等方式通信
- 节点可以分布在不同的机器上运行
2.2 话题(Topic)—— 广播喇叭
话题是ROS2里最常用的通信方式。它是一种发布/订阅模型,说白了就是「一个人说,多个人听」。
比如你有一个摄像头节点,它不停地发布图像数据。其他节点,比如图像识别节点、显示节点,只要订阅这个话题,就能收到数据。
我的经验:话题适合传输高频、持续更新的数据,比如传感器数据、控制指令。我曾经在AGV项目里用话题传输激光雷达数据,频率跑到100Hz都没问题。
# 发布话题示例
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.5, y: 0.0, z: 0.0}, angular: {z: 0.0}}"
2.3 服务(Service)—— 打电话问问题
服务和话题不一样。话题是单向的、持续的。服务是双向的、一次性的。你发一个请求,对方给你一个响应。
我举个例子:你让机器人抓取一个物体。你发送「抓取请求」,机器人执行后返回「成功」或「失败」。这就是典型的服务模式。
注意:服务不适合高频调用。如果你需要每秒调用几十次服务,那设计上可能有问题。我曾经见过有人用服务做实时控制,结果系统响应越来越慢……嗯,后来改成了话题。
# 调用服务示例
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2.0, y: 2.0, theta: 0.2, name: 'turtle2'}"
2.4 动作(Action)—— 派任务并跟踪进度
动作是服务的升级版。它适合执行时间较长的任务,比如导航到某个点、执行一段轨迹。
动作有三个阶段:发送目标 → 反馈进度 → 返回结果。你想想看,如果你让机器人从A点走到B点,你肯定想知道它走到哪了,对吧?动作就能做到这一点。
动作 vs 服务:
| 特性 | 服务 | 动作 |
|---|---|---|
| 通信模式 | 请求-响应 | 目标-反馈-结果 |
| 执行时间 | 短(毫秒级) | 长(秒级甚至更久) |
| 可取消 | 否 | 是 |
| 进度反馈 | 无 | 有 |
2.5 参数(Parameter)—— 配置文件
参数就是节点的配置项。比如PID控制器的Kp值、摄像头帧率、机器人最大速度等等。
我个人习惯把参数写在YAML文件里,启动时加载。这样改参数不用重新编译代码,方便多了。
# 参数文件示例
robot_controller:
ros__parameters:
max_linear_speed: 1.0
max_angular_speed: 2.0
pid_kp: 0.5
pid_ki: 0.01
pid_kd: 0.1
2.6 它们之间的关系
好了,五个概念都讲完了。它们之间到底是什么关系?
我画了一张图,帮你理清思路:
从这张图你能看出来:节点是核心。话题、服务、动作、参数都是节点之间通信的手段。
- 话题:适合高频、单向数据流,比如传感器数据
- 服务:适合一次性请求-响应,比如触发某个动作
- 动作:适合长时间任务,带进度反馈,比如导航
- 参数:用于配置节点行为,运行时可以动态修改
避坑指南:我曾经在一个项目里,用服务来传输高频的IMU数据。结果呢?服务调用阻塞了主循环,机器人直接撞墙了……后来改成话题,一切正常。记住:高频数据用话题,低频指令用服务,长时间任务用动作。
好了,这一章的内容就到这里。理解了这些核心概念,后面学ROS2就会顺畅很多。你想想看,整个ROS2的通信机制,说白了就是这几种模式来回组合。
可可精品资料库