前面我们学习了ROS当中的“发布--订阅“模型,知道了两个节点之间通过话题进行异步通信的具体方式。但是订阅与发布模型存在一个小小的问题,那就是当订阅者需要获得不同的数据时,发布者并不会根据订阅者的需要对发送的话题数据进行调整,它只负责发送设定好的话题数据。因此。针对这种情况,我们需要采用一种新的通信方式,它必须是同步的,请求一次数据,返回一次数据;多对一的,可以有多个客户端,但提供服务的服务端有一个就行了;
ROS Service 介绍
我们来看看官方的WIKI中描述的:服务是节点之间通信的另一种方式,服务能够允许节点发送请求,并且作出响应。 (英语水平不高,翻译勉强能看)
简单点说,就是我们创建一个客户端节点,向服务端节点发送一些请求参数(我们称为request)然后服务端节点根据我们传入的参数进行处理,之后把结果再返回给客户端节点,这就是服务通信的基本过程。
Service 常用命令
- rosservice list (打印目前活跃的服务节点,用来查询可以用的服务)
- rosservice call(call后面一般加服务名以及传入参数,即向服务节点发起一次请求)
例子:
rosrun turtlesim turtlesim_node #运行小海龟节点
rosservice list #查询目前活跃的服务节点信息
可以看到,打印了很多服务节点出来,我们主要测试 /spawn 服务,这是一个用来创建小海龟的服务。
rosservice call /spawn
我们先输一半,后面传递的参数我们不知道,这该怎么办呢?--单击tab进行格式化补全呗!
rosservice call /spawn "x: 1.0
y: 2.0
theta: 0.0
name: 'wanglei'"
我们填入参数,分别是小海龟生成的坐标,角度,坐标
这时我们可以看到,在左下角生成了一个新的小海龟!
扩展
其实在ROS中还有一个特殊的服务,我们称为参数服务器,顾名思义,参数服务器就是用来存储参数数据的,比如说我们在节点执行的过程中,需要传入一些参数,我们就可以使用特殊的参数获取函数,向参数服务器获取参数,同时这个参数服务器中的参数是全局的,它的存在,相当于一位好管家,为我们提供了参数管理的服务,关于参数服务器的详情,我们将在后面讲解launch文件时进行分析。
详细参考
路漫漫其修远兮,吾将上下而求索。