理解ROS 2动作

Goal: Introspect actions in ROS 2.

教程级别: 初学者 [Alyssa@7088]

时间: 15分钟 [Alyssa@6755]

背景

[需手动修复的语法]Action是ROS 2中的通讯类型之一,用于长期运行的任务。它们由三部分组成: 目标、反馈和结果。 [待校准@9126]

[需手动修复的语法]Action是建立在话题和服务之上的。它们的功能与服务类似,除了动作是可抢占的 (您可以在执行时取消它们)。他们也提供稳定的反馈,而不是返回单一响应的服务。 [待校准@9127]

[需手动修复的语法]Action使用客户端-服务器模型,类似于出版商-订户模型 (在 topics tutorial 中描述)。“动作客户端” 节点向 “动作服务器” 节点发送目标,该节点确认目标并返回反馈流和结果。 [待校准@9128]

../_images/Action-SingleActionClient.gif

先决条件

本教程建立了一些概念,如 nodestopics ,涵盖在之前的教程中。 [待校准@9129]

本教程使用 turtlesim package[待校准@9130]

和往常一样,不要忘记在 every new terminal you open 中源文件ROS 2。 [待校准@9131]

任务

1设置 [待校准@7567]

启动两个turtlesim节点, /turtlesim/teleop_turtle[待校准@7815]

打开新终端并运行: [待校准@7339]

ros2 run turtlesim turtlesim_node

打开另一个终端并运行: [待校准@7816]

ros2 run turtlesim turtle_teleop_key

2使用动作 [待校准@9132]

当你launch的 /teleop_turtle 节点,你将看到以下消息终端: [待校准@9133]

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 中讨论过。) [待校准@9134]

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

注意运行 /turtlesim 节点的终端。每次按下其中一个键,您都会向作为 /turtlesim 节点一部分的动作服务器发送一个目标。目标是旋转海龟以面对特定的方向。一旦海龟完成旋转,应显示一条传达目标结果的消息: [待校准@9136]

[INFO] [turtlesim]: Rotation goal completed successfully

[需手动修复的语法] F 键将在执行过程中取消一个目标,例程显示动作的可抢占功能。 [待校准@9137]

尝试按 C 键,然后按 F 键,乌龟才能完成旋转。在运行 /turtlesim 节点的终端中,您将看到以下消息: [待校准@9138]

[INFO] [turtlesim]: Rotation goal canceled

不仅客户端 (您在teleop中的输入) 可以抢占目标,服务器端 ( /turtlesim 节点) 也可以。当服务器端抢占动作时,它将 “中止” 目标。 [待校准@9139]

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

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

服务器端中止了第一个目标,因为它被中断了。 [待校准@9141]

3 ros2节点信息 [待校准@9142]

要查看 /turtlesim 节点的动作,请打开一个新终端并运行以下命令: [待校准@9143]

ros2 node info /turtlesim

它将返回 /turtlesim 的订阅者、出版商、服务、动作服务器和动作客户端的列表: [待校准@9144]

/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
  Services:
    /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
  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  Action Clients:

请注意, /turtlesim/turtle1/rotate_absolute 动作在 Action Servers 之下。这意味着 /turtlesim/turtle1/rotate_absolute 动作做出反应并提供反馈。 [待校准@9145]

[需手动修复的语法] /teleop_turtle 节点在 Action Clients 下有 /turtle1/rotate_absolute 的名字,意思是它为那个动作的名字发送目标。 [待校准@9146]

ros2 node info /teleop_turtle

它将返回: [待校准@8090]

/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
  Services:
    /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
  Action Servers:

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

4 ros2动作列表 [待校准@9147]

要识别ROS图中的所有动作,请运行以下命令: [待校准@9148]

ros2 action list

它将返回: [待校准@8090]

/turtle1/rotate_absolute

这是目前ROS图中唯一的动作。正如你之前看到的,它控制着海龟的旋转。你也已经知道是动作客户端 (部分 /teleop_turtle ) 和动作服务器 (部分 /turtlesim ) 动作使用 ros2 node info <node_name> 命令。 [待校准@9149]

4.1 ros2动作列表-t [待校准@9150]

[需手动修复的语法]Action有类型,类似于话题和服务。要查找 /turtle1/rotate_absolute 的类型,请运行以下命令: [待校准@9151]

ros2 action list -t

它将返回: [待校准@8090]

/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

在每个动作右侧的括号中,名称 (在这种情况下,只有 /turtle1/rotate_absolute ) 是动作类型, turtlesim/action/RotateAbsolute 。当您想要从命令行或代码中执行动作时,将需要此功能。 [待校准@9152]

5 ros2动作信息 [待校准@9153]

您可以通过以下命令进一步反思 /turtle1/rotate_absolute 动作: [待校准@9154]

ros2 action info /turtle1/rotate_absolute

它将返回 [待校准@9155]

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

这告诉我们我们之前从在每个节点上运行 ros2 node info 中学到的东西: /teleop_turtle 节点有一个动作客户端, /turtlesim 节点有一个用于 /turtle1/rotate_absolute 动作的动作服务器。 [待校准@9156]

6 ros2界面展示 [待校准@8841]

在自己发送或执行动作目标之前,你还需要一条信息,那就是动作类型的结构。 [待校准@9157]

重新调用您在运行命令 ros2 action list -t 时识别了 /turtle1/rotate_absolute 的类型。在终端中使用动作类型输入以下命令: [待校准@9158]

ros2 interface show turtlesim/action/RotateAbsolute

它将返回: [待校准@8090]

# 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

此消息的第一部分,在 --- 上方,是目标请求的结构 (数据类型和名称)。下一节是结果的结构。最后一节是反馈的结构。 [待校准@9159]

7 ros2动作发送 _ 目标 [待校准@9160]

现在,让我们使用以下语法从命令行发送一个动作目标: [待校准@9161]

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

[需手动修复的语法]``<values>`` need为YAML格式。 [待校准@9162]

密切注意turtlesim窗口,并在终端中输入以下命令: [待校准@9163]

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

您应该会看到海龟在旋转,以及终端中的以下消息: [待校准@9164]

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

所有目标都有一个唯一的账号,显示在返回消息中。你也可以看到结果,一个名为 delta 的字段,它是到起始位置的位移。 [待校准@9165]

要查看此目标的反馈,请将 --feedback 添加到您运行的最后一个命令中。首先,确保你改变了 theta 的价值。运行完之前的命令后,海龟已经处于 1.57 弧度的方向,所以除非你通过一个新的 theta ,否则它不会移动。 [待校准@9166]

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

您的终端将返回消息: [待校准@7838]

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

你将继续收到反馈,剩余的弧度,直到目标完成。 [待校准@9167]

总结

[需手动修复的语法]Action就像服务一样,允许你执行长时间运行的任务,提供定期反馈,并且是可取消的。 [待校准@9168]

机器人系统可能会使用动作来导航。动作目标可以告诉机器人穿梭到一个位置。当机器人导航到该位置时,它可以一路发送更新 (即反馈),然后在到达目的地后发出最终结果消息。 [待校准@9169]

Turtlesim有一个动作服务器,动作客户端可以为旋转海龟发送目标。在本教程中,你反思了这个动作, /turtle1/rotate_absolute ,以更好地了解什么是动作以及它们是如何工作的。 [待校准@9170]

下一步

现在,您已经介绍了所有核心ROS 2概念。从 使用rqt_控制台 [待校准@8152] 开始, "Users" 系列的最后几个教程将向您介绍一些工具和技术,这些工具和技术将使使用ROS 2变得更容易。 [待校准@9171]