跳转至

动作(Actions)

目录

  • 动作服务器(Action server)
  • 动作客户端(Action client)

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

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

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

在 ROS 2 中,动作适用于长时间运行的过程,因为建立和监控连接存在额外开销。
如果您需要的是短时远程过程调用,请考虑使用服务(service)。

动作通过动作名称(action name)进行标识,其命名方式与话题名称类似,但位于不同的命名空间中。

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

动作服务器(Action server)

动作服务器是接收远程过程调用请求并执行相应过程的实体。它还负责在动作执行过程中发送反馈,并应响应取消或抢占请求

例如,考虑一个用于计算斐波那契数列的动作,其接口如下:

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

动作服务器就是接收包含 order 的消息,开始计算到指定项的数列(过程中提供反馈),并最终在 sequence 中返回完整结果的实体。

注意
每个动作名称应仅有一个动作服务器。如果同一动作名称下存在多个动作服务器,则无法确定哪个服务器会接收到客户端请求。

动作客户端(Action client)

动作客户端是一个请求远程动作服务器代其执行某个过程的实体。
接续上述示例,动作客户端就是创建包含 order 的初始请求消息,并等待动作服务器计算数列、返回结果(过程中接收反馈) 的那个实体。

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