编写简单的服务和客户端(C++)---ROS学习第10篇
文章目录
- 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篇相关推荐
- ROS学习笔记十:用C++编写一个简单的服务和客户端
ROS学习笔记十:用C++编写一个简单的服务和客户端 这一节主要介绍如何使用C++编写一个简单的服务和客户端节点. 编写服务节点 由于在前面的练习中,已经向beginner_tutorials软件包中 ...
- 转‘ROS学习心得——安装篇——ROS安装’
ROS学习心得--安装篇--ROS安装 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: ROS(Robot Operating System) ...
- ROS学习心得——安装篇——ROS安装
ROS学习心得--安装篇--ROS安装 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: ROS(Robot Operating System) ...
- ROS学习之Arduino篇——读取并发布各种传感器数据
本篇主要包括以下五部分内容: 1. 说明 2. 在rosserial_arduino中自定义数据类型 3. 使用Arduino读取传感器的数据 4. 更改代码 5. 测试 本篇将读取超声波雷达.电位计 ...
- ROS学习心得——机器人篇——同一局域网下机器人与主机的通信
ROS学习心得--机器人篇--同一局域网下机器人与主机的通信 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: 关于这一章我将详细的介绍如何利用 ...
- [服务计算] 简单 web 服务与客户端开发实战
GitHub: 项目文档: https://github.com/fentender/book-blog-doc 客户端: https://github.com/fentender/book-blog ...
- 服务计算--简单 web 服务与客户端开发实战
一.概述 利用 web 客户端调用远端服务是服务开发本实验的重要内容.其中,要点建立 API First 的开发理念,实现前后端分离,使得团队协作变得更有效率. 任务目标 选择合适的 API 风格,实 ...
- 编写简单的发布者和订阅者(C++)---ROS学习第9篇
文章目录 1.编写发布者节点 2. 编写订阅者节点 3.构建节点 4.运行节点 1.编写发布者节点 在之前创建的study/src目录下创建talker.cpp文件并粘贴以下内容进去 #include ...
- 理解ROS节点---ROS学习第4篇
文章目录 1.图概念速览 2.节点 3.客户端库 4.roscore 5.使用rosnode 6.使用rosrun 1.图概念速览 计算图(Computation Graph)是一个由ROS进程组成的 ...
最新文章
- java里注释为什么报错_这些年我们在java中遇到过的坑,你遇到过几个
- Python之路--Python基础12--并发编程之协程
- vmware中的Ubuntu安装ssh全家桶(解决connect to host localhost port 22: Connection refused)...
- [原创]关于打开新窗口和关闭老窗口的2个方法!
- 【数据库】数据库系统的结构(概念篇详解)
- 提示:通过URL激活并发送参数
- java 快捷工具,如何清理不需要的引用
- python写剧情文字游戏_文字游戏引擎试用心得之一:Ren'py 和 Fungus
- 【问题解决】线程间操作无效:从不是创建控件“textBox1”的线程访问它
- 【异常 1】什么是异常
- 如何将文字转换成二维码?
- 20140322深圳百公里
- Could not publish server configuration for Apache Tomcat v7.0.22 at localhos
- 100个经典C语言程序(益智类)
- MP地面站在飞行数据显示界面显示自己想显示的数据
- echarts添加基准线
- java输入成绩并排序简单_java 成绩排序
- 简述关系数据库的数据完整性规则_关系数据库的完整性简述 关系数据库完整性规则...
- 操作系统的简介(UNIX、Linux)
- 你应该解雇工作狂程序员的5个原因
热门文章
- 微型计算机的外存储器可与 直接打交道,微型计算机的外存储器可与( )直接打交道。...
- python 处理url 参数_Python 优雅的处理网页URL参数
- log4j 打印线程号配置_log4j配置参数
- 四章: CentOS6.5 配置连接Windows远程桌面、创建新用户、禁用root在本地或远程使用ssh登录
- matlab 多次求解偏微分方程 ode45
- python游戏编程快速上手第四版dragon_《Python游戏编程快速上手》——导读
- python生成器和迭代器作用_浅谈Python中的生成器和迭代器
- python归并排序 分词_python-归并排序
- 网络运维基础之IP地址学习
- Zabbix的故障与恢复邮件设置