《ROS1学习笔记5——话题通信最佳实践之自定义消息话题》
文章目录1、关于话题1.1、前言2、自定义消息接口2.1、新建功能包2.2、自定义消息接口2.2.1、 新建msg2.2.2 、在package.xml添加依赖2.2.3、修改CMakeLists2.3、编译3、编写程序3.1、发布者3.2、订阅者3.3、配置CMakeLists3.4、编译且运行3.4.1、编译3.4.2、运行1、关于话题1.1、前言在前面我们学习了如何发布消息以及如何订阅消息但都是基于ros里已经存在了的消息话题——海龟模拟器订阅和发布的话题。我们可以看看海龟模拟器的相关话题打开两个终端分别运行下面两句命令roscore rosrun turtlesim turtlesim_node在打开一个终端运行rostopic list就会出现与现在正在运行的节点相关的话题1、/rosout和/rosout_agg是运行ros就存在的。2、/turtle1/cmd_vel 是我们在笔记3发布一个话题中使用到的消息话题向该消息话题发布信息能够控制海龟进行运动。运行rostopic info/turtle1/cmd_vel可以看到该消息的相关信息geometry_msgs/Twist是消息接口也是我们在笔记3编写发布者代码时添加到头文件。3、/turtle1/pose是我们在笔记四订阅一个话题中用到的话题接口通过订阅该话题我们能获取到海龟当前的x、y坐标。2、自定义消息接口2.1、新建功能包在demo_ws/src目录下新建一个功能包catkin_create_pkg demo_topic roscpp rospy std_msgs geometry_msgsmessage_generation是编译时所需的依赖message_runtime是运行时所需的依赖2.2、自定义消息接口2.2.1、 新建msg在功能包目录下新建msg文件夹并新建Preson.msg文件用驼峰命令法首字母P必须大写string name uint8 sex uint8 age uint8 unkown0uint8 male1uint8 femake02.2.2 、在package.xml添加依赖添加下面两行配置代码build_dependmessage_generation/build_dependexec_dependmessage_runtime/exec_dependmessage_genaation是编译依赖message_runtime是运行依赖2.2.3、修改CMakeLists需要更改find_package和catkin_package将message_genaration添加进去。将message_runtime添加进去1、find_package(catkin REQUIRED COMPONENTS …)核心作用声明编译当前包时需要的依赖包2、catkin_package(…)核心作用声明当前包被其他包依赖时对方需要的信息包括运行时依赖、头文件路径、库文件等。其中 CATKIN_DEPENDS 明确指定了运行时依赖当前包运行时需要的包以及依赖当前包的其他包在编译 / 运行时也需要的包。通俗总结find_package 是 “我编译时需要什么”给当前包的编译过程用。catkin_package 是 “别人用我时需要什么”给依赖当前包的其他包用同时也隐含了当前包运行时的需求。3、添加一个配置项用于将自己新建的.msg文件编译成其他的文件add_message_files(FILES Person.msg)generate_messages(DEPENDENCIES std_msgs)如下图位置所示并且在上面也有相应的注释说明generate_messages(DEPENDENCIES std_msgs)触发消息生成过程ROS 会根据 add_message_files 声明的 .msg 文件自动生成对应语言C、Python 等的代码如头文件、类定义供你的程序调用。DEPENDENCIES std_msgs表示当前自定义消息依赖于 std_msgs 包中的基础消息类型如刚用到的uint8等2.3、编译回到功能空间目录下进行编译catkin_make编译成功后可以检查demo_ws/devel/include目录下会生成一个demo_topic文件夹文件夹下面有一个Person.h这就是根据刚才的.msg文件生成的c头文件主要包括一些类、属性是定义Person.h内容3、编写程序3.1、发布者#includeros/ros.h#includedemo_topic/Person.hintmain(intargc,char**argv){// ROS节点初始化ros::init(argc,argv,person_publisher);// 创建节点句柄ros::NodeHandle n;// 创建一个Publisher发布名为/person_info的topic消息类型为learning_topic::Person队列长度10ros::Publisher person_info_pubn.advertisedemo_topic::Person(/person_info,10);// 设置循环的频率ros::Rateloop_rate(1);intcount0;while(ros::ok()){// 初始化learning_topic::Person类型的消息demo_topic::Person person_msg;person_msg.nameTom;person_msg.age18;person_msg.sexdemo_topic::Person::male;// 发布消息person_info_pub.publish(person_msg);ROS_INFO(Publish Person Info: name:%s age:%d sex:%d,person_msg.name.c_str(),person_msg.age,person_msg.sex);//这里使用 name.c_str()是因为 ROS INFO函数输出%s时 并不是使用的std::string,所以需要额外从char 转为string// 按照循环频率延时loop_rate.sleep();}return0;}3.2、订阅者#includeros/ros.h#includedemo_topic/Person.h// 接收到订阅的消息后会进入消息回调函数voidpersonInfoCallback(constdemo_topic::Person::ConstPtrmsg){// 将接收到的消息打印出来ROS_INFO(Subcribe Person Info: name:%s age:%d sex:%d,msg-name.c_str(),msg-age,msg-sex);}intmain(intargc,char**argv){// 初始化ROS节点ros::init(argc,argv,person_subscriber);// 创建节点句柄ros::NodeHandle n;// 创建一个Subscriber订阅名为/person_info的topic注册回调函数personInfoCallbackros::Subscriber person_info_subn.subscribe(/person_info,10,personInfoCallback);// 循环等待回调函数ros::spin();return0;}3.3、配置CMakeListsadd_executable(person_pub src/person_pub.cpp)target_link_libraries(person_pub${catkin_LIBRARIES})add_dependencies(person_pub${PROJECT_NAME}_generate_messages_cpp)add_executable(person_sub src/person_sub.cpp)target_link_libraries(person_sub${catkin_LIBRARIES})add_dependencies(person_sub${PROJECT_NAME}_generate_messages_cpp)3.4、编译且运行3.4.1、编译编译成功后进度条跑到100%并且devel目录下出现两可执行文件3.4.2、运行需要注意的是修改后的环境变量只会在当前终端中生效。比如你此时打开了三个终端终端1运行roscore终端2运行订阅话题rosrun demo_topic person_sub终端2运行发布话题rosrun demo_topic person_pub你必须在终端2和3运行rosrun命令前运行source devel/setup.bash更改环境变量才能让代码成功跑起来。1、更改环境变量source devel/setup.bash2、启动ROSroscore3、运行订阅话题rosrun demo_topic person_sub4、运行发布话题rosrun demo_topic person_pub此时代码就成功运行起来了。

相关新闻

终极指南:如何免费降级你的iPhone 5和iPad Air?LeetDown完整教程

终极指南:如何免费降级你的iPhone 5和iPad Air?LeetDown完整教程

终极指南:如何免费降级你的iPhone 5和iPad Air?LeetDown完整教程 【免费下载链接】LeetDown a macOS app that downgrades A6 and A7 iDevices to OTA signed firmwares 项目地址: https://gitcode.com/gh_mirrors/le/LeetDown 你是否拥有一台经典…

2026/8/9 23:33:20 阅读更多 →
OpenMTP:告别macOS与Android文件传输烦恼的终极解决方案

OpenMTP:告别macOS与Android文件传输烦恼的终极解决方案

OpenMTP:告别macOS与Android文件传输烦恼的终极解决方案 【免费下载链接】openmtp OpenMTP - Advanced Android File Transfer Application for macOS 项目地址: https://gitcode.com/gh_mirrors/op/openmtp 还在为macOS上连接Android设备时文件传输的各种问…

2026/8/9 23:05:28 阅读更多 →
前端进入网站建设公司怎么样?给想转行或刚入行小白的真心话与避坑指南

前端进入网站建设公司怎么样?给想转行或刚入行小白的真心话与避坑指南

最近后台私信里,有一个问题出现的频率高得让人头疼,基本就是大家问得最多的:前端进入网站建设公司怎么样?这不仅仅是一个简单的职业选择问题,背后折射出的是很多开发者在这个充满焦虑和机遇并存的时代,对于自身职业路径的迷茫与探索。说实话,如果你是在知乎、CSDN或者各…

2026/8/9 19:56:32 阅读更多 →

最新新闻

零基础网络安全入门:从Kali Linux到渗透测试实战就业指南

零基础网络安全入门:从Kali Linux到渗透测试实战就业指南

这类课程最值得先看的不是它有多少集、谁讲的,而是它到底能不能帮你把“零基础”到“学完即可就业”这条路走通。Kali Linux 和渗透测试听起来很酷,但新手最容易踩的坑是:一上来就装系统、跑工具,结果连最基本的网络原理、目标环境…

2026/8/10 3:20:38 阅读更多 →
【2027最新】基于SpringBoot+Vue的在线问卷调查系统管理系统源码+MyBatis+MySQL

【2027最新】基于SpringBoot+Vue的在线问卷调查系统管理系统源码+MyBatis+MySQL

博主介绍:✨ 专业背景 专注Java企业级开发与小程序生态,全网影响力10万开发者,CSDN特邀作者、技术专家、新星计划导师。 🎯 核心服务 📚 毕业设计智库 微信小程序方向:100个前沿选题 Java企业级方向&#x…

2026/8/10 3:20:38 阅读更多 →
Python数据分析全栈学习路径:从零基础到项目实战的196小时系统教程

Python数据分析全栈学习路径:从零基础到项目实战的196小时系统教程

这次我们来看一套号称“清华大学196小时讲完”的Python数据分析全套教程。标题很吸引人,600集、零基础到精通、全程干货,听起来像是一个打包好的知识宝库。但作为技术人,我们得先抛开营销话术,看看这套教程到底覆盖了什么、怎么学…

2026/8/10 3:20:38 阅读更多 →
JDK17+JavaFX打包EXE解决No toolkit found错误

JDK17+JavaFX打包EXE解决No toolkit found错误

1. 问题现象与背景分析最近在将JDK17JavaFX项目打包成EXE时遇到了一个典型错误:"Caused by: java.lang.RuntimeException: No toolkit found"。这个报错通常发生在使用JavaFX工具链进行本地打包时,特别是从JDK11开始JavaFX被移出标准JDK后&…

2026/8/10 3:20:38 阅读更多 →
小程序语音播报功能实现与优化指南

小程序语音播报功能实现与优化指南

1. 语音播报功能在小程序中的核心价值在"小鲸写字"这类教育类小程序中,语音播报功能绝不是简单的技术炫技。从实际教学场景来看,这个功能至少解决了三个关键痛点:第一是解决低龄儿童的识字障碍。当孩子写完一个字却不确定是否正确时…

2026/8/10 3:20:38 阅读更多 →
钓鱼邮件伪装技术解析与企业防御实战指南

钓鱼邮件伪装技术解析与企业防御实战指南

1. 钓鱼邮件新变种:伪装成垃圾邮件警报的攻击手法剖析最近安全团队发现一类高度定向化的钓鱼攻击,攻击者精心伪造企业级垃圾邮件过滤系统的警报通知,诱导受害者点击恶意链接。这类邮件通常带有"您的邮件已被隔离"、"重要&…

2026/8/10 3:19:37 阅读更多 →

日新闻

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南 【免费下载链接】graphql-css A blazing fast CSS-in-GQL™ library. 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-css GraphQL-CSS是一个基于GraphQL的CSS-in-GQL™库&#xff0…

2026/8/10 0:00:02 阅读更多 →
告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南 【免费下载链接】kiss-translator A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本) 项目地址: https://gitcode.com/…

2026/8/10 0:00:02 阅读更多 →
BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否曾经因为游戏插件的复杂…

2026/8/10 0:00:02 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/10 1:05:29 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/10 1:05:29 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/10 1:05:29 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/9 17:05:02 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/10 1:05:29 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/9 17:05:02 阅读更多 →