动作

在 ROS 2 中,动作是指具有反馈和取消或抢占目标能力的长时间运行的远程过程调用。 例如,运行机器人的高级状态机可以调用一个动作来告诉导航子系统前往某个航点,这可能需要几秒钟(或几分钟)才能完成。 在此过程中,导航子系统可以提供有关其行驶距离的反馈,高级状态机可以选择取消或抢占前往该航点的行程。

此结构反映在动作消息定义的外观上:

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

在 ROS 2 中,操作预计是长时间运行的过程,因为设置和监控连接会产生开销。 如果您需要短时间运行的远程过程调用,请考虑改用 service

操作由操作名称标识,该名称看起来很像主题名称(但位于不同的命名空间中)。

操作由两部分组成:操作服务器和操作客户端。

操作服务器

操作服务器是接受远程过程请求并对其执行某些过程的实体。 它还负责在操作进行时发送反馈,并应对取消/抢占请求做出反应。 例如,考虑使用以下接口计算斐波那契数列的操作:

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

动作服务器是接收此消息的实体,开始计算序列直到“order”(在此过程中提供反馈),并最终以“sequence”形式返回完整结果。

Note

每个操作名称只能有一个操作服务器。 如果同一操作名称上有多个操作服务器,则未定义哪个操作服务器将接收客户端请求。

动作客户端

动作客户端是一个实体,它将请求远程动作服务器代表其执行某个过程。 按照上面的例子,动作客户端是创建包含“顺序”的初始消息的实体,并等待动作服务器计算序列并返回它(沿途带有反馈)。

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