ROS服务通信(C++)
ROS服务通信C++
效果图
结构总览
友情提醒
每一步编辑完,执行一下 Ctrl+Shift+B进行编译,及时排查错误
准备工作
第一步:创建工作空间
配置:roscpp rospy std_msgs
devel/src/sever_client/src/CMakeLists.txt
devel/src/sever_client/src/package.xml
devel/src/sever_client/srv/strings.srv
# 客户端请求时发送的两个字符串
string str1
string str2
---
# 服务器响应发送的数据
string res
devel/src/sever_client/src/server.cpp
// 客户端请求时发送的两个字符串
#include "ros/ros.h"
#include "server_client/strings.h"
#include <string>
#include "std_msgs/String.h"
using namespace std;
using namespace std_msgs;
/*
1.包含头文件
服务端实现
*/
// bool 返回值由于标志是否处理成功
bool doStrings(server_client::strings::Request &request,
server_client::strings::Response &response)
{
// 处理请求
// string str1 = request.str1;
// string str2 = request.str2;
string str1;
str1 = request.str1;
string str2;
str2=request.str2;
ROS_INFO("服务器接收到的请求数据为:str1 = %s, str2 = %s",str1.c_str(), str2.c_str());
// //组织响应
// // static const string res = str1 + str2;
// string res;
// // sprintf(res, "%s%s", str1, str2);
// res = str1 + str2;
// // response.res = res;
response.res = request.str1 + request.str2;
// ROS_INFO("request: str1=%s, str2=%s", request.str1.c_str(), request.str2.c_str());
ROS_INFO("服务器接发送的响应数据为: res = %s", response.res.c_str());
// ros::spin();
return true;
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
// 2.初始化 ROS 节点
ros::init(argc,argv,"strings_Server");
// 3.创建 ROS 句柄
ros::NodeHandle nh;
// 4.创建 服务 对象
ros::ServiceServer server = nh.advertiseService("strings",doStrings);
ROS_INFO("服务端已经启动....");
// 5.回调函数处理请求并产生响应
// 6.由于请求有多个,需要调用 ros::spin()
ros::spin();
return 0;
}
devel/src/sever_client/src/client.cpp
// 客户端请求时发送的两个字符串
// 1.包含头文件
#include "ros/ros.h"
#include "server_client/strings.h"
#include <iostream>
#include "std_msgs/String.h"
using namespace std;
using namespace std_msgs;
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
// 调用时动态传值,如果通过 launch 的 args 传参,需要传递的参数个数 +3
if (argc != 3)
// if (argc != 5)//launch 传参(0-文件路径 1传入的参数 2传入的参数 3节点名称 4日志路径)
{
ROS_ERROR("请提交两个字符串");
return 1;
}
ROS_INFO("客户端已经启动....");
// 2.初始化 ROS 节点
ros::init(argc,argv,"strings_Client");
// 3.创建 ROS 句柄
ros::NodeHandle nh;
// 4.创建 客户端 对象
ros::ServiceClient client = nh.serviceClient<server_client::strings>("strings");
//等待服务启动成功
//方式1
ros::service::waitForService("strings");
//方式2
// client.waitForExistence();
// 5.组织请求数据
server_client::strings ai;
ai.request.str1 = argv[1];
ai.request.str2 = argv[2];
// cout << atoi(argv[1]) << ' ' << atoi(argv[2]);
// ai.request.str1 = 'a';
// ai.request.str2 = 'b';
ROS_INFO("客户端发送的请求数据为:str1 = %s, str2 = %s",ai.request.str1.c_str(), ai.request.str2.c_str());
// 6.发送请求,返回 bool 值,标记是否成功
bool flag = client.call(ai);
// 7.处理响应
if (flag)
{
ROS_INFO("请求正常处理,响应结果: res = %s",ai.response.res.c_str());
}
else
{
ROS_ERROR("请求处理失败....");
return 1;
}
return 0;
}
made by zyl
ROS服务通信(C++)的更多相关文章
- ROS Learning-013 beginner_Tutorials (编程) 编写ROS服务版的Hello World程序(Python版)
ROS Indigo beginner_Tutorials-12 编写ROS服务版的Hello World程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的 ...
- ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务
ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubunt ...
- 理解ros服务和参数 ---- 7
原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/ 周学伟 Description: 本教程介绍了ROS 服务和参数的知识,以及命令行工具rosservi ...
- 与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信
原文:与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信 [索引页][源码下载] 与众不同 windows phone (29) - Co ...
- 美团分布式服务通信框架及服务治理系统OCTO
一.什么是OCTO 定义: OCTO是美团的分布式服务通信框架及服务治理系统,属于公司级基础设施,目前尚未开源. 目标: 为公司所有业务提供统一的服务通信框架,使业务具备良好的服务运营能力,轻松实现 ...
- ROS串口通信
身处机器人行业,不想一直只做低端的单片机控制,老是待在舒适区,所以一直都想学一下ROS系统,但看了几个月资料后,感觉还是云里雾里,似懂非懂,感念似乎都很清楚,但要实际去做,却又感觉无从下手. 于是想先 ...
- (十)创建ROS消息和ROS服务
ROS总教程(中文版) 110.创建ROS消息和ROS服务
- ROS学习(八)—— 理解ROS服务和参数
一.ROS 服务 服务(services)是节点之间通讯的另一种方式.服务允许节点发送请求(request) 并获得一个响应(response) 二.rosservice 1.用途 rosservic ...
- ROS Learning-009 beginner_Tutorials ROS服务 和 ROS参数
ROS Indigo beginner_Tutorials-08 ROS服务 和 ROS参数 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14 ...
- RRiBbit,一个事件总线.基于spring配置不同服务通信!
1.何为RRiBbit? *一种开源事件总线技术,能够让模块(组件)之间双向通讯,也被称为请求相应总线(request-response-bus),使用简单,相对其他框架来说,RRiBbit只需要加个 ...
随机推荐
- PAM8403 3.3V音频功放调试笔记
做I2S输出用了PT8211(实际上买到的丝印是GH8211), 双声道, LSB格式, 工作正常但是输出功率非常低, 喇叭声音要贴近了才能勉强听到, 所以打算做一个PT8211带功放的I2S模块. ...
- http转成https工具类
工具类代码如下: 点击查看代码 package com.astronaut.auction.modules.oss.utils; import org.apache.commons.collectio ...
- JavaScript:对象:如何复制一个对象?浅拷贝与深拷贝
回顾一下,我们对传参的讨论,对象的传参是引用传递,我们传递的是对象数据所在的内存地址: 那么无论我们怎么去赋值,所有变量指向的都是同一块内存: 如上图所示,无论我去使用哪个变量去操作对象的属性,改变的 ...
- python画社交网络图
安装依赖包 pip3 install networkx 在图书馆的检索系统中,关于图书的信息里面有一个是图书相关借阅关系图.跟这个社交网络图是一样的,反映了不同对象间的关联性.利用python画社交网 ...
- 【深入浅出 Yarn 架构与实现】4-3 RM 管理 NodeManager
本篇继续对 RM 中管理 NodeManager 的部分进行深入的讲解.主要有三个部分:检查 NM 是否存活:管理 NM 的黑白名单:响应 NM RPC 请求. 一.简介 在 RM 的主从结构中,最主 ...
- Android的诞生
Android操作系统最初由Andy Rubin开发,刚开始主要支持手机,被Google收购后,对Android进行了改良,使其可以用于平板电脑等其它领域. 1.1.1 Android的发展史Andr ...
- WCH沁恒 CH37系列芯片选型以及常见问题的处理(CH376/CH378)
选型 型号 接口 功能 备注 电源 CH372 并口 USB_Device 全速 USB 设备接口,兼容 USB V2.0 3.1-3.6 4.2-5.4 CH374 SPI/并口 Host/Devi ...
- Visual Studio 2022 MAUI NU1105(NETSDK1005) 处理记录
故障说明 MAUI项目是日常使用的项目,一直都好好的 某一天修改了几行代码后,突然项目无法编译了,提示NU1105错误 从Git重新拉取一份之前的代码编译也是同样的错误,经过半天的查阅,尝试了几种方案 ...
- [OpenCV实战]37 图像质量评价BRISQUE
摄影是全世界数百万人最喜爱的爱好.毕竟,这有多难啊!用美国著名摄影师阿巴斯•黛安娜的话来说: 拍照就像深夜踮着脚尖走进厨房,偷奥利奥饼干. 拍照很容易,但是拍一张高质量的照片却很难.它需要良好的组成和 ...
- ArcGIS工具 - 统计要素数量
查询和统计是GIS中的重要功能之一.在ArcGIS中可以按属性信息.按空间位置关系进行查询和统计.今天为源GIS给大家分享使用ArcPy编程实现批量统计地理数据库要素类记录数量. 软件应用 统计单个图 ...