前面我们学习了ROS当中的“发布--订阅“模型,知道了两个节点之间通过话题进行异步通信的具体方式。但是订阅与发布模型存在一个小小的问题,那就是当订阅者需要获得不同的数据时,发布者并不会根据订阅者的需要对发送的话题数据进行调整,它只负责发送设定好的话题数据。因此。针对这种情况,我们需要采用一种新的通信方式,它必须是同步的,请求一次数据,返回一次数据;多对一的,可以有多个客户端,但提供服务的服务端有一个就行了;

ROS Service 介绍

        我们来看看官方的WIKI中描述的:服务是节点之间通信的另一种方式,服务能够允许节点发送请求,并且作出响应。 (英语水平不高,翻译勉强能看)

简单点说,就是我们创建一个客户端节点,向服务端节点发送一些请求参数(我们称为request)然后服务端节点根据我们传入的参数进行处理,之后把结果再返回给客户端节点,这就是服务通信的基本过程。

Service 常用命令

  1. rosservice list (打印目前活跃的服务节点,用来查询可以用的服务)
  2. 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文件时进行分析。

详细参考

路漫漫其修远兮,吾将上下而求索。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐