我们将创建一个服务器节点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();  

      ;
    }  

下面解释一下代码:

    #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");
      )
      {
        ROS_INFO("usage: add_two_ints_client X Y");
        ;
      }  

      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");
        ;
      }  

      ;
    }  

下面看一下代码解释:

    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[]);  

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

  1. 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_serveradd_two_ints_client,默认将会产生在~/catkin_ws/devel/lib/share/<package name>目录下,你可以直接运行它们,也可以通过rosrun来运行。

现在开始构建:

cd ~/catkin_ws

catkin_make

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

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. css3clock.js - 一个用CSS3与纯js实现的简单时钟

    前言 项目代码明细可以查看我Github上的源码:https://github.com/nelsonkuang/css3clock.js 实现思路 主要是用CSS3控制时针.分针和秒针旋转:时针每12 ...

  2. 用Vagrant创建Jenkins构建环境

    这是一个关于Vagrant的学习系列,包含如下文章: Vagrant入门 创建自己的Vagrant box 用Vagrant搭建Jenkins构建环境 用Vagrant和Ansible搭建持续交付平台 ...

  3. ViewFlipper(翻转视图)的使用

    android developers java.lang.Object --android.view.View ----android.view.ViewGroup ------android.wid ...

  4. POI Word 模板 文字 图片 替换

    实验环境:POI3.7+Word2007 Word模板: 替换后效果: 代码: 1.入口文件 public class Test { public static void main(String[] ...

  5. java面试欠缺知识点总结

    针对最近面试被问到的问题,总结自己欠缺的知识点,并要在接下来的1年内加强这些知识: Java方面:反射.线程concurrent包: Spring方面:Ioc和Aop.事务: 持久化框架:设计并实现分 ...

  6. linux下忘记mysql root密码解决办法

    vi /etc/my.cnf    #编辑文件,找到[mysqld],在下面添加一行skip-grant-tables [mysqld] skip-grant-tables :wq!  #保存退出 s ...

  7. C# delegate &amp; event

    public delegate void MyDelegate(string mydelegate);//声明一个delegate对象 //实现有相同参数和返回值的函数        public v ...

  8. Host绑定

    Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Host ...

  9. java根据url获取json对象

    package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; ...

  10. MongoDB 覆盖索引查询

    MongoDB 覆盖索引查询 官方的MongoDB的文档中说明,覆盖查询是以下的查询: 所有的查询字段是索引的一部分 所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分, Mo ...