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

最新文章

  1. 使用ikmv将jar转换为dll,在.NET中直接调用
  2. CURL
  3. iconv命令详解
  4. Graph-tool简介 - wiki
  5. 【jmete】Bean shell使用(一)
  6. [添加用户]解决useradd 用户后没有添加用户Home目录的情况,Linux改变文件或目录的访问权限命令,linux修改用户密码
  7. Websocket和PHP Socket编程
  8. Server.Transfer方法,Server.Execute方法和Response.Redirect方法有什么异同
  9. centos7上安装与配置Tomcat7(整理篇)
  10. hdu3853(概率dp)
  11. 你怎么知道你的网站K
  12. 源码安装apache及配置转发
  13. Entity Framework (EF) Core工具创建一对多和多对多的关系
  14. [strongswan][autoconf][automake][cento] 在CentOS上编译strongswan git源码时遇到的autoconf问题
  15. 测H5
  16. CSS常见Bugs及解决方案列表
  17. ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Memory order
  18. 【Android】详解Android 网络操作
  19. 【转】 Ubuntu在启动器添加程序快捷方式
  20. Chromium base库分割字符串SplitString

热门文章

  1. 把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10
  2. NGINX的配置和基本使用
  3. 2、postman调试
  4. python3使用OCR识别图片
  5. [IOI2016] shortcut
  6. 解决angular11+zorro使用table组件排序失效以及分页组件失效问题,附完整DEMO代码
  7. 一幅图像为f=[1 4 7;2 5 8;3 6 9],设kx=1.8,ky=1.3,试采用最邻近插值对其进行放大,写出新图像矩阵。
  8. 字符编码和字符集-FileReader读取jbk格式的文件
  9. Dubbo 中 Zookeeper 注册中心原理分析
  10. 关于integer数据对比的问题