ROS入门:服务
Posted penuel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS入门:服务相关的知识,希望对你有一定的参考价值。
服务端实现一个加法,将结果反馈给客户端
客户端将要计算的和的两个数发给服务的。
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;
以上是关于ROS入门:服务的主要内容,如果未能解决你的问题,请参考以下文章