本文主要来源于:http://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28c%2B%2B%29

  1. 写一个服务节点。
    创建消息和服务中,我们创建了一个消息AddTwoInts.srv,为实现节点功能,我们还需要编写相应代码。
    1. 代码
      在beginner_tutorials包中创建add_two_ints_server.cpp,并输入如下内容(中文注释即为说明):

      #include "ros/ros.h"
      #include "beginner_tutorials/AddTwoInts.h"//服务头文件
      bool add(beginner_tutorials::AddTwoInts::Request &req,//Request,作为输入
      beginner_tutorials::AddTwoInts::Response &res)//Response,作为输出
      {
      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 0;
      }
    2. 客户端(Client)节点
      代码如下(解释见中文注释)
      #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 != 3)
      {
      ROS_INFO("usage: add_two_ints_client X Y");
      return 1;
      } 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.request.b = atoll(argv[2]);
      if (client.call(srv))//调用服务
      {
      ROS_INFO("Sum: %ld", (long int)srv.response.sum);
      }
      else
      {
      ROS_ERROR("Failed to call service add_two_ints");
      return 1;
      } return 0;
      }
    3. 编译运行代码
      在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)

      然后运行catkin_make进行编译
      使用roscore开启中心节点。
      运行

      rosrun begginner_tutorials add_two_ints_server
      

      启动服务节点。
      运行

      rosrun beginner_tutorials add_two_ints_client 1 3
      

      启动客户端节点,并传入参数
      会出现:

      server节点会出现:

      功能正确。

ROS学习笔记11-写一个简单的服务和客户端(C++版本)的更多相关文章

  1. DuiLib学习笔记2——写一个简单的程序

    我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新 ...

  2. DuiLib学习笔记2.写一个简单的程序

    我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新 ...

  3. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  4. Linux系统学习笔记之 1 一个简单的shell程序

    不看笔记,长时间不用自己都忘了,还是得经常看看笔记啊. 一个简单的shell程序 shell结构 1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建shell程序的步骤 第一步: ...

  5. laravel学习:php写一个简单的ioc服务管理容器

    php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...

  6. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  7. UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信

    1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...

  8. Django 学习笔记之六 建立一个简单的博客应用程序

    最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...

  9. Ruby学习笔记2 : 一个简单的Ruby网站,搭建ruby环境

    Ruby on Rails website 的基础是 请求-返回 循环. 首先是浏览器请求服务器, 第二步,Second, in our Rails application, the route ta ...

随机推荐

  1. 【Go语言系列】第三方框架和库——GIN:GIN介绍

    1.Gin 是什么? Gin 是一个用 Go (Golang) 编写的 HTTP web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高 ...

  2. java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time.....

    SpringBoot 2.1.4启动时报错 java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecogniz ...

  3. Java Https双向验证

    CA: Certificate Authority,证书颁发机构 CA证书:证书颁发机构颁发的数字证书 参考资料 CA证书和TLS介绍 HTTPS原理和CA证书申请(满满的干货) 单向 / 双向认证 ...

  4. java怎么调用子类中父类被覆盖的方法

    public class b { { void show() { System.out.println("b"); } } public class c extends b { v ...

  5. docker+hexo 搭建博客

    前提 Linux服务器 保证自己服务器上的端口对外开放,即设置相应的防火墙规则 安装好hexo 安装:npm install hexo-cli -g 初始化搭建:npm init myBlog,myB ...

  6. quartz定时任务cron表达式讲解及翻译成现实语言的插件的使用详解

    cron表达式讲解 参见该网址: https://www.cnblogs.com/GarfieldTom/p/3746290.html cron表达式只有专业技术人员才看得懂,普通人不知道表达式是什么 ...

  7. netty代理http&https请求

    (1)关键代码 package test; import java.security.cert.CertificateException; import javax.net.ssl.SSLExcept ...

  8. Java面向对象编程 -4

    声明static属性 static 是一个关键字,这个关键字主要是用来定义属性和方法. static内存分析 在正常开发之中每一个对象都要保存有各自的属性 所以此时程序没有问题 但是如果country ...

  9. python学习 —— 使用subprocess获取命令行输出结果

    这里使用的版本:Python2 >= 2.7 对于获取命令行窗口中的输出python有一个很好用的模块:subprocess 两个简单例子: 1.获取ping命令的输出: from subpro ...

  10. 5种JVM调优配置方法概览

    1 堆设置 -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值.如:为3,表示年轻代与年老代比值为1:3,年 ...