了解动作

目标: ROS 2 中的自省操作。

教程级别: 初学者

时间: 15 分钟

背景

动作是 ROS 2 中的一种通信类型,用于长时间运行的任务。

它们由三部分组成:目标、反馈和结果。

动作基于主题和服务构建。

它们的功能类似于服务,但可以取消动作。

它们还提供稳定的反馈,而服务则返回单个响应。

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

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

先决条件

本教程基于之前教程中介绍的概念,如 nodestopics

本教程使用 turtlesim 包

与往常一样,不要忘记在 每次打开新终端 中获取 ROS 2。

任务

1 设置

启动两个 turtlesim 节点 /turtlesim/teleop_turtle

打开新终端并运行:

ros2 run turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

2 使用操作

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

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”主题,之前在 topics tutorial 中讨论过。)

请注意,字母键 G|B|V|C|D|E|R|T 在美国 QWERTY 键盘上围绕 F 键形成一个“框”(如果您不使用 QWERTY 键盘,请参阅 此链接 <https://upload.wikimedia.org/wikipedia/commons/d/da/KB_United_States.svg>`__ 以继续)。 ``F 周围的每个键的位置对应于 turtlesim 中的该方向。 例如,E 将把海龟的方向旋转到左上角。

注意 /turtlesim 节点正在运行的终端。 每次按下其中一个键时,您都会向“/turtlesim”节点的一部分操作服务器发送一个目标。 目标是旋转乌龟以面向特定方向。 乌龟完成旋转后,应显示一条传达目标结果的消息:

[INFO] [turtlesim]: Rotation goal completed successfully

“F”键将在执行过程中取消目标。

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

[INFO] [turtlesim]: Rotation goal canceled

不仅客户端(您在 teleop 中的输入)可以停止目标,服务器端(“/turtlesim”节点)也可以。 当服务器端选择停止处理目标时,它被称为“中止”目标。

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

[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal

此操作服务器选择中止第一个目标,因为它获得了一个新目标。 它本可以选择其他目标,例如拒绝新目标或在第一个目标完成后执行第二个目标。 不要假设每个操作服务器在获得新目标时都会选择中止当前目标。

3 ros2 node info

要查看节点提供的操作列表(在本例中为“/turtlesim”),打开一个新终端并运行以下命令:

ros2 node info /turtlesim

这将返回“/turtlesim”的订阅者、发布者、服务、动作服​​务器和动作客户端的列表:

/turtlesim
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
  Service Servers:
    /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/TeleportAbsolute
    /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
    /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
  Service Clients:

  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  Action Clients:

请注意,“/turtlesim”的“/turtle1/rotate_absolute”操作位于“操作服务器”下。 这意味着“/turtlesim”响应并为“/turtle1/rotate_absolute”操作提供反馈。 “/teleop_turtle”节点在“操作客户端”下的名称为“/turtle1/rotate_absolute”,这意味着它为该操作名称发送目标。 要查看,请运行:

ros2 node info /teleop_turtle

它将返回:

/teleop_turtle
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Service Servers:
    /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
  Service Clients:

  Action Servers:

  Action Clients:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute

4 ros2 操作列表

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

ros2 action list

它将返回:

/turtle1/rotate_absolute

这是目前 ROS 图中唯一的操作。 如您之前所见,它控制海龟的旋转。 您还已经通过使用“ros2 node info <node_name>”命令知道此操作有一个操作客户端(“/teleop_turtle”的一部分)和一个操作服务器(“/turtlesim”的一部分)。

4.1 ros2 action list -t

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

ros2 action list -t

它将返回:

/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

每个动作名称右侧的括号中(本例中只有“/turtle1/rotate_absolute”)是动作类型“turtlesim/action/RotateAbsolute”。

当您想从命令行或代码执行动作时,您将需要它。

5 ros2 动作类型

如果您想检查动作的动作类型,请运行以下命令:

ros2 action type /turtle1/rotate_absolute

它将返回:

turtlesim/action/RotateAbsolute

6 ros2 action info

您可以使用以下命令进一步检查 /turtle1/rotate_absolute 操作:

ros2 action info /turtle1/rotate_absolute

将会回归

Action: /turtle1/rotate_absolute
Action clients: 1
    /teleop_turtle
Action servers: 1
    /turtlesim

这告诉我们之前在每个节点上运行“ros2 node info”时学到的内容: “/teleop_turtle”节点有一个动作客户端,而“/turtlesim”节点有一个用于“/turtle1/rotate_absolute”动作的动作服务器。

7 ros2 interface show

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

回想一下,在运行命令“ros2 action list -t”时,您已识别出“/turtle1/rotate_absolute”的类型。 在终端中输入以下命令,其中包含动作类型:

ros2 interface show turtlesim/action/RotateAbsolute

Which will return:

# 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

该消息中第一个“—”上方的部分是目标请求的结构(数据类型和名称)。 下一部分是结果的结构。 最后一部分是反馈的结构。

8 ros2 action send_goal

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

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

<values> need to be in YAML format.

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

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

您应该看到海龟在旋转,并且终端中出现以下消息:

Waiting for an action server to become available...
Sending goal:
   theta: 1.57

Goal accepted with ID: f8db8f44410849eaa93d3feb747dd444

Result:
  delta: -1.568000316619873

Goal finished with status: SUCCEEDED

所有目标都有一个唯一的 ID,显示在返回消息中。 您还可以看到结果,一个名为“delta”的字段,它是相对于起始位置的位移。

要查看此目标的反馈,请将“–feedback”添加到“ros2 action send_goal”命令:

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

你的终端将返回以下消息:

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

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

摘要

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

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

Turtlesim 有一个动作服务器,动作客户端可以向其发送旋转海龟的目标。 在本教程中,您自省了该动作“/turtle1/rotate_absolute”,以更好地了解动作是什么以及它们如何工作。

后续步骤

现在您已经了解了所有核心 ROS 2 概念。 本系列的最后几个教程将向您介绍一些使使用 ROS 2 更加容易的工具和技术,从 使用 rqt_console 查看日志 开始。

相关内容

您可以在 此处 阅读有关 ROS 2 中操作背后的设计决策的更多信息。