ROS 话题订阅模型之自定义消息类型 C++实现

ROS 话题订阅模型之自定义消息类型

1.自定义消息类型好处

ROS提供了许多标准的消息类型,如 std_msgs/Stringsensor_msgs/Image 等,涵盖了很多常见的数据类型和传感器数据。但是,在实际的开发中,我们经常会遇到需要传输的数据类型是标准消息类型中没有的,或者我们希望定义自己的数据结构以适应特定的应用场景。

因此,ROS允许用户定义自己的消息类型,这样用户可以更灵活地描述和传输数据。一些常见的情况包括:

  1. 特定的传感器数据:例如,你可能有一种特殊类型的传感器,它输出的数据类型在标准消息中没有涵盖。
  2. 自定义控制命令:你可能需要向机器人或设备发送一些自定义的控制命令,以便执行特定的动作或行为。
  3. 自定义数据结构:你可能需要在ROS系统中传输一些复杂的数据结构,例如地图、路径规划数据等。

自定义消息使得ROS更加灵活,能够满足各种各样的应用需求。通过定义自己的消息类型,用户可以更好地组织和传输数据,从而更容易地开发复杂的ROS应用。

2. 使用自定义消息类型

以发送模拟相机数据自定义类型数据为例:

2.1 定义msg 文件

在功能包下新建msg目录,添加Image.msg 文件,用来模拟相机数据

添加以下内容:

uint16 frame_id  # 图像帧的ID  
uint16 width     # 图像的宽度  
uint16 height    # 图像的高度  
int64 timestamp  # 图像的时间戳,通常以纳秒为单位

2.2 编辑配置文件

package.xml中添加编译依赖与执行依赖

  <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>

CMakeLists.txt编辑 msg 相关配置

find_package(catkin REQUIRED COMPONENTSroscppstd_msgsmessage_generation
)
## 配置 msg 源文件
add_message_files(FILESImage.msg
)
# 生成消息时依赖于 std_msgs
generate_messages(DEPENDENCIESstd_msgs
)
#执行时依赖
catkin_package(CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
)

2.3 编译

使用编译命令之后,在 工程目录下的 devel/include/包名 会生成对应的C++头文件

后续编写代码要引用这些头文件

3.编写简单用例 C++ 传输模拟相机数据

如果使用VsCode开发,为了方便代码提示以及避免误抛异常,需要先配置 vscode,将前面生成的 head 文件路径配置进 c_cpp_properties.json 的 includepath属性:

{"configurations": [{"browse": {"databaseFilename": "${default}","limitSymbolsToIncludedHeaders": false},"includePath": ["/opt/ros/melodic/include/**","/usr/include/**","/opt/ros/melodic/include","/home/marxist/userdata/catkin_ws/devel/include/*"],"name": "ROS","intelliSenseMode": "gcc-x64","compilerPath": "/usr/bin/gcc","cStandard": "gnu17","cppStandard": "c++17"},{"name": "ros_inc","includePath": ["${workspaceFolder}/**"],"defines": [],"compilerPath": "/usr/bin/gcc","cStandard": "c11","cppStandard": "gnu++14","intelliSenseMode": "linux-gcc-x64"}],"version": 4
}

3.1 发布模拟相机数据

#include "ros/ros.h"
#include "image_node/Image.h"int main(int argc, char *argv[])
{setlocale(LC_ALL,"");//1.初始化 ROS 节点ros::init(argc,argv,"image_pub_node");//2.创建 ROS 句柄ros::NodeHandle nh;//3.创建发布者对象ros::Publisher pub = nh.advertise<image_node::Image>("image_info",1000);//4.组织被发布的消息,编写发布逻辑并发布消息image_node::Image image_data;int start_id =0;image_data.height=1080;image_data.width=1920;ros::Rate r(1);while (ros::ok()){// 获取当前时间  ros::Time current_time = ros::Time::now();  
// 将当前时间转换为int64纳秒时间戳  image_data.timestamp = current_time.toNSec();  pub.publish(image_data);// 打印消息字段  ROS_INFO("Image frame ID: %d, Width: %d, Height: %d, Timestamp: %ld",image_data.frame_id,image_data.width,image_data.height,image_data.timestamp);ros::spinOnce();}return 0;
}

3.2 接受模拟相机数据

#include "ros/ros.h"
#include "image_node/Image.h"void doGetData(const image_node::Image::ConstPtr& image_data){ROS_INFO("Image frame ID: %d, Width: %d, Height: %d, Timestamp: %ld",image_data->frame_id,image_data->width,image_data->height,image_data->timestamp);
}
int main(int argc, char *argv[])
{   setlocale(LC_ALL,"");//1.初始化 ROS 节点ros::init(argc,argv,"get_image");//2.创建 ROS 句柄ros::NodeHandle nh;//3.创建订阅对象ros::Subscriber sub = nh.subscribe<image_node::Image>("image_info",10,doGetData);//4.回调函数中处理 person//5.ros::spin();ros::spin();    return 0;
}

3.3 配置CmakeLists.txt

add_executable(image_pub  src/Image_pub.cpp)add_dependencies(image_pub ${PROJECT_NAME}_generate_messages_cpp)target_link_libraries(image_pub${catkin_LIBRARIES}
)add_executable(image_sub  src/Image_sub.cpp)add_dependencies(image_sub ${PROJECT_NAME}_generate_messages_cpp)target_link_libraries(image_sub${catkin_LIBRARIES}
)

4. 效果图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2981187.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

SD-WAN多分支组网案例分享

随着企业规模持续扩大&#xff0c;业务版图日益多元&#xff0c;多分支组网已成为企业网络建设的核心议题。如何构建高效、安全且灵活的网络连接&#xff0c;成为企业急需解决的关键问题。近些年&#xff0c;SD-WAN技术的崭露头角&#xff0c;为企业带来了前所未有的解决方案。…

在浏览器输入网址,Enter之后发生了什么?

在浏览器输入网址&#xff0c;Enter之后发生了什么&#xff1f; 很多八股文会给出&#xff1a; 1. DNS Resolution2. Establishing a Connection3. Sending an Http Request4. Receiving the HTTP Response5. Rendering the Web Page 但今天我斗胆插入第0.9步URL Parsing&#…

为什么堆排序的时间复杂度是O(N*logN)?

目录 前言&#xff1a; 堆排序&#xff08;以排升序为例&#xff09; 步骤&#xff08;用大根堆&#xff0c;倒这排&#xff0c;排升序&#xff09;&#xff1a; 1.先把要排列的数组建立成大根堆 2.堆顶元素&#xff08;82&#xff09;和最后一个元素交换&#xff08;2&…

【随想录】Day30—第七章 回溯算法part06

目录 题目1: 重新安排行程1- 思路2- 题解⭐重新安排行程 ——题解思路 题目2: N皇后1- 思路2- 题解⭐N皇后 ——题解思路 题目3: 解数独&#xff08;跳过&#xff09; 题目1: 重新安排行程 题目链接&#xff1a;332. 重新安排行程 1- 思路 思路&#xff1a; 本题实际上是一个…

2024第24届营养健康展/北京健康展/健康食品展

第24届中国国际营养健康产业博览会 2024HEC营养健康展/北京健康展/大健康展 2024北京大健康展/营养健康展/北京健康展 2024第24届营养健康展/北京健康展/健康食品展 2024北京健康展/营养品展/HEC营养健康展 HEC2024与您共同打造健康梦&#xff0d;做中国最具权威性的大健康…

H264 编码标准常见术语解释

H264 编码标准 H.264编码标准&#xff0c;也被称作MPEG-4 AVC&#xff08;Advanced Video Coding&#xff09;&#xff0c;是一种被广泛使用的数字视频压缩标准&#xff0c;由国际电信联盟&#xff08;ITU-T&#xff09;和国际标准化组织&#xff08;ISO&#xff09;共同开发。…

ArcGIS教程:降雨量插值

一、目标 制作一副年平均降雨量的地图。 二、数据 某地的175个气象站数据的shp文件station.shp&#xff0c;以及这个地方轮廓的栅格数据idoutlgd。 数据下载链接&#xff1a;数据下载链接 三、制作方法 1.首先加载数据。 2.在菜单栏/customize/toolbars/中找到geostatisti…

AI图书推荐:如何用ChatGPT和Python进行数据可视化

《如何用ChatGPT和Python进行数据可视化》的原版英文图书标题&#xff1a;Python 3 Data Visualization Using ChatGPT - GPT-4 &#xff0c;作者是 Oswald Campesato &#xff0c;2023年出版 本书旨在向读者展示Python 3编程的概念和数据可视化的艺术。它还探讨了使用ChatGPT/…

模块化 DeFi L2 “Mode” 整合 Covalent Network(CQT),以获 Web3 最大数据集的支持

Covalent Network&#xff08;CQT&#xff09;&#xff0c;作为 Web3 领先的数据层&#xff0c;宣布其统一 API 将与 Mode 集成&#xff0c;以加快其基于以太坊构建的专注于 DeFi 的模块化 Layer2 方案的数据访问速度。这一战略合作将通过为开发者提供更强大的工具和能力&#…

8.0MGR单主模式搭建_克隆(clone)插件方式

为了应对事务一致性要求很高的系统对高可用数据库系统的要求&#xff0c;并且增强高可用集群的自管理能力&#xff0c;避免节点故障后的failover需要人工干预或其它辅助工具干预&#xff0c;MySQL5.7新引入了Group Replication&#xff0c;用于搭建更高事务一致性的高可用数据库…

快解析搭建网站解决方案

在如今网络时代下&#xff0c;各行各业都需要有自己的门户网站。 企业搭建自己的门户网站&#xff0c;有着众多实际意义: 1.可以全面详细地介绍企业及企业产品&#xff0c;这是企业网站的一个最基本的功能。企业可以把任何想让大众知道的信息放到网站&#xff0c;当人们想知道…

如何从架构层面降低公有云多可用区同时故障的概率

阿里云和腾讯云都曾出现过因一个组件故障而导致所有可用区同时瘫痪的情况。本文将探讨如何从架构设计的角度减小故障域&#xff0c;在故障发生时最小化业务损失&#xff0c;并以 Sealos 的稳定性实践为例&#xff0c;分享经验教训。 抛弃主从&#xff0c;拥抱点对点架构 从腾…

Xilinx 7系列MMCM/PLL 编程时参数值的确定

MMCM/PLL 的编程必须遵循一套流程&#xff0c;以确保配置的稳定性和性能。本文将描述了如何根据特定的设计要求来编程 MMCM/PLL。设计可以通过两种方式实现&#xff1a;直接通过图形用户界面&#xff08;Clocking Wizard 时钟向导&#xff09;或通过实例化来实现 MMCM/PLL。无论…

LabVIEW与Modbus协议的多点温度监控系统

LabVIEW与Modbus协议的多点温度监控系统 随着工业自动化和智能化水平的不断提升&#xff0c;对于现场监控技术的需求日益增长。开发了一种基于LabVIEW与Modbus协议的多点温度监控系统&#xff0c;实现高效、准确的温度数据采集、处理和显示&#xff0c;以及数据存储功能&#…

python爬虫学习第二十八天-------了解scrapy(二十八天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

related_name和related_query_name属性

在Django模型继承中&#xff0c;假如在外键或多对多字段中使用了related_name属性或related_query_name属性&#xff0c;则必须为该字段提供一个独一无二的反向名字和查询名字。但是&#xff0c;这样在抽象基类中一般会引发问题&#xff0c;因为基类中的字段都被子类继承并且保…

Photoshop 2024 25.4蓝猫版_支持参数滤波器和Ai神经滤镜

网盘下载 Photoshop 2024 (Beta) 蓝猫版v25.4.0(2426)全新功能&#xff1a;支持参数滤波器和AI神经滤镜。 最新的PS 25.4 Beta版新增了参数滤波器&#xff08;Parametric Filters&#xff09;功能&#xff0c;而正式版的PS 2024还没有这个功能&#xff0c;只有Beta版才有&…

数据可视化———Tableau

基本认识&#xff1a; 维度&#xff1a;定性—字符串文本&#xff0c;日期和日期时间等等 度量&#xff1a;定量—连续值&#xff0c;一般属于数值 数据类型&#xff1a; 数值 日期/日期时间 字符串 布尔值 地理值 运算符 算数运算符&#xff1a;加减乘除,%取余&#xff0c;…

vue: vscode安装扩展Volar失败(保姆级教程+图文结合)

1 vscode插件离线下载vsix文件 2.1 打开vscode插件市场地址 ​​​​​​https://marketplace.visualstudio.com/search?termvue&targetVSCode&categoryAll%20categories&sortByRelevance 2.2 搜索插件,Vue.volar 1 2.3 下载vsix文件 打开 vetur插件地址&…

GUI测试首推!TestComplete 帮助有效缩短 40-50% 测试时长!

TestComplete 是一款自动化UI测试工具&#xff0c;这款工具目前在全球范围内被广泛应用于进行桌面、移动和Web应用的自动化测试。 TestComplete 集成了一种精心设计的自动化引擎&#xff0c;可以自动记录和回放用户的操作&#xff0c;方便用户进行UI&#xff08;用户界面&…