学习视频:

三个横线上方为request数据,横线下方为response数据;
第一步先在功能包中创建一个srv文件夹放置数据定义文档;
在srv内部自定义一个数据srv文档

将数据的结构定义写入,数据的结构定义如下
string name
uint8 age
uint8 sex
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
---
string result

定义完成后在package.xml内部添加功能包依赖:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

再在CMakeList内部添加编译选项
首先在find_package里面添加message_generation添加功能包要寻找的依赖

再添加如下指令:使得编译器知道根据哪个srv产生你的头文件
add_service_files(
FILES #自动收缩srv文件夹内文件
Person.srv
)
generate_messages(
DEPENDENCIES #根据Person.srv的定义以及DEPENDENCIES下方的依赖产生头文件
std_msgs
)

再在CMakeList里面的catkin_package里面添加一个message_runtime依赖放入;

至此配置就完成了进入编译生成相关头文件;

对于服务数据定义编译完成会出现三个头文件,第一个是包含后续两个是一个总体的头文件,第二个是在服务中的请求,是数据的结构定义时三个横线上方的头文件,第三个则是三个横线下方的。编译完还是要记得设置变量环境的好习惯

下一步放置源码在功能包src内部;

放置完源码还是一样在CMakeList内部放置编译规则:
add_executable(person_server src/person_server.cpp) #将src中person_server.cpp编译成对应可执行文件person_server
target_link_libraries(person_server ${catkin_LIBRARIES}) #将person_server与person_client做一个链接
add_dependencies(person_server ${PROJECT_NAME}_gencpp) #将动态生成的头文件做一个依赖
#下面同上方一个意思
add_executable(person_client src/person_client.cpp)
target_link_libraries(person_client ${catkin_LIBRARIES})
add_dependencies(person_client ${PROJECT_NAME}_gencpp)

添加完后就可以执行编译了

编译后,要记得设置变量环境好习惯。

可以在devel文件夹下找到编译的可执行文件

最后就是测试了;

可以看见运行有应答,测试就完成了。