Topics vs Services vs Actions

有三种主要的接口形式可以用在 ROS 2 的系统设计中。 文档中所提及的接口规范在 接口概述 中可以找到。 本文的目的是指导读者选择合适的接口类型。

Topics

  • 应当用于连续数据流(传感器数据,机器人状态等)。

  • 数据随时有可能被发布和订阅,不依赖于发送者或接收者。

  • 多对多连接。

  • 数据一可用就会被回调函数接收。

  • 发布方决定何时发送数据。

Services

  • 应当用于远程过程调用(remote procedure calls, RPC),这些调用会很快结束,例如查询节点状态或进行快速计算,如 IK。它们永远不应该用于运行时间较长的进程,特别是可能需要在发生异常情况时抢占的进程,也永远不应该改变或依赖于状态以避免对其他节点产生不希望的副作用。

  • 简单的阻塞调用。主要用于请求特定数据。从名字上能看出来就是用于处理请求。

Actions

  • 应当用于运行时间较长但在执行过程中提供反馈的离散行为,例如移动机器人。

  • 最重要的是,它们可以被抢占,而且抢占应该总是由 action 服务器无副作用地实现。

  • Actions 可以保持状态,直到目标完成,例如在同一台服务器上并行执行两个 action 目标时,对于每个客户端可以保持一个单独的状态实例,因为目标是通过其 ID 唯一标识的。

  • 需要好几秒才能终止的感知程序,或者启动某个底层控制模式,都是适合使用 action 的例子。

  • 更复杂的非阻塞后台处理。用于执行机器人动作等较长任务。顾名思义, action 当然是用于执行真实世界的 action 的。