动作
在 ROS 2 中,动作指的是具有反馈以及取消或中止目标的长时间远程过程调用。例如,运行机器人的高级状态机可以调用一个动作,以告知导航子系统前往一个路径点,这可能需要几秒钟(或几分钟)的时间。在此过程中,导航子系统可以提供有关其进展情况的反馈,并且高级状态机可以选择取消或中止前往该路径点的旅行。
这种结构体现在动作消息定义的外观上:
int32 request
---
int32 response
---
int32 feedback
在 ROS 2 中,由于设置和监视连接需要开销,因此预期动作是长时间运行的过程。如果您需要一个短时间运行的远程过程调用,请考虑使用 服务。
动作由动作名称标识,看起来很像主题名称(但位于不同的命名空间中)。
动作由两部分组成:动作服务器和动作客户端。
动作服务器是将接受远程过程请求并对其执行某些过程的实体。它还负责在动作进行时发送反馈,并应对取消/中止请求。例如,考虑一个用于计算斐波那契数列的动作,具有以下接口:
int32 order
---
int32[] sequence
---
int32[] sequence
动作服务器接收此消息,开始计算直到 order
的数列(并提供反馈),最后在 sequence
中返回完整结果。
注解
每个动作名称应始终只有一个动作服务器。在同一动作名称上存在多个动作服务器的情况下,未定义哪个动作服务器将接收客户端请求。
动作客户端是一个实体,将请求远程动作服务器代表其执行某些过程。继续上面的示例,动作客户端是创建包含 order
的初始消息,并等待动作服务器计算序列并返回(在此过程中提供反馈的)实体。
与动作服务器不同,可以使用相同的动作名称拥有任意数量的动作客户端。