一、背景

Action是 ROS 2 中的一种通信类型,适用于长时间运行的任务。它们由三个部分组成:目标、反馈和结果。

操作建立在主题和服务之上。它们的功能类似于服务,除了可以取消操作。它们还提供稳定的反馈,而不是返回单一响应的服务。

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

二、开启演示方式

启动海龟案例的两个 turtlesim 节点,/turtlesim 和 /teleop_turtle。

打开一个新终端并运行:

ros2 run turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

三、使用动作action

当您启动 /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.

让我们关注第二行,它对应一个动作。 其中:

(G|B|V|C|D|E|R|T对应一条指令,而该指令对应于“cmd_vel”主题。F对应另一个指令,另一个动作)

请注意,字母键 G|B|V|C|D|E|R|T 在美国 QWERTY 键盘上的 F 键周围形成一个“框”(如果您不使用 QWERTY 键盘,请参阅此链接以跟随)。每个键在 F 周围的位置对应于 turtlesim 中的方向。例如,E 会将海龟的方向旋转到左上角。

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

[INFO] [turtlesim]: Rotation goal completed successfully
([INFO] [turtlesim]:轮换目标成功完成)

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

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

[INFO] [turtlesim]: Rotation goal canceled
[INFO] [turtlesim]:轮换目标取消

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

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

[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal[WARN] [turtlesim]:在上一个目标完成之前收到轮换目标。中止先前的目标

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

四、ros2 节点信息

4.1 查看 /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 操作并提供反馈。

4.2 查看 /teleop_turtle节点的操作

/teleop_turtle 节点在 Action Clients 下的名称为 /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.3 查看节点对比后结论

/turtlesim和 /teleop_turtle是一对action的服务器、客户端。通过以上信息对比,不难获得下列结论:

1)在ROS2的节点基类中,存在六个基本模块:

  • Subscribers:
  • Publishers:
  • Service Servers:
  • Service Clients
  • Action Servers: 
  • Action Clients:

2)六个模块,表示六种身分。每个节点可以是六模块中的任意一个或多个角色。

3)看上例得出: /turtlesim是action的服务器, /teleop_turtle是action的客户端。

五、针对于Action的特殊操作

5.1 ros2 action列表

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

ros2 action list

返回信息是action的名称

/turtle1/rotate_absolute

这是目前 ROS 图中唯一的动作服务,其topic名为/turtle1/rotate_absolute。

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

5.2 ros2 action list -t  动作有类型

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

 ros2 action list -t 

会返回action的类型:

/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

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

5.3 ros2 动作信息

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

ros2 action info  /turtle1/rotate_absolute

返回信息是action的发起方和接收方:

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

这告诉我们之前在每个节点上运行 ros2 节点信息所学到的知识:/teleop_turtle 节点有一个动作客户端,/turtlesim 节点有一个用于 /turtle1/rotate_absolute 动作的动作服务器。

5.4 ros2界面显示

在您自己发送或执行操作目标之前,您需要的另一条信息是操作类型的结构。

回想一下,您在运行命令 ros2 action list -t 时确定了 /turtle1/rotate_absolute 的类型。如果想看到topic数据类型的内部定义,可在终端中输入以下带有操作类型的命令:

ros2 interface show  < action的类型>

在本案例:

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

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

5.5 ros2 手工发送动作请求

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

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.57Goal accepted with ID: f8db8f44410849eaa93d3feb747dd444Result:delta: -1.568000316619873Goal 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.57Goal accepted with ID: e6092c831f994afda92f0086f220da27Feedback:remaining: -3.1268222332000732Feedback:remaining: -3.1108222007751465…Result:delta: 3.1200008392333984Goal finished with status: SUCCEEDED

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

注意:这里的 ros2 action send_goal 和 ros2 topic pub类似,都是调试节点的好工具!!!

六、总结

action类似于允许您执行长时间运行的任务、提供定期反馈并且可以取消的服务。

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

Turtlesim 有一个动作服务器(Action),动作客户端可以将目标发送到旋转海龟。在本教程中,您明白动作 /turtle1/rotate_absolute,以及是什么,它们如何工作。

Understanding actions — ROS 2 Documentation: Humble documentation

ROS on DDS (ros2.org)

ROS2初级知识(6):Action服务概念相关推荐

  1. ROS2 foxy 学习5 : Action 行动

    也是节点node之间的一种通讯方式 每个节点自己实现了action 客户端 或服务端. 客户端发起请求,action(后台中心)转发给 服务端节点 服务端node处理.执行action动作 客户端节点 ...

  2. ROS2学习(六).ROS概念 - 服务质量设置

    ROS Quality of Service settings QoS策略[^1] 同ROS 1比较 QoS配置文件 QoS兼容性 ROS1的QoS体系 QoS事件 发布者相关事件 订阅者相关事件 参 ...

  3. java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(三:注册中心、补充CAP定理、BASE 理论)~整起

    架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(一:总览篇) 网关开了个头 你请求来了,我网关把你拦截住,验明正身,加以控制,协助你调用服务,完成请求的调用.但是这个过程中,为了解耦和或者 ...

  4. SpringCloud一、前提概述、相关微服务和微服务架构理论知识、微服务技术栈有哪些、

    ①前提概述.微服务架构springcloud的相关学习. 前提知识+相关说明 1.目前,我们学习到最后的微服务架构SpringCloud,基本上需要熟悉以前的学习内容和知识:springmvc.spr ...

  5. [9-1]磁盘基本知识、分区基本概念

    本文旨在复习磁盘基础知识.分区基本概念 知识储备 按照磁盘接口类型,常有ATA.SATA.SCSI.SAS.FC等: 按照磁盘芯片组分,常有HDD机械式.SSD闪存式等: 同一芯片组可能有多种类型的接 ...

  6. 8分钟学会Consul集群搭建及微服务概念

    Consul介绍: Consul 是由 HashiCorp 公司推出的开源软件,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul 的方案更"一站式" ...

  7. 计算机的概念重点,2019考研计算机重点知识:十二大基础概念释义

    2019考研复习正在紧张的进行中,为了更好的帮助同学们学习.新东方在线为大家整理了"2019计算机考研重点知识:十二大基础概念释义"的相关信息,提醒各位考生要合理安排复习时间,做好 ...

  8. 分布式与微服务——Iaas,Paas和Saas、单体应用和缺点、微服务概念、传统 分布式 SOA 架构与微服务架构的区别、微服务实战、什么是RPC、CAP定理和BASE理论、唯一ID生成、实现分布式

    文章目录 1-什么是Iaas,Paas和Saas 一 IaaS基础设施服务 二 paas平台即服务 三saas软件即服务 四 总结 2-单体应用和缺点 一 单体应用 二 单体应用的缺陷 3-微服务概念 ...

  9. OGC标准WMTS服务概念与地图商的瓦片编号流派-web地图切片加载

    还不知道地图栅格化切片等相关GIS原理的,推荐阅读<webGIS底图栅格化与实时数据合成处理原理,地图API设计,xyz加载> OGC概念 OGC全称--开放地理空间信息联盟(Open G ...

最新文章

  1. CentOS6:安装JDK
  2. elasticsearch java likequery_ElasticSearch的模糊查询
  3. 谷歌浏览器之如何快速找到js、css等文件
  4. 模型存储在哪里_最强的模型工作收纳站「Artty Station」登场!
  5. 项目学生:带有Jersey的Web服务服务器
  6. FIle类和递归方法的使用
  7. 数据结构—链表-循环链表
  8. nginx 负载均衡集群解决方案 healthcheck_nginx_upstreams (一)
  9. Java longTime 和C#日期转换
  10. ktv服务器管理系统,KTV收银管理系统.doc
  11. Proxyee Down百度网盘高速下载器详细使用教程
  12. Unity发布WebGL遇到的问题
  13. OEM嵌入式通讯模块与西门子PLC S7-1200通讯测试指南
  14. 水果忍者(数学 叉积)
  15. 冰蝎v4.0已经更新,在Java18下也能启动冰蝎。
  16. 餐厅预订APP多少钱一套?餐厅预订APP如何收费?
  17. 直播报名|如何洞察消费者痛点?大数据分析为您支招!
  18. Audience Insights被下架后,Facebook广告定位的最佳替代方案
  19. Ubuntu 18.04 LTS版本 谷歌拼音输入法安装
  20. 斯坦福AI Lab主任Chris Manning:我的第一次CVPR

热门文章

  1. 格式工厂使用之去除水印
  2. 操作系统概念及常见的操作系统
  3. unity游戏之羊刀与Pendragon复盘:DotA做对了什么
  4. 触摸按键设计layout
  5. 防DDoS***不要再走寻常路
  6. 设计模式 模板方法模式(模板找女朋友/男朋友)
  7. 淘宝关于计算金额的一些规则
  8. 华为关闭telnet命令_华为3928配置telnet登录的命令
  9. Vitis 统一软件平台文档:应用加速开发 (UG1393)
  10. TXB0108PWR 德州TI 具有自动方向感应和 +/-15kV ESD 保护的 8 位双向电压电平转换器