ROS2 学习笔记5:了解ROS2 服务Service_ros2怎么查看活跃的service-程序员宅基地

技术标签: 学习  笔记  ROS2  

Background 背景

服务是ROS 中节点的另一种通讯方法。服务基于请求和响应模型,而不是话题的发布-订阅模型。话题订阅可以使订阅节点持续获取数据流,服务只对具体调用的客户端节点提供数据。

思考及疑问: 多个 Service Clients 使用相同 Service,Server 如何区分,Node ID? Src port?

在这里插入图片描述

在这里插入图片描述

Prerequisites 前提

Tasks 任务

1 Setup

启动两个turtlesim节点, /turtlesim/teleop_turtle 在两个不同终端分别输入:

ros2 run turtlesim turtlesim_node     
ros2 run turtlesim turtle_teleop_key   

2 ros2 service list

在新终端中运行 ros2 service list 命令将返回系统中当前活动的所有服务的列表:

/clear
/kill
/reset
/spawn
/teleop_turtle/describe_parameters
/teleop_turtle/get_parameter_types
/teleop_turtle/get_parameters
/teleop_turtle/list_parameters
/teleop_turtle/set_parameters
/teleop_turtle/set_parameters_atomically
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/describe_parameters
/turtlesim/get_parameter_types
/turtlesim/get_parameters
/turtlesim/list_parameters
/turtlesim/set_parameters
/turtlesim/set_parameters_atomically  

你会发现两个节点在的6个服务名字中都带有parameters ,几乎每一个ros2节点的服务都是以参数parameters为基础。下一个节课会深入了解参数paramters ,本课程省去参数服务的讨论。

现在,专注于turtlesim服务,/clear, /kill, /reset, /spawn, /turtle1/set_pen, /turtle1/teleport_absolute,和/turtle1/teleport_relative。之前课程中使用rqt来展现了相关服务交互关系。

3 ros2 service type

服务类型描述的是,服务的 请求/响应 数据结构是怎样的。服务类型的定义类似话题类型,但服务类型有两部分组成:一个是请求,另一个是响应。

思考及疑问: service type 的具体定义方式

查看具体服务的类型,使用下面指令:

ros2 service type <service_name>

turtlesim/clear 服务。在新终端中,输入命令:

ros2 service type /clear

返回:

std_srvs/srv/Empty

Empty 类型是指服务调用在发出请求时不发送任何数据,在收到响应时不接收任何数据。

3.1 ros2 service list -t

要同时查看所有活动服务的类型,可以将 --show-types 选项 (缩写为 -t ) 附加到 list 命令中:

ros2 service list -t

返回:

/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]
...

4 ros2 service find

如果要查找特定类型的所有服务,可以使用以下命令:

ros2 service find <type_name>

例如,您可以找到所有 Empty 类型 服务,如下所示:

ros2 service find std_srvs/srv/Empty

返回:

/clear
/reset

5 ros2 interface show

您可以从命令行调用服务,但首先需要了解输入参数的结构

ros2 interface show <type_name>

/clear 服务的类型 Empty 运行此命令:

ros2 interface show std_srvs/srv/Empty.srv

返回:

---

---将请求结构 (上) 与响应结构 (下) 分开。但是,如前所述, Empty 型不发送或接收任何数据。所以,它的结构是空白的。

探索一下可以传送和接受数据的服务,例如/spawn。从上面ros2 service list -t指令可以获知,/spawn服务类型是turtlesim/srv/Spawn

查看请求/spawn服务的参数,运行如下指令:

ros2 interface show turtlesim/srv/Spawn

返回:

float32 x
float32 y
float32 theta
string name # Optional.  A unique name will be created and returned if this is empty
---
string name

---上方的信息表示 请求服务/Spawn的所需参数.x, ytheta决定者生成小乌龟的位置,而name参数是可选的。

---下方的信息,不必了解,但其可以帮助你理解从请求中获取响应的数据类型。

6 ros2 service call

既然知道什么是服务类型,如何找到服务的类型,以及如何找到该类型参数的结构,您可以使用以下方法调用服务:

思考及疑问: rqt 中 call service 的本质:从一个节点发布请求服务

ros2 service call <service_name> <service_type> <arguments>

<arguments> 部分是可选的。例如,您知道 Empty 类型服务没有任何参数:

ros2 service call /clear std_srvs/srv/Empty

这个指令会清除小乌龟之前绘制的一些线条
在这里插入图片描述
通过调用 /spawn 输入参数来产生一只新的乌龟。从命令行在服务调用中输入 <arguments> 需要采用YAML语法。

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

可以看到请求发布,然后是服务响应:

requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')

response:
turtlesim.srv.Spawn_Response(name='turtle2')

turtlesim窗口将立即更新新产生的海龟:
在这里插入图片描述

Summary 总结

在ros2里面,节点可通过服务进行通信。不像话题那样,一个节点发布消息可以被一个或多个订阅器接收的的通信方式;服务是一种请求/响应模式,客户端节点发出请求,服务端节点处理这个请求并给出响应。

通常,不会连续调用一个服务;话题,甚至动作更符合这种场景。

在本教程中,你使用了命令行工具去识别,详细说明和调用服务。

Next steps 下一步

下一节课,认识ros2参数parameters,你会学习配置节点。

命令合集

ros2 service -h  #查看命令帮助      

ros2 service list 罗列服务列表      

ros2 service type <service_name> #展示指定服务的类型      

ros2 service list -t #罗列带有类型的服务列表      

ros2 service find <type_name> #查找特定类型的服务清单      

ros2 interface show <type_name>.srv #类型详细参数查看      

ros2 service call <service_name> <service_type> <arguments> #请求服务

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43180456/article/details/135686731

智能推荐

RabbitMq初识_guest user from anywhere on the network-程序员宅基地

文章浏览阅读145次。文章目录一、认识二、安装1.docker安装2. 配置文件2.RabbitMQ的简单指令三、分类1. Direct直连问题:2. Work queue3. Fanout4. Routing4.1 Direct(订阅)4.2 Topic四、SpringBoot整合RabbitMQ一、认识[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TJhBYPKI-1586753..._guest user from anywhere on the network

今天端午节了,哈哈。。。-程序员宅基地

文章浏览阅读425次。今天过端午了,记录一下。。。先从百度入手,百度一篇《【创意Logo】浓浓的端午味儿……》来叙解了一下她的logo。端一盘粽子,呈一枝艾叶,与你一起过——端午。 自多了端午节假日,端午的“节”气立时浓了起来。这也让现时代的人们,体味到了旧时中国的传统意味。农历五月初五,端午。在中国,流传至今的节日“四大名旦”,当属春节、中秋、清明和端午。而这四者中,端午名气相..._csdn 今天端午了哈哈

JS 判断字符串中是否包含中文-程序员宅基地

文章浏览阅读974次,点赞3次,收藏2次。第一种方法: <script language="javascript"> function funcChina(){ var obj = document.form1.txtName.value; if(/.*[\u4e00-\u9fa5]+.*$/.test(obj))..._js 判断中文

理解崩溃和崩溃日志(WWDC 2018 session 414)_4418 崩溃-程序员宅基地

文章浏览阅读1.8k次。WWDC 2018 session 414: Understanding Crashes and Crash Logs每个人在写代码的时候,或多或少都会犯错。有的错误就会导致程序崩溃,这非常影响用户体验。本session主要介绍崩溃的原理,他们为什么会发生,以及如何查看、分析崩溃日志,找到并解决问题。基础知识崩溃是什么?崩溃指的是应用程序在尝试执行不允许的操作时,突然中止的..._4418 崩溃

九度1167 数组排序-程序员宅基地

文章浏览阅读1.2k次。/********************************* * 日期:2013-1-29 * 作者:SJF0115 * 题号: 九度1167 * 题目:数组排序 * 来源:http://ac.jobdu.com/problem.php?pid=1167 * 结果:AC * 题意: * 总结:****************

组合预测模型 | GA-LSTM遗传算法优化长短期记忆网络多输入单输出数据回归预测模型(Matlab程序)-程序员宅基地

文章浏览阅读397次。组合预测模型 | GA-LSTM遗传算法优化长短期记忆网络多输入单输出数据回归预测模型(Matlab完整程序)_ga-lstm

随便推点

关于fastjson 对象转json出现$ref_"fastjson 转的json,\"$ref\":\"$. jsjson.parse("-程序员宅基地

文章浏览阅读781次。 现在微服务、前后分离什么的那么流行,多数新的程序在返数据给前端的时候直接返回json 数据,这样json工具就有用武之地了常用的json工具有 org.json、Gson 、albaba的fastjson。 昨天本来是用fastjson 对象转json了,发现有些重复引用的对象 会如下展示{"$ref":"$.data.list[0].list[34]"} 看着就像是坐标,这..._"fastjson 转的json,\"$ref\":\"$. jsjson.parse("

禾川Q1系列PLC官方教程_禾川学院培训资料-程序员宅基地

文章浏览阅读3.2k次。禾川Q系列PAC教程_禾川学院培训资料

Eclipse详细安装教程_eclipse的安装步骤-程序员宅基地

文章浏览阅读9.3k次,点赞7次,收藏26次。Eclipse安装教程前言一、Eclipse是什么?二、安装步骤1. Eclipse下载下载网址2. Eclipse安装前言Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。一、Eclipse是什么?Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。二、安装步骤1. E_eclipse的安装步骤

计算机组成原理练习题_在底数取16及尾数为二进制的浮点数中,为了保持数值不变,阶码加1,尾数要( )。-程序员宅基地

文章浏览阅读497次,点赞20次,收藏21次。4. (单选题, 7分)计算机问世至今,新型机器不断推陈出新,不管怎样更新,依然保有“存储程序”的概念,最早提出这种概念的是( )。3. (单选题, 5分)在底数取 16及尾数为二进制的浮点数中 , 为了保持数值不变 , 阶码加 1, 尾数小数点要_( )__。2. (单选题, 5分)若浮点数的机器表示中,尾数用补码表示,则判断该浮点数是否为规格化的方法是尾数的最高数值位__( )__。5. (单选题, 5分)x=+0. 1011, y=+0. 0110,用补码运算得到[x-y]补 =___( )__。_在底数取16及尾数为二进制的浮点数中,为了保持数值不变,阶码加1,尾数要( )。

2013年东北c语言考试题答案,2013东北大学c语言试题-程序员宅基地

文章浏览阅读104次。信息学院 2013-2014 学年第 1 学期 程序设计基础 试题 a总分 班 级装一二 30三 24四 26五六七八九十(10) 若有说明语句:int *p,a;则能通过 scanf 语句正确给输入项读入数据 的程序段是_______。 A) *p=&a; scanf(“%d”,p); B) *p=&a; scanf(“%d”,*p); C) p=&a; scanf(“%..._c语言中的数据的类型不同,在内存中占据不同长度的存储单元

Meta 的 LLaMa 2 许可证并非开源许可证-程序员宅基地

文章浏览阅读347次。作者有幸受邀参加 Linux 基金会 7 月 27 日在瑞士日内瓦举办的 Open Source Congress,议程如下:https://oscongress2023.sched.com/。我看到了互动讨论环节建议参会者预先阅读的一些报告和文章里,其中有一篇 OSI 的博客《Meta 的 LLaMa 2 许可证不是开源许可证》,特别引起了我的注意,也因此取得了 OSI 的同意,将它翻译出来..._2023年7月20日,开源组织osi(open source initiative)发文指出,llama 2所适用的许