《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/9/25 3:30:27 阅读更多 →
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/9/28 20:47:50 阅读更多 →
前端进入网站建设公司怎么样?给想转行或刚入行小白的真心话与避坑指南

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

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

2026/9/29 6:56:32 阅读更多 →

最新新闻

FTTR全光家庭网络:从物理层重构Wi-Fi体验

FTTR全光家庭网络:从物理层重构Wi-Fi体验

简介:本资源为华为FTTR全光家庭网络创新解决方案的完整技术白皮书PDF,面向通信工程师、宽带网络规划人员、运营商装维团队及智能家居方案集成商,聚焦解决大户型Wi-Fi覆盖弱、千兆宽带实际速率不足(实测常低于签约带宽20%&#xff…

2026/9/30 11:03:55 阅读更多 →
网络安全技术基础入门:从核心概念到职业发展路线

网络安全技术基础入门:从核心概念到职业发展路线

网络安全技术基础——第1章:网络安全概述 说句实在话,我见过太多人一上来就撸工具、扫端口、翻漏洞报告,结果学了一个月连“这个漏洞到底危害在哪”都讲不清楚。网络安全这个方向,看着门槛低,实际上非常吃基础。你手里有工具&…

2026/9/30 11:03:55 阅读更多 →
JavaWeb从入门到实战:SpringBoot+MySQL搭建完整项目全攻略

JavaWeb从入门到实战:SpringBoot+MySQL搭建完整项目全攻略

很多刚接触 JavaWeb 的同学都有一种感觉:书翻了好几遍,视频也刷了,一打开 IDEA 却不知道从哪里下手。今天想结合我自己做项目、带新人的实际经验,把 JavaWeb 从“配置环境”到“跑通一个完整项目”的这条路彻底捋一遍。无论你是要…

2026/9/30 11:03:55 阅读更多 →
Sniffnet 贡献指南:从 Issue 认领到合并的完整流程与代码质量门禁

Sniffnet 贡献指南:从 Issue 认领到合并的完整流程与代码质量门禁

网络桌面应用数据可视化 【免费下载链接】sniffnet Comfortably monitor your network traffic 🕵️‍♂️ 项目地址: https://gitcode.com/GitHub_Trending/sn/sniffnet 点击查看 免费下载 Sniffnet 是一款用 Rust 编写的开源网络流量监控工具&#xf…

2026/9/30 11:03:55 阅读更多 →
排序算法从入门到实践:复杂度、稳定性与避坑指南

排序算法从入门到实践:复杂度、稳定性与避坑指南

我经常和刚学算法的朋友说,如果只选一类算法来入门,我肯定推荐排序。原因很简单:排序算法是数据结构、分治、递归、复杂度分析这些概念的天然载体。最近很多同学在刷各种排序算法,从冒泡、快排到归并、堆排序,还有各种…

2026/9/30 11:03:55 阅读更多 →
tar解压失败排查与修复:从gzip报错到完整复原

tar解压失败排查与修复:从gzip报错到完整复原

最近排查一个线上问题时,连着在三台服务器上撞见了同一种尴尬场面: tar -zxvf 刚解压到一半,终端里刷出一行 gzip: stdin: unexpected end of file ,紧接着就是 tar: Error is not recoverable: exiting now ,退…

2026/9/30 11:02:54 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →