ROS 学习笔记 创建自定义service数据类型

自定义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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值