ROS服务器与客户端
我们将创建一个服务器节点add_two_ints_server,它将会收到两个整数,并且返回它们的和。切换目录到之前建立的beginner_tutorials包下:
- cd ~/catkin_ws/src/beginner_tutorials
编辑src/add_two_ints_server.cpp文件:
- gedit src/add_two_ints_server.cpp
将下面的代码复制到文件中,保存后退出:
- #include "ros/ros.h"
- #include "beginner_tutorials/AddTwoInts.h"
- bool add(beginner_tutorials::AddTwoInts::Request &req,
- beginner_tutorials::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 ;
- }
下面解释一下代码:
- #include "ros/ros.h"
- #include "beginner_tutorials/AddTwoInts.h"
beginner_tutorials/AddTwoInts.h是由之前我们创建的srv文件自动产生的头文件。
- bool add(beginner_tutorials::AddTwoInts::Request &req,
- beginner_tutorials::AddTwoInts::Response &res)
这个函数为两个整数相加提供了服务,它使用了在srv文件中定义的请求和响应类型,并且返回一个布尔类型的值。
在这里两个整数相加并存储在response中,然后输出了一些关于request和response的信息,最后返回一个真值。
- ros::ServiceServer service = n.advertiseService("add_two_ints", add);
这行代码创建了一个服务。
接下来创建一个客户端,打开一个终端输入:
- gedit src/add_two_ints_client.cpp
将下面的代码复制进去,保存后退出:
- #include "ros/ros.h"
- #include "beginner_tutorials/AddTwoInts.h"
- #include <cstdlib>
- int main(int argc, char **argv)
- {
- ros::init(argc, argv, "add_two_ints_client");
- if (argc != )
- {
- ROS_INFO("usage: add_two_ints_client X Y");
- return ;
- }
- ros::NodeHandle n;
- ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
- beginner_tutorials::AddTwoInts srv;
- srv.request.a = atoll(argv[]);
- srv.request.b = atoll(argv[]);
- if (client.call(srv))
- {
- ROS_INFO("Sum: %ld", (long int)srv.response.sum);
- }
- else
- {
- ROS_ERROR("Failed to call service add_two_ints");
- return ;
- }
- return ;
- }
下面看一下代码解释:
- ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
这行代码为add_two_ints创建了一个客户端,ros::ServiceClient对象之后被用来调用服务。
- beginner_tutorials::AddTwoInts srv;
- srv.request.a = atoll(argv[]);
- srv.request.b = atoll(argv[]);
我们示例了一个自动产生的服务类,并且在它的请求成员中分配值。一个服务类包括了两个成员,请求和服务。它同样包括了两个类的定义,请求和响应。
- if (client.call(srv))
这句代码才开始真正调用了服务,因为服务调用被阻塞,当调用完成后就立即返回。如果服务调用成功,call()将会返回真及srv中的值。否则,call()将会返回假及srv中的值。
打开~/catkin_ws/src/beginner_tutorials/CMakeLists.txt,把下面代码复制到文件末尾,保存,退出:
- add_executable(add_two_ints_server src/add_two_ints_server.cpp)
- target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
- add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
- add_executable(add_two_ints_client src/add_two_ints_client.cpp)
- target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
- add_dependencies(add_two_ints_client beginner_tutorials_gencpp)
这将会创建两个可执行文件,add_two_ints_server和add_two_ints_client,默认将会产生在~/catkin_ws/devel/lib/share/<package name>目录下,你可以直接运行它们,也可以通过rosrun来运行。
现在开始构建:
- cd ~/catkin_ws
- catkin_make
ok了,一切准备就绪,现在就开始检验一下程序是否正确吧。打开一个终端,运行服务器:
- rosrun beginner_tutorials add_two_ints_server
会出现一下提示:
- Ready to add two ints.
再打开一个终端,运行客户端:
- rosrun beginner_tutorials add_two_ints_client 1 3
我们可以看到返回的结果如下:
- Requesting 1+3
- 1 + 3 = 4
说明你已经成功了。
ROS服务器与客户端的更多相关文章
- SVN服务器和客户端安装教程
SVN是什么?有何用? SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁 ...
- 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world
2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...
- python web编程-CGI帮助web服务器处理客户端编程
这几篇博客均来自python核心编程 如果你有任何疑问,欢迎联系我或者仔细查看这本书的地20章 另外推荐下这本书,希望对学习python的同学有所帮助 概念预热 eb客户端通过url请求web服务器里 ...
- GATT两个角色 服务器与客户端
两个设备应用数据的通信是通过协议栈的GATT层实现的. 从GATT角度来看,当两个设备建立连接后,他们处于以下两种角色之一: GATT服务器: 它是为GATT客户端提供数据服务的设备 GATT客户端: ...
- golang thrift 源码分析,服务器和客户端究竟是如何工作的
首先编写thrift文件(rpcserver.thrift),运行thrift --gen go rpcserver.thrift,生成代码 namespace go rpc service RpcS ...
- GATT 服务器与客户端角色
两个设备应用数据的通信是通过协议栈的GATT层实现的.从GATT角度来看,当两个设备建立连接后,他们处于以下两种角色之一: GATT服务器: 它是为GATT客户端提供数据服务的设备 GATT客户端: ...
- homework-05 服务器与客户端
首先非常抱歉第三次和第四次作业我没交上来,不想找借口强调原因,但是这两次作业我一定会补上,到时候会@助教.谢谢 回到这次作业! 这次作业邹老师没说博客的格式,所以在这里就没有什么回答问题的东西了.这次 ...
- Node.js权威指南 (8) - 创建HTTP与HTTPS服务器及客户端
8.1 HTTP服务器 / 177 8.1.1 创建HTTP服务器 / 177 8.1.2 获取客户端请求信息 / 182 8.1.3 转换URL字符串与查询字符串 / 184 8.1.4 发送服务器 ...
- 单点登录CAS使用记(二):部署CAS服务器以及客户端
CAS-Server下载地址:https://www.apereo.org/projects/cas/download-cas CAS-Client下载地址:http://developer.jasi ...
随机推荐
- fragment入门
[1]在activity布局中定义fragment <?xml version="1.0" encoding="utf-8"?> <Linea ...
- iOS 的 Safari 文件上传功能详解
iOS 6 给 Safari 浏览器带来的另外一个功能是文件上传,终于 Safari 终于支持 input 输入框的文件类型了,并且还支持 HTML媒体捕获(HTML Media Capture). ...
- MyBatis学习笔记(二) 关联关系
首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001 没事看看 - MyBatis工具:www.mybatis.tk h ...
- hiho_1054_滑动解锁
题目大意 智能手机九点屏幕滑动解锁,如果给出某些连接线段,求出经过所有给出线段的合法的滑动解锁手势的总数.题目链接: 滑动解锁 题目分析 首先,尝试求解没有给定线段情况下,所有合法的路径的总数.可以使 ...
- python操作mongodb之八地理索引空间数据
from pymongo import MongoClient, GEO2D #使用geo_example库 db = MongoClient('192.168.30.252',27017).geo_ ...
- Selenium Grid Configuration
Start Hub and Node with Json config 1. Start Hub with json config file title HubWebDriver java -jar ...
- oracel数据库基本知识和基本查询方法
Oracel数据库学习1.小型数据库 access,foxbase 中型数据库 mysql,sqlserver,informix 大型数据库 sybase,Oracle,db2 Oracle数据库需求 ...
- B2车
晚上10点之后,杭州快速公交B2的司机,把2节车厢,开的像是跑车一样,每次启动都是弹射出去的,好像是在报复白天蜗牛般的速度.真乃是见神杀神,见佛杀佛.
- Spring表达式语言 之 5.3 SpEL语法(拾肆)
5.3 SpEL语法 5.3.1 基本表达式 一.字面量表达式: SpEL支持的字面量包括:字符串.数字类型(int.long.float.double).布尔类型.null类型. 类型 示例 字 ...
- Nginx内置常用变量
nginx用到的全局变量 $arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值. $args #这个变量等于请求行中(GET请求)的参数,例如foo=123&a ...