ROS2中的QoS(Quality of Service)詳解

ROS2中的QoS(Quality of Service)詳解

  • 1. 主要QoS參數
  • 2. 為什么需要設置QoS
  • 3. QoS兼容性規則
  • 4. 選擇QoS策略的建議
  • 5. 調試QoS問題的方法
  • 6. 踩坑:訂閱話題沒有輸出
    • 可能的原因:
    • 調試方法

QoS是ROS2中用于控制通信質量和行為的機制。它定義了發布者和訂閱者之間消息傳遞的各種策略和保證,包括可靠性、持久性、延遲等特性。

1. 主要QoS參數

  1. Reliability(可靠性)
# 兩種模式:
QoSReliabilityPolicy.RELIABLE      # 可靠傳輸,確保消息送達
QoSReliabilityPolicy.BEST_EFFORT   # 盡力傳輸,不保證送達
  1. Durability(持久性)
QoSDurabilityPolicy.TRANSIENT_LOCAL  # 為新訂閱者保留最后的消息
QoSDurabilityPolicy.VOLATILE         # 不保留消息
  1. History(歷史記錄)
QoSHistoryPolicy.KEEP_LAST   # 保留最后N條消息
QoSHistoryPolicy.KEEP_ALL    # 保留所有消息
  1. Depth(深度)
depth=10  # 消息隊列深度

2. 為什么需要設置QoS

  1. 發布者和訂閱者QoS必須兼容

ROS2中,發布者和訂閱者的QoS設置必須兼容才能正常通信。不兼容的QoS設置會導致連接失敗。

  1. 默認QoS差異
# ROS2不同API的默認QoS可能不同
# 有些默認是RELIABLE,有些是BEST_EFFORT

3. QoS兼容性規則

  1. Reliability兼容性
# 兼容組合:
Publisher: RELIABLE    <-> Subscriber: RELIABLE    ?
Publisher: BEST_EFFORT <-> Subscriber: BEST_EFFORT ?
Publisher: RELIABLE    <-> Subscriber: BEST_EFFORT ?
Publisher: BEST_EFFORT <-> Subscriber: RELIABLE    ? (不兼容)
  1. Durability兼容性
# 兼容組合:
Publisher: TRANSIENT_LOCAL <-> Subscriber: TRANSIENT_LOCAL ?
Publisher: VOLATILE        <-> Subscriber: VOLATILE        ?
Publisher: TRANSIENT_LOCAL <-> Subscriber: VOLATILE        ?
Publisher: VOLATILE        <-> Subscriber: TRANSIENT_LOCAL ? (不兼容)

4. 選擇QoS策略的建議

  1. 傳感器數據(如激光雷達、攝像頭)
# 使用BEST_EFFORT,因為數據頻率高,偶爾丟失可接受
qos_profile = QoSProfile(depth=10,reliability=QoSReliabilityPolicy.BEST_EFFORT,history=QoSHistoryPolicy.KEEP_LAST
)
  1. 控制命令
# 使用RELIABLE,確保命令不丟失
qos_profile = QoSProfile(depth=10,reliability=QoSReliabilityPolicy.RELIABLE,history=QoSHistoryPolicy.KEEP_LAST
)
  1. 配置參數
# 使用TRANSIENT_LOCAL,新訂閱者可以獲得最后的配置
qos_profile = QoSProfile(depth=1,reliability=QoSReliabilityPolicy.RELIABLE,durability=QoSDurabilityPolicy.TRANSIENT_LOCAL,history=QoSHistoryPolicy.KEEP_LAST
)

5. 調試QoS問題的方法

  1. 檢查QoS兼容性
# 查看話題的QoS信息
ros2 topic info /inner/information/object_computation -v
  1. 使用QoS分析工具
# 安裝QoS分析工具
sudo apt install ros-humble-rqt-graph
rqt_graph
  1. 在代碼中打印QoS信息
def check_qos_compatibility(self):"""檢查QoS兼容性"""topic_info = self.get_topic_names_and_types()self.get_logger().info(f'話題信息: {topic_info}')

您的問題通過設置BEST_EFFORT解決了,說明您的發布程序使用的是BEST_EFFORT策略,而訂閱程序默認使用了RELIABLE策略,導致不兼容。設置為BEST_EFFORT后,訂閱者可以接收任何可靠性級別的消息。

6. 踩坑:訂閱話題沒有輸出

通過程序發布ros2消息給/test_ros2話題 ,通過python程序

self.subscription = self.create_subscription(Object, '/test_ros2', object_callback, 100)

訂閱話題后,沒有打印任何信息。但是通過終端命令行ros2 topic pub /test_ros2 custom_msgs/Object 去發布,通過ros2 topic echo 查看話題,又有打印的信息。

可能的原因:

  1. 話題名稱不匹配

檢查您程序中發布消息的話題名稱是否完全匹配訂閱者的話題名稱。確保:

  • 發布者使用的話題名稱:/test_ros2
  • 訂閱者使用的話題名稱:/test_ros2
  • 注意前綴斜杠、大小寫、拼寫等
  1. 消息類型不匹配

確認發布程序使用的消息類型與訂閱者期望的類型完全一致:

# 發布者應該使用
from custom_msgs.msg import Object
  1. QoS設置不匹配

檢查發布者和訂閱者的QoS設置是否兼容。

調試方法

  1. 檢查話題狀態
# 查看當前活躍的話題
ros2 topic list
# 查看特定話題的信息
ros2 topic info /test_ros2
# 實時監聽話題消息
ros2 topic echo /test_ros2
  1. 檢查消息發布頻率

如果程序只發布一次消息就退出,可能訂閱者還沒來得及接收。嘗試:

# 在發布程序中循環發布或添加延遲
for i in range(5):  # 發布5次publisher.publish(msg)time.sleep(1)
  1. 使用相同的QoS設置

在訂閱者中明確設置QoS:

from rclpy.qos import QoSProfile, QoSReliabilityPolicyqos_profile = QoSProfile(depth=10)
qos_profile.reliability = QoSReliabilityPolicy.BEST_EFFORTself.subscription = self.create_subscription(Object,'/test_ros2',self.object_callback,qos_profile
)

最終采用方法3得到解決。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88694.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88694.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88694.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cursor三大核心AI功能

一&#xff1a;Tab鍵&#xff1a;智能小助手 1.1 單行/多行代碼補全 在代碼中寫出要實現的功能&#xff0c;第一次按Tab生成代碼&#xff0c;第二次按Tab接受代碼。1.2 智能代碼重寫 對已有代碼重新編寫。 寫個注釋告訴AI重構方法&#xff0c;然后鼠標點到方法內部&#xff0c;…

cesium添加原生MVT矢量瓦片方案

項目中需要基于cesium接入mvt格式的服務并支持屬性拾取查詢&#xff0c;通過一系列預研測試&#xff0c;最后選擇cesium-mvt-imagery-provider開源插件完成&#xff0c;關鍵源碼信息如下&#xff1a; npm i cesium cesium-mvt-imagery-provider //安裝依賴包// 加載圖層import…

AI金融風控:識別欺詐,量化風險的新利器

AI金融風控&#xff1a;識別欺詐&#xff0c;量化風險的新利器深度學習算法穿透海量交易數據&#xff0c;92.5%的不良貸款識別率宣告了金融風險防控新時代的來臨。深圳桑達銀絡科技有限公司在2025年6月申請的“基于人工智能的金融交易反欺詐系統”專利&#xff0c;揭示了金融風…

【unitrix】 5.0 第二套類型級二進制數基本結構體(types2.rs)

一、源碼 這是一個使用 Rust 類型系統實現類型級(type-level)二進制數的設計。 //! 類型級二進制數表示方案&#xff08;第二套方案&#xff09; //! //! 使用嵌套泛型結構體表示二進制數&#xff0c;支持整數和小數表示。use crate::sealed::Sealed;/// 類型級二進制數結構體 …

DAY01:【ML 第一彈】機器學習概述

一、三大概念 1.1 人工智能&#xff08;AI&#xff09; Artificial Intelligence 人工智能AI is the field that studies the synthesis and analysis of computational agents that act intelligently 1.2 機器學習&#xff08;ML&#xff09; Machine Learning 機器學習Fi…

AGX Xavier 搭建360環視教程【一、先確認方案】

設備默認自帶 NVIDIA 硬件編解碼能力&#xff08;NVDEC/NVENC&#xff09;&#xff0c;但是需要你在 OpenCV 和 FFmpeg 里正確啟用 調通 GStreamer 或 nvmpi&#xff0c;才真正能用起來&#xff01;這里的硬解碼是核心&#xff1a;Jetson 平臺的硬解碼&#xff0c;要么走 GStr…

服務器怎么跑Python項目?

在服務器上運行 Python 項目通常涉及 環境配置、依賴安裝、項目部署 和 進程管理。以下是詳細步驟&#xff1a;1. 連接服務器確保你能通過 SSH 訪問服務器&#xff1a;ssh usernameyour_server_ip&#xff08;如果是本地測試&#xff0c;可跳過這一步&#xff09;2. 安裝 Pytho…

【軟件設計師】

UML 類圖中的關系用例圖中的關系 關系例子類圖用例圖順序圖 概念示例通信圖活動圖泳道圖狀態圖

Java 內部類詳解:從基礎到實戰,掌握嵌套類、匿名類與局部類的使用技巧

作為一名 Java 開發工程師&#xff0c;你一定在實際開發中遇到過這樣的場景&#xff1a;想在一個類內部定義另一個邏輯相關的類&#xff1b;需要為某個接口或抽象類提供一個臨時實現&#xff08;比如監聽器&#xff09;&#xff1b;想利用面向對象特性來組織代碼結構&#xff0…

Java設計模式之行為型模式(觀察者模式)介紹與說明

一、模式結構 觀察者模式包含以下四個角色&#xff1a; Subject&#xff08;主題/被觀察者&#xff09; 維護觀察者列表&#xff0c;提供注冊&#xff08;registerObserver&#xff09;、移除&#xff08;removeObserver&#xff09;觀察者的方法&#xff0c;并定義通知所有觀察…

實現一個點擊輸入框可以彈出的數字軟鍵盤控件 qt 5.12

我們將創建兩個自定義組件&#xff1a; 1. NumericInputField&#xff1a;一個輸入框&#xff0c;當點擊時彈出數字鍵盤。 2. NumericKeyboard&#xff1a;一個可縮放的數字鍵盤。 設計思路&#xff1a; - NumericInputField 是一個常規的輸入框&#xff0c;但點擊后會彈出 Num…

Java 深入解析:JVM對象創建與內存機制全景圖

第一章&#xff1a;引言 Java 是一種面向對象的編程語言&#xff0c;對象&#xff08;Object&#xff09;是其最基本的組成單位。Java 的“一切皆對象”不僅體現在語法層面&#xff0c;更體現在運行時&#xff0c;幾乎所有數據都以對象形式存在于內存中。 然而&#xff0c;很…

Redis 基本操作筆記

1. Redis 簡介 Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、高性能的鍵值對存儲系統&#xff0c;通常作為數據庫、緩存、消息中間件等使用。它支持多種數據類型&#xff0c;包括字符串、哈希、列表、集合、有序集合等。 Redis 特點&#xff1a; 性能&…

Docker從環境配置到應用上云的極簡路徑

Docker從環境配置到應用上云的極簡路徑主要包括環境配置、應用容器化、選擇云平臺及部署應用等步驟&#xff0c;具體如下&#xff1a; - 配置Docker環境&#xff1a; - 安裝Docker&#xff1a;根據操作系統下載對應版本的Docker安裝包。如在Linux系統中&#xff0c;可使用命令…

Slicer渲染Dicom到nrrd

Slicer渲染Dicom到nrrd 工作中遇到一些處理Dicom數據的需求&#xff0c;個人通過網絡上的一些教程 對于原始數據嘗試轉換到nrrd時&#xff0c;發現部分的窗體數據的渲染方向不一致 進一步發現這些很多定義的方向是跟設備廠家強相關的&#xff0c;不同廠家對于同一段的Dicom參…

QT中設計qss字體樣式但是沒有用【已解決】

檢查一下stylesheet里面是不是有不能被QT讀取的CSS語言&#xff0c;可能會跟字體顏色沖突錯誤示范&#xff1a;/* 錯誤示例&#xff1a;QSS 中使用 box-shadow */ QPushButton {box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); /* Qt 不支持此屬性 */ }刪掉就行了如果后續想用陰影…

uniapp獲取狀態欄高度,膠囊按鈕的高度,底部安全區域的高度,自定義導航欄

相關API uni.getSystemInfoSync() uni.getMenuButtonBoundingClientRect() 創建一個utils文件夾&#xff0c;該文件下封裝一個systemInfo.js /*** 系統信息工具類* 封裝獲取系統狀態欄、導航欄和安全區域等相關信息的方法*/// 獲取系統信息并緩存 const systemInfo uni.get…

jQuery 文本屬性值

一、前言在網頁開發中&#xff0c;我們經常需要對頁面上的文本內容進行操作&#xff0c;例如動態修改段落文字、讀取用戶輸入框的內容、更新按鈕文本等。jQuery 提供了簡潔而強大的方法來處理這些常見的文本操作需求。本文將帶你全面了解 jQuery 中用于操作文本內容的三個核心方…

JAVA并發——為什么Java中的ThreadLocal對key的引用為弱引用

1、ThreadLocal 的用途 給每個線程提供自己獨立的變量副本&#xff0c;實現線程間隔離。 常用于&#xff1a; 數據庫連接、Session 緩存、用戶上下文&#xff08;如 userId&#xff09;線程池中的線程復用時避免共享污染&#xff1b;實現線程封閉的設計模式 2、內存泄漏 使用弱…

【C++】多線程同步三劍客介紹

目錄 條件變量 頭文件 主要操作函數 1、等待操作 2、喚醒操作 使用示例 信號量 頭文件 主要操作函數 1、信號量初始化 2、等待操作&#xff08;P操作&#xff09; 3、信號操作&#xff08;V操作&#xff09; 4、獲取信號量值 5、銷毀信號量 使用示例 互斥鎖 …