ROS 学习应用篇(五)服务Server学习之自定义服务与调用

在之前我学着如何建立一个话题Topic的消息类型,那时候建立了一个msg文件,包括,消息名称和消息数据类型(int还是什么之类的。),将其链接到CMakeList,.xml文件补录需要的依赖,CMakeList文件也模块的补充依赖,包括编译依赖和执行依赖。catkin_make一下就会生成一个.h的头文件,这个头文件就像一个消息类型库一样,需要在编译代码之前引入库,而cpp代码链接到CMakeList文件的时候多了句反馈代码。这就是话题消息数据类型定义的详细过程。

接下来是service服务的数据类型自定义

自定义服务类型的定义

Person.srv文件的定义(数据接口文件的定义)

创建srv文件

ROS 学习应用篇(五)服务Server学习之自定义服务与调用_第1张图片

定义.srv文件内容

ROS 学习应用篇(五)服务Server学习之自定义服务与调用_第2张图片

老规矩,定义变量名称,变量数据类型,不同的是消息是单项的不需要回馈,只需要订阅,但是服务是需要售后回馈的,在之前我们知道服务是有req和res的,也就是要求和回应,二者通过---来间隔,所以srv文件的定义也是如此。(所以我猜服务也是可以订阅的,课后问题3

package.xml文件的编译

这里需要的依赖和消息的自定义是一样的。

build_depend

build_depend是编译依赖,message_generation是一个消息的编译依赖。

exec_depent 

exec_depent是执行依赖,message_runtime是一个消息的动态执行依赖。

CMakeList.txt文件的修改

添加依赖包

ROS 学习应用篇(五)服务Server学习之自定义服务与调用_第3张图片

 链接Person.srv文件

ROS 学习应用篇(五)服务Server学习之自定义服务与调用_第4张图片

链接ROS中已有的依赖

ROS 学习应用篇(五)服务Server学习之自定义服务与调用_第5张图片

链接执行依赖

编译头文件

编译生成Person.h头文件

编译好的头文件.h在如下目录中

ROS 学习应用篇(五)服务Server学习之自定义服务与调用_第6张图片ROS 学习应用篇(五)服务Server学习之自定义服务与调用_第7张图片

自定义服务的调用

客户端建立

这一部分可以参照(二)的内容,其实是一样的。区别在于主循环段服务内容不一样,特别的是req段C++中的result是string字符串所以需要.c_str()一下。

c++                                                                                python  

服务端配置

跟之前的一模一样。

ROS 学习应用篇(五)服务Server学习之自定义服务与调用_第8张图片ROS 学习应用篇(五)服务Server学习之自定义服务与调用_第9张图片

c++                                                                                python   

注意反馈数据result会在客户端的代码中输出,但是实际上反馈什么样的数据实在服务端的代码中送入,书写的,不过是在客户端中打印出来而已。其实就是客户端需要反馈数据,但是反馈的是什么是由服务的结果来决定的。

头文件调用

订阅与发布的主要调用方式,就在代码开始的地方输入头文件,这个Person.h头文件是catkin_make编译功能包后存放在工作空间devel/include下对应的功能包名文件夹下的。

c++                                                                                python  

CMakeList.txt文件

ROS 学习应用篇(五)服务Server学习之自定义服务与调用_第10张图片

该文件的修改和已有的服务类型的区别在于最后一行代码,最后一行代码是将这个可执行文件与srv文件产生一个依赖的关系,而原有的消息类型则不需要加入这一行代码也是可以运作的。

最后一行代码和话题不同的最后那里,服务是_gencpp,消息是_generate_messages_cpp

编译

catkin_make

roscore

新开终端_客户端(1)

新开终端_服务端(2) 

服务端输出

客户端输出

ROS 学习应用篇(五)服务Server学习之自定义服务与调用_第11张图片

题外话

之前我们说话题Topic构建链接后,roscore就可以关闭了,但是服务不行,服务里关闭roscore就会出现一下错误。

 

 

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