#include"ros/ros.h"
#include"my_package/AddTwoInts.h"
bool add(my_package::AddTwoInts::Request &req,
my_package::AddTwoInts::Response &res)
{
res.sum = req.a + req.b;
ROS_INFO("request:x=%ld,y=%ld",(long int)req.a,(long int)req.b);
ROS_INFO("sending back response:[%ld]",(long int)res.sum);
return true;
}
int main(int argc,char **argv)
{
ros::init(argc, argv, "add_two_ints_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_two_ints",add);
ROS_INFO("Ready to add two ints.");
ros::spin();
return 0;
}
代码解析:
1,头文件
#include"ros/ros.h"
#include"my_package/AddTwoInts.h"
使用ros中的服务必须包含的头文件,其中“my_package/AddTwoInts.h"由之前创建的服务文件AddTwoInts.srv自动生成。
2,主函数
ros::init(argc, argv, "add_two_ints_server");
ros节点初始化,add_two_ints_server是节点名称,在ros的运行中必须独一无二,
ros::ServiceServer service = n.advertiseService("add_two_ints",add);
创建一个服务的Sever,指定服务的名称add_two_ints,以及收到数据的回调函数 add.然后循环等待服务请求,一旦有服务请求,Sever就跳入回调函数进行处理。
3,回调函数部分
bool add(my_package::AddTwoInts::Request &req,
my_package::AddTwoInts::Response &res)
回调函数是实现服务功能的部分,add()完成两个函数相加的功能,其传入参数便是我们在服务数据类型描述文件(srv)声明的数据结构。
res.sum = req.a + req.b;
ROS_INFO("request:x=%ld,y=%ld",(long int)req.a,(long int)req.b);
ROS_INFO("sending back response:[%ld]",(long int)res.sum);
return true;
完成加法运算后,求和结果会放入到应答数据中,反馈到Client,回调函数返回true。
服务中的Server类似于话题中的Subscriber,流程如下:
1,初始化ros节点
2,创建Server实例
3,循环等待服务请求,进入回调函数
4,在回调函数中完成服务功能的处理并反馈应答数据。