ROS 2行动-actions-

2019-12-20 14:23:27 浏览数 (2)

前序:ROS 2参数-paramete

本节详细介绍行动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案例如下:

  1. ros2 run turtlesim turtlesim_node
  2. 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进行了分析,更好地了解什么是行动以及它们如何工作。


0 人点赞