ROS2-3-动作

Catalogue
  1. 1. Action
    1. 1.1. 测试Action
    2. 1.2. 启动两个节点
    3. 1.3. 查看节点信息
  2. 2. 查看动作列表
  3. 3. 查看动作信息
  4. 4. 查看动作接口
  5. 5. 利用接口进行操作,控制海龟旋转
  6. 6. 总结
    1. 6.1. 参考资料

Action

动作是ROS 2中用于长时间运行任务的通信类型之一。它们由三部分组成:目标,结果和反馈。

动作基于主题和服务。它们的功能与服务相似,但动作是可抢占的(您可以在执行时将其取消)。与返回单个响应的服务相反,它们还提供稳定的反馈

操作使用类似于发布者-订阅者模型(在主题教程中进行描述)的客户端-服务器模型。“动作客户端”节点将目标发送到“动作服务器”节点,该节点确认目标并返回反馈和结果流。

测试Action

启动两个节点

启动两个turtlesim节点,/turtlesim/teleop_turtle

打开一个新终端并运行:

1
ros2 run turtlesim turtlesim_node

打开另一个终端并运行:

1
ros2 run turtlesim turtle_teleop_key

启动/teleop_turtle节点时,您将在终端中看到以下消息:

1
2
Use arrow keys to move the turtle.
Use G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.

让我们专注于第二行,它对应于一个动作。(第一条指令对应于“ cmd_vel”主题)

请注意,字母键在键盘上G|B|V|C|D|E|R|TF键周围形成一个“框” 。每个关键点的位置F对应于turtlesim中的方向。例如,E会将乌龟的方向旋转到左上角。

注意/turtlesim节点正在运行的终端。每次按这些键之一,就将目标发送到属于该/turtlesim节点的动作服务器。

目标是旋转乌龟以使其朝向某个而特定的方向

乌龟完成旋转后,将显示一条有关目标结果的消息:

F键将取消目标的中间执行,证明操作具有可抢占的功能。

尝试C按键,然后F在乌龟完成旋转之前按键。在/turtlesim运行节点的终端中,您将看到以下消息:

客户端(您在Teleop中的输入)不仅可以抢占目标,而且服务器端(/turtlesim节点)也可以抢占目标。当服务器端抢占一个动作时,它“中止”了目标。

尝试按一下D键,然后G在第一次旋转之前完成键。在/turtlesim运行节点的终端中,您将看到以下消息:

服务器端中止了第一个目标,因为它被中断了。

查看节点信息

要查看/turtlesim节点的操作,请打开一个新终端并运行以下命令:

1
ros2 node info /turtlesim

这将返回/turtlesim的订阅者,发布者,服务,操作服务器和操作客户端的列表:

可以看到,/turtle1/rotate_absolute动作在/turtlesimAction 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sending goal:
theta: -1.57

Goal accepted with ID: e6092c831f994afda92f0086f220da27

Feedback:
remaining: -3.1268222332000732

Feedback:
remaining: -3.1108222007751465



Result:
delta: 3.1200008392333984

Goal finished with status: SUCCEEDED

您将继续收到剩余弧度的反馈,直到完成目标。

总结

动作就像服务,可让您执行长时间运行的任务,提供定期反馈并可以取消。

机器人系统可能会使用动作进行导航。一个行动目标可以告诉机器人去某个位置。当机器人导航到该位置时,它可以沿途发送更新(即反馈),一旦到达目的地,便发送最终结果消息。

参考资料