文章目录

  • 1. 编写服务节点
  • 2. 编写客户端节点
  • 3. 构建节点
  • 4. 运行可执行文件

1. 编写服务节点

这里,我们将创建简单的服务(Service)节点add_two_ints_server,该节点将接收两个整数,并返回它们的和。将当前目录切换到之前的教程中创建的study包中,另外请确保你已经按照[之前介绍]中的指示创建了本教程(https://loongembedded.blog.csdn.net/article/details/122423436)中需要的服务AddTwoInts.srv。

#include "ros/ros.h"
#include "study/AddTwoInts.h"bool add(study::AddTwoInts::Request  &req,study::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 0;
}

advertiseService(const string &service, bool(*srv_func)(Mreq &, Mres &));
创建 server,作为 service 通讯中的服务端
第一个参数是该 server 提供的 service 名称
第二个参数是服务函数的指针,指向服务函数。服务函数接受两个参数,分别为请求和响应。

2. 编写客户端节点

在study包中创建src/add_two_ints_client.cpp文件并粘贴以下内容进去:

#include "ros/ros.h"
#include "study/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<study::AddTwoInts>("add_two_ints");study::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;
}

ros::ServiceClient client = n.serviceClientstudy::AddTwoInts(“add_two_ints”);
这为add_two_ints服务创建一个客户端,ros::ServiceClient对象的作用是在稍后调用服务。

study::AddTwoInts srv;
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
这里实例化一个自动生成的服务类,并为它的request成员赋值。一个服务类包括2个成员变量:request和response,以及2个类定义:Request和Response。

if (client.call(srv))
此处实际上调用了服务。由于服务调用被阻塞,它将在调用完成后返回。如果服务调用成功,call()将返回true,并且srv.response中的值将是有效的。如果调用不成功,则call()将返回false且srv.response的值将不可用。

3. 构建节点

编辑一下study里面的CMakeLists.txt文件,文件位于~/catkin_ws/src/study/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 study_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 study_gencpp)

这将创建两个可执行文件add_two_ints_server和add_two_ints_client,默认情况下,它们将被放到软件包目录下的devel空间中,即~/catkin_ws/devel/lib/。

进入工作空间编译生成可执行文件

cd ~/catkin_ws
catkin_make

4. 运行可执行文件

编写简单的服务和客户端(C++)---ROS学习第10篇相关推荐

  1. ROS学习笔记十:用C++编写一个简单的服务和客户端

    ROS学习笔记十:用C++编写一个简单的服务和客户端 这一节主要介绍如何使用C++编写一个简单的服务和客户端节点. 编写服务节点 由于在前面的练习中,已经向beginner_tutorials软件包中 ...

  2. 转‘ROS学习心得——安装篇——ROS安装’

    ROS学习心得--安装篇--ROS安装 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: ROS(Robot Operating System) ...

  3. ROS学习心得——安装篇——ROS安装

    ROS学习心得--安装篇--ROS安装 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: ROS(Robot Operating System) ...

  4. ROS学习之Arduino篇——读取并发布各种传感器数据

    本篇主要包括以下五部分内容: 1. 说明 2. 在rosserial_arduino中自定义数据类型 3. 使用Arduino读取传感器的数据 4. 更改代码 5. 测试 本篇将读取超声波雷达.电位计 ...

  5. ROS学习心得——机器人篇——同一局域网下机器人与主机的通信

    ROS学习心得--机器人篇--同一局域网下机器人与主机的通信 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: 关于这一章我将详细的介绍如何利用 ...

  6. [服务计算] 简单 web 服务与客户端开发实战

    GitHub: 项目文档: https://github.com/fentender/book-blog-doc 客户端: https://github.com/fentender/book-blog ...

  7. 服务计算--简单 web 服务与客户端开发实战

    一.概述 利用 web 客户端调用远端服务是服务开发本实验的重要内容.其中,要点建立 API First 的开发理念,实现前后端分离,使得团队协作变得更有效率. 任务目标 选择合适的 API 风格,实 ...

  8. 编写简单的发布者和订阅者(C++)---ROS学习第9篇

    文章目录 1.编写发布者节点 2. 编写订阅者节点 3.构建节点 4.运行节点 1.编写发布者节点 在之前创建的study/src目录下创建talker.cpp文件并粘贴以下内容进去 #include ...

  9. 理解ROS节点---ROS学习第4篇

    文章目录 1.图概念速览 2.节点 3.客户端库 4.roscore 5.使用rosnode 6.使用rosrun 1.图概念速览 计算图(Computation Graph)是一个由ROS进程组成的 ...

最新文章

  1. java里注释为什么报错_这些年我们在java中遇到过的坑,你遇到过几个
  2. Python之路--Python基础12--并发编程之协程
  3. vmware中的Ubuntu安装ssh全家桶(解决connect to host localhost port 22: Connection refused)...
  4. [原创]关于打开新窗口和关闭老窗口的2个方法!
  5. 【数据库】数据库系统的结构(概念篇详解)
  6. 提示:通过URL激活并发送参数
  7. java 快捷工具,如何清理不需要的引用
  8. python写剧情文字游戏_文字游戏引擎试用心得之一:Ren'py 和 Fungus
  9. 【问题解决】线程间操作无效:从不是创建控件“textBox1”的线程访问它
  10. 【异常 1】什么是异常
  11. 如何将文字转换成二维码?
  12. 20140322深圳百公里
  13. Could not publish server configuration for Apache Tomcat v7.0.22 at localhos
  14. 100个经典C语言程序(益智类)
  15. MP地面站在飞行数据显示界面显示自己想显示的数据
  16. echarts添加基准线
  17. java输入成绩并排序简单_java 成绩排序
  18. 简述关系数据库的数据完整性规则_关系数据库的完整性简述 关系数据库完整性规则...
  19. 操作系统的简介(UNIX、Linux)
  20. 你应该解雇工作狂程序员的5个原因

热门文章

  1. 微型计算机的外存储器可与 直接打交道,微型计算机的外存储器可与( )直接打交道。...
  2. python 处理url 参数_Python 优雅的处理网页URL参数
  3. log4j 打印线程号配置_log4j配置参数
  4. 四章: CentOS6.5 配置连接Windows远程桌面、创建新用户、禁用root在本地或远程使用ssh登录
  5. matlab 多次求解偏微分方程 ode45
  6. python游戏编程快速上手第四版dragon_《Python游戏编程快速上手》——导读
  7. python生成器和迭代器作用_浅谈Python中的生成器和迭代器
  8. python归并排序 分词_python-归并排序
  9. 网络运维基础之IP地址学习
  10. Zabbix的故障与恢复邮件设置