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 它们之间的关系

好了,五个概念都讲完了。它们之间到底是什么关系?

我画了一张图,帮你理清思路:

节点 Node 话题 Topic 服务 Service 动作 Action 参数 Parameter 发布/订阅 请求/响应 目标/反馈/结果 读取/设置 ROS2核心概念关系图:节点通过不同方式与其他节点通信

从这张图你能看出来:节点是核心。话题、服务、动作、参数都是节点之间通信的手段。

  • 话题:适合高频、单向数据流,比如传感器数据
  • 服务:适合一次性请求-响应,比如触发某个动作
  • 动作:适合长时间任务,带进度反馈,比如导航
  • 参数:用于配置节点行为,运行时可以动态修改

避坑指南:我曾经在一个项目里,用服务来传输高频的IMU数据。结果呢?服务调用阻塞了主循环,机器人直接撞墙了……后来改成话题,一切正常。记住:高频数据用话题,低频指令用服务,长时间任务用动作。

好了,这一章的内容就到这里。理解了这些核心概念,后面学ROS2就会顺畅很多。你想想看,整个ROS2的通信机制,说白了就是这几种模式来回组合。

可可精品资料库