Skip to content

接口:话题/服务/动作

ROS 中的接口定义了节点之间如何交换数据。 本文将解释 ROS 接口的不同类型及其之间的差异。 阅读本文后,你将能够根据实际需求选择合适的接口。

ROS 节点通常通过以下三种类型的接口进行通信:

  • 话题:用于连续数据流。
  • 服务:用于同步请求/响应交互(即时完成的短任务)。
  • 动作:用于带有反馈的长时间运行任务(可能需要一些时间才能完成的任务)。

为了实现一致的通信,每种接口都使用存储在 .msg、.srv 或 .action 文件中的定义。

了解更多关于节点的信息,请参阅 关于节点。

话题接口适用于连续数据流,例如传输传感器数据或机器人的状态。 话题定义存储在 .msg 文件中。 话题实现了发布/订阅模式。 一个节点向话题发布数据,其他节点订阅以接收该数据。 这种接口类型具有以下主要特征:

  • 异步、单向通信
  • 多个发布者和订阅者可以共享同一个话题

话题密钥(topic key)用于标识话题上的各个发布者,以便节点和工具能够区分消息的来源。 当多个发布者共享同一个话题时,话题密钥可以更方便地追踪数据来源。

话题统计是内置的测量功能,可以帮助你了解订阅者接收消息时的性能表现。 启用后,它会自动跟踪两个方面:

  • 消息年龄(Message age):消息到达时的年龄,基于其时间戳计算。
  • 消息周期(Message period):连续消息之间的时间间隔。

对于消息年龄和周期,ROS 使用每次新消息到达时更新的滑动窗口来计算平均值、最小值、最大值、标准差和样本数量。 这些计算在固定的时间和内存开销内完成。 当你为订阅启用话题统计时,ROS 会定期将收集到的数据作为 MetricsMessage 发布到统计话题上。 这样你就可以清晰地观察时间模式、延迟和异常情况,方便评估系统性能或排查消息流相关的问题。

提示: 默认间隔为 1 秒。 默认统计话题为 /statistics。

了解如何启用话题统计,请参阅 话题统计教程。

服务接口适用于同步请求/响应交互,例如你想发送一个查询请求以获取特定机器人的配置。 服务定义存储在 .srv 文件中。 服务实现了请求/响应模式。 客户端发送请求,服务端返回响应。 这种接口类型具有以下主要特征:

  • 同步通信
  • 适用于需要确认的短时操作,或在响应请求时提供结果

动作接口适用于带有反馈的长时间运行任务,例如将机器人移动到特定位置,或要求机器人执行复杂的动作。 动作定义存储在 .action 文件中。 动作允许客户端发送目标(goal),在执行过程中持续接收反馈,必要时可以取消,并在完成后返回结果。 这种接口类型具有以下主要特征:

  • 异步,带有反馈和结果
  • 适用于耗时的操作

三种接口都支持节点之间的通信,但每种接口的用途不同。 下表总结了 ROS 接口类型之间的差异:

模式方向提供结果典型用例取消
话题(Topics)发布/订阅单向否连续数据不支持
服务(Services)请求/响应双向是快速查询不支持
动作(Actions)目标/反馈/结果带反馈的双向是长时间运行任务支持