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++)的更多相关文章

  1. ROS Learning-013 beginner_Tutorials (编程) 编写ROS服务版的Hello World程序(Python版)

    ROS Indigo beginner_Tutorials-12 编写ROS服务版的Hello World程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的 ...

  2. ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务

    ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubunt ...

  3. 理解ros服务和参数 ---- 7

    原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/  周学伟 Description: 本教程介绍了ROS 服务和参数的知识,以及命令行工具rosservi ...

  4. 与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信

    原文:与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信 [索引页][源码下载] 与众不同 windows phone (29) - Co ...

  5. 美团分布式服务通信框架及服务治理系统OCTO

     一.什么是OCTO 定义: OCTO是美团的分布式服务通信框架及服务治理系统,属于公司级基础设施,目前尚未开源. 目标: 为公司所有业务提供统一的服务通信框架,使业务具备良好的服务运营能力,轻松实现 ...

  6. ROS串口通信

    身处机器人行业,不想一直只做低端的单片机控制,老是待在舒适区,所以一直都想学一下ROS系统,但看了几个月资料后,感觉还是云里雾里,似懂非懂,感念似乎都很清楚,但要实际去做,却又感觉无从下手. 于是想先 ...

  7. (十)创建ROS消息和ROS服务

    ROS总教程(中文版) 110.创建ROS消息和ROS服务

  8. ROS学习(八)—— 理解ROS服务和参数

    一.ROS 服务 服务(services)是节点之间通讯的另一种方式.服务允许节点发送请求(request) 并获得一个响应(response) 二.rosservice 1.用途 rosservic ...

  9. ROS Learning-009 beginner_Tutorials ROS服务 和 ROS参数

    ROS Indigo beginner_Tutorials-08 ROS服务 和 ROS参数 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14 ...

  10. RRiBbit,一个事件总线.基于spring配置不同服务通信!

    1.何为RRiBbit? *一种开源事件总线技术,能够让模块(组件)之间双向通讯,也被称为请求相应总线(request-response-bus),使用简单,相对其他框架来说,RRiBbit只需要加个 ...

随机推荐

  1. view-design tabpane禁用后renderHeader失效问题

    需求是这样的 在tabPane的renderHeader里面添加hover事件(使用组件自带的Poptip)能显示提示 其实这个不算是问题,设置disabled属性后,原本的元素上面添加了 ivu-t ...

  2. 重学c#系列——linq(1) [二十七]

    前言 简单介绍一下linq,linq很多人其实用的很熟练了,但是有些人不知道自己用的是linq. 正文 在介绍linq 之前,先介绍一下集合. public interface ICollection ...

  3. mysql下载及环境配置

    目录 mysql简介 mysql下载 启动mysql 系统mysql服务的启动 mysql虚拟环境配置 (可以直接看这个) 卸载说明 mysql简介 为什么是mysql? 虽然数据库软件有很多 但是操 ...

  4. 记开源项目:DotNetCore.CAP.MySql问题分析:only mysqlparameter objects may be stored

    1.  简介 最近在学习分布式事务及解决方案,最终找到了开源项目DotNetCore.CAP ,因为自己用的MySql数据库比较多.于是也使用MySQL+EFCore+RabbitMQ+CAP实现事务 ...

  5. 3、swagger调试

    Swagger: 1.将项目中所有的接口展现在页面上,这样后端程序员就不需要专门为前端使用者编写专门的接口文档: 2.当接口更新之后,只需要修改代码中的Swagger描述就可以实时生成新的接口文档了, ...

  6. MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(1)-后端项目框架搭建

    前言: 前面的四个章节我们主要讲解了MongoDB的相关基础知识,接下来我们就开始进入使用.NET7操作MongoDB开发一个ToDoList系统实战教程. MongoDB从入门到实战的相关教程 Mo ...

  7. 蚂蚁感冒【第五届蓝桥杯省赛C++A/B组】

    蚂蚁感冒 长 \(100\) 厘米的细长直杆子上有 \(n\) 只蚂蚁. 它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是 1 厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方 ...

  8. 腾讯出品小程序自动化测试框架【Minium】系列(一)环境搭建之第一个测试程序

    一.什么是Minium? minium是为小程序专门开发的自动化框架,使用minium可以进行小程序UI自动化测试. 当然,它的能力不仅仅局限于UI自动化, 比如: 使用minium来进行函数的moc ...

  9. P5934 [清华集训2012]最小生成树

    简要题意 给你一个 \(N\) 个点,\(M\) 条边的 无向连通 带权图.给定一条边 \((u,v,L)\),请问需要在原图中删除多少条边,使得将 \((u,v,L)\) 插入图后,它既可能在最小生 ...

  10. VUEX state 的使用学习二

    转载请注明出处: state 提供唯一的数据资源,所有的共享的数据都要统一放到store 中的state中进行存储; 状态state用于存储所有组件的数据. 管理数据 // 初始化vuex对象 con ...