目标: 理解并学习ROS 2 中的Action通信方式。
教程级别:初学者
时间: 15分钟
内容
-
背景
-
先决条件
-
任务
-
1 设置
-
2 使用动作
-
3 ros2节点信息
-
4 ros2 动作列表
-
5 ros2 动作信息
-
6 ros2界面展示
-
7 ros2 动作 send_goal
-
-
概括
-
下一步
-
相关内容
背景
动作是 ROS 2 中的一种通信类型,用于长时间运行的任务。它们由三部分组成:目标、反馈和结果。
操作基于主题和服务。它们的功能类似于服务,除了操作是可抢占的(您可以在执行时取消它们)。他们还提供稳定的反馈,而不是返回单一响应的服务。
操作使用客户端-服务器模型,类似于发布者-订阅者模型(在主题教程中描述)。“动作客户端”节点将目标发送到“动作服务器”节点,该节点确认目标并返回反馈流和结果。
先决条件
本教程建立在之前教程中涵盖的概念之上,例如nodes和topics 。
本教程使用turtlesim 包。
任务
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”主题。)
请注意,字母键在键盘上的键G|B|V|C|D|E|R|T
周围形成一个“框” 。F
每个键的位置都F
对应于 turtlesim 中的那个方向。例如,E
会将乌龟的方向旋转到左上角。
注意节点/turtlesim
运行的终端。每次按下其中一个键时,您都会将一个目标发送到作为节点一部分的动作服务器/turtlesim
。目标是旋转海龟以面向特定方向。一旦海龟完成旋转,就会显示一条传达目标结果的消息:
[INFO] [turtlesim]: Rotation goal completed successfully
该F
键将在执行过程中取消目标,展示动作的可抢占特性。
尝试按下C
键,然后F
在海龟完成旋转之前按下 键。在节点运行的终端中/turtlesim
,您将看到消息:
[INFO] [turtlesim]: Rotation goal canceled
不仅客户端(您在远程操作中的输入)可以抢占目标,服务器端(节点/turtlesim
)也可以。当服务器端抢占一个动作时,它会“中止”目标。
尝试敲击D
键,然后G
在第一次旋转完成之前按下键。在节点运行的终端中/turtlesim
,您将看到消息:
[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
服务器端中止了第一个目标,因为它被中断了。
3 ros2节点信息
要查看/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 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:
请注意,/turtle1/rotate_absolute
对于的操作/turtlesim
在 下。这意味着响应并为操作提供反馈。Action Servers
/turtlesim
/turtle1/rotate_absolute
该/teleop_turtle
节点的名称/turtle1/rotate_absolute
表示它为该操作名称发送目标。Action Clients
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 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 动作列表
要识别 ROS 图中的所有操作,请运行以下命令:
ros2 action list
将返回:
/turtle1/rotate_absolute
这是目前 ROS 图中唯一的动作。正如您之前看到的,它控制海龟的旋转。您还已经通过使用命令知道此操作有一个操作客户端(部分/teleop_turtle
)和一个操作服务器(部分) 。/turtlesim
ros2 node info <node_name>
4.1 ros2动作列表-t
动作有类型,类似于主题和服务。要查找/turtle1/rotate_absolute
的类型,请运行命令:
ros2 action list -t
将返回:
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
在每个动作名称(在本例中仅为 )右侧的括号中/turtle1/rotate_absolute
是动作类型,turtlesim/action/RotateAbsolute
。当您想要从命令行或代码执行操作时,您将需要它。
5 ros2 动作信息
/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
6 ros2界面展示
在自己发送或执行操作目标之前,您还需要了解操作类型的结构。
回想一下您/turtle1/rotate_absolute
在运行命令时确定的类型。在终端中输入带有操作类型的以下命令:ros2 action list -t
ros2 action show turtlesim/action/RotateAbsolute
将返回:
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
此消息的第一部分,在 之上---
,是目标请求的结构(数据类型和名称)。下一部分是结果的结构。最后一部分是反馈的结构。
7 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}"
您应该看到海龟在旋转,并在您的终端中看到以下消息:
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
到您运行的最后一个命令。首先,确保更改 的值theta
。运行上一个命令后,乌龟将已经处于1.57
弧度方向,因此除非您传递一个新的 ,否则它不会移动theta
。
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 概念。“用户”集中的最后几篇教程将从使用 rqt_console开始,向您介绍一些工具和技术,这些工具和技术将使 ROS 2 的使用更加容易。