Action
动作是ROS 2中用于长时间运行任务的通信类型之一。它们由三部分组成:目标,结果和反馈。
动作基于主题和服务。它们的功能与服务相似,但动作是可抢占的(您可以在执行时将其取消)。与返回单个响应的服务相反,它们还提供稳定的反馈
操作使用类似于发布者-订阅者模型(在主题教程中进行描述)的客户端-服务器模型。“动作客户端”节点将目标发送到“动作服务器”节点,该节点确认目标并返回反馈和结果流。
测试Action
启动两个节点
启动两个turtlesim节点,/turtlesim
和/teleop_turtle
。
打开一个新终端并运行:
1 | ros2 run turtlesim turtlesim_node |
打开另一个终端并运行:
1 | ros2 run turtlesim turtle_teleop_key |
启动/teleop_turtle
节点时,您将在终端中看到以下消息:
1 | Use arrow keys to move the turtle. |
让我们专注于第二行,它对应于一个动作。(第一条指令对应于“ cmd_vel”主题)
请注意,字母键在键盘上G|B|V|C|D|E|R|T
的F
键周围形成一个“框” 。每个关键点的位置F
对应于turtlesim中的方向。例如,E
会将乌龟的方向旋转到左上角。
注意/turtlesim
节点正在运行的终端。每次按这些键之一,就将目标发送到属于该/turtlesim
节点的动作服务器。
目标是旋转乌龟以使其朝向某个而特定的方向。
乌龟完成旋转后,将显示一条有关目标结果的消息:
该F
键将取消目标的中间执行,证明操作具有可抢占的功能。
尝试C
按键,然后F
在乌龟完成旋转之前按键。在/turtlesim
运行节点的终端中,您将看到以下消息:
客户端(您在Teleop中的输入)不仅可以抢占目标,而且服务器端(/turtlesim
节点)也可以抢占目标。当服务器端抢占一个动作时,它“中止”了目标。
尝试按一下D
键,然后G
在第一次旋转之前完成键。在/turtlesim
运行节点的终端中,您将看到以下消息:
服务器端中止了第一个目标,因为它被中断了。
查看节点信息
要查看/turtlesim
节点的操作,请打开一个新终端并运行以下命令:
1 | ros2 node info /turtlesim |
这将返回/turtlesim
的订阅者,发布者,服务,操作服务器和操作客户端的列表:
可以看到,/turtle1/rotate_absolute
动作在/turtlesim
的Action Servers
之下。这意味着海龟是服务端,会对做出响应并提供反馈。
下面查看/teleop_turtle
节点信息
1 | ros2 node info /teleop_turtle |
可以看到,这个节点是动作/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
的客户端,发出指令,然后由服务器(海龟)做出响应。
查看动作列表
要标识ROS图中的所有动作,请运行以下命令:
1 | ros2 action list |
返回:
操作具有类型,类似于主题和服务。要查找/turtle1/rotate_absolute
的类型,请运行以下命令:
1 | ros2 action list -t |
将返回:
1 | /turtle1/rotate_absolute [turtlesim/action/RotateAbsolute] |
每个动作名称(仅在此情况下/turtle1/rotate_absolute
)右侧的括号中是动作类型turtlesim/action/RotateAbsolute
。当您想从命令行或代码执行操作时,将需要此功能。
查看动作信息
您可以/turtle1/rotate_absolute
使用以下命令进一步检查操作:
1 | ros2 action info /turtle1/rotate_absolute |
返回:
这意味着该节点/teleop_turtle
有一个动作客户端,而节点/turtlesim
有一个动作服务器。
查看动作接口
自己发送或执行动作目标之前,您需要获得的另一条信息是动作类型的结构。
在终端中输入以下命令以及操作类型:
1 | ros2 interface show turtlesim/action/RotateAbsolute.action |
返回接口信息:
利用接口进行操作,控制海龟旋转
现在,让我们使用以下语法从命令行发送一个操作目标:
1 | ros2 action send_goal <action_name> <action_type> <values> |
<values>
必须为YAML格式。
留意turtlesim窗口,然后在终端中输入以下命令:
1 | ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {'theta: 1.57'} |
可以看到,海龟在旋转,并且命令行返回如下:
所有目标都有唯一的ID,如返回消息所示。您还可以看到结果,一个名为的字段delta
,它是到起始位置的位移。
要查看此目标的反馈,请添加--feedback
到您运行的最后一个命令。首先,请确保您更改的值theta
。运行上一个命令后,乌龟将已经处于1.57
弧度方向,因此除非传递新的,否则它不会移动theta
。
1 | ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {'theta: -1.57'} --feedback |
终端将返回以下消息:
1 | Sending goal: |
您将继续收到剩余弧度的反馈,直到完成目标。
总结
动作就像服务,可让您执行长时间运行的任务,提供定期反馈并可以取消。
机器人系统可能会使用动作进行导航。一个行动目标可以告诉机器人去某个位置。当机器人导航到该位置时,它可以沿途发送更新(即反馈),一旦到达目的地,便发送最终结果消息。