Understanding actions:理解动作(Action)
创始人
2025-05-30 05:39:48
0

文章目录

  • 动作(Action)介绍
  • 1. 准备工作
  • 2. 使用动作
  • 3. ros2 node info 命令
  • 4. ros2 action list 命令
    • 4.1. ros2 action list -t 命令
  • 5. ros2 action info 命令
  • 6. ros2 interface show 命令
  • 7. ros2 action send_goal 命令

参考官方文档: Understanding actions

动作(Action)介绍

动作(Action)是ROS 2中的通信类型之一,旨在用于长期运行的任务。它们由三部分组成:目标(goal)、反馈(feedback)和结果(result)。

动作是建立在话题和服务之上的。它们的功能类似于服务,只是动作可以被取消。它们也提供稳定的反馈,而服务只返回单一的响应。

行动使用一个客户端-服务器(client-server)模型,类似于发布者-订阅者(publisher-subscriber)模型(在Understanding topics:理解话题(Topic)教程中讲过)。一个“动作客户端(action client)”节点向“动作服务器(action server)”节点发送一个目标,该节点确认该目标并返回反馈流和结果。

在这里插入图片描述

1. 准备工作

打开两个终端,分别运行:

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 " 主题,在前面的主题Understanding topics:理解话题(Topic)教程中讨论过。)

请注意,在美式QWERTY布局的键盘上,字母键 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

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

试着在第一次旋转完成之前按 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 的订阅者、发布者、服务、动作服务器和动作客户端:

/turtlesimSubscribers:/parameter_events: rcl_interfaces/msg/ParameterEvent/turtle1/cmd_vel: geometry_msgs/msg/TwistPublishers:/parameter_events: rcl_interfaces/msg/ParameterEvent/rosout: rcl_interfaces/msg/Log/turtle1/color_sensor: turtlesim/msg/Color/turtle1/pose: turtlesim/msg/PoseService 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/SetParametersAtomicallyService Clients:Action Servers:/turtle1/rotate_absolute: turtlesim/action/RotateAbsoluteAction Clients:

请注意,/turtle1/rotate_absolute 的动作是在 Action Servers 下面。这意味着 /turtlesim 对 /turtle1/rotate_absolute 动作做出反应并提供反馈。

ros2 node info /teleop_turtle
/teleop_turtleSubscribers:/parameter_events: rcl_interfaces/msg/ParameterEventPublishers:/parameter_events: rcl_interfaces/msg/ParameterEvent/rosout: rcl_interfaces/msg/Log/turtle1/cmd_vel: geometry_msgs/msg/TwistService 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/SetParametersAtomicallyService Clients:Action Servers:Action Clients:/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute

/teleop_turtle 节点在动作客户端下有 /turtle1/rotate_absolute 的名字,意味着它为该动作名称发送目标。

4. ros2 action list 命令

要识别ROS图中的所有动作,运行命令:

ros2 action list

返回结果如下:

/turtle1/rotate_absolute

这是目前ROS图中唯一的动作。它控制乌龟的旋转,正如你之前看到的那样。通过使用 ros2 node info 命令,你也已经知道这个动作有一个动作客户端( /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 action info 命令

你可以用以下命令进一步查看 /turtle1/rotate_absolute 动作:

ros2 action info /turtle1/rotate_absolute

返回结果如下:

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

/teleop_turtle 节点有一个动作客户端,/turtlesim 节点有一个 /turtle1/rotate_absolute 动作的动作服务器。

6. ros2 interface show 命令

在自己发送或执行动作目标之前,你还需要一个信息,就是动作类型的结构。

在运行命令 ros2 action list -t 时知道了 /turtle1/rotate_absolute 的类型是 turtlesim/action/RotateAbsolute 。在你的终端中输入以下带有动作类型的命令:

ros2 interface 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

这个消息的第一部分,在—之上,是目标(goal)请求的结构(数据类型和名称)。接下来的部分是结果(result)的结构。最后一节是反馈(feedback)的结构。

7. ros2 action send_goal 命令

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

ros2 action send_goal   

需要是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.57Goal accepted with ID: f8db8f44410849eaa93d3feb747dd444Result:delta: -1.568000316619873Goal finished with status: SUCCEEDED

所有目标都有一个独特的ID,显示在返回信息中。你也可以看到结果,一个名为 delta 的字段,它是到起始位置的位移。

要看到这个目标的反馈,需要在 ros2 action send_goal 命令中添加 --feedback :

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

你的终端将返回如下信息:

Sending goal:theta: -1.57Goal accepted with ID: e6092c831f994afda92f0086f220da27Feedback:remaining: -3.1268222332000732Feedback:remaining: -3.1108222007751465…Result:delta: 3.1200008392333984Goal finished with status: SUCCEEDED

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

相关内容

热门资讯

台州最新学区划分,最新或202... 台州公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍台州小...
衢州最新学区划分,最新或202... 柯城区最新或2023(历届)学区划分衢江区最新或2023(历届)学区划分
舟山最新学区划分,最新或202... 临城新区】1、南海实验小学片区:新城沈白线以南、千岛路以西区域,以及长峙社区居民子女。2、舟山第二小...
④电子产品拆解分析-太阳能自动... ④电子产品拆解分析-太阳能自动感应灯一、功能介绍二、电路分析以及器件作用1、太阳能控制电路分析2、优...
丽水最新学区划分,最新或202... 根据“就近入学,统筹安排”为原则,公办小学学区划分也已出炉。  市实验学校:丽阳门居委、高井弄居委。...
海南最新学区划分,最新或202... 1.市直属学校招生范围划分小 学招 生 范 围海口市滨海第九小学滨海大道北侧(至海边),港进路和港集...
从ChatGPT到AGI还有多... 1.引子 21年开始在公司负责一个全链路语音的项目,支持公司的Iot设备,...
海口最新学区划分,最新或202... 海口公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍海口小...
青海最新学区划分,最新或202... 为方便家长和学生们了解自己孩子所就读的小学或是自己孩子的户口究竟在不在想要入读的中学的学区范围内,小...
西宁最新学区划分,最新或202... 西宁公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍西宁小...
三亚最新学区划分,最新或202... 三亚公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍三亚小...
贵州最新学区划分,最新或202... 为方便家长和学生们了解自己孩子所就读的小学或是自己孩子的户口究竟在不在想要入读的中学的学区范围内,小...
21- 神经网络模型_超参数搜... 知识要点 fetch_california_housing:加利福尼亚的房价数据&#...
一文了解GPU并行计算CUDA 了解GPU并行计算CUDA一、CUDA和GPU简介二、GPU工作原理与结构2.1、基础GPU架构2....
贵阳最新学区划分,最新或202... 贵阳公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍贵阳小...
遵义最新学区划分,最新或202... 遵义公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍遵义小...
安顺最新学区划分,最新或202... 安顺公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍安顺小...
六盘水最新学区划分,最新或20... 百年教育网小编为您整理了关于六盘水市幼升小学区划分详情的相关信息,希望对您有帮助,想了解更多请继续关...
遍历二叉树线索二叉树 遍历二叉树 遍历定义 顺着某一条搜索路径寻访二叉树中的每一个结点,使得每个节点均被依次...
springboot简介和项目... Java知识点总结:想看的可以从这里进入 目录SpringBoot1、简介和原理1....