自定义消息类型
首先在功能包下新建srv文件夹,然后创建srv文件 。本次例子是来实现客户端提交两个数,服务端来进行求和。
配置文件如下:
订阅方的实现:
#include"ros/ros.h"
#include "service_client/Sum.h" //自定义服务消息类型
#include <cstdlib>
int main(int argc,char *argv[])
{
ros::init(argc,argv,"Sum_client"); //初始化节点
if(argc!=3) //外部输入参数
{
ROS_INFO("failed");
return 1;
}
ros::NodeHandle nh;
ros::ServiceClient sum_client=nh.serviceClient<service_client::Sum>("add_two_ints");//创建用于发布的节点句柄
ros::service::waitForService("add_two_ints");//等待服务端启动
service_client::Sum srv; //创建新的消息
srv.request.a=atoll(argv[1]);
srv.request.b=atoll(argv[2]); /* 把字符串转变成long long 类型*/
/*argv[0] 存储的是节点的路径*/
if(sum_client.call(srv)) //调用服务端,发布数据给服务端,返回值是bool类型
{
ROS_INFO("sun =%ld ",(long int )srv.response.sum);
}
else{
ROS_INFO("failed ");
return 1;
}
return 0;
}
服务方的实现:
#include "ros/ros.h"
#include "service_client/Sum.h"
bool add(service_client::Sum::Request &req,
service_client::Sum::Response &res)//消息中的请求和服务参数指针
{
res.sum=req.a+req.b; //sum是服务端的参数,a,b是客户端发送的消息。
ROS_INFO("request : x=%ld y=%ld",(long int)req.a,(long int)req.b); /*在定义消息类型时用的是64位的longint型*/
ROS_INFO("responce : sum= %ld",(long int)res.sum);
return true;
}
int main(int argc,char*argv[])
{
ros::init(argc,argv,"SUM_server");
ros::NodeHandle nh;
ros::ServiceServer sum_service=nh.advertiseService("add_two_ints",add);//创建句柄函数,调用服务端的函数add
ROS_INFO("ready to add two ints .");
ros::spin();
return 0;
}