ROS 2系統Callback Group概念筆記

核心概念

Callback Group(回調組)是一個管理一個或多個回調函數執行規則的容器。它決定了這些回調函數是如何被節點(Node)的 executor 調度的,特別是當多個回調函數同時就緒時,它們之間是并行執行還是必須串行執行。

理解回調組的關鍵在于理解它與 Executor 的交互。Executor 是 ROS 2 中負責檢查訂閱、定時器、服務、動作服務器等是否就緒,并調用其對應回調函數的組件。


為什么需要 Callback Group?

例如一個節點,它有以下組件:

  • 一個激光雷達(Lidar)訂閱者:回調函數 lidar_callback,處理高頻、數據量大的點云數據。
  • 一個鍵盤輸入訂閱者:回調函數 keyboard_callback,處理用戶偶爾的按鍵輸入。
  • 一個服務服務器:回調函數 save_data_service_callback,處理保存數據的請求。

如果沒有回調組,所有回調函數默認都在同一個組里。當 Executor 發現多個回調函數同時就緒時(例如,正在處理激光數據時用戶按下了鍵),它會將它們全部放入一個隊列,然后逐個執行。

這可能會導致一個問題:處理龐大的激光雷達數據可能會阻塞 keyboard_callbacksave_data_service_callback 很長時間,導致用戶輸入或服務請求響應非常遲鈍,體驗很差。

回調組就是為了解決這種回調函數之間的相互干擾問題而設計的。


回調組的類型

ROS 2 主要提供了兩種類型的回調組:

1. Mutually Exclusive (互斥型) - 默認類型
  • 行為:屬于同一個互斥組的所有回調函數不能同時執行。Executor 會像處理一個隊列一樣,一次只執行其中一個。
  • 類比:單線程。任務一個接一個地做。
  • 適用場景:這是最常用也是默認的類型。適用于回調函數之間沒有嚴格的實時性要求,或者它們會訪問共享資源需要互斥鎖保護的情況。
2. Reentrant (可重入型)
  • 行為:屬于同一個可重入組的所有回調函數可以同時被執行。Executor 會盡可能同時調用它們(如果系統有多個CPU核心,則真正并行)。
  • 警告:使用此類型需要非常小心。你必須確保回調函數是線程安全的。如果它們會訪問共享的變量或資源,你必須自己使用鎖(如 std::mutex)來保護,否則會導致數據競爭和未定義行為。
  • 類比:多線程。多個任務可以同時進行。
  • 適用場景:適用于那些相互獨立、沒有共享數據、且對實時性要求很高的回調函數。例如,一個控制電機的高頻定時器回調和一個發布狀態的低頻定時器回調。

使用回調組

你需要在創建訂閱者、定時器、服務等之前先創建回調組,然后在創建這些對象時將回調組作為參數傳入。

以下是 C++ 和 Python 的示例代碼:

C++ 示例
#include “rclcpp/rclcpp.hpp”class MyNode : public rclcpp::Node {
public:MyNode() : Node(”my_node”) {// 1. 創建回調組// 互斥型 (默認就是這個,顯式寫出更清晰)mutually_exclusive_group_ = this- >create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);// 可重入型reentrant_group_ = this- >create_callback_group(rclcpp::CallbackGroupType::Reentrant);// 2. 設置選項,在創建對象時指定所屬的回調組rclcpp::SubscriptionOptions options;options.callback_group = mutually_exclusive_group_;// 創建訂閱者,并指定它屬于 mutually_exclusive_group_lidar_sub_ = this- >create_subscription< sensor_msgs::msg::LaserScan >(/scan”, 10,std::bind(&MyNode::lidar_callback, this, std::placeholders::_1),options); // 傳入 options// 對于不需要特殊選項的對象,可以直接傳遞 callback_group 參數// 這個定時器屬于 reentrant_group_,可以和上面的訂閱者并行執行timer_ = this- >create_wall_timer(std::chrono::seconds(1),std::bind(&MyNode::timer_callback, this),reentrant_group_); // 直接傳入回調組}private:void lidar_callback(const sensor_msgs::msg::LaserScan::SharedPtr msg) {// 處理激光數據,可能很耗時}void timer_callback() {// 定時執行的任務}rclcpp::CallbackGroup::SharedPtr mutually_exclusive_group_;rclcpp::CallbackGroup::SharedPtr reentrant_group_;rclcpp::Subscription< sensor_msgs::msg::LaserScan >::SharedPtr lidar_sub_;rclcpp::TimerBase::SharedPtr timer_;
};int main(int argc, char * argv[]) {rclcpp::init(argc, argv);auto node = std::make_shared< MyNode >();rclcpp::spin(node);rclcpp::shutdown();return 0;
}

回調組與執行器(Executor)的配合

  • SingleThreadedExecutor:即使是可重入組,回調函數也無法真正并行,因為只有一個線程。但 Executor 會通過技巧(如在等待服務響應時切換到其他可執行回調)來模擬并發,提高響應效率。
  • MultiThreadedExecutor:這是發揮可重入組威力的地方。該執行器內部有一個線程池。當一個可重入組有多個回調就緒時,執行器可以從線程池中取出多個線程來真正并行地執行它們。

最佳實踐:如果你使用了可重入回調組,通常應該配合 MultiThreadedExecutor 來使用,以實現真正的并行處理。

總結

特性Mutually Exclusive (互斥)Reentrant (可重入)
執行方式串行并行
線程安全不需要額外考慮(默認安全)必須自行保證線程安全
性能可能因長回調導致阻塞響應性更好,資源利用率更高
適用場景默認選擇,共享資源需保護實時性要求高,回調間完全獨立

核心:Callback Group 是一種強大的工具,讓你能夠精細地控制節點內部回調函數的執行流程,從而優化節點的響應性和性能,避免不必要的阻塞。在設計復雜的節點時,合理地使用回調組是非常重要的一環。

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

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

相關文章

Qt——主窗口 mainWindow

主窗口 mainWindow 前面學習的所有代碼&#xff0c;都是基于QWidget控件&#xff0c;其更多的是作為別的窗口的部分 現在來學習QMainWindow&#xff0c;即主窗口&#xff0c;其包含以下屬性 Window Title&#xff1a;標題欄Menu Bar&#xff1a;菜單欄Tool Bar Area&#xff1a…

無訓練神經網絡影響下的智能制造

摘要 未訓練神經網絡&#xff08;Untrained Neural Networks, UNNs&#xff09;作為近年來人工智能領域的新興范式&#xff0c;正在逐步改變智能制造的發展路徑。不同于傳統深度學習依賴大規模標注數據與高性能計算資源的模式&#xff0c;UNNs 借助網絡結構自身的歸納偏置與初…

微服務自動注冊到ShenYu網關配置詳解

一、配置逐行詳解 shenyu:register:registerType: http # 注冊中心類型:使用 HTTP 協議進行注冊serverLists: ${shenyu-register-serverLists} # ShenYu Admin 的地址列表props:username: ${shenyu-register-props-username} # 注冊認證用戶名password: ${shenyu-regi…

時序數據庫IoTDB的列式存儲引擎

在大數據時代&#xff0c;工業物聯網&#xff08;IIoT&#xff09;場景正以前所未有的速度生成著海量的時間序列數據。這些數據通常由成千上萬的傳感器&#xff08;如溫度、壓力、轉速傳感器&#xff09;持續不斷采集產生&#xff0c;它們具備鮮明的特點&#xff1a;數據時間屬…

JavaScript手錄18-ajax:異步請求與項目上線部署

前言&#xff1a;軟件開發流程 AJAX&#xff1a;前端與后端的數據交互 前后端協作基礎 Web應用的核心是“數據交互”&#xff0c;前端負責展示與交互&#xff0c;后端負責處理邏輯與數據存儲&#xff0c;二者通過網絡請求協作。 &#xff08;1&#xff09;項目開發流程與崗…

HTB 賽季7靶場 - Enviroment

最近所幸得點小閑&#xff0c;補個檔嘞&#xff01;~nmap掃描 nmap -F -A 10.10.11.67dirsearch掃描發現login接口 http://environment.htb/login構造如下payload&#xff0c;讓程序報錯&#xff0c;其原理在于缺失了rember后會導致報錯&#xff0c;從而告訴我們一個新的參數ke…

源碼編譯部署 LAMP 架構詳細步驟說明

源碼編譯部署 LAMP 架構詳細步驟說明 一、環境準備 1. 關閉防火墻和SELinux [roothrz ~]# systemctl stop firewalld [roothrz ~]# systemctl disable firewalld [roothrz ~]# setenforce 02. 配置YUM網絡源 [roothrz ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://m…

機器學習----PCA降維

一、PCA是什么&#xff1f;主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;是機器學習中最常用的降維技術之一&#xff0c;它通過線性變換將高維數據投影到低維空間&#xff0c;同時保留數據的最重要特征。PCA由卡爾皮爾遜于1901年發明&#x…

ReactNative開發實戰——React Native開發環境配置指南

一、開發前準備 1. macOS平臺基礎工具安裝 brew install node18 brew install watchman brew install cocoapods2. 代理配置 npm config set proxy http://127.0.0.1:7890 npm config set https-proxy http://127.0.0.1:7890# 新增擴展建議&#xff08;可選配置&#xff09; ec…

差速轉向機器人研發:創新驅動的未來移動技術探索

在科技日新月異的今天&#xff0c;機器人技術作為智能制造與自動化領域的核心驅動力&#xff0c;正以前所未有的速度發展。其中&#xff0c;差速轉向機器人以其獨特的運動機制和廣泛的應用前景&#xff0c;成為了科研與工業界關注的焦點。本文旨在探討差速轉向機器人研發進展&a…

Wireshark捕獲電腦與路由器通信數據,繪制波形觀察

一、準備工作 電腦發出數據的波形圖繪制在我的另一篇博客有詳細介紹&#xff1a; 根據Wireshark捕獲數據包時間和長度繪制電腦發射信號波形-CSDN博客 路由器發送給電腦數據的波形圖繪制也在我的另一篇博客有詳細介紹&#xff1a; 根據Wireshark捕獲數據包時間和長度繪制路由…

汽車ECU實現數據安全存儲(機密性保護)的一種方案

一、 綜述在車輛ECU中總是有一些密鑰或重要數據需進行機密性保護&#xff0c;但因產品選型、成本等考慮&#xff0c;導致一些ECU的芯片不支持硬件安全模塊&#xff08;例如HSM、TEE等&#xff09;。此時&#xff0c;為保障數據的機密性&#xff0c;可考慮通過軟件實現數據的安全…

AI 效應: GPT-6,“用戶真正想要的是記憶”

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

云計算學習100天-第25天

部署LNMP環境安裝軟件#在前一天已經安裝nginx的基礎上安裝MariaDB&#xff0c;php和php-fpm yum -y install mariadb mariadb-server mariadb-devel php php-mysqlnd php-fpm #mariadb&#xff08;數據庫客戶端軟件&#xff09;、mariadb-server&#xff08;數據庫服務器軟件&…

細化的 Spring Boot 和 Spring Framework 版本對應關系

注:本文由ai輔助,個人整理,有問題可留言 Spring Boot 3.x 系列 (基于 Spring Framework 6.x) Spring Boot 版本 對應的 Spring Framework 版本 Java 支持版本 3.1.5 (最新) 6.0.15 Java 17+ 3.1.4 6.0.14 Java 17+ 3.1.3 6.0.12 Java 17+ 3.1.2 6.0.11 Java 17+ 3.1.1 6.0.…

PyTorch API 1

文章目錄torch張量創建操作索引、切片、連接與變異操作加速器生成器隨機采樣原地隨機采樣準隨機采樣序列化并行計算局部禁用梯度計算數學運算常量逐點運算歸約操作比較運算頻譜操作其他操作BLAS 和 LAPACK 運算遍歷操作實用工具符號數字導出路徑控制流優化方法操作符標簽torch.…

基于FPGA的實時圖像處理系統(2)——VGA顯示彩條和圖片

VGA顯示彩條和圖片 文章目錄VGA顯示彩條和圖片一、VGA簡介二、功能設計1、彩條設計2、圖片設計三、結果展示四、代碼一、VGA簡介 VGA(Video Graphics Array)是IBM在1987年隨PS/2機?起推出的?種視頻&#xff0c;具有分辨率?、顯?速率快、顏?豐富等優點&#xff0c;在彩 ?…

【網絡運維】Linux 文本處理利器:sed 命令

Linux 文本處理利器&#xff1a;sed 命令 sed 簡介 sed&#xff08;Stream Editor&#xff09;是一款非交互式的流編輯器&#xff0c;誕生于 1973–1974 年間的貝爾實驗室&#xff0c;由 McMahon 開發。它專為文本處理而生&#xff0c;功能強大&#xff0c;是 Linux 文本處理常…

week2-[一維數組]出現次數

week2-[一維數組]出現次數 題目描述 給定 NNN 個整數A1,A2,…,ANA_1,A_2,\ldots,A_NA1?,A2?,…,AN?。請求出這 NNN 個數中出現次數最多的數的出現次數&#xff0c;以及出現次數最少的數的出現次數。 輸入格式 讀入包括 222 行。第一行只有 111 個整數 NNN&#xff0c;表示數…

力扣 hot100 Day79

215. 數組中的第K個最大元素 給定整數數組 nums 和整數 k&#xff0c;請返回數組中第 k 個最大的元素。 請注意&#xff0c;你需要找的是數組排序后的第 k 個最大的元素&#xff0c;而不是第 k 個不同的元素。 你必須設計并實現時間復雜度為 O(n) 的算法解決此問題。 class…