Actions
在 ROS 2 中,action 指的是一个可远程调用的、可长时间运行的程序,它可以提供反馈并且可以取消运行。 例如,一个机器人的上层状态机可能会调用一个 action 来告诉导航系统去某个航点(waypoint),这个过程可能需要几秒钟(或几分钟)。 在这个过程中,导航系统可以提供有关目标还有多远的反馈,而上层状态机可以在这个过程中选择取消或者中断到达那个航点。
action 的结构也体现在 action message 的定义中:
int32 request
---
int32 response
---
int32 feedback
在 ROS 2 中,action 通常被期望是一个长时间运行的程序,因为建立和监控连接会有一些开销。 如果你需要一个短时间运行的远程调用程序,考虑使用 service。
Actions 由 action 名称标识,它看起来很像一个 topic 名称(但在不同的命名空间中)。
Action 由两部分组成:action 服务器和 action 客户端。
Action 服务器(server)
Action 服务器是接受请求并执行程序的实体。 它还负责在运行过程中发送反馈,并且回应可能的对取消/中断请求。 例如,考虑一个计算 Fibonacci 数列的 action,它的接口如下:
int32 order
---
int32[] sequence
---
int32[] sequence
Action 服务器会接收一条包含 order
的消息,开始计算 Fibonacci 数列直到 order
(并且在这计算过程中提供反馈),最后在 sequence
中返回一个完整的结果数列。
Note
每个 action 名称应该只有一个 action 服务器。 如果有多个服务服务器使用相同的服务名称,那么在客户端请求时,无法确定哪个服务服务器会接收到请求。
Action 客户端(client)
Action 客户端是向服服务器发起请求的实体。
在上面的例子中,action 客户端是 创建包含 order
的初始消息,并等待 action 服务器计算序列并返回它(在这个过程中提供反馈) 的实体。
与 action 服务器不同,可以有任意数量的 action 客户端使用相同的 action 名称。