服务端实现一个加法,将结果反馈给客户端
客户端将要计算的和的两个数发给服务的。
1.自定义服务数据
创建一个srv文件:AddTwoInts.srv
int64 a int64 b --- int64 sum
上面是request数据,下面是response数据,中间用---隔开
打开package.xml文件,加入
<build_depend>message_generation</build_depend> <build_export_depend>message_generation</build_export_depend> <exec_depend>message_runtime</exec_depend>
打开CMakeLists.txt文件加入
find_package(catkin REQUIRED COMPONENTS
message_generation
roscpp
)
add_service_files(FILES
AddTwoInts.srv
)
2.服务端代码
#include "ros/ros.h" #include "learning_server/AddTwoInts.h" //service 回调函数 输入req 输出res bool add(learning_server::AddTwoInts::Request &req, learning_server::AddTwoInts::Response &res) { res.sum = req.a + req.b; return true; } int main(int argc, char **argv) { //ROS节点初始化 ros::init(argc, argv, "add_server"); //创建节点句柄 ros::NodeHandle n; //创建一个名为add_two的server,注册回调函数add() ros::ServiceServer service = n.advertiseService("add_two",add); //等待回调函数,类似于轮询的方式 ros::spin(); return 0; }
3.客户端代码
#include <cstdlib> #include "ros/ros.h" #include "learning_server/AddTwoInts.h" int main(int argc, char *argv[]) { //ros节点初始化 ros::init(argc, argv, "add_client"); if(argc != 3) { return 1; } //创建节点句柄 ros::NodeHandle n; //创建一个client,请求服务 ros::ServiceClient client = n.serviceClient<learning_server::AddTwoInts>("add_two"); //创建自定义的服务类型srv learning_server::AddTwoInts srv; srv.request.a = atoll(argv[1]); srv.request.b = atoll(argv[2]); //发布service请求,该进程会发生阻塞 if(client.call(srv)) { ROS_INFO("sum:%ld",(long int)srv.response.sum); } else { ROS_ERROR("faile"); return 1; } return 0; }