ROS2学习笔记5--认识ros2服务services

概要:这篇主要认识ros2服务services

环境:ubuntu20.04,ros2-foxy,vscode

2.1.5认识ros2服务services(原文:https://docs.ros.org/en/foxy/Tutorials/Services/Understanding-ROS2-Services.html

>>教程>>认识ros2服务services

你正阅读的是ros2较老版本(Foxy),但仍然支持的说明文档.想查看最新版本的信息,请看galactic版本链接( https://docs.ros.org/en/galactic/Tutorials.html

认识ros2服务services

目标:使用命令汗学习ros2服务

课程等级:初级

时长:10min

目录:

1.背景
2.预备知识
3.步骤
3.1配置
3.2 ros2 service list
3.3 ros2 service type
3.4 ros2 service find
3.5 ros2 interface show
3.6 ros2 service call
4.总结
5.下一步
6.相关内容

1.背景

服务是ros网络中节点通信的另一种方式.服务基于呼叫-回复模式,以之对比的话题是基于发布-订阅模式.话题可以让所有节点订阅数据流并且持续更新,而服务仅当它们收到客户端的请求才提供数据.

图片.png
图片.png
(这是一个动态图,建议原文链接查看)

2.预备知识

本节课提及的一些概念,如节点,话题,在前面课程有所学习.

你要准备好turtlesim小乌龟仿真包

老规矩,别忘记在新打开终端source一下配置文件(环境变量)(个人,如果ros2的环境变量写到启动脚本.bashrc里面,没必要再source一次了).

3.步骤

3.1配置

开一个终端,运行:

ros2 run turtlesim turtlesim_node

另开一个终端,运行:

ros2 run turtlesim turtle_teleop_key

3.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.turtlesimrqt课程中的rqt, 你还记得使用其来展现服务交互关系.

3.3 ros2 service type

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

为了找出服务的类型,使用下面指令:

ros2 service type <service_name>

tertlesim/clear服务为例,新开终端输入指令:

ros2 service type /clear

会返回:

std_srvs/srv/Empty

Empty类型表示当有请求唤起服务,但服务不会发送任何数据;当接受响应时,服务也不会接收任何数据.

3.3.1 ros2 sevrice 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]

3.4 ros2 service find

如果你查找众多服务里的特定类型服务,可以使用指令:

ros2 service find <type_name>

比如,你打算查询的是Empty类型服务,如:

ros2 service find std_srvs/srv/Empty

将会得到(下面两个服务属于这种类型):

/clear
/reset

3.5 ros2 interface show

你可以通过命令行来激活服务,但前提是你要知道输入参数的结构.

ros2 interface show <type_name>.srv

/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参数是可选填的.

本案中线下方的信息,你只需要知道即可,但其可以帮助你理解从请求中获取响应的数据类型.

3.6 ros2 service call

既然你知道了服务类型是什么,如何去找服务的类型,如何找类型的参数结构,你就可以使用如下指令请求服务:

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

<arguments>参数部分是可选择的,比如,你知道的Empty类型服务就没有参数这部分的:

ros2 service call /clear std_srvs/srv/Empty

这个指令会清除你的小乌龟之前绘制的一些线条.
图片.png

现在,让我们请求/spawn 服务并输入参数来生成一个新小乌龟.在命令行输入服务的<arguments>参数应该遵循YAML语法.

输入指令:

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

你策略性看看发生什么,然后这个服务会响应:

waiting for service to become available...
requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='None')

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

更新小乌龟仿真窗口,在指定位置出现一个新乌龟.
图片.png

4.总结

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

一般情况下,你不会想使用服务来连续调用一个服务;话题,甚至动作可能更好符合(这种连续调用的情形).

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

5.下一步

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

6.相关内容

学习一下这个课程(https://discourse.ubuntu.com/t/call-services-in-ros-2/15261),其利用Robotis机器人手臂实践了本课程的内容,是一个很优秀的实际运用.

其他

Services服务也是node节点信息交流的方式之一,与topic(发布-订阅)不同的是,其采用的是呼叫-响应的方式.

个人认为重点:

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> #请求服务

这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.

#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值