Skip to content

关于动作

在 ROS 2 中,动作(action)指的是带有反馈、且能够取消或抢占目标的长时间运行远程过程调用。 例如,运行机器人的高层状态机可以调用一个动作来指示导航子系统前往某个航点,这可能需要几秒甚至几分钟才能完成。 在此过程中,导航子系统可以持续提供进度反馈,而高层状态机则可以选择取消或抢占前往该航点的行程。

这种结构反映在动作消息定义的形式上:

int32 request
---
int32 response
---
int32 feedback

在 ROS 2 中,动作应当用于长时间运行的过程,因为建立和监控连接存在开销。 如果你需要一个短时间的远程过程调用,请考虑改用服务。

动作通过动作名称标识,动作名称看起来很像话题名称(但位于不同的命名空间中)。

一个动作由两部分组成:Action 服务端(action server)和 Action 客户端(action client)。

Action 服务端是接收远程过程请求并执行相应过程的实体。 它还负责在动作执行过程中发送反馈,并应当对取消/抢占请求做出响应。 例如,考虑一个计算斐波那契数列的动作,其接口如下:

int32 order
---
int32[] sequence
---
int32[] sequence

Action 服务端接收此消息,开始计算直到 order 为止的序列(在此过程中提供反馈),并最终在 sequence 中返回完整结果。

注意: 每个动作名称应只有一个 Action 服务端。 如果同一动作名称上存在多个 Action 服务端,哪个服务端会收到客户端请求是不确定的。

Action 客户端是请求 Action 服务端代为执行某个过程的实体。 沿用上面的例子,Action 客户端创建包含 order 的初始消息,并等待 Action 服务端计算序列并返回结果(在此过程中提供反馈)。

与 Action 服务端不同,使用同一动作名称的 Action 客户端可以有任意数量。