创建ROS服务端(service)和客户端(client)
2016-01-13 20:21
387 查看
服务端和客户端的关系实际上就是请求和响应的关系。我们在定义服务类型的时候实际上只是定义了请求时客户端发送的数据类型及个数,还有服务端响应时返回来的数据类型和个数。对C++语言而言、服务端和客户端同样是.cpp文件编译生成的可执行文件。
一、服务端:
1、cd到包目录下,然后在src文件夹下创建.cpp文件;
2、.cpp文件包括以下部分:
①包含(include)依赖库,如ros/ros.h、beginner_tutorials/AddTwoInts.h(已生成的服务类型头文件)等
②请求处理函数部分:
bool add(beginner_tutorials::AddTwoInts::Request &req, beginner_tutorials::AddTwoInts::Request &res)
{
客户端传来的数据存在req中,在此函数体处理请求,并将结果存在res中
}
③主函数部分: ros::init(argc,argv,"add_two_ints_server");
ros::NodeHandle n;
// 向ROS节点网络广播:当前节点提供add_two_ints服务,这个服务通过调用add函数完成,
// 需要这个服务的可以来请求当前节点
ros::ServiceServer service = n.advertiseService("add_two_ints",add);
ros::spin(); //自循环,等待请求
二、客户端:
1、cd到包目录下,然后在src文件夹下创建.cpp文件;
2、.cpp文件包括以下部分:
主函数: ros::init(argc,argv,"add_two_ints_client");
// 客户端需要通过命令行输入参数,这里是两个加数用空格隔开,
// 所以输入参数个数不等于3时属于非法输入
if(argc != 3){return;};
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
beginner_tutorials::AddTwoInts srv; // 实例化需要请求的服务
srv.request.a = atoll(argv[1]); // 把要传递给服务端的参数存入服务srv中
srv.request.b = atoll(argv[2]);
if (client.call(srv))
{
如果服务端成功响应,返回值存在srv.response中,在此函数体处理结果
}
else return;
return;
三、CMakeLists.txt文件的设置:
1、添加可执行文件,即add_executable(add_two_ints_server src/talker.cpp);
add_executable(add_two_ints_client src/talker.cpp);
2、添加目标连接库,即target_link_libraries(add_two_ints_server ${catkin_LIBRARIES});
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES});
3、添加对生成的消息文件的依赖项,即 add_dependencies(add_two_ints_server beginner_tutorials_generate_messages_cpp);
add_dependencies(add_two_ints_client beginner_tutorials_generate_messages_cpp);
推荐博文:
二叉树相关练习题(C++)
与字符串有关的一些典型问题的C++解法
一些可以用动态规划(DP)算法解决的问题(C++)
排列组合相关笔试面试题(C++)
与概率相关的算法题C++解法(附证明过程)
二分查找的巧妙运用(C++)
位运算在算法题中的使用(C++)
链表相关练习题(C++)
用实例讲解栈和队列(C++)
一些智力题的C++解法
一、服务端:
1、cd到包目录下,然后在src文件夹下创建.cpp文件;
2、.cpp文件包括以下部分:
①包含(include)依赖库,如ros/ros.h、beginner_tutorials/AddTwoInts.h(已生成的服务类型头文件)等
②请求处理函数部分:
bool add(beginner_tutorials::AddTwoInts::Request &req, beginner_tutorials::AddTwoInts::Request &res)
{
客户端传来的数据存在req中,在此函数体处理请求,并将结果存在res中
}
③主函数部分: ros::init(argc,argv,"add_two_ints_server");
ros::NodeHandle n;
// 向ROS节点网络广播:当前节点提供add_two_ints服务,这个服务通过调用add函数完成,
// 需要这个服务的可以来请求当前节点
ros::ServiceServer service = n.advertiseService("add_two_ints",add);
ros::spin(); //自循环,等待请求
二、客户端:
1、cd到包目录下,然后在src文件夹下创建.cpp文件;
2、.cpp文件包括以下部分:
主函数: ros::init(argc,argv,"add_two_ints_client");
// 客户端需要通过命令行输入参数,这里是两个加数用空格隔开,
// 所以输入参数个数不等于3时属于非法输入
if(argc != 3){return;};
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
beginner_tutorials::AddTwoInts srv; // 实例化需要请求的服务
srv.request.a = atoll(argv[1]); // 把要传递给服务端的参数存入服务srv中
srv.request.b = atoll(argv[2]);
if (client.call(srv))
{
如果服务端成功响应,返回值存在srv.response中,在此函数体处理结果
}
else return;
return;
三、CMakeLists.txt文件的设置:
1、添加可执行文件,即add_executable(add_two_ints_server src/talker.cpp);
add_executable(add_two_ints_client src/talker.cpp);
2、添加目标连接库,即target_link_libraries(add_two_ints_server ${catkin_LIBRARIES});
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES});
3、添加对生成的消息文件的依赖项,即 add_dependencies(add_two_ints_server beginner_tutorials_generate_messages_cpp);
add_dependencies(add_two_ints_client beginner_tutorials_generate_messages_cpp);
推荐博文:
二叉树相关练习题(C++)
经典排序算法的C++实现
与字符串有关的一些典型问题的C++解法
一些可以用动态规划(DP)算法解决的问题(C++)
排列组合相关笔试面试题(C++)
与概率相关的算法题C++解法(附证明过程)
二分查找的巧妙运用(C++)
位运算在算法题中的使用(C++)
链表相关练习题(C++)
用实例讲解栈和队列(C++)
一些智力题的C++解法
相关文章推荐
- Jquery
- 软件测试_Badboy自动化测试工具11_Jmeter并发测试
- 蓝桥杯-高斯日记
- Android 深入理解Android中的自定义属性
- Android 轻量级sqlite orm 框架
- thinkphp源码解析 (Version 3.1) -2 /Lib/Core/Think.class
- [ACM] POJ 3254 Corn Fields(状态压缩)
- 与独立、自由说再见!微信是怎样扼杀了它们
- jquery——滚动条插件jscroll.js
- 无法解析的外部符号 "public: __thiscall BasePlugin::BasePlugin(class QObject *)"
- CentOS6.5下编译spark1.6.0源码
- Android RecyclerView 使用完全解析 体验艺术般的控件
- MATLABtextscan函数中参数delimiter的使用
- 阿岳之_mariadb安装篇(一)
- 创建ROS消息发布器(publisher)、订阅器(subscriber)
- java工程师面试题积累中...
- 给你90天,成为不一样的自己(转)
- android面试所涉及的范围及学习方向
- HotSpot GC机制初步理解
- 005_Eclipse配置Tomcat