我们将创建一个服务器节点add_two_ints_server,它将会收到两个整数,并且返回它们的和。切换目录到之前建立的beginner_tutorials包下:

  1. cd ~/catkin_ws/src/beginner_tutorials

编辑src/add_two_ints_server.cpp文件:

  1. gedit src/add_two_ints_server.cpp
 

将下面的代码复制到文件中,保存后退出:

  1. #include "ros/ros.h"
  2. #include "beginner_tutorials/AddTwoInts.h"
  3.  
  4. bool add(beginner_tutorials::AddTwoInts::Request &req,
  5. beginner_tutorials::AddTwoInts::Response &res)
  6. {
  7. res.sum = req.a + req.b;
  8. ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
  9. ROS_INFO("sending back response: [%ld]", (long int)res.sum);
  10. return true;
  11. }
  12.  
  13. int main(int argc, char **argv)
  14. {
  15. ros::init(argc, argv, "add_two_ints_server");
  16. ros::NodeHandle n;
  17.  
  18. ros::ServiceServer service = n.advertiseService("add_two_ints", add);
  19. ROS_INFO("Ready to add two ints.");
  20. ros::spin();
  21.  
  22. return ;
  23. }

下面解释一下代码:

  1. #include "ros/ros.h"
  2. #include "beginner_tutorials/AddTwoInts.h"

beginner_tutorials/AddTwoInts.h是由之前我们创建的srv文件自动产生的头文件。

  1. bool add(beginner_tutorials::AddTwoInts::Request &req,
  2. beginner_tutorials::AddTwoInts::Response &res)

这个函数为两个整数相加提供了服务,它使用了在srv文件中定义的请求和响应类型,并且返回一个布尔类型的值。

在这里两个整数相加并存储在response中,然后输出了一些关于request和response的信息,最后返回一个真值。

  1. ros::ServiceServer service = n.advertiseService("add_two_ints", add);

这行代码创建了一个服务。

接下来创建一个客户端,打开一个终端输入:

  1. gedit src/add_two_ints_client.cpp

将下面的代码复制进去,保存后退出:

  1. #include "ros/ros.h"
  2. #include "beginner_tutorials/AddTwoInts.h"
  3. #include <cstdlib>
  4.  
  5. int main(int argc, char **argv)
  6. {
  7. ros::init(argc, argv, "add_two_ints_client");
  8. if (argc != )
  9. {
  10. ROS_INFO("usage: add_two_ints_client X Y");
  11. return ;
  12. }
  13.  
  14. ros::NodeHandle n;
  15. ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
  16. beginner_tutorials::AddTwoInts srv;
  17. srv.request.a = atoll(argv[]);
  18. srv.request.b = atoll(argv[]);
  19. if (client.call(srv))
  20. {
  21. ROS_INFO("Sum: %ld", (long int)srv.response.sum);
  22. }
  23. else
  24. {
  25. ROS_ERROR("Failed to call service add_two_ints");
  26. return ;
  27. }
  28.  
  29. return ;
  30. }

下面看一下代码解释:

  1. ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");

这行代码为add_two_ints创建了一个客户端,ros::ServiceClient对象之后被用来调用服务。

  1. beginner_tutorials::AddTwoInts srv;
  2. srv.request.a = atoll(argv[]);
  3. srv.request.b = atoll(argv[]);

我们示例了一个自动产生的服务类,并且在它的请求成员中分配值。一个服务类包括了两个成员,请求和服务。它同样包括了两个类的定义,请求和响应。

    1. if (client.call(srv))

这句代码才开始真正调用了服务,因为服务调用被阻塞,当调用完成后就立即返回。如果服务调用成功,call()将会返回真及srv中的值。否则,call()将会返回假及srv中的值。

打开~/catkin_ws/src/beginner_tutorials/CMakeLists.txt,把下面代码复制到文件末尾,保存,退出:

  1. add_executable(add_two_ints_server src/add_two_ints_server.cpp)
  2. target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
  3. add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
  4.  
  5. add_executable(add_two_ints_client src/add_two_ints_client.cpp)
  6. target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
  7. add_dependencies(add_two_ints_client beginner_tutorials_gencpp)

这将会创建两个可执行文件,add_two_ints_serveradd_two_ints_client,默认将会产生在~/catkin_ws/devel/lib/share/<package name>目录下,你可以直接运行它们,也可以通过rosrun来运行。

现在开始构建:

  1. cd ~/catkin_ws
  2.  
  3. catkin_make

ok了,一切准备就绪,现在就开始检验一下程序是否正确吧。打开一个终端,运行服务器:

  1. rosrun beginner_tutorials add_two_ints_server

会出现一下提示:

  1. Ready to add two ints.

再打开一个终端,运行客户端:

  1. rosrun beginner_tutorials add_two_ints_client 1 3

我们可以看到返回的结果如下:

  1. Requesting 1+3
  2. 1 + 3 = 4

说明你已经成功了。

ROS服务器与客户端的更多相关文章

  1. SVN服务器和客户端安装教程

    SVN是什么?有何用? SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁 ...

  2. 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world

    2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...

  3. python web编程-CGI帮助web服务器处理客户端编程

    这几篇博客均来自python核心编程 如果你有任何疑问,欢迎联系我或者仔细查看这本书的地20章 另外推荐下这本书,希望对学习python的同学有所帮助 概念预热 eb客户端通过url请求web服务器里 ...

  4. GATT两个角色 服务器与客户端

    两个设备应用数据的通信是通过协议栈的GATT层实现的. 从GATT角度来看,当两个设备建立连接后,他们处于以下两种角色之一: GATT服务器: 它是为GATT客户端提供数据服务的设备 GATT客户端: ...

  5. golang thrift 源码分析,服务器和客户端究竟是如何工作的

    首先编写thrift文件(rpcserver.thrift),运行thrift --gen go rpcserver.thrift,生成代码 namespace go rpc service RpcS ...

  6. GATT 服务器与客户端角色

    两个设备应用数据的通信是通过协议栈的GATT层实现的.从GATT角度来看,当两个设备建立连接后,他们处于以下两种角色之一: GATT服务器: 它是为GATT客户端提供数据服务的设备 GATT客户端:  ...

  7. homework-05 服务器与客户端

    首先非常抱歉第三次和第四次作业我没交上来,不想找借口强调原因,但是这两次作业我一定会补上,到时候会@助教.谢谢 回到这次作业! 这次作业邹老师没说博客的格式,所以在这里就没有什么回答问题的东西了.这次 ...

  8. 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 发送服务器 ...

  9. 单点登录CAS使用记(二):部署CAS服务器以及客户端

    CAS-Server下载地址:https://www.apereo.org/projects/cas/download-cas CAS-Client下载地址:http://developer.jasi ...

随机推荐

  1. fragment入门

    [1]在activity布局中定义fragment <?xml version="1.0" encoding="utf-8"?> <Linea ...

  2. iOS 的 Safari 文件上传功能详解

    iOS 6 给 Safari 浏览器带来的另外一个功能是文件上传,终于 Safari 终于支持 input 输入框的文件类型了,并且还支持 HTML媒体捕获(HTML Media Capture). ...

  3. MyBatis学习笔记(二) 关联关系

    首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001 没事看看 - MyBatis工具:www.mybatis.tk h ...

  4. hiho_1054_滑动解锁

    题目大意 智能手机九点屏幕滑动解锁,如果给出某些连接线段,求出经过所有给出线段的合法的滑动解锁手势的总数.题目链接: 滑动解锁 题目分析 首先,尝试求解没有给定线段情况下,所有合法的路径的总数.可以使 ...

  5. python操作mongodb之八地理索引空间数据

    from pymongo import MongoClient, GEO2D #使用geo_example库 db = MongoClient('192.168.30.252',27017).geo_ ...

  6. Selenium Grid Configuration

    Start Hub and Node with Json config 1. Start Hub with json config file title HubWebDriver java -jar ...

  7. oracel数据库基本知识和基本查询方法

    Oracel数据库学习1.小型数据库 access,foxbase 中型数据库 mysql,sqlserver,informix 大型数据库 sybase,Oracle,db2 Oracle数据库需求 ...

  8. B2车

    晚上10点之后,杭州快速公交B2的司机,把2节车厢,开的像是跑车一样,每次启动都是弹射出去的,好像是在报复白天蜗牛般的速度.真乃是见神杀神,见佛杀佛.

  9. Spring表达式语言 之 5.3 SpEL语法(拾肆)

    5.3  SpEL语法 5.3.1  基本表达式 一.字面量表达式: SpEL支持的字面量包括:字符串.数字类型(int.long.float.double).布尔类型.null类型. 类型 示例 字 ...

  10. Nginx内置常用变量

    nginx用到的全局变量 $arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值. $args #这个变量等于请求行中(GET请求)的参数,例如foo=123&a ...