ROS 学习应用篇(三)服务Server学习之Server

话题Topic是订阅器与发布器节点之间的,而服务则是客户端(Client)和服务器(Server)间的,前者是异步的,后者是同步的。而且话题是单项的不需要服务器上线,而服务是双向的。在开启服务之前要先打开客户端,所以流程应该是客户端的建立→服务的建立,就像是要现有饭店才能有菜单,客人才能点菜,才能凭借饭店给客人提供服务。

ROS 学习应用篇(三)服务Server学习之Server_第1张图片

创建功能包

src文件夹下输入一下内容

客户端实现

 引入库

在这里python程序多了一个sys库但是后面的代码里并没有看见。

ROS 学习应用篇(三)服务Server学习之Server_第2张图片

 c++                                                                                python   

ROS 节点初始化

ROS 学习应用篇(三)服务Server学习之Server_第3张图片ROS 学习应用篇(三)服务Server学习之Server_第4张图片

 c++                                                                                python   

这里还是一样的定义节点的名称,python函数的名字和节点的名字一样都是turtle_spawn 。

定义客户端

ROS 学习应用篇(三)服务Server学习之Server_第5张图片

c++                                                                                python    

 可以看出在定义客户端的时候,C++语言依旧创建了一个句柄,之前创建的句柄是n在n.publicer这里定义的句柄是node所以是node.serviceClient,老规矩定义了服务名是/spawn,客户端的名字是add_turtle,服务的数据类型是Spawn它存在于turtlesim依赖下。特别的是,客户端定义的时候多了一个等待要等待到名为/spawn的服务的时候才开始定义客户端。

客户端响应

ROS 学习应用篇(三)服务Server学习之Server_第6张图片ROS 学习应用篇(三)服务Server学习之Server_第7张图片

c++                                                                                python   

客户端调用

在这里C++是通过客户端.call的方式调用数据,call也是自带等待的,等待service的应答处理结果,一直等着知道小海龟建立成功,就像百度搜索的时候网不好它会一直转圈圈一样。ROS_INFO也不过是print一下数据,同样字符串的位置是多了一个c_str()的;而python的服客户端调用显然更加方便,之前定义的add_turtle直接就可以送入数据得到响应变量reponse,只需要返回输出一下reponse.name,这里我觉的返回那个值都行,反正函数也不输出什么。except是try对应出现的,如果出现错误就输出一下错误。

数据初始化(设定数据输入)

C++文件将数据送入到srv 变量中,在通过服务器调用,python我们之前也提过了直接就能送入数据。

主程序调用

ROS 学习应用篇(三)服务Server学习之Server_第8张图片ROS 学习应用篇(三)服务Server学习之Server_第9张图片

 c++                                                                                python   

这一部分是根据代码逻辑来的,C++输出一下,然后返回个0就结束了。python也需要print一下,这个print的语句打印的是名字,所有函数turtle_spwan函数的返回值必须是名字,所以之前说的可以返回其他选项就不合适了,但是这套程序是将try封装在了函数turtle_spawn中,之前的publisher是封装在主函数外面的,其实也是可以的。

CMakeList.txt文件

封装成可执行文件,python函数不用调用的时候输入程序名.py就可以

python调用的时候输入程序名.py

c++                                                                                python   

多生成几个海龟是一样的,多输入数据,然后返回就可以了。

服务器实现

节点初始化

创建Server服务器

创建一个发布器

你可能感兴趣的:(ROS,ROS,学习)