ros通信机制学习——latched持久化机制

点云的地图的发送逻辑中,我发现每次使用rostopic echo 时只会打印一次,然后就不会再打印了。并且rviz中也是始终都会显示的,这里面其实就是用到了latched持久话机制,可以接受这最后一次发布的消息。
我们通过一个具体的项目来学习和认识这个过程

latched话题:

你创建的发布者使用了 latching(持久化)机制 (advertise<sensor_msgs::PointCloud2>(map_topic, 10, true) 中的 true 参数)。Latching 意味着最后一次发布的信息会被保存下来,新的订阅者连接时会立即接收到这条消息。因此,每当一个新的订阅者(如 rostopic echo)连接到这个话题时,它都会立即接收到那条被 latched 的消息。
源码信息:
头文件

#ifndef _MAP_LOADER_HPP_
#define _MAP_LOADER_HPP_#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl_conversions/pcl_conversions.h>
#include <ros/ros.h>
#include <sensor_msgs/Imu.h>
#include <sensor_msgs/PointCloud2.h>
#include <vector>
#include <pcl_ros/transforms.h>using namespace std;class MapLoader {
public:ros::Publisher pc_map_pub_;vector<string> file_list_;MapLoader(ros::NodeHandle &nh);private:sensor_msgs::PointCloud2 CreatePcd();
};#endif

map_load.cpp

#include <map_load/map_load.h>using namespace std;MapLoader::MapLoader(ros::NodeHandle &nh){std::string pcd_file, map_topic;nh.param<string>("pcd_path", pcd_file_path, "");nh.param<string>("map_topic", map_topic, "point_map");pc_map_pub = nh.advertise<sensor_msgs::PointCloud2>(map_topic, 10, true);//latched话题:创建的发布者使用了 latching(持久化)机制 // (advertise<sensor_msgs::PointCloud2>(map_topic, 10, true) 中的 true 参数)// Latching 意味着最后一次发布的信息会被保存下来,新的订阅者连接时会立即接收到这条消息。// 每当一个新的订阅者(如 rostopic echo)连接到这个话题时,它都会立即接收到那条被 latched 的消息file_list_.push_back(pcd_file_path);auto pc_msg = CreatePcd();cout << "pc_msg.width" << "\n" << pc_msg.width << endl;if (pc_msg.width != 0) {pc_msg.header.frame_id = "map";pc_map_pub_.publish(pc_msg);}}sensor_msgs::PointCloud2 MapLoader::CreatePcd() {sensor_msgs::PointCloud2 pc_msg;pcl::PointCloud<pcl::PointXYZ> pcd, part;int pcd_width = 0;for (const string& path : file_list_) {if (pcd_width == 0) {if (pcl::io::loadPCDFile(path.c_str(), pcd) == -1) {cerr << "load failed " << path << endl;}}else {if (pcl::io::loadPCDFile(path.c_str(), part) == -1) {cerr << "load failed " << path << endl;}pcd.width += part.width;pcd.row_step += part.row_step;pcd.data.insert(pcd.data.end(), part.data.begin(), part.data.end());}cerr << " load " << path << endl;if (!ros::ok()) break;}return pcd;
}int main(int argc, char** argv) {ros::init(argc, argv, "map_loader");ROS_INFO("\033[32m ---> \033[0m Map Loader Started.");ros::NodeHandle nh;ros::spin();return 0;
}

然后我们看launch文件中的传参

<launch><!--- Sim Time --><param name="/use_sim_time" value="false" /><!--- Run Rviz--><!-- <node pkg="rviz" type="rviz" name="rviz" args="-d $(find map_load)/rviz/map_show.rviz" /> --><!--- MapLoader -->    <arg name="pcd_path"  default="$(find map_load)/map/map_Statistical_filter.pcd"/><arg name="map_topic" default="point_map"/><node pkg="map_load" type="mapload"    name="mapLoader"    output="screen"><param name="pcd_path" value="$(arg pcd_path)"/><param name="map_topic" value="$(arg map_topic)"/></node></launch>

主要就是两个参数,一个是pcd的路径,一个是map发布的话题运行后:
在这里插入图片描述
此时可以查看一下话题的发布情况,可以看到

rostopic list
rostopic hz /mapLoader/point_map

在这里插入图片描述
所以就是没有数据在这里发布,也就不会占用带宽.我们卻是可以打印出来的:
在这里插入图片描述
在这里插入图片描述
rviz中也是可以显示出对应的点云地图的,这个方式非常适合那些不会变化的数据的内容.
我们从原理上深入分析一下:

ROS Publisher Latch 机制详解

1. 核心含义

  • ​功能定义​​:
    latch=true 启用​​持久化消息​​机制,发布者会缓存最后一次发送的消息。
  • ​核心作用​​:
    新订阅者连接到话题时,​​立即收到缓存的最后一条消息​​,无需等待下一次发布。

2. 底层机制

机制说明
消息存储ROS内部维护一个长度为1的队列,仅保留最新消息
触发条件新订阅者通过 ros::Subscriber 连接时触发
生命周期缓存消息保留至新消息发布或节点关闭

3. 适用场景

场景1:静态数据发布(如地图)

// 只需加载一次,新节点需立即获取
pc_map_pub_ = nh.advertise<sensor_msgs::PointCloud2>("map", 10, true);

场景2:低频更新数据(如初始位姿)

// 新的GUI模块启动后需立刻显示当前位置
pose_pub_ = nh.advertise<geometry_msgs::PoseStamped>("initial_pose", 1, true);

场景3:服务类数据(如全局路径)

// 控制模块可能稍后启动,需确保其能获取路径
path_pub_ = nh.advertise<nav_msgs::Path>("global_plan", 1, true);

4. 禁用 Latch 的对比

// 默认行为:latch=false
pc_map_pub_ = nh.advertise<sensor_msgs::PointCloud2>("map", 10); 

新订阅者体验 立即收到最后消息 必须等待下次 publish() 调用
数据连续性 适合单次发布场景 需要持续发布维持数据流

5. 实际效果验证

# 终端1:发布地图(仅一次)
rosrun map_loader map_loader _pcd_path:=/home/user/map.pcd# 终端2:查看话题
rostopic echo /map  # 立即显示数据
# 禁用 Latch 时的表现
rostopic echo /map  # 无输出,直到再次调用 publish()

6注意事项

  • List item

​​内存管理​​

大消息(如10万+点云)会持续占用内存,需评估消息大小

  • ​​ROS 2 对应机制​​
    通过QoS策略实现:
// ROS 2 等效实现
auto qos = rclcpp::QoS(10).durability(RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL);
pc_map_pub_ = node->create_publisher<sensor_msgs::msg::PointCloud2>("map", qos);
  1. 最佳实践指南

ROS Publisher Latch 参数对比表

​对比维度​latch=true (持久化)latch=false (非持久化,默认)
​新订阅者连接行为​立即收到最后一次发布的消息必须等待下一次 publish() 调用
​消息存储机制​ROS内部维护长度为1的队列,保留最新消息不存储任何历史消息
​适用数据类型​静态数据(地图/参数)、低频更新数据(路径/位姿)高频动态数据(激光/图像/IMU)
​内存占用​存储完整消息副本(需注意大消息内存消耗)无额外占用
​典型场景​初始化配置、服务类结果、需即时同步的全局数据实时数据流、连续状态更新
​调试验证方法​rostopic info /topic 显示 LATCH: truerostopic echo /topic 只在发布后显示新数据
​队列机制​固定队列长度=1(强制保留最新消息)队列长度由 advertise() 的第二个参数定义
​ROS 2 等效实现​DurabilityPolicy::TRANSIENT_LOCALDurabilityPolicy::VOLATILE
​典型代码示例​pub = nh.advertise<MapMsg>("map", 10, true);pub = nh.advertise<LaserScan>("scan", 10);
​数据更新影响​新消息会覆盖缓存,后续订阅者收到最新版本旧订阅者按队列长度接收历史消息,新订阅者只收新消息

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣每日打卡 1922. 统计好数字的数目 (中等)

力扣 1922. 统计好数字的数目 中等 前言一、题目内容二、解题方法1. 暴力解法&#xff08;会超时&#xff0c;此法不通&#xff09;2. 快速幂运算3. 组合计数的思维逻辑分析组合计数的推导例子分析思维小结论 4.官方题解4.1 方法一&#xff1a;快速幂 三、快速幂运算快速幂运算…

如何使用通义灵码玩转Docker - AI助手提升开发效率

一、引言 Docker 作为一种流行的虚拟化技术&#xff0c;能够帮助开发者快速搭建所需的运行环境。然而&#xff0c;对于初学者来说&#xff0c;掌握 Docker 的基本概念和使用方法可能会遇到一些挑战。本文将介绍如何利用通义灵码这一智能编码助手&#xff0c;帮助你更高效地学习…

从一到无穷大 #45:InfluxDB MCP Server 构建:从工程实践到价值重构

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 工程实践遇到的问题MCP Host选择开发流程 结果展现可能性展望工作生活带来的变化 MCP…

JAVA SDK通过proxy对接google: GCS/FCM

前言&#xff1a;因为国内调用google相关api需要通过代理访问(不想设置全局代理)&#xff0c;所以在代理这里经常遇到问题&#xff0c;先说一下结论 GCS 需要设置全局代理或自定义代理选择器&#xff0c; FCM sdk admin 在初始化firebaseApp时是支持设置的。 GCS: 开始时尝试在…

【NLP】24. spaCy 教程:自然语言处理核心操作指南(进阶)

spaCy 中文教程&#xff1a;自然语言处理核心操作指南&#xff08;进阶&#xff09; 1. 识别文本中带有“百分号”的数字 import spacy# 创建一个空的英文语言模型 nlp spacy.blank("en")# 处理输入文本 doc nlp("In 1990, more than 60% of people in East…

关于香橙派OrangePi 5 Ultra 这个开源板子,开发Android

我下载了它资料中的开源Android13 系统SDK&#xff0c; 这个SDK连个git 都没有&#xff0c;把这种代码释放能称为开源吗&#xff1f;&#xff1f; 并且也就是说你买了这个板子&#xff0c;里面是没有任何关于RK3588的开发文档&#xff0c;如果你没玩过其他RK平台&#xff0c;估…

WHAT - React Portal 机制:将子组件渲染到 DOM 的指定节点

文章目录 适合场景基本语法示例&#xff1a;Modal 弹窗1. 创建一个简单的 Modal.tsx2. 在 App 中使用 为什么要用 Portal&#xff1f;TypeScript 中 Portal 类型定义&#xff1f; 适合场景 React Portal 是 React 提供的一种机制&#xff0c;让你可以将子组件渲染到 DOM 的指定…

数据结构---跳表

目录 一、跳表的概念 为什么要使用随机值来确定层高 二、跳表的分析 &#xff08;1&#xff09;查找过程 &#xff08;2&#xff09;性能分析 三、跳表的实现 四、与红黑树哈希表的对比 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c…

PCDN通过个人路由器,用更靠近用户的节点来分发内容,从而达到更快地网络反应速度

PCDN&#xff08;P2P CDN&#xff09;的核心思想正是利用个人路由器、家庭宽带设备等分布式边缘节点&#xff0c;通过就近分发内容来降低延迟、提升网络响应速度&#xff0c;同时降低传统CDN的带宽成本。以下是其技术原理和优势的详细分析&#xff1a; 1. 为什么PCDN能更快&…

用excel做九乘九乘法表

公式&#xff1a; IF($A2>B 1 , 1, 1,A2 & “" & B$1 & “” & $A2B$1,”")

凡泰极客亮相QCon2025鸿蒙专场,解析FinClip“技术+生态”双引擎

2025年4月10日&#xff0c;备受瞩目的QCon开发者技术峰会盛大举行&#xff0c;本次活动开设鸿蒙专场以“HarmonyOS NEXT 创新特性与行业实践”为主题&#xff0c;汇聚了众多鸿蒙生态的领军人物与技术专家&#xff0c;共同探讨鸿蒙操作系统的技术创新与行业应用。 凡泰极客CTO徐…

java HttpServletRequest 和 HttpServletResponse

HttpServletRequest 和 HttpServletResponse 详解 1. HttpServletRequest&#xff08;HTTP 请求对象&#xff09; HttpServletRequest 是 Java Servlet API 提供的接口&#xff0c;用于封装客户端的 HTTP 请求信息。它继承自 ServletRequest&#xff0c;并增加了 HTTP 协议相…

HAL TIM PWM产生 蓝桥杯

目录 0.原理 0.1 CNT和CCR关系 0.2 PWM模式1模式2 1. cubemx配置 需求(将PA1输出1Khz的 50&#xff05;占空比的方波) 1.0 PWM的频率计算: 2.代码 0.原理 0.1 CNT和CCR关系 CNT计数器和CCR比较器进行比较,如果是向上计数,CNT逐渐增加,CCR是虚线位置,也是用户自定义的…

python入门:简单介绍和python和pycharm软件安装/学习网址/pycharm设置(改成中文界面,主题,新建文件)

Python 目前是 AI 开发的首选语言 软件安装 python解释器 官网下载 Python |Python.org 勾选 Add python.exe to PATH 将python.exe添加到PATH 勾选这个选项会将Python的可执行文件路径添加到系统的环境变量PATH中。这样做的好处是&#xff0c;你可以在命令行中从任何位置直…

CMD命令行笔记

CMD命令行笔记&#xff0c;涵盖常用命令及实用技巧&#xff0c;适合快速查阅&#xff1a; 一、基础操作 打开CMD Win R → 输入 cmd → 回车管理员模式&#xff1a;右键开始菜单 → 选择“命令提示符&#xff08;管理员&#xff09;” 常用命令 help&#xff1a;查看所有命令…

android中dp和px的关系

关于android的dp和px的关系是我刚开始学习android的第一个知识点&#xff0c;不知不觉学安卓也有一年了&#xff0c;但是偶然间我发现我理解的dp和px的关系一直是错的&#xff0c;真的是有一点搞笑&#xff0c;今天特意写一篇博客纪念一下这个我理解错一年的知识点。 dp和px之间…

(四)机器学习---逻辑回归及其Python实现

之前我们提到了常见的任务和算法&#xff0c;本篇我们使用逻辑回归来进行分类 分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高…

【汽车产品开发项目管理——端到端的汽车产品诞生流程】

MPU&#xff1a;集成运算器、寄存器和控制器的中央处理器芯片 MCU&#xff1a;微控制单元&#xff0c;将中央处理器CPU、存储器ROM/RAM、计数器、IO接口及多种外设模块集成在单一芯片上的微型计算机系统。 汽车产品开发项目属性&#xff1a;临时性、独特性、渐进明细性、以目标…

Python将不能修改的值称为不可变的 ,而不可变的列表被称为元组------元组

列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的&#xff0c;这对处理网站的用户列表或游戏中的角色列表至关重要。然而&#xff0c;有时候你需要创建一系列不可修改的元素&#xff0c;元组可以满足这种需求。Python将不能修改的值称为不可变的&#xf…

智慧医院室内导航系统架构拆解:技术选型与性能攻坚指南

本文面向医院信息化团队技术负责人及医疗IoT解决方案开发者&#xff0c;聚焦解决大规模院区导航系统的扩展性、多源数据融合及实时路径规划等技术难点&#xff0c;提供从架构到落地的完整技术路线图。 如需获取智慧医院导航导诊系统解决方案请前往文章最下方获取&#xff0c;如…