话题Topic是订阅器与发布器节点之间的,而服务则是客户端(Client)和服务器(Server)间的,前者是异步的,后者是同步的。而且话题是单项的不需要服务器上线,而服务是双向的。在开启服务之前要先打开客户端,所以流程应该是客户端的建立→服务的建立,就像是要现有饭店才能有菜单,客人才能点菜,才能凭借饭店给客人提供服务。
创建功能包
src文件夹下输入一下内容
客户端实现
引入库
在这里python程序多了一个sys库但是后面的代码里并没有看见。
c++ python
ROS 节点初始化
c++ python
这里还是一样的定义节点的名称,python函数的名字和节点的名字一样都是turtle_spawn 。
定义客户端
c++ python
可以看出在定义客户端的时候,C++语言依旧创建了一个句柄,之前创建的句柄是n在n.publicer这里定义的句柄是node所以是node.serviceClient,老规矩定义了服务名是/spawn,客户端的名字是add_turtle,服务的数据类型是Spawn它存在于turtlesim依赖下。特别的是,客户端定义的时候多了一个等待要等待到名为/spawn的服务的时候才开始定义客户端。
客户端响应
c++ python
客户端调用
在这里C++是通过客户端.call的方式调用数据,call也是自带等待的,等待service的应答处理结果,一直等着知道小海龟建立成功,就像百度搜索的时候网不好它会一直转圈圈一样。ROS_INFO也不过是print一下数据,同样字符串的位置是多了一个c_str()的;而python的服客户端调用显然更加方便,之前定义的add_turtle直接就可以送入数据得到响应变量reponse,只需要返回输出一下reponse.name,这里我觉的返回那个值都行,反正函数也不输出什么。except是try对应出现的,如果出现错误就输出一下错误。
数据初始化(设定数据输入)
C++文件将数据送入到srv 变量中,在通过服务器调用,python我们之前也提过了直接就能送入数据。
主程序调用
c++ python
这一部分是根据代码逻辑来的,C++输出一下,然后返回个0就结束了。python也需要print一下,这个print的语句打印的是名字,所有函数turtle_spwan函数的返回值必须是名字,所以之前说的可以返回其他选项就不合适了,但是这套程序是将try封装在了函数turtle_spawn中,之前的publisher是封装在主函数外面的,其实也是可以的。
CMakeList.txt文件
封装成可执行文件,python函数不用调用的时候输入程序名.py就可以
python调用的时候输入程序名.py
c++ python
多生成几个海龟是一样的,多输入数据,然后返回就可以了。
服务器实现
节点初始化
创建Server服务器
创建一个发布器