了解行动

目标 ROS 中的自省行动 2.

辅导水平: 初学者

时间 15 分钟

背景介绍

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

操作建立在主题和服务的基础上。它们的功能与服务类似,但行动可以取消。它们还能提供稳定的反馈,而服务只会返回一个响应。

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

.././././_images/Action-SingleActionClient.gif

先决条件

本教程以一些概念为基础,例如 结点主题在以前的教程中已经介绍过。

本教程使用 海龟模拟软件包.

与往常一样,别忘了在 您打开的每个新终端.

任务

1 设置

启动两个海龟模拟节点、 /turtlesim/teleop_turtle.

打开一个新终端并运行

ros2 运行 turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

2 使用行动

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

使用箭头键移动乌龟。
使用 G|B|V|C|D|E|R|T 键旋转到绝对方向。 'F' 取消旋转。

让我们重点看看第二行,它对应的是一个操作。(第一条指令对应的是 "cmd_vel "主题,在前面的 主题教程.)

注意字母键 g|b|v|c|d|e|r|t 形成一个 F 键(如果您使用的不是 QWERTY 键盘,请参见 此链接 来跟随)。每个键在 F 与海龟模拟中的方向相对应。例如 E 会将乌龟的方向旋转到左上角。

注意 /turtlesim 节点正在运行。每次按下这些按键时,都会将目标发送到动作服务器,该服务器是 /turtlesim 节点。目标是将乌龟旋转到一个特定的方向。一旦乌龟完成旋转,就会显示一条转达目标结果的信息:

[INFO] [turtlesim]:旋转目标成功完成

"(《世界人权宣言》) F 键会在目标执行过程中取消目标。

尝试按下 C 键,然后按 F 键,乌龟才能完成旋转。在 /turtlesim 节点正在运行,您将看到该信息:

[INFO] [turtlesim]:旋转目标取消

不仅客户端(您在远程操作中的输入)可以阻止目标实现,服务器端(您在远程操作中的输入)也可以阻止目标实现。 /turtlesim 节点)也可以。当服务器端选择停止处理一个目标时,它就会 "中止 "该目标。

尝试点击 D 键,然后按 G 键才能完成第一次旋转。在 /turtlesim 节点正在运行,您将看到该信息:

[WARN] [turtlesim]:在前一个目标完成之前收到旋转目标。放弃前一个目标

因为有了新目标,所以服务器选择放弃第一个目标。它也可以选择其他方式,比如拒绝新目标或在第一个目标完成后执行第二个目标。不要认为每个行动服务器在收到新目标时都会选择放弃当前目标。

3 ros2 节点信息

查看节点提供的操作列表、 /turtlesim 在这种情况下,打开一个新的终端并运行该命令:

ros2 节点信息 /turtlesim

将返回一个 /turtlesim的订阅者、发布者、服务、操作服务器和操作客户端:

/turtlesim
  订阅者:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  出版商
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
  服务服务器:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    /reset: std_srvs/srv/Empty
    /spawn: turtlesim/srv/Spawn
    /turtle1/set_pen: turtlesim/srv/SetPen
    /turtle1/teleport_absolute: turtlesim/srv/TteleportAbsolute
    /turtle1/teleport_relative: turtlesim/srv/TteleportRelative
    /turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
    /turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
    /turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
    /turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  服务客户:

  行动服务器:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  行动客户:

注意到 /turtle1/rotate_absolute 行动 /turtlesim行动 服务器.这意味着 /turtlesim 回应和反馈 /turtle1/rotate_absolute 行动。

"(《世界人权宣言》) /teleop_turtle 节点的名称为 /turtle1/rotate_absolute 根据 行动 客户 意味着它会为该操作名称发送目标。要查看,请运行

ros2 节点信息 /teleop_turtle

哪个会回来?

/teleop_turtle
  订阅者:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
  出版商
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  服务服务器:
    /teleop_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /teleop_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /teleop_turtle/get_parameters: rcl_interfaces/srv/GetParameters
    /teleop_turtle/list_parameters: rcl_interfaces/srv/ListParameters
    /teleop_turtle/set_parameters: rcl_interfaces/srv/SetParameters
    /teleop_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  服务客户:

  行动服务器:

  行动客户:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute

4 ROS2 行动清单

要识别 ROS 图形中的所有操作,请运行该命令:

ROS2 行动清单

哪个会回来?

/turtle1/rotate_absolute

这是目前 ROS 图形中唯一的动作。如前所述,它控制乌龟的旋转。你也已经知道有一个动作客户端(隶属于 /teleop_turtle的一部分)和一个行动服务器 /turtlesim)来执行该操作。 玫瑰2 网站 信息 <节点名称>; 指挥。

4.1 ros2 行动列表 -t

操作有类型,类似于主题和服务。要查找 /turtle1/rotate_absolute的类型,运行该命令:

ros2 操作列表 -t

哪个会回来?

/turtle1/rotate_absolute【turtlesim/action/RotateAbsolute

在每个操作名称右侧的括号中(本例中只有 /turtle1/rotate_absolute) 是动作类型、 turtlesim/action/RotateAbsolute.当您想从命令行或代码中执行操作时,就需要用到它。

5 ROS2 行动类型

如果要检查操作的操作类型,请运行该命令:

ros2 操作类型 /turtle1/rotate_absolute

哪个会回来?

turtlesim/action/RotateAbsolute

6 ROS2 行动信息

您可以进一步反省 /turtle1/rotate_absolute 命令进行操作:

ros2 action info /turtle1/rotate_absolute

将返回

行动:/turtle1/rotate_absolute
行动客户:1
    /teleop_turtle
行动服务器:1
    /turtlesim

这就告诉了我们之前通过运行 玫瑰2 网站 信息 在每个节点上:的 /teleop_turtle 节点有一个动作客户端,而 /turtlesim 节点有一个 /turtle1/rotate_absolute 行动。

7 ros2 interface show

在发送或执行行动目标之前,您还需要了解行动类型的结构。

回忆一下,你们确定了 /turtle1/rotate_absolute运行命令时 玫瑰2 行动 清单 -t.在终端中输入以下命令,并输入操作类型:

ros2 interface show turtlesim/action/RotateAbsolute

哪个会回来?

# "(《世界人权宣言》) 所愿 标题  弧度
float32 theta
---
# "(《世界人权宣言》) 角度 流离失所  弧度   开始 位置
float32 delta
---
# "(《世界人权宣言》) 剩余的 自转  弧度
float32 remaining

本报文第一段以上的部分 --- 是目标请求的结构(数据类型和名称)。下一部分是结果结构。最后一部分是反馈结构。

8 ros2 行动 send_goal

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

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}";

你应该会看到乌龟在旋转,并在终端中看到以下信息:

等待行动服务器可用...
发送目标:
   θ: 1.57

目标已接受,ID:f8db8f44410849eaa93d3feb747dd444

结果
  三角洲:-1.568000316619873

目标已完成,状态为成功

所有目标都有一个唯一的 ID,显示在返回信息中。您还可以看到结果,一个名为 三角洲即向起始位置的位移。

要查看此目标的反馈信息,请添加 --反馈玫瑰2 行动 发送目标 指挥:

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

您的终端将返回信息:

发送目标:
   θ:-1.57

目标已接受,ID:e6092c831f994afda92f0086f220da27

反馈:
  剩余:-3.1268222332000732

反馈:
  剩余:-3.1108222007751465

...

结果
  三角洲: 3.1200008392333984

目标已完成,状态为成功

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

摘要

操作就像服务,可以让你执行长期运行的任务,提供定期反馈,并且可以取消。

机器人系统可能会使用行动来导航。一个行动目标可以告诉机器人前往某个位置。当机器人导航到该位置时,它可以沿途发送更新信息(即反馈),然后在到达目的地后发送最终结果信息。

Turtlesim 有一个动作服务器,动作客户端可以向其发送目标,以便旋转乌龟。在本教程中,你将对该动作进行反省、 /turtle1/rotate_absolute,以便更好地了解什么是行动以及行动是如何运作的。

下一步工作

现在,您已经掌握了 ROS 2 的所有核心概念。本套教程的最后几篇将向您介绍一些工具和技术,让您更轻松地使用 ROS 2。 使用 rqt_console 查看日志.