【ROS2 入门】ROS 2 actions 概述

news2024/12/25 12:15:27

        大家好,我是虎哥,从今天开始,我将花一段时间,开始将自己从ROS1切换到ROS2,在上一篇中,我们一起了解ROS 2中Parameters, 这一篇,我们主要会围绕ROS中另外一个重要的概念“Actions ”来展开。

目录

1 、启动模拟节点

2、 Use actions

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

8、总结


        操作(Actions)是ROS 2中用于长时间运行任务的通信类型之一。它们由三部分组成:目标、结果和反馈。Actions基于主题和服务。它们的功能类似于服务,只是动作是可抢占的(您可以在执行时取消它们)。它们还提供稳定的反馈,而不是返回单一响应的服务。

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

1 、启动模拟节点

到现在,你应该可以轻松地启动turtlesim。打开一个终端,执行如下命令:

ros2 run turtlesim turtlesim_node

打开一个新的终端,启动遥控节点:

ros2 run turtlesim turtle_teleop_key

2、 Use actions

当您启动/teolep_turtle节点时,您将在终端中看到以下消息:

Reading from keyboard
---------------------------
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.
'Q' to quit.

        让我们关注第4行,它对应于一个动作。(第一条指令对应于“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 node info

要查看/turtlesim节点的操作,请打开一个新终端并运行命令:

ros2 node info /turtlesim

它将返回/turtlesim的订户、发布者、服务、动作服务器和动作客户端的列表:

nvidia@ubuntu:~$ ros2 node info /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动作并为其提供反馈。/teolep_turtle节点在Action Clients下的名称为/turtle1/rotate_absolute,这意味着它发送该动作名称的目标。

ros2 node info /teleop_turtle
nvidia@ubuntu:~$ 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、 ros2 action list(列表)

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

ros2 action list
nvidia@ubuntu:~$ ros2 action list
/turtle1/rotate_absolute

这是ROS图中目前唯一的操作。它控制着海龟的旋转,正如你前面看到的。通过使用ros2 node info<node_name>命令,您还可以知道该操作有一个操作客户端(/teolep_turtle的一部分)和一个操作服务器(/turtlesim的一部分)。

4.1 ros2 action list -t

操作具有与主题和服务类似的类型。要查找/tuttle1/rotate_absolute的类型,请运行以下命令:

ros2 action list -t
nvidia@ubuntu:~$ ros2 action list
/turtle1/rotate_absolute
nvidia@ubuntu:~$ ros2 action list -t
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

在每个动作名称右侧的括号中(在本例中仅限/turtle1/rotate_absolute)是动作类型,即turtlesim/action/RotateAbsolute。当您想要从命令行或代码中执行操作时,您将需要此选项。

5、 ros2 action info(详细信息)

您可以使用以下命令进一步了解和查看/tuttle1/rotate_absolute操作:

ros2 action info /turtle1/rotate_absolute

会得到如下回复:

nvidia@ubuntu:~$ ros2 action info /turtle1/rotate_absolute
Action: /turtle1/rotate_absolute
Action clients: 1
    /teleop_turtle
Action servers: 1
    /turtlesim

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

6、 ros2 interface show(接口结构)

在自己发送或执行行动目标之前,还需要一条信息,那就是行动类型的结构。回想一下,在运行命令ros2 action list-t时,您标识了/tuttle1/rotate_absolute的类型。在终端中输入具有操作类型的以下命令:

ros2 interface show turtlesim/action/RotateAbsolute.action

会得到如下回复:

nvidia@ubuntu:~$ ros2 interface show turtlesim/action/RotateAbsolute.action
# 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 action 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}"

会得到如下回复:

nvidia@ubuntu:~$ 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: 5cd8eb561348477abbb532fc816ce792
​
Result:
    delta: 1.5680029392242432
​
Goal finished with status: SUCCEEDED

所有目标都有一个唯一的ID,显示在返回消息中。您还可以看到结果,一个名为delta的字段,它是到起始位置的位移。要查看此目标的反馈,请在上次运行的命令中添加--feedback。首先,确保改变θ的值。运行上一个命令后,乌龟将已经处于1.57弧度的方向,因此除非您传递新的θ,否则它不会移动。

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

会看到连续的打印输出:

nvidia@ubuntu:~$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback
Waiting for an action server to become available...
Sending goal:
     theta: -1.57
​
Feedback:
    remaining: -1.046811819076538
​
Goal accepted with ID: 9d189d65de984057ad9c92f6b7580e39
​
Feedback:
    remaining: -1.0308117866516113
​
Feedback:
    remaining: -1.0148117542266846
​
。。。。。。。。
​
​
Feedback:
    remaining: -0.006811380386352539
​
Result:
    delta: 1.0400004386901855
​
Goal finished with status: SUCCEEDED

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

8、总结

        动作就像服务,允许您执行长期运行的任务,提供定期反馈,并且可以取消。

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

        Turtlesim有一个动作服务器,动作客户端可以向其发送旋转乌龟的目标。在本教程中,您对动作/turtle1/rotate_absolute进行了详细了解,以更好地了解动作是什么、以及它们是如何工作的。

以上就是我今天要分享的内容。纠错,疑问,交流: 911946883@qq.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 系统调用的实现(x86_64)

目录 1、系统调用的定义 1.1 SYSCALL_METADATA宏 1.2 __SYSCALL_DEFINEx定义 2、系统调用表-sys_call_table数组的定义 3、用户态系统调用流程 kernel 5.10 1、系统调用的定义 系统调用的定义我们其实都不陌生&#xff0c;类似这样的函数SYSCALL_DEFINE0&#xff0c; SYSC…

C语言常见错误汇总

1 数组遍历时使用sizeof(a) 任务&#xff1a;有个数组&#xff0c;找出第二大的数&#xff0c;并且打印出来&#xff08;使用*操作数组元素个数&#xff0c;不要使用[]&#xff09; #include<stdio.h> int main01() {int a[] { 100,100,100,234,123,500,32,68,41,99,1…

code.org免费的少儿编程入门平台

现在市面上的少儿编程课&#xff0c;都是先花9.9就能体验几节课&#xff0c;然后要花几千块才能继续学习后面的课程。这些钱大可不必花。 现在给大家推荐一个免费的网站&#xff0c;code.org&#xff0c;它是一个非营利组织创办的网站&#xff0c;目标是让每个学生都能像生物、…

高并发系统设计 --多级缓存

为了提高系统的性能&#xff0c;一般会引入“缓存机制”&#xff0c;将部分热点数据存入缓存中&#xff0c;用空间换取时间&#xff0c;以达到快速响应的目的。 我们对缓存的认知停留在redis&#xff0c;但其实缓存远远不是只有redis的&#xff0c;从客户端发起请求开始&#…

MySQL整体使用》导入数据、约束、多表查询、事务、变量类型、资源占用

我发的MySQL相关内容&#xff1a; C#基础知识体系框架图&#xff0c;及起对应我发过的博客 linux安装mysql8配置使用&#xff0c;并解决常见问题 MySQL常用命令&#xff08;DQL&#xff09; 执行脚本命令&#xff0c;本地生成SQL文件后在服务器执行 // 进入mysql命令控制 m…

svg绘(viewBox viewport preserveAspectRatio)代替png图片等

当我们的代码中需要一个小图标的时候没必要去iconfont进行下载图标使用 要是下载的png格式那么容量还很大 远不如svg 直接自己代码写 记住svg的坐标朝向和数学坐标轴不一样 实现下图添加的小图标 <svg width"20px" height"20px" style"border: …

2023java面试之Zookeeper基础

一、说说 Zookeeper 是什么&#xff1f;直译&#xff1a;从名字上直译就是动物管理员&#xff0c;动物指的是 Hadoop 一类的分布式软件&#xff0c;管理员三个字体现了 ZooKeeper 的特点&#xff1a;维护、协调、管理、监控。简述&#xff1a;有些软件你想做成集群或者分布式&a…

冯诺依曼体系结构

冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成&#xff1a; 输入单元&#xff1a;包括键盘, 鼠…

netbeans中配置maven

deploy-发布到远程maven库本节默认maven库为nexusnetbeans中按ctrl1&#xff0c;打开Project窗口&#xff1b;在Project窗口中找到相关的project或module,在项目名上点击鼠标右键&#xff1b;在弹出菜单中找到菜单“Run Maven”的子菜单“Goals”&#xff0c;并点击&#xff0c…

PCB封装创建(IC类+USB)

目录 一&#xff1a;IC类 封装原理图 规格参数选最大。创建过程 1.放置焊盘 2.我们需要八个上图焊盘&#xff0c;可以用特殊粘贴 3.丝印层设置 封装向导 右击0805R&#xff0c;选择footprint 输入焊盘尺寸 二&#xff1a;USB封装 原理图 创建过程 1.放置焊盘&#x…

SSM 03_SpringMVC REST风格 Postman SSM整合 拦截器

01-SpringMVC简介SpringMVC是隶属于Spring框架的一部分&#xff0c;主要是用来进行Web开发&#xff0c;是对Servlet进行了封装。SpringMVC是处于Web层的框架&#xff0c;所以其主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果响应给前端&#xff0c;所…

元宇宙时代业务扩张,专精特新小巨人找到了增长“神器”

进入2023年&#xff0c;元宇宙时代正扑面而来。自从脸书公司更名为Meta以来&#xff0c;元宇宙就在全球迅速走红。《福布斯》认为&#xff0c;2030年全球元宇宙的市场规模有望高达5万亿美元。更为重要的是&#xff0c;元宇宙正在成为数实融合的新界面、未来商业的新型基础设施。…

如何在浏览器中安装使用Vue开发者工具?Vue开发者工具的安装使用?可直接提取插件安装使用

一个混迹于Github、Stack Overflow、开源中国、CSDN、博客园、稀土掘金、51CTO等 的野生程序员。 目标&#xff1a;分享更多的知识&#xff0c;充实自己&#xff0c;帮助他人 GitHub公共仓库&#xff1a;https://github.com/zhengyuzh 以github为主&#xff1a; 1、分享前端后端…

【阶段四】Python深度学习08篇:深度学习项目实战:循环神经网络SimpleRNN、LSTM进行淘宝商品评论文本情感分析

本篇的思维导图: 项目背景 随着信息化社会的发展,互联网成为方便、快捷的信息获取渠道之一。在电子商务和社会网站中,大量非结构化的评论文本作为最直观的用户体验数据被保存下来。如何利用这些文字信息归纳出用户对某一事、物的观点态度成为自然语言(NLP)领域一项…

RNN从理论到实战【实战篇】

来源&#xff1a;投稿 作者&#xff1a;175 编辑&#xff1a;学姐 昨天的文章中&#xff0c;我们学习了RNN的理论部分&#xff0c;本文来看如何实现它&#xff0c;包括堆叠RNN和双向RNN。从而理解它们的原理。最后看一个应用到词性标注任务的实战。 RNNCell 首先实现单时间步…

iMX6ULL —按键输入捕获与GPIO输入配置与高低电平读取

硬件介绍1.1 板子上按键原理图先来看原理图&#xff0c;我板子上有4个按键sw1~sw4:1.1.1 SW1SW1是板子的系统复位按键&#xff0c;不可编程使用1.1.2 SW2、SW3SW2&#xff1a;SNVS_TAMPER1&#xff0c;GPIO5_1平时是低电平&#xff0c;按下去是高电平。SW3&#xff1a;ONOFF它也…

2023年java面试题之zookeeper基础2

一、请描述一下 Zookeeper 的通知机制是什么&#xff1f;Zookeeper 允许客户端向服务端的某个 znode 注册一个 Watcher 监听&#xff0c;当服务端的一些指定事件触发了这个 Watcher &#xff0c;服务端会向指定客户端发送一个事件通知来实现分布式的通知功能&#xff0c;然后客…

echarts基本用法

目录 tooltip:{ // 设置提示框信息 图表的提示框组件 legend:{ // 图例组件 toolbox : { //工具箱组件 可以另存为图片等功能 grid{ //网格配置 grid可以控制线型图 柱状图 图表大小 xAxs: { // 设置x轴的相关配置 y轴同理 series:[ // 系列图表 它决定着显示那种…

Spring MVC 详解 (Spring Boot)

Spring MVC 详解 - Spring Boot一、什么是 Spring MVC1.1 MVC 定义1.2 MVC 和 Spring MVC 的关系1.3 学习目的二、Spring MVC 创建和连接2.1 创建 Spring MVC 项目2.2 相关注解三、获取参数3.1 使用 Servlet API3.2 通过方法参数直接拿到3.2.1 传递单个参数3.2.2 传递多个参数3…

【Acwing 周赛复盘】第86场周赛复盘(2023.1.14)

【Acwing 周赛复盘】第86场周赛复盘 周赛复盘 ✍️ 本周个人排名&#xff1a;678/2358 AC情况&#xff1a;2/3 这是博主参加的第一次周赛&#xff0c;深刻体会到了世界的参差 &#x1f602; 看到排名 TOP3 的大佬都是不到 5 分钟内就 AK 了&#xff0c;真是恐怖如斯&#xff0…