警告
您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.
了解 ROS 2 行动
目标 ROS 中的自省行动 2.
辅导水平: 初学者
时间 15 分钟
背景介绍
行动是 ROS 2 中的通信类型之一,适用于长时间运行的任务。行动由三部分组成:目标、反馈和结果。
操作建立在主题和服务的基础上。它们的功能与服务类似,只是操作可以抢占(可以在执行时取消)。与只返回单一响应的服务不同,它们还能提供稳定的反馈。
操作使用客户端-服务器模式,类似于发布者-订阅者模式(在......中描述)。 主题教程).行动客户端 "节点向 "行动服务器 "节点发送目标,"行动服务器 "节点确认目标,并返回反馈流和结果。

先决条件
本教程以一些概念为基础,例如 结点 和 主题在以前的教程中已经介绍过。
本教程使用 海龟模拟软件包.
与往常一样,别忘了在 您打开的每个新终端.
任务
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
键。每个键在 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 行动信息
您可以进一步反省 /turtle1/rotate_absolute
命令进行操作:
ros2 action info /turtle1/rotate_absolute
将返回
行动:/turtle1/rotate_absolute
行动客户:1
/teleop_turtle
行动服务器:1
/turtlesim
这就告诉了我们之前通过运行 玫瑰2 网站 信息
在每个节点上:的 /teleop_turtle
节点有一个动作客户端,而 /turtlesim
节点有一个 /turtle1/rotate_absolute
行动。
6 ros2 interface show
在发送或执行行动目标之前,您还需要了解行动类型的结构。
回忆一下,你们确定了 /turtle1/rotate_absolute
运行命令时 玫瑰2 行动 清单 -t
.在终端中输入以下命令,并输入操作类型:
ros2 action show turtlesim/action/RotateAbsolute
哪个会回来?
# "(《世界人权宣言》) 所愿 标题 于 弧度
float32 theta
---
# "(《世界人权宣言》) 角度 流离失所 于 弧度 至 的 开始 位置
float32 delta
---
# "(《世界人权宣言》) 剩余的 自转 于 弧度
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}";
你应该会看到乌龟在旋转,并在终端中看到以下信息:
等待行动服务器可用...
发送目标:
θ: 1.57
目标已接受,ID:f8db8f44410849eaa93d3feb747dd444
结果
三角洲:-1.568000316619873
目标已完成,状态为成功
所有目标都有一个唯一的 ID,显示在返回信息中。您还可以看到结果,一个名为 三角洲
即向起始位置的位移。
要查看此目标的反馈信息,请添加 --反馈
到你运行的最后一条命令。首先,确保更改 θ
.运行前一条命令后,乌龟的方位已经是 1.57
弧度,所以它不会移动,除非您通过一个新的 θ
.
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.