在无人机集群项目的算法开发中,推选长机作为集群的动态中心,往往承担着集群管理、通讯中继等重要功能。由于通讯链路的有限性和任务的实时性需要,需要保证动态长机时刻工作正常,并在异常情况下快速切换新长机。
本文主要分享基于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;从而优化性能并提高用户体验。本文将详细介绍这两种缓存策略的原理、优势和适用场景…