自定义service数据类型
- 在创建好的
package
目录下再创建一个srv文件夹专门用于防止自定义数据类型的topic
的源文件(文件名必须是srv,踩过坑了) - 创建
Person.srv
文件(据说文件的首字母一定要大写,不大写会出问题) - 可以在里面定义变量或常量
//Person.srv
string name
uint8 age
uint8 sex
uint8 unknow = 0
uint8 male = 1
uint8 female = 2
---
string result
- 其中- - -(中间没空格,只要三个)上面的是
request
的内容 ,下面是response
的内容
编译srv文件
- 首先在此功能包的package.xml内添加依赖说明
<build_depend>message_generation</build_depend>//编译依赖
<exec_depend>message_runtime</exec_depend>//运行依赖
- 在功能包的
CMakeLists.txt
中的find_package()
中多加一行(防止有人把原先的内容全删了然后就省这一行了)
message_generation
- 在功能包的
CMakeLists.txt
中的catkin_package()
变为形如:(正常操作是去掉CATKIN_DEPENDS
那一行前面的#
然后在行末加上message_runtime
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES learning_topic
CATKIN_DEPENDS message_runtime
# DEPENDS system_lib
)
原来的样子是这样的
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES learning_topic
# CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim
# DEPENDS system_lib
)
- 设置要编译的srv文件
add_service_files(
FILES
Person.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
- 然后编译即可
rossrv show packageName/Person
此命令可以显示此数据结构的信息
附上配套的demo
//Person_server
#include<ros/ros.h>
#include"learning_service/Person.h"
//定义回调函数
bool commandCallBack(learning_service::Person::Request &req,learning_service::Person::Response &res){
//输出收到的数据
ROS_INFO("resived name = %s age = %d sex = %d",req.name.c_str(),req.age,req.sex);
res.result = "sending successful";
return true;
}
int main(int argc,char ** argv){
ros::init(argc,argv,"Person_server");
ros::NodeHandle n;
ros::ServiceServer person_server = n.advertiseService("/Person_data",commandCallBack);
//创建service
ROS_INFO("Ready to recive message\n");
ros::spin();
return 0;
}
//Person_client
#include<ros/ros.h>
#include<iostream>
#include"learning_service/Person.h"
int main(int argc,char ** argv){
ros::init(argc,argv,"Person_client");
ros::NodeHandle n;
ros::service::waitForService("/Person_data");//等待服务开启
ros::ServiceClient person_clinet = n.serviceClient<learning_service::Person>("/Person_data");
//创建客户端 定义数据类型以及发送信息的 service
learning_service::Person data;
data.request.name = "luoxihao";
data.request.age = 20;
data.request.sex = data.request.male;
person_clinet.call(data);
//发送信息
ROS_INFO("%s",data.response.result.c_str());
return 0;
}