ROS 2 | 行动 -actions-

958
0
2020年3月6日 05时19分

前序:ROS 2 | 参数-parameters-

 

本节详细介绍行动action。

 

1. 如何理解行动action:

 

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

 

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

 

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

 

2. 行动action有哪些命令功能:

 

ros2 action -h

 

ROS 2 | 行动 -actions-插图

 

命令如下:

·   info:显示行动具体信息
·   list:输出行动名列表
·   send_goal:发送行动目标
·   show:显示行动类型定义

 

行动消息格式如下:

# 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案例如下:

1)  ros2 run turtlesim turtlesim_node
2)  ros2 run turtlesim turtle_teleop_key

 

3.1 小试牛刀

 

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

 

ROS 2 | 行动 -actions-插图(1)

 

专注于第二行,它对应于一个行动。 (第一条指令对应于主题教程中先前讨论的“ cmd_vel”主题。)

 

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

 

ROS 2 | 行动 -actions-插图(2)

 

注意节点/turtlesim正在运行的终端。 每次按这些键之一,就向一个目标服务器发送目标,该服务器是/ turtlesim节点的一部分。 目标是旋转乌龟以使其朝向特定方向。 乌龟完成旋转后,将显示一条有关目标结果的消息:

 

E:

ROS 2 | 行动 -actions-插图(3)

 

V:

ROS 2 | 行动 -actions-插图(4)

 

ROS 2 | 行动 -actions-插图(5)

 

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

 

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

 

ROS 2 | 行动 -actions-插图(6)

 

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

 

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

 

ROS 2 | 行动 -actions-插图(7)

 

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

 

3.2 节点信息(行动)

 

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

ros2 node info /turtlesim

 

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

 

ROS 2 | 行动 -actions-插图(8)

 

请注意,/turtlesim的行动/turtle1/rotate_absolute位于行动服务器端下。 这意味着/turtlesim会响应行动/turtle1/rotate_absolute并提供反馈。

 

节点/teleop_turtle在“行动客户端”下具有名称/turtle1/rotate_absolute,这表示它发送该目标行动的名称。

ros2 node info /teleop_turtle

 

ROS 2 | 行动 -actions-插图(9)

 

通俗一点:

·   节点turtlesim为行动服务器端
·   节点teleop_turtle为行动客户端

 

3.3 行动列表

 

显示ROS图中的所有行动,运行以下命令:

ros2 action list

 

返回值:

/turtle1/rotate_absolute 

 

这是目前ROS图中唯一的行动。 如先前所见,它控制着乌龟的旋转。 使用ros2节点信息<node_name>命令可以为该操作提供一个行动客户端(/teleop_turtle的一部分)和一个行动服务器(/turtlesim的一部分)。

 

3.4 行动信息

 

使用以下命令进一步查询/turtle1/rotate_absolute行动:

ros2 action info /turtle1/rotate_absolute

 

返回:

 

ROS 2 | 行动 -actions-插图(10)

 

运行ros2节点信息:/teleop_turtle节点有一个行动客户端,/turtlesim节点有一个针对/turtle1/rotate_absolute行动服务器。

3.5 行动接口

 

发送或执行目标行动之前,需要知道是行动的结构类型。

 

回想一下,在运行ros2行动列表-t时,已经确定了/turtle1/rotate_absolute的类型。 在终端中输入以下命令和行动类型:

ros2 interface show turtlesim/action/RotateAbsolute.action

 

返回:

 

ROS 2 | 行动 -actions-插图(11)

 

该消息的位于—上方的第一部分,是目标请求结构(数据类型和名称)。中间部分是结果的结构。 最下面一部分是反馈的结构。

 

3.6 命令行发布行动

 

现在,使用以下语法从命令行发送一个目标行动:

ros2 action send_goal <action_name> <action_type> <values>

 

<values>必须为YAML格式。

 

密切注意turtlesim窗口,并在终端中输入以下命令:

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {"theta: 1.57"}

 

显示如下:

 

ROS 2 | 行动 -actions-插图(12)

 

所有目标都有唯一的ID,如返回消息所示。 还可以看到结果,一个名为delta的字段,它是到起始位置的位移。

 

要查看此目标的反馈,请将–feedback添加到运行的最后一个命令。 首先,请确保更改theta的值。 运行上一条命令后,乌龟将已经处于1.57弧度的方向,因此除非传递新的theta,否则它不会移动。

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute {"theta: -1.57"} --feedback

 

过程1:

 

ROS 2 | 行动 -actions-插图(13)

 

过程2:

 

ROS 2 | 行动 -actions-插图(14)

 

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

 

4. 小结

 

行动类似服务,实现执行长时间运行的任务,提供定期反馈并可以取消。

 

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

 

Turtlesim有一个行动服务器,行动客户端可以将目标发送给旋转的乌龟。 在本教程中,对行动/turtle1/rotate_absolute进行了分析,更好地了解什么是行动以及它们如何工作。

发表评论

后才能评论