本节详细介绍行动action。
1. 如何理解行动action:
行动action是ROS 2中用于长时间运行任务的通信类型之一。 它由三部分组成:目标,结果和反馈。
行动基于主题和服务。 它们的功能与服务相似,但行动是可抢占的模式(即,可以在执行时将其取消)。 与返回单个响应的服务不同,它们还提供稳定的反馈(过程状态反馈)。
行动使用客户端-服务器端模型,类似于发布者-订阅者模型(已经在主题教程中进行了介绍)。 “行动客户端”节点将目标发送到“行动服务器”节点,该节点确认目标并返回反馈流和一个结果。
2. 行动action有哪些命令功能:
ros2 action -h
命令如下:
- info:显示行动具体信息
- list:输出行动名列表
- send_goal:发送行动目标
- show:显示行动类型定义
行动消息格式如下:
代码语言:javascript复制# The desired heading in radians
float32 theta
---
# The angular displacement in radians to the starting position
float32 delta
---
# The remaining rotation in radians
float32 remaining
- 主题消息,没有---
- 服务消息,一个---
- 行动消息,两个---
3. 行动命令实践
启动turtesim案例如下:
- ros2 run turtlesim turtlesim_node
- ros2 run turtlesim turtle_teleop_key
3.1 小试牛刀
启动/teleop_turtle节点时,在终端中看到以下消息:
专注于第二行,它对应于一个行动。 (第一条指令对应于主题教程中先前讨论的“ cmd_vel”主题。)
请注意,字母键G | B | V | C | D | E | R | T在键盘上的F键周围形成一个“框”。 F周围每个键的位置都对应于turtlesim中的方向。 例如,E会将乌龟的方向旋转到左上角。
E | R | T |
---|---|---|
D | F | G |
C | V | B |
注意节点/turtlesim正在运行的终端。 每次按这些键之一,就向一个目标服务器发送目标,该服务器是/ turtlesim节点的一部分。 目标是旋转乌龟以使其朝向特定方向。 乌龟完成旋转后,将显示一条有关目标结果的消息:
E:
V:
F键将取消目标的中间执行,表明行动具有可抢占的功能。
尝试按C键,在乌龟完成旋转之前按F键。 在/turtlesim节点运行的终端中,将看到以下消息:
客户端(在Teleop中的输入)不仅可以抢占目标,而且服务器端(/turtlesim节点)也可以抢占目标。 当服务器端抢占一个行动时,它“中止”了目标。
尝试先按D键,在完成第一次旋转之前按G键。 在/turtlesim节点运行的终端中,将看到以下消息:
服务器端中止了前一个目标,因为它被中断了。
3.2 节点信息(行动)
要查看/turtlesim节点的行动,请打开一个新终端并运行以下命令:
代码语言:javascript复制ros2 node info /turtlesim
这将返回/turtlesim的订阅者,发布者,服务,行动服务器和行动客户端的列表:
请注意,/turtlesim的行动/turtle1/rotate_absolute位于行动服务器端下。 这意味着/turtlesim会响应行动/turtle1/rotate_absolute并提供反馈。
节点/teleop_turtle在“行动客户端”下具有名称/turtle1/rotate_absolute,这表示它发送该目标行动的名称。
代码语言:javascript复制ros2 node info /teleop_turtle
通俗一点:
- 节点turtlesim为行动服务器端
- 节点teleop_turtle为行动客户端
3.3 行动列表
显示ROS图中的所有行动,运行以下命令:
代码语言:javascript复制ros2 action list
返回值:
/turtle1/rotate_absolute
这是目前ROS图中唯一的行动。 如先前所见,它控制着乌龟的旋转。 使用ros2节点信息<node_name>命令可以为该操作提供一个行动客户端(/teleop_turtle的一部分)和一个行动服务器(/turtlesim的一部分)。
3.4 行动信息
使用以下命令进一步查询/turtle1/rotate_absolute行动:
代码语言:javascript复制ros2 action info /turtle1/rotate_absolute
返回:
运行ros2节点信息:/teleop_turtle节点有一个行动客户端,/turtlesim节点有一个针对/turtle1/rotate_absolute行动服务器。
3.5 行动接口
发送或执行目标行动之前,需要知道是行动的结构类型。
回想一下,在运行ros2行动列表-t时,已经确定了/turtle1/rotate_absolute的类型。 在终端中输入以下命令和行动类型:
代码语言:javascript复制ros2 interface show turtlesim/action/RotateAbsolute.action
返回:
该消息的位于---上方的第一部分,是目标请求结构(数据类型和名称)。中间部分是结果的结构。 最下面一部分是反馈的结构。
3.6 命令行发布行动
现在,使用以下语法从命令行发送一个目标行动:
代码语言:javascript复制ros2 action send_goal <action_name> <action_type> <values>
<values>必须为YAML格式。
密切注意turtlesim窗口,并在终端中输入以下命令:
代码语言:javascript复制ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {"theta: 1.57"}
显示如下:
所有目标都有唯一的ID,如返回消息所示。 还可以看到结果,一个名为delta的字段,它是到起始位置的位移。 要查看此目标的反馈,请将--feedback添加到运行的最后一个命令。 首先,请确保更改theta的值。 运行上一条命令后,乌龟将已经处于1.57弧度的方向,因此除非传递新的theta,否则它不会移动。
代码语言:javascript复制ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {"theta: -1.57"} --feedback
过程1:
过程2:
将继续收到剩余弧度值的反馈,直到完成目标。
4. 小结
行动类似服务,实现执行长时间运行的任务,提供定期反馈并可以取消。
机器人系统可能会使用行动进行导航。 一个行动目标可以告诉机器人去某个位置。 机器人导航到该位置时,可以沿途发送更新(即反馈),一旦到达目的地,它就会发送最终结果消息。
Turtlesim有一个行动服务器,行动客户端可以将目标发送给旋转的乌龟。 在本教程中,对行动/turtle1/rotate_absolute进行了分析,更好地了解什么是行动以及它们如何工作。