本文主要来源于: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节点会出现:

      功能正确。

最新文章

  1. 将Json数据转换为ADO.NET DataSet对象
  2. JQ常用代码
  3. Visual Studio远程调试监视器(MSVSMON.EXE)的32位版本不能用于调试64位进程或64位转储
  4. python字符串str和字节数组相互转化
  5. Codeforces7C 扩展欧几里得
  6. linux 安装redis
  7. Codeforces Round #131 (Div. 2) : B
  8. HDU1878 欧拉回路 - from lanshui_Yang
  9. cmd介面,进adb命令提示符error
  10. [ios-必看] IOS调试技巧:当程序崩溃的时候怎么办 iphone IOS
  11. [转]HTTP请求模型和头信息参考
  12. 重置winsock目录解决不能上网的问题
  13. 06 Activity的启动模式 Intent的七大属性的总结
  14. 第一册:lesson 103.
  15. java9 Local-variable type inference
  16. 委托(作用:解耦),lambda的演化
  17. 首席数据官(CDO)的崛起
  18. eclipse包层级显示和工作空间显示
  19. 稀疏数据压缩查询方法:Rank &amp; Select 操作
  20. 第五周 mybash的实现

热门文章

  1. Vue-项目搭建时的常用配置
  2. Centos7 将应用添加快捷方式到applications 中以pycham为例[ubuntu]适用
  3. MockMVC - 基于RESTful风格的Springboot,SpringMVC的测试
  4. 【Go语言系列】1.2、GO语言简介:哪些大公司正在使用Go语言
  5. 论文阅读|Focal loss
  6. idea使用vue项目
  7. IKAnalyzer使用
  8. 解决CentOS下boost安装后不能使用的问题
  9. jqGird错误“decimalSeparator”的解决办法
  10. SpringBoot实现restuful风格的CRUD