在之前我学着如何建立一个话题Topic的消息类型,那时候建立了一个msg文件,包括,消息名称和消息数据类型(int还是什么之类的。),将其链接到CMakeList,.xml文件补录需要的依赖,CMakeList文件也模块的补充依赖,包括编译依赖和执行依赖。catkin_make一下就会生成一个.h的头文件,这个头文件就像一个消息类型库一样,需要在编译代码之前引入库,而cpp代码链接到CMakeList文件的时候多了句反馈代码。这就是话题消息数据类型定义的详细过程。
接下来是service服务的数据类型自定义
自定义服务类型的定义
Person.srv文件的定义(数据接口文件的定义)
创建srv文件
定义.srv文件内容
老规矩,定义变量名称,变量数据类型,不同的是消息是单项的不需要回馈,只需要订阅,但是服务是需要售后回馈的,在之前我们知道服务是有req和res的,也就是要求和回应,二者通过---来间隔,所以srv文件的定义也是如此。(所以我猜服务也是可以订阅的,课后问题3)
package.xml文件的编译
这里需要的依赖和消息的自定义是一样的。
build_depend
build_depend是编译依赖,message_generation是一个消息的编译依赖。
exec_depent
exec_depent是执行依赖,message_runtime是一个消息的动态执行依赖。
CMakeList.txt文件的修改
添加依赖包
链接Person.srv文件
链接ROS中已有的依赖
链接执行依赖
编译头文件
编译生成Person.h头文件
编译好的头文件.h在如下目录中
自定义服务的调用
客户端建立
这一部分可以参照(二)的内容,其实是一样的。区别在于主循环段服务内容不一样,特别的是req段C++中的result是string字符串所以需要.c_str()一下。
c++ python
服务端配置
跟之前的一模一样。
c++ python
注意反馈数据result会在客户端的代码中输出,但是实际上反馈什么样的数据实在服务端的代码中送入,书写的,不过是在客户端中打印出来而已。其实就是客户端需要反馈数据,但是反馈的是什么是由服务的结果来决定的。
头文件调用
订阅与发布的主要调用方式,就在代码开始的地方输入头文件,这个Person.h头文件是catkin_make编译功能包后存放在工作空间devel/include下对应的功能包名文件夹下的。
c++ python
CMakeList.txt文件
该文件的修改和已有的服务类型的区别在于最后一行代码,最后一行代码是将这个可执行文件与srv文件产生一个依赖的关系,而原有的消息类型则不需要加入这一行代码也是可以运作的。
最后一行代码和话题不同的最后那里,服务是_gencpp,消息是_generate_messages_cpp
编译
catkin_make
roscore
新开终端_客户端(1)
新开终端_服务端(2)
服务端输出
客户端输出
题外话
之前我们说话题Topic构建链接后,roscore就可以关闭了,但是服务不行,服务里关闭roscore就会出现一下错误。