IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> ROS学习(二)——服务通信的C++实现 -> 正文阅读

[C++知识库]ROS学习(二)——服务通信的C++实现

ROS学习(二)——服务通信的C++实现.

引言:本文分为三个部分,分别为服务通信的理论模型、自定义srv文件的导入以及服务端和响应端对应的C++实现。

一、服务通信理论模型

服务通信的理论模型与单片机的中断模式类似,我们先将服务端程序挂起,然后只有当客户端发出请求的时候,服务端才会响应,调用对应的回调函数。在这里我们也举一个比较简单的例子:服务端进行加和运算,把客户端发来的两个数字求和并输出。

二、自定义srv文件的导入

在本例子中,我们需要3个变量:即客户端要输入的2个数字num1,num2,以及服务端响应的求和结果sum,他们都是整形变量,步骤如下:

1.创建srv文件

在功能包下新建srv文件夹,在其中创建后缀为srv的文件,这里设置为srv.srv,并在其中写入需要用到的变量,上为客户端请求变量,下为服务端响应变量,中间用—分割。

int32 num1
int32 num2
---
int32 sum

2.编辑配置文件(package.xml与CMakeLists.txt)

  #package.xml添加依赖
  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>
#CMakeLists.txt添加依赖
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)
add_service_files(
  FILES
  srv.srv
)
generate_messages(
  DEPENDENCIES
  std_msgs
)

3.编译

catkin_make

4.导入头文件路径

编译之后我们就可以在devel/include/test_link和devel/lib/python3/dist-packages/test_link/srv下看到供我们引用的srv.h和srv.py文件。

我们在.vscode/c_cpp_properties.json文件中导入头文件路径"/home/hqs/ros_demo/devel/include/**"完成C++头文件的导入。

#include "test_link/srv.h"

我们在.vscode/settings.json文件中导入头文件路经 "/opt/ros/noetic/lib/python3/dist-packages"完成Python文件的导入。

from test_link.srv import srv

三、C++服务通信实现

1.服务端实现:

(1)导入头文件

#include "ros/ros.h"
#include "test_link/srv.h"

(2)初始化节点,并创建节点句柄

 ros::init(argc,argv,"node_name_server");
 ros::NodeHandle nh;

(3)创建服务端对象

//nh.advertiseService("节点名称",回调函数名称);
ros::ServiceServer srv = nh.advertiseService("topic_name_server",callback);
spin()  					//官方建议

(4)回调函数编写

bool callback(test_link::srv::Request &request,
              test_link::srv::Response &response)
{
    int num1 = request.num1;
    int num2 = request.num2;
    ROS_INFO("受到的请求数据为:%d与%d",num1,num2);
    int sum = num1 + num2;
    response.sum = sum;
    return true;
}

(5)CMakeLists.txt配置

add_executable(demo_server src/demo_server.cpp)

target_link_libraries(demo_server
${catkin_LIBRARIES}
)

2.客户端实现

(1)导入头文件略

(2)初始化节点略,创建句柄略

(3)创建客户端对象

ros::ServiceClient client = nh.serviceClient<test_link::srv>("topic_name_server");

(4)创建响应对象并指定main函数输入

test_link::srv srv;
srv.request.num1 = atoi(argv[1]); 
srv.request.num2 = atoi(argv[2]);
上传数据,等待响应
client.call(srv)

(5)CMakeLists.txt配置略

(6)编译

3.结果演示

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 00:58:09  更:2022-02-19 00:58:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:20:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码