当前位置: 首页 > news >正文

无人机开发分享——基于行为树的无人机集群机载自主决策算法框架搭建及开发

** 在之前的开发分享中,我们分享了机载端开发任务管理、协同控制、无人机平台接口等一系列模块软件,但是要想实现真正的无人机高度智能化,机载的自主决策模块功能必不可少。机载自主决策模块主要实现无人机集群任务过程中地面任务获取分析、战场实时态势分析与自主决策,可在断连或自主模式时对作业中的无人机集群进行决策与控制,减少地面交互,提升任务效率。下面我们对机载自主决策模块的开发进行介绍。**

一、模块架构

在这里插入图片描述
我们搭建了任务管理器(接收任务或实时信息)、决策引擎(决策算法推选任务)、行为树(动态管理服务)的架构,实现从信息获取、决策算法推选、行为树执行的框架搭建。

二、自主决策软件算法

1、任务管理器

主要实现接收地面任务或情报信息

#pragma once#include <rclcpp/rclcpp.hpp>#include "autonomous_decision_msgs/msg/task_command.hpp"#include "autonomous_decision_msgs/msg/intelligence_report.hpp"#include <queue>#include <mutex>namespace autonomous_decision {class TaskManager : public rclcpp::Node {public:TaskManager();// 任务优先级枚举enum TaskPriority {CRITICAL = 0,HIGH = 1,NORMAL = 2,LOW = 3};// 任务结构体struct Task {uint32_t id;std::string type;geometry_msgs::msg::PoseStamped target;TaskPriority priority;rclcpp::Time deadline;std::map<std::string, std::string> parameters;};// 添加新任务void add_task(const autonomous_decision_msgs::msg::TaskCommand::SharedPtr msg);// 获取最高优先级任务Task get_next_task();// 更新情报信息void update_intelligence(const autonomous_decision_msgs::msg::IntelligenceReport::SharedPtr report);private:// 任务队列std::priority_queue<Task, std::vector<Task>, [](const Task& a, const Task& b) {return a.priority < b.priority || (a.priority == b.priority && a.deadline > b.deadline);}> task_queue_;// 情报数据库std::map<std::string, autonomous_decision_msgs::msg::IntelligenceReport> intelligence_db_;// 线程安全std::mutex task_mutex_;std::mutex intel_mutex_;// ROS接口rclcpp::Subscription<autonomous_decision_msgs::msg::TaskCommand>::SharedPtr task_sub_;rclcpp::Subscription<autonomous_decision_msgs::msg::IntelligenceReport>::SharedPtr intel_sub_;};} // namespace autonomous_decision

2、决策引擎(决策算法调用,选择待执行任务)

#pragma once#include <rclcpp/rclcpp.hpp>#include "behaviortree_cpp/bt_factory.h"#include "task_manager.hpp"#include "behavior_tree_nodes.hpp"namespace autonomous_decision {class DecisionEngine : public rclcpp::Node {public:DecisionEngine();// 决策算法枚举enum DecisionAlgorithm {RULE_BASED = 0,UTILITY_BASED = 1,MDP = 2,       // 马尔可夫决策过程POMDP = 3      // 部分可观察马尔可夫决策过程};// 初始化决策系统void initialize();// 执行决策循环void run_decision_cycle();private:// 行为树工厂BT::BehaviorTreeFactory factory_;// 当前行为树std::unique_ptr<BT::Tree> current_tree_;// 任务管理器std::shared_ptr<TaskManager> task_manager_;// 决策算法DecisionAlgorithm current_algorithm_;// 创建行为树void create_behavior_tree(const std::string& tree_type);// 基于规则的决策TaskManager::Task rule_based_decision();// 基于效用的决策TaskManager::Task utility_based_decision();// MDP决策TaskManager::Task mdp_decision();// 配置参数void load_parameters();// ROS定时器rclcpp::TimerBase::SharedPtr decision_timer_;// 决策频率double decision_frequency_;};} // namespace autonomous_decision

其中,可以选择决策算法,如规则算法、效用算法、mdp等

基于效用的决策算法:

TaskManager::Task DecisionEngine::utility_based_decision() {auto tasks = task_manager_->get_all_tasks();if (tasks.empty()) return TaskManager::Task();double max_utility = -std::numeric_limits<double>::max();TaskManager::Task best_task;for (auto& task : tasks) {// 计算任务效用double utility = 0.0;// 1. 优先级权重double priority_weight = 1.0;switch(task.priority) {case TaskManager::CRITICAL: priority_weight = 4.0; break;case TaskManager::HIGH: priority_weight = 2.0; break;case TaskManager::NORMAL: priority_weight = 1.0; break;case TaskManager::LOW: priority_weight = 0.5; break;}// 2. 时间紧迫性double time_factor = 1.0;auto time_left = (task.deadline - now()).seconds();if (time_left > 0) {time_factor = 1.0 / (1.0 + std::exp(-0.1 * time_left));}// 3. 资源匹配度double resource_match = calculate_resource_match(task);// 4. 情报价值double intel_value = calculate_intelligence_value(task.target);// 综合效用计算utility = priority_weight * 0.4 + time_factor * 0.3 + resource_match * 0.2 + intel_value * 0.1;// 选择最高效用任务if (utility > max_utility) {max_utility = utility;best_task = task;}}return best_task;}

基于mdp(马尔科夫)的决策算法

TaskManager::Task DecisionEngine::mdp_decision() {// 简化的MDP实现auto tasks = task_manager_->get_all_tasks();if (tasks.empty()) return TaskManager::Task();// 定义状态空间 (当前状态+任务类型)enum State { IDLE, RECON, SURVEILLANCE, EMERGENCY };// 定义奖励函数auto reward_function = [](State state, const TaskManager::Task& task) {double reward = 0.0;// 任务完成奖励if (task.priority == TaskManager::CRITICAL) reward += 100;else if (task.priority == TaskManager::HIGH) reward += 50;else reward += 20;// 状态转换惩罚if (state == EMERGENCY && task.type != "emergency") reward -= 30;if (state != IDLE && task.type == "emergency") reward += 80;// 时间惩罚auto time_left = (task.deadline - now()).seconds();if (time_left < 60) reward -= 50 * (1 - time_left/60.0);return reward;};// 简化的策略选择State current_state = IDLE; // 从系统状态获取实际值double max_reward = -std::numeric_limits<double>::max();TaskManager::Task best_task;for (auto& task : tasks) {double reward = reward_function(current_state, task);if (reward > max_reward) {max_reward = reward;best_task = task;}}return best_task;}

3、行为树执行

行为树的ROS工程中比较常见的管理架构,学习资料可以参考behavior_tee和navigation2。

建立行为树表(示例):

<!-- config/behavior_trees/reconnaissance.xml --><root main_tree_to_execute="ReconTree"><BehaviorTree ID="ReconTree"><Sequence name="ReconSequence"><!-- 获取侦察任务 --><GetReconTask name="GetReconTask" task="{recon_task}"/><!-- 风险评估 --><RiskAssessment name="RiskAssessment" task="{recon_task}" risk_level="{risk}"/><!-- 资源检查 --><ResourceCheck name="ResourceCheck" task="{recon_task}" sufficient_resources="{has_resources}"/><!-- 根据风险决策 --><Fallback name="RiskDecision"><Condition name="LowRisk" if_risk="LOW"/><SubTree ID="HighRiskPlan" name="HighRiskResponse"/></Fallback><!-- 执行任务 --><ExecuteTask name="ExecuteRecon" task="{recon_task}"/><!-- 处理结果 --><ProcessIntel name="ProcessIntelData"/><!-- 报告完成 --><ReportCompletion name="ReportReconComplete"/></Sequence></BehaviorTree><!-- 高风险处理子树 --><BehaviorTree ID="HighRiskPlan"><Sequence name="HighRiskSequence"><RequestSupport name="RequestSupport"/><Delay delay="5000"/><ReevaluateRisk name="ReevaluateAfterSupport"/><Condition name="CheckRiskReduced" if_risk="LOW"/><AbortTask name="AbortIfHighRisk" if_condition="false"/></Sequence></BehaviorTree></root>

行为树执行:

#pragma once#include <behaviortree_cpp/action_node.h>#include <behaviortree_cpp/bt_factory.h>#include <rclcpp/rclcpp.hpp>#include "autonomous_decision_msgs/action/execute_task.hpp"namespace autonomous_decision {// 任务执行节点class ExecuteTask : public BT::StatefulActionNode {public:ExecuteTask(const std::string& name, const BT::NodeConfig& config);static BT::PortsList providedPorts() {return { BT::InputPort<TaskManager::Task>("task"),BT::OutputPort<std::string>("status")};}BT::NodeStatus onStart() override;BT::NodeStatus onRunning() override;void onHalted() override;private:rclcpp::Node::SharedPtr node_;rclcpp_action::Client<ExecuteTask>::SharedPtr action_client_;rclcpp_action::ClientGoalHandle<ExecuteTask>::SharedPtr goal_handle_;};// 风险评估节点class RiskAssessment : public BT::ConditionNode {public:RiskAssessment(const std::string& name, const BT::NodeConfig& config);static BT::PortsList providedPorts() {return { BT::InputPort<TaskManager::Task>("task"),BT::OutputPort<double>("risk_level")};}BT::NodeStatus tick() override;private:double calculate_risk(const TaskManager::Task& task);};// 资源检查节点class ResourceCheck : public BT::ConditionNode {public:ResourceCheck(const std::string& name, const BT::NodeConfig& config);static BT::PortsList providedPorts() {return { BT::InputPort<TaskManager::Task>("task"),BT::OutputPort<bool>("sufficient_resources")};}BT::NodeStatus tick() override;};// 注册所有节点void RegisterCustomNodes(BT::BehaviorTreeFactory& factory);} // namespace autonomous_decision

三、模块亮点

1架构清晰:采用“决策引擎(DecisionEngine)+任务管理器(TaskManager)+ 行为树(Behavior Tree)” 的分层设计,职责划分明确(决策引擎负责算法选择与循环,任务管理器负责任务生命周期管理,行为树负责任务执行流程控制)。

2多决策算法支持:预留了规则基(RuleBased)、效用基(UtilityBased)、MDP 等决策算法接口,便于根据场景切换或扩展。

以上对于无人机集群机载自主决策算法的开发思路和示例进行了介绍,有相关开发经验的可以加入v(UavFree95)进入无人机开发进行共同讨论。

http://www.dtcms.com/a/317049.html

相关文章:

  • 【嵌入式电机控制#26】BLDC:三相模拟采集
  • springboot项目前后端通用下载方法、问题和解决方案
  • [滑动窗口]904. 水果成篮
  • Maven入门到精通
  • Linux网络编程基础-简易TCP服务器框架
  • Unity笔记(一)——生命周期函数、Inspector面板、MonoBehavior、GameObject
  • Go语言版JSON转TypeScript接口生成器:支持智能递归解析与命名优化
  • 超细整理,接口测试基础+流程,真实环境下怎么测...
  • [GESP202309 四级] 2023年9月GESP C++四级上机题题解,附带讲解视频!
  • 解锁音频创作新可能:AI 人声伴奏分离神器 Replay 深度解析
  • Python 进行点云ICP(lterative Closest Point)配准(精配准)
  • 【Java String】类深度解析:从原理到高效使用技巧
  • 数论手机辅助:打造便捷高效的移动应用交互体验
  • Wisdom SSH:数据库自动化运维的坚固基石
  • WARNING: Illegal reflective access by org.apache.ibatis.reflection.Reflector
  • 八股——IM项目
  • 多端同步新解法:Joplin+cpolar联合通过开源设计实现跨平台无缝协作?
  • 2025年测绘程序设计模拟赛一--地形图图幅编号及图廓点经纬度计算
  • Python日志记录库——logaid
  • 磁悬浮转子振动控制:主动电磁力如何成为高速旋转的“振动克星”
  • 数据集相关类代码回顾理解 | sns.distplot\%matplotlib inline\sns.scatterplot
  • LeetCode 刷题【31. 下一个排列】
  • Golang 基本数据类型
  • 【vibe coding】Kubernetes + Nginx Ingress 实现云端Workspace容器分配与域名访问方案
  • Linux lvm逻辑卷管理
  • MySQL间隙锁在查询时锁定的范围
  • lesson32:Pygame模块详解:从入门到实战的2D游戏开发指南
  • Python 3.13 预览版:颠覆性特性与实战指南
  • 项目设计模式草稿纸
  • 电感矩阵-信号完整性分析