在学习古月居的教程中,提到,不同于消息通信,服务通信过程中服务的数据类型需要自己定义。节点并不提供标准服务类型。服务类型的定义文件一般是:*.srv为扩展名,且一般都放在功能包下的srv文件夹目录。ros中的服务数据可以通过srv文件进行语言无关的接口定义。一般写在功能包的srv目录。目的是client输入两个数,server返回这两个数相加的结果,下面是实践:
本地环境: ubuntu16.04 + ROS kinetic
1.在一个catkin_ws/src 下,创建一个pkg:
catkin_create_pkg learning_communication roscpp rospy
依赖会被默认写到功能包的CMakeLists.txt和package.xml中
2.创建自定义服务数据结构在learning_communication/srv 下创建 AddTwoInts.srv文件,文件内容:
int64 a
int64 b
---
int64 sum
中间用’—'隔开,上面的client的数据结构,下面是 server的数据结构
注:定义好服务数据结构后,要想让服务类型在c++,python中使用,必须要做相应的编译与运行配置。
编译依赖message_generation
运行依赖message_runtime
本文为了方便演示,只说在vscode等下,找不到自定义数据结构的情况,所以server, client的源代码只包含头文件进行测试。
server.cpp的内容:
#include<ros/ros.h>
#include "learning_communication/AddTwoInts.h"
int main(){}
client.cpp的内容:
#include<ros/ros.h>
#include "learning_communication/AddTwoInts.h"
int main(){}
注: 以上的AddTwoInts.h 本来没有这个头文件,但根据作者的解释说,该头文件根据我们之前创建的服务数据类型AddTwoInts.srv自动创建,但是,后来经过测试,还是没有找到这个头文件,这里不报错,不知道是为什么。
接着打开package.xml (这里,这里打开的是包learning_communication下的package.xml, 后面的CMakeLists.txt也是,