首页 > 编程语言 >ROS服务通信(C++)

ROS服务通信(C++)

时间:2023-03-03 20:56:56浏览次数:32  
标签:ROS str2 str1 request 通信 C++ client ros

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,str2,str1,request,通信,C++,client,ros
From: https://www.cnblogs.com/zylyehuo/p/17176936.html

相关文章

  • [C/C++] noexcept:承诺函数不抛出异常
    noexcept是新标准(C++11)引入的,其作用是我们承诺一个函数不抛出异常。标准库知道我们的函数不会抛出异常,就不会认为“函数可能会抛出异常”,而为这种可能性做一些额外的工作;......
  • C++智能指针详解(共享指针,唯一指针,自动指针)
    前言:智能指针在C++11中引入,分为三类:shared_ptr:共享指针unique_ptr:唯一指针auto_ptr:自动指针一、共享指针几个共享指针可以指向同一个对象;每当shared_ptr的最后一个所有者......
  • C++类的默认函数(特种函数)
    默认不显示地声明#include<iostream>#include<chrono>#include<unordered_map>usingnamespacestd;usingnamespacestd::chrono;classWidget{public://......
  • 网络通信——TCP “三次握手“、“四次挥手“ 详解
    前言TCP三次握手和四次挥手是面试题的热门考点,它们分别对应TCP的连接和释放过程1.TCP通信包含那几步?TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道......
  • C++时间对秒数的运算
    使用引用#include<iostream>usingnamespacestd;structTime{ inth; intm; ints;};voidtimeCompute(Time&t,intsec){ //引用作为形参 t.m=t.m+(t.s......
  • 了解Microsoft Media Foundation
    关于MicrosoftMediaFoundation是什么MicrosoftMediaFoundation是用来处理(创建、修改、传输、合成)多媒体数据(音视频)的一个平台。有什么用MicrosoftMediaFoundatio......
  • c++ 五种排序方式
    第一种:冒泡排序冒泡排序遍历两次数组,时间复杂度On2,每一次用一个元素和后续其他所有元素比较,若是大小不符合预期则反转位置,具体实现代码如下:#include<iostream>#include......
  • Linux开发C++
    首先在windows上安装linux系统。VM简介VMwareWorkstation中文版是一个“虚拟PC”软件。它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多......
  • 【大型软件开发】开发日志(五).net框架与C++的融合:CLR——C++调用C#的DLL
    做什么?先说一下场景,现在正在开发一个QtActiveServer,也就是用一个应用程序去向其他的组件暴露接口,以达到提供服务的目的。然后新版的框架要提供大部分功能,也就是要重做大......
  • C/C++学生考勤系统[2023-03-03]
    C/C++学生考勤系统[2023-03-03]功能:学生考勤系统应包含各班学生的全部信息。每个学生是一条记录,包括姓名、性别、学号、出勤情况等。本系统可模拟考勤过程,记录考勤结果,并......