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
英文地址,請注明出處:http://en.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;如…