接口:话题/服务/动作
ROS 中的接口定义了节点之间如何交换数据。 本文将解释 ROS 接口的不同类型及其之间的差异。 阅读本文后,你将能够根据实际需求选择合适的接口。
ROS 节点通常通过以下三种类型的接口进行通信:
为了实现一致的通信,每种接口都使用存储在 .msg、.srv 或 .action 文件中的定义。
了解更多关于节点的信息,请参阅 关于节点。
话题接口适用于连续数据流,例如传输传感器数据或机器人的状态。
话题定义存储在 .msg 文件中。
话题实现了发布/订阅模式。
一个节点向话题发布数据,其他节点订阅以接收该数据。
这种接口类型具有以下主要特征:
- 异步、单向通信
- 多个发布者和订阅者可以共享同一个话题
话题密钥(topic key)用于标识话题上的各个发布者,以便节点和工具能够区分消息的来源。 当多个发布者共享同一个话题时,话题密钥可以更方便地追踪数据来源。
话题统计是内置的测量功能,可以帮助你了解订阅者接收消息时的性能表现。 启用后,它会自动跟踪两个方面:
- 消息年龄(Message age):消息到达时的年龄,基于其时间戳计算。
- 消息周期(Message period):连续消息之间的时间间隔。
对于消息年龄和周期,ROS 使用每次新消息到达时更新的滑动窗口来计算平均值、最小值、最大值、标准差和样本数量。
这些计算在固定的时间和内存开销内完成。
当你为订阅启用话题统计时,ROS 会定期将收集到的数据作为 MetricsMessage 发布到统计话题上。
这样你就可以清晰地观察时间模式、延迟和异常情况,方便评估系统性能或排查消息流相关的问题。
提示: 默认间隔为 1 秒。 默认统计话题为
/statistics。
了解如何启用话题统计,请参阅 话题统计教程。
服务接口适用于同步请求/响应交互,例如你想发送一个查询请求以获取特定机器人的配置。
服务定义存储在 .srv 文件中。
服务实现了请求/响应模式。
客户端发送请求,服务端返回响应。
这种接口类型具有以下主要特征:
- 同步通信
- 适用于需要确认的短时操作,或在响应请求时提供结果
动作接口适用于带有反馈的长时间运行任务,例如将机器人移动到特定位置,或要求机器人执行复杂的动作。
动作定义存储在 .action 文件中。
动作允许客户端发送目标(goal),在执行过程中持续接收反馈,必要时可以取消,并在完成后返回结果。
这种接口类型具有以下主要特征:
- 异步,带有反馈和结果
- 适用于耗时的操作
ROS 接口之间的关键差异
Section titled “ROS 接口之间的关键差异”三种接口都支持节点之间的通信,但每种接口的用途不同。 下表总结了 ROS 接口类型之间的差异:
| 模式 | 方向 | 提供结果 | 典型用例 | 取消 | |
|---|---|---|---|---|---|
| 话题(Topics) | 发布/订阅 | 单向 | 否 | 连续数据 | 不支持 |
| 服务(Services) | 请求/响应 | 双向 | 是 | 快速查询 | 不支持 |
| 动作(Actions) | 目标/反馈/结果 | 带反馈的双向 | 是 | 长时间运行任务 | 支持 |