無人機開發分享——無人機集群基于braft實現長機動態推選算法

在無人機集群項目的算法開發中,推選長機作為集群的動態中心,往往承擔著集群管理、通訊中繼等重要功能。由于通訊鏈路的有限性和任務的實時性需要,需要保證動態長機時刻工作正常,并在異常情況下快速切換新長機。
本文主要分享基于braft的長機推選算法。在 ROS2 系統中基于 braft 設計無人機集群的長機推選算法需要結合分布式共識算法和 ROS2 的通信機制。以下是實現該算法的詳細步驟。

1 理解 braft 與長機推選

braft

百度開源的分布式一致性算法庫,基于 Raft 協議實現,提供領導者選舉、日志復制和安全性保障。

長機推選

在無人機集群中動態選擇一個 Leader(長機)負責決策,其他無人機作為 Follower(僚機)執行命令。

2. ROS2 與 braft 集成架構

在這里插入圖片描述

3. 核心實現步驟

步驟 1:創建 ROS2 工作空間和包

mkdir -p ~/drone_ws/src
cd ~/drone_ws/src
ros2 pkg create --build-type ament_cmake drone_leader_election --dependencies rclcpp
cd ~/drone_ws
colcon build --packages-select drone_leader_election
source install/setup.bash

步驟 2:集成 braft 庫
在CMakeLists.txt中添加 braft 依賴:

find_package(braft REQUIRED)add_executable(drone_leader_node src/drone_leader_node.cpp)
target_link_libraries(drone_leader_node${rclcpp_LIBRARIES}braft
)

步驟 3:實現長機推選節點

#include <rclcpp/rclcpp.hpp>
#include <braft/raft.h>
#include <braft/node.h>
#include <braft/protobuf_file.h>
#include <drone_msgs/msg/leader_status.hpp>
#include <drone_msgs/msg/drone_command.hpp>// 定義狀態機
class DroneStateMachine : public braft::StateMachine {
public:// Raft狀態變化回調void on_leader_start(int64_t term) override {RCLCPP_INFO(rclcpp::get_logger("drone_state_machine"), "Become leader on term %ld, I'm the master drone now!", term);is_leader_ = true;publish_leader_status(true);}void on_leader_stop(const butil::Status& status) override {RCLCPP_INFO(rclcpp::get_logger("drone_state_machine"), "Lost leadership: %s, become a follower", status.to_string().c_str());is_leader_ = false;publish_leader_status(false);}// 其他必要實現...private:bool is_leader_ = false;rclcpp::Publisher<drone_msgs::msg::LeaderStatus>::SharedPtr leader_pub_;void publish_leader_status(bool is_leader) {auto msg = std::make_unique<drone_msgs::msg::LeaderStatus>();msg->is_leader = is_leader;msg->drone_id = get_my_drone_id(); // 自定義函數獲取本機IDleader_pub_->publish(std::move(msg));}
};// 主節點類
class DroneLeaderNode : public rclcpp::Node {
public:DroneLeaderNode() : Node("drone_leader_node") {// 初始化braft配置init_braft();// 創建ROS2發布者和訂閱者leader_status_pub_ = this->create_publisher<drone_msgs::msg::LeaderStatus>("leader_status", 10);command_sub_ = this->create_subscription<drone_msgs::msg::DroneCommand>("drone_command", 10, [this](const drone_msgs::msg::DroneCommand::SharedPtr msg) {if (state_machine_->is_leader()) {// 長機處理命令process_command(*msg);} else {// 僚機轉發給長機forward_to_leader(*msg);}});}private:void init_braft() {// 配置braft節點braft::NodeOptions node_options;node_options.initial_conf.parse_from("127.0.0.1:8001,127.0.0.1:8002,127.0.0.1:8003"); // 集群地址// 創建狀態機state_machine_ = std::make_shared<DroneStateMachine>();node_options.fsm = state_machine_.get();// 啟動braft節點std::string node_id = "drone_" + std::to_string(get_my_drone_id());std::string ip_port = "127.0.0.1:" + std::to_string(8001 + get_my_drone_id());braft::NodeId node_id_obj(node_id, ip_port);node_ = std::make_unique<braft::Node>(node_id_obj);butil::Status status = node_->init(node_options);if (!status.ok()) {RCLCPP_ERROR(this->get_logger(), "Failed to initialize braft node: %s", status.to_string().c_str());}}std::shared_ptr<DroneStateMachine> state_machine_;std::unique_ptr<braft::Node> node_;rclcpp::Publisher<drone_msgs::msg::LeaderStatus>::SharedPtr leader_status_pub_;rclcpp::Subscription<drone_msgs::msg::DroneCommand>::SharedPtr command_sub_;
};int main(int argc, char** argv) {rclcpp::init(argc, argv);auto node = std::make_shared<DroneLeaderNode>();rclcpp::spin(node);rclcpp::shutdown();return 0;
}  

步驟 4:定義消息接口
創建 ROS2 消息定義文件:

# 在drone_leader_election包中創建msg目錄
mkdir -p ~/drone_ws/src/drone_leader_election/msg
touch ~/drone_ws/src/drone_leader_election/msg/LeaderStatus.msg
touch ~/drone_ws/src/drone_leader_election/msg/DroneCommand.msg

步驟 5:配置 CMakeLists.txt 和 package.xml
在CMakeLists.txt中添加消息生成規則:

find_package(rosidl_default_generators REQUIRED)rosidl_generate_interfaces(${PROJECT_NAME}"msg/LeaderStatus.msg""msg/DroneCommand.msg"
)ament_export_dependencies(rosidl_default_runtime)

4. 算法工作流程

初始化階段:

所有無人機節點啟動 braft 并加入集群。
braft 自動選舉出 Leader(長機)。

運行階段:

長機通過 ROS2 發布LeaderStatus消息。
集群命令由長機接收并處理,僚機轉發命令給長機。
braft 保證即使長機故障,也能快速選舉新的長機。

故障處理:

當長機離線時,braft 自動觸發重新選舉。
新長機接管控制權,確保集群連續性。
5. 部署與測試
為每臺無人機配置不同的節點 ID 和端口。
啟動所有無人機節點,觀察日志確認選舉結果。
使用rqt_graph可視化節點通信。
通過發送命令測試長機響應和僚機轉發功能。
在這里插入圖片描述
文中提過的機間通訊可以通過話題通訊,也可以在機間采用gRPC或bRPC進行機間信息的交互,其中交互的日志信息不僅實現了長機狀態的判斷,還實現了數據共享,在長機切換后仍然保留任務管理信息,使得集群任務能夠絲滑繼續,從而保證了無人機集群任務執行的魯棒性。
本期無人機自由開發坊關于無人機集群動態長機推舉的分享,更多討論可加入無人機自由開發群(過期可加UavFree95)。
在這里插入圖片描述

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

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

相關文章

python 解碼 jwt

import base64 import jsondef base64url_decode(base64url_data):# 將URL安全的base64編碼數據轉換為標準的base64編碼數據base64_data base64url_data.replace(-, ).replace(_, /)# 如果數據長度不是4的倍數&#xff0c;則補齊padding_length 4 - len(base64_data) % 4base…

騰訊云TCCA認證考試報名 - TDSQL數據庫交付運維工程師(MySQL版)

數據庫交付運維工程師-騰訊云TDSQL(MySQL版)認證 適合人群&#xff1a; 適合從事TDSQL(MySQL版)交付、初級運維、售前咨詢以及TDSQL相關項目的管理人員。 認證考試 單選*40道多選*20道 成績查詢 70分及以上通過認證&#xff0c;官網個人中心->認證考試 查詢 考試費用&am…

Spring Boot的Security安全控制——認識SpringSecurity!

Spring Boot的Security安全控制 在Web項目開發中&#xff0c;安全控制是非常重要的&#xff0c;不同的人配置不同的權限&#xff0c;這樣的系統才安全。最常見的權限框架有Shiro和Spring Security。Shiro偏向于權限控制&#xff0c;而Spring Security能實現權限控制和安全控制…

深入理解ArrayList:從Java原生實現到手寫一個ArrayList

Java原生ArrayList解析 基本結構 Java的ArrayList是基于數組實現的動態列表&#xff0c;主要特點包括&#xff1a; 動態擴容&#xff1a;當元素數量超過當前容量時&#xff0c;自動擴容&#xff08;通常增加50%&#xff09; 快速隨機訪問&#xff1a;通過索引訪問元素的時間…

【力扣 簡單 C】206. 反轉鏈表

目錄 題目 解法一&#xff1a;迭代 解法二&#xff1a;遞歸 題目 解法一&#xff1a;迭代 struct ListNode* reverse(struct ListNode* head) {struct ListNode* retHead NULL;while (head){struct ListNode* nextNode head->next;head->next retHead;retHead he…

明代大模型:智能重構下的文明再發現

引言&#xff1a;當紫禁城遇見生成式AI 一幅動態的《紫禁城圖卷》正通過全息投影技術演繹永樂年間的宮廷盛景。這個虛實交融的場景&#xff0c;恰似明代大模型技術的隱喻——以人工智能為紐帶&#xff0c;連接起永樂盛世的恢弘氣象與數字時代的文明重構。作為人工智能與歷史學…

推薦使用的Unity插件(行為樹Behavior )

在 Unity 6.0 中使用 Behavior Designer 行為樹插件開發 AI 系統&#xff0c;需結合其核心節點設計、變量管理和代碼控制。以下是詳細指南&#xff0c;整合了最新版本的最佳實踐&#xff1a; &#x1f6e0;? 1. 安裝與基礎配置 安裝插件 通過 Unity Asset Store 安裝 “Behav…

107. Java 繼承 - 總結:方法重寫與隱藏

文章目錄 107. Java 繼承 - 總結&#xff1a;方法重寫與隱藏**詳細解釋&#xff1a;****方法重載** **總結** 107. Java 繼承 - 總結&#xff1a;方法重寫與隱藏 在 Java 中&#xff0c;定義與超類中的方法具有相同簽名的方法時&#xff0c;不同類型的方法之間會有不同的行為。…

Spring Cloud使用Eureka調用接口,超時設置(二)

在 Spring Cloud 微服務架構中&#xff0c;當同時配置了 Ribbon 和 Feign 的超時時間時&#xff0c;Feign 的配置優先級高于 Ribbon。具體規則和底層邏輯如下&#xff1a; ?? 1. 配置優先級規則 Feign 顯式配置 > Ribbon 配置 若在 Feign 中顯式設置了超時時間&#xff0…

iOS-SM3加密算法N種集成

近期的一個項目需要用到SM3加密算法&#xff0c;需要在iOS中使用Objective-C實現SM3國密加密算法。 SM3&#xff1a;是中國國家密碼管理局發布的密碼雜湊算法標準&#xff0c;適用于商用密碼應用中的數字簽名和驗證、消息認證碼的生成與驗證以及隨機數的生成等 由于iOS系統并未…

[逆向工程]什么是TEB 與 PEB(二十九)

[逆向工程]什么是TEB 與 PEB(二十九) 一、引言:為什么需要了解 TEB/PEB? 在 Windows 系統開發、調試或逆向工程中,TEB(Thread Environment Block) 和 PEB(Process Environment Block) 是理解程序執行機制的關鍵。它們如同進程與線程的“身份證”,存儲了從內存布局到…

逆向分析貝殼網人機驗證JS加密邏輯

引言 在數據爬取和自動化測試過程中&#xff0c;人機驗證&#xff08;如滑塊、點選、短信驗證等&#xff09;是常見的反爬手段。貝殼網&#xff08;ke.com&#xff09;作為國內領先的房產平臺&#xff0c;其人機驗證機制較為復雜&#xff0c;涉及前端JS加密、動態Token、行為檢…

Vue3 + Element Plus中el-table加載狀態分析

在 Vue 3 中&#xff0c;當 onMounted 鉤子被觸發時&#xff0c;父組件的 DOM 已經掛載完成&#xff0c;但子組件&#xff08;如 el-table&#xff09;可能尚未完成其內部渲染。具體分析如下&#xff1a; 1. onMounted 的執行時機 父組件掛載完成&#xff1a;onMounted 表示當前…

OpenCV圖像拼接技術詳解:從特征匹配到全景合成

本文將詳細介紹如何使用OpenCV實現兩幅圖像的自動拼接&#xff0c;涵蓋特征提取、單應性矩陣計算和圖像融合等關鍵技術。 一、圖像拼接概述 圖像拼接是將多張有重疊區域的圖像合并成一幅全景圖的技術&#xff0c;廣泛應用于全景攝影、衛星圖像處理、醫學影像等領域。其核心技術…

如何通過 5 種方式向 Android 手機添加音樂

想把音樂添加到你的安卓手機&#xff0c;然后隨時隨地無需網絡連接就能欣賞你喜愛的音樂嗎&#xff1f;這不再是麻煩。現在&#xff0c;你可以按照本指南中的有效方法&#xff0c;將音樂添加到你的安卓手機上。讓我們在安卓手機上聆聽我們美妙的歌曲吧。 第 1 部分&#xff1a;…

VS Code 項目中的 .vscode 目錄詳解

VS Code 項目中的 .vscode 目錄詳解 .vscode 目錄是 VS Code 項目的核心配置中心&#xff0c;它包含特定于當前項目的配置&#xff0c;這些配置覆蓋全局設置&#xff0c;確保團隊成員獲得一致的開發環境體驗。 .vscode 目錄中的核心文件 文件名作用是否應納入版本控制settin…

Ubuntu22.04安裝opengauss并配置遠程訪問、JDBC連接

內容概括 最近在研究怎么在ubuntu服務器環境下使用opengauss&#xff0c;看了下官方下載地址沒有適配ubuntu的安裝包。仔細翻了下官方文檔&#xff0c;發現安裝指南里有提供一個deb包安裝方案&#xff0c;有適配ubuntu&#xff0c;經過實踐可行&#xff0c;于是記錄下來給有需要…

國產智能體“雙子星”:實在Agent vs Manus(核心架構與技術實現路徑對比)

2025年&#xff0c;人工智能領域迎來重要轉折點——大模型的光環逐漸消散&#xff0c;落地應用成為行業焦點。 正如業內人士所言&#xff1a;“2023年&#xff0c;大家普遍覺得要買一個大模型&#xff0c;但訓練完了怎么用起來&#xff0c;大家一頭霧水。” 在這一背景下&…

pgAdmin 4 連接 postgreSQL

環境如下&#xff1a; 宿主機為Windows 11postgreSQL安裝在宿主機上的Linux虛機中&#xff0c;Hypervisor是VirtualBoxpgAdmin 4 已安裝在宿主機上 本文講述&#xff1a;如何通過宿主機上的pgAdmin 連接到虛擬機中的PG。 設置監聽 默認的PG監聽主機為localhost&#xff0c;…

HTTP 緩存策略:強緩存與協商緩存的深入解析

在HTTP緩存策略中&#xff0c;強緩存和協商緩存是兩種常用的機制&#xff0c;用于減少數據傳輸和提高網頁加載速度。它們通過在客戶端和服務器之間建立緩存來避免不必要的網絡請求&#xff0c;從而優化性能并提高用戶體驗。本文將詳細介紹這兩種緩存策略的原理、優勢和適用場景…