尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
多无人机协同追踪中的Dubins曲线能耗计算与联盟决策
做过多无人机协同仿真的人应该都遇到过同一个问题路径规划出来了目标也盯住了一看能量曲线某架无人机的油耗早就超预算最初的联盟方案在真实跑飞时根本撑不到任务结束。我最近在复盘一个面向移动目标追踪的Matlab仿真项目核心正是联盟组建与精淮Dubins曲线能耗计算。折腾下来最大的感受是协同不是越多飞机越好而是用最合适的组合、走代价可估的路径把任务撑完。这篇文章把我在这个仿真里的问题拆解、联盟决策逻辑、Dubins能耗计算思路和踩坑记录完整写出来适合正在做多无人机追踪、固定翼路径仿真、任务分配算法复现的同学参考。1. 追踪任务从仿真视角看有哪些硬约束1.1 任务场景与模型抽象所谓无人机追踪通俗说就是让一架或多架无人机持续咬住一个移动目标。目标可以是地面车辆也可以是低空慢速飞行器仿真里通常把它简化为一个带有位置、速度、加速度的状态向量。而无人机这边的任务不是简单追到目标点就结束而是要保持一段合理的跟踪距离同时确保目标始终在机载传感器的探测范围里。我在这套仿真里设置的场景是一片开阔区域内目标以近似直线的路径运动偶尔改变航向区域内部署4架固定翼无人机初始位置分散在目标四周。每架无人机要知道自己的位置、速度、航向还要能获取目标在当前时刻的估计状态。听起来并不复杂但一旦把动力学约束和能耗预算放进去问题就立刻变得真实起来。1.2 固定翼无人机的转弯约束为什么绕不开你可以把固定翼无人机理解成一辆只能踩着油门转弯的跑车它不能原地旋转也不能瞬间把机头掰到另一个方向。转弯需要靠坡度产生向心力所以任何航向变化都有最小转弯半径。这个半径由飞行速度和最大坡度角决定实际工程里是一个相对固定的数值。这个看似简单的约束直接影响路径规划的结果。如果忽略它规划算法可以画出一条直直指向目标点的线段但真正去飞的时候无人机根本做不出这么急的机动。Dubins曲线之所以在固定翼路径规划里大量出现就是因为它从数学上保证了任意两段航向之间的路径都由圆弧和直线拼接而成圆弧半径正好不小于最小转弯半径。也就是说Dubins路径天生满足飞行器的运动学可行性。1.3 能耗预算决定算法能不能落地另一个容易在仿真初期被忽略的问题是能耗。很多教科书里的协同追踪都假设无人机电量无限任务想飞多久就飞多久。但现实中每架无人机的载荷和能源都很有限路径长短、转弯次数、飞行速度都会直接决定它还能在这个任务里待多久。这套项目里我把能耗拆成两个部分直线巡航能耗和转弯能耗。直线段跟航程成正比转弯段除了航程之外还要额外考虑坡度带来的阻力损失。这样每一段Dubins路径算出来之后都能转成一个具体的能耗预测值。让一架无人机去追一个遥远目标哪怕路径可行能耗超限也得放弃这正是联盟组建需要解决的核心问题。2. 联盟组建先决定谁去追再算怎么追2.1 为什么不把所有无人机都派上去一开始我犯过一个天真错误既然要追踪目标那4架无人机全部围上去总能保持覆盖吧。仿真跑下来发现这个做法不仅没有提升跟踪质量反而带来三个问题。第一未来能看到的航迹预测是有限的多架无人机挤在同一个方位目标反而更容易挣脱探测范围。第二无人机之间需要保持通信协同架次越多通信拓扑越复杂决策延迟越高。第三能耗分散到所有飞机上每一架都飞了很多无效路径整体续航被拉低。联盟组建的本质就是回答一个问题当前时刻哪些无人机值得参与追踪哪些无人机应该待命或去其他位置。这很像作战任务里的兵力分配但不是拍脑袋决定而是通过代价计算得到的数学最优解。2.2 代价矩阵与最小覆盖约束我把联盟选择的输入设计成一张代价矩阵矩阵的每一个元素代表某架无人机i飞到目标最佳观测位置的综合代价。这个代价不是单纯的距离而是三部分加权路径能耗、到达时间、任务风险。路径能耗来自Dubins曲线计算输入无人机当前位姿和目标最佳观测位姿输出这段可行飞行的预测能耗。到达时间用路径长度除以巡航速度得到任务风险则根据无人机飞往观测位的过程中是否离目标太近或太远来打分。三者加权求和就得到一架无人机对当前目标的参与代价。表某仿真时刻4架无人机的参与代价计算无人机编号Dubins路径长度(m)预测转弯能耗(kJ)预计到达时间(s)综合参与代价U1142021.5958.7U298015.2656.1U3235033.815612.4U476012.1515.3接下来是一个0-1规划问题在若干无人机的可行组合里选出总代价最小、同时满足覆盖约束的子集。覆盖约束指的是追踪目标至少需要两个不同方位视角少于两架就丢了冗余多于两架就是浪费。这样就把问题变成一个带约束的组合优化。2.3 联盟切换的频率控制联盟组建不能每跑一个仿真步长都重新解一轮优化那样计算量暴增而且会带来严重的抖动问题。目标和无人机的状态每秒钟都在变化如果每一帧都重新选择联盟成员上一帧U2还在追踪下一帧U3顶上再下一帧又换回来整个编队就像抽风一样来回摆动。我采用的策略是事件触发而不是时间触发。只有当三个条件之一成立时才重新考虑联盟目标航向发生显著变化当前联盟成员的能耗预测超过预设阈值或者有成员因故障脱离了任务。这样既保持决策响应速度又避免无意义的频繁优化。实测下来联盟切换次数从每秒多次降到每20秒一到两次整体能耗曲线平滑很多。3. 精淮Dubins曲线能耗计算的原理与实现3.1 Dubins路径的几何结构与六种基本形态Dubins曲线解决的是这样一类问题给定起点位姿位置加航向角和终点的位姿在转弯半径不小于某个最小值的约束下找一条最短的可飞行路径。解决方案分两类一类是CSC型也就是圆弧、直线、圆弧的组合包含左转左转右转等不同接法另一类是CCC型三段全是圆弧适合起终点航向差特别大的情况。具体到实现最常用的六种路径是LSL、RSR、LSR、RSL、LRL、RLRL代表左转圆弧R代表右转圆弧S代表直线。每种路径都对应一条独立的最短路径公式计算时把六种全部算出长度取最短的那条作为输出。我在仿真里没有自己从零推导全部公式而是先实现了CSC型的四种再用CCC型处理航向差接近180度的边界情况。这样做的原因是CSC型涵盖绝大多数追踪场景CCC虽然看起来更全但数值稳定性差一些容易在航向差很小时算出非常别扭的绕圈路径。3.2 能耗模型从航迹长度到真实能量消耗把Dubins路径长度当成能耗的全部体现是一个典型的简化诱惑。仿真里四五条路径长度明明差不多实际能耗却可能差出一大截原因就藏在转弯段里。我的能耗模型分三部分。直线段能耗用巡航阻力乘以路程这个阻力在固定速度下基本恒定所以直线段能耗正比于长度。转弯段能耗就要复杂一些飞机在转弯时侧倾角增大升力需要额外分量提供向心力诱导阻力显著上升所以单位距离的能耗高于平飞直线。转弯半径越小坡度角越大额外能耗越高。于是我在仿真里给转弯段加了一个能耗放大系数。路径上每段圆弧的能耗等于该段弧长乘以巡航单位能耗再乘以转弯因子转弯因子根据最小转弯半径和实际转弯半径的比值计算。这样Dubins曲线输出不只是给出一条几何路径还顺带给出了分段的能耗清单。3.3 一个可直接作为仿真核心的Dubins能耗计算函数下面这段Matlab代码是我在项目里实际使用的核心函数结构它完成两件事生成满足最小转弯半径的Dubins路径并累加整条路径的预测能耗。为了保持简洁我只保留了RRT路径求解后到能耗计算的接口部分。function [totalLen, segEnergy, totalEnergy] dubinsEnergy(startPose, endPose, minR, unitEnergy, turnFactor) % 输入startPose[x0,y0,psi0], endPose[xf,yf,psif] % minR: 最小转弯半径 % unitEnergy: 单位距离巡航能耗(kJ/m) % turnFactor: 转弯能耗放大系数基准值(a折线系数) % 1) 调用Dubins路径求解输出分段信息 [segInfo] computeDubinsSegments(startPose, endPose, minR); % segInfo包含每个分段的type为S或L或R以及弧长/线长 totalLen 0; totalEnergy 0; segEnergy []; for i 1:length(segInfo) segLen segInfo(i).len; totalLen totalLen segLen; if strcmp(segInfo(i).type, S) % 直线段能耗长度*单位能耗 curEnergy segLen * unitEnergy; else % 圆弧段能耗长度*单位能耗*转弯放大系数 curRadius segInfo(i).radius; factor 1 (minR / curRadius) * (turnFactor - 1); curEnergy segLen * unitEnergy * factor; end segEnergy [segEnergy, curEnergy]; totalEnergy totalEnergy curEnergy; end end这里有一个重要的设计取舍为什么要单独区分直线段和圆弧段如果你把弧线也默认成直线段能耗那么六条Dubins路径算出来都差不多联盟决策就失去了一个关键区分维度。加上转弯因子后那些需要多次急转弯的路径才会在能耗对比中显出来联盟选择才能真正规避高机动代价的路径。另一个容易踩的坑是最小转弯半径的单位一致性。Dubins曲线计算里所有长度、位置都需要统一单位比如全部用米和弧度如果混用了公里和米路径长度会差出千倍能耗预测完全失真。3.4 为什么不是每架无人机都走最优路径这是我在项目进行到中期才意识到的一个问题。从单架无人机看让它从当前位置飞到目标最佳观测位置当然应该走一条Dubins最短路径。但放在多机协同环境里各架无人机的最佳观测位置可能互相重叠大家都在同一个区域转圈反而浪费了空间上的覆盖价值。联盟组建的代价模型里加入的到达时间和任务风险实际上就是用来干这件事的。U4虽然路径最短但如果它和U2的观测方位过于接近覆盖度不够那综合代价会显著上升最终联盟可能会选择U1和U4而不是单纯挑两个路径最短的U2和U4。这个取舍在论文里常叫空间分集说白了就是观测视角不能扎堆。4. Matlab仿真框架与一次典型运行结果4.1 主循环结构想定、决策、规划、执行、记录整个仿真的骨架并不复杂就是一个按固定步长推进的循环。我采用的是0.1秒一个步长但联盟决策和路径重规划不是每步都做而是由事件触发。每次触发时执行完整链路更新目标状态和无人机状态计算各机的参与代价矩阵解联盟优化对联盟成员重新规划Dubins路径更新能耗预测。然后每0.1秒只做运动学推进把无人机沿当前路径往前推一段并把轨迹和能耗记录下来。这套结构的好处是计算量可控而且方便观察每一次联盟决策的前因后果。仿真结束后可以从记录数据里回放任意时刻的联盟成员和路径切换情况。for t 0:dt:simTime % 1. 更新目标状态 targetState updateTarget(targetState, dt); % 2. 事件触发判断 if isTriggerEvent(t, triggerRecord, targetState, uavStates) % 3. 构造代价矩阵 costMat buildCostMatrix(uavStates, targetState, minR, unitEnergy, turnFactor); % 4. 求解联盟组合使用自定义0-1规划或贪心近拟 [coalition, selectedIdx] solveCoalition(costMat); % 5. 为联盟成员重新规划Dubins路径 for k selectedIdx pathList(k) planDubinsPath(uavStates(k).pose, getObservePose(targetState, k)); end end % 6. 沿当前路径推进无人机 for i 1:numUAV uavStates(i) advanceAlongPath(uavStates(i), pathList(i), dt); end % 7. 记录轨迹、能耗、联盟状态 recordSimData(t, uavStates, coalitions, energyLog); end4.2 三个最容易出问题的模块第一个是solveCoalition模块。最初我打算用现成的整数规划求解器但仿真环境里频繁调用求解器会让步长内的计算时间抖动很大。我换成了自定义的贪心近拟每次先选综合代价最小的无人机进联盟再寻找一个代价次小、且能满足覆盖视角约束的互补成员。结果和精确解相比只差个位数的代价百分比但计算时间降低了将近一个数量级。第二个是planDubinsPath模块。它的输入输出看似简单但边界条件很多。比如起点和终点之间距离太近且航向差接近180度Dubins求解容易算出极长的绕圈路径。这时需要人为处理把目标观测点稍微朝无人机方向移动一些或者直接选择三段圆弧路径里的最短一条。第三个是advanceAlongPath模块。无人机沿Dubins路径推进时不能简单用直线插值。圆弧段里需要根据曲率更新航向角步长太大还会让无人机逐渐偏离理论路径。仿真里我固定步长0.1秒巡航速度25米每秒单步前进2.5米配合圆弧角度增量位置误差能控制在0.1米量级。4.3 一次典型仿真结果能告诉我们什么我用一个具体场景说明输出形态。4架无人机初始位置散布在区域四个角目标从区域中心附近开始以约20米每秒的速度向东南方向移动仿真时长180秒每架无人机最后圈定一块可用的能耗上限。结果显示联盟成员并不是固定的。任务开始后前30秒因为目标速度和无人机速度差距不大U2和U4组成联盟利用距离优势快速靠近目标。大约第40秒目标开始转向原先U2所处方位突然失去视觉优势事件触发了一次联盟切换U2被U1替换。第90秒附近目标又一次转向此时U4还在联盟里但U1的能耗已经接近预算上限联盟再次切换U1下撤U2重新补位。这条联盟成员的变化链说明联军组建并不是一次性任务分配而是随着目标运动不断动态调整。能耗曲线也很有意思U4因为一直保持比较短的Dubins路径能耗增长平缓U1虽然前期参与时间短但在第40到90秒之间被派去执行一次长距离大转弯路径能耗迅速拉升这也是它在第90秒被换下的直接原因。5. 从仿真走向工程我踩过的四个坑5.1 Dubins路径在目标位姿突变时的跳变仿真中目标状态的更新通常来自探测与估计噪声会导致目标位置估计在某个时刻突然跳变一小段。这本来没什么但Dubins路径对起终点位姿非常敏感终点一旦跳变重新规划出来的路径会和上一条完全不同无人机需要立刻做一个大坡度转弯去追新路径。我在第一次仿真里就观察到无人机轨迹出现明显的不连续转角甚至像在空中画了一个尖锐的折线。这在实际飞行中不可能实现因为固定翼飞机的航向变化是渐进的。解决思路不是去压制路径规划器而是在控制层对角度指令做限速处理每次航向改变不能超过每秒一定度数。这样即使上层路径跳变执行层也能把它平滑成可控的机动。5.2 联盟过度频繁切换导致能耗反而增加前面提到过事件触发机制但第一次实现时我的触发条件太灵敏只要目标航向变化超过2度就触发重新决策。结果180秒的仿真里联盟切换了50多次每次切换都伴随一架无人机脱离、另一架无人机重新规划路径整体能耗不降反升。后来我加了两个约束一个是切换冷却期两次联盟决策之间至少间隔5秒另一个是滞回比较目标航向要变化超过5度才触发如果上一轮联盟的实际表现还在可接受范围内就算触发条件满足也要先做一次短期预测确认新联盟确实有显著收益才切换。这两条规则放进去之后联盟切换次数大幅减少总能耗下降了约18%。5.3 能耗模型过于理想化的修正我第一次写的能耗模型只区分直线段和圆弧段后来发现有一个关键因素被漏了那就是无人机从当前路径顺利切换到新Dubins路径时通常会经历一段额外机动。这段机动既不属于旧路径的末端也不属于新路径的起点仿真里如果不计就会低估无人机在联盟切换阶段的能耗。我采用的修补办法是在每次重规划前把当前速度和航向作为起点位姿输入确保新路径从当前真实状态开始而不是从上一个理论位置开始。同时在路径衔接处补上一小段过渡航段的能耗估算。修正之后能耗曲线在联盟切换点附近不再出现明显凹陷整体曲线更符合实际任务的变化趋势。5.4 覆盖约束不能只算几何距离联盟选择里的覆盖约束我一开始简单定义为两架无人机与目标之间的夹角要大于某个阈值。跑仿真时发现只要夹角达标系统就认为覆盖满足实际上目标如果离得很近即便夹角不小两架无人机也可能在某个维度上同时丢失目标。后来我把覆盖约束升级为探测覆盖的时间冗余两架无人机在目标任意未来5秒窗口内至少各自保留一个可探测状态。这样一来联盟决策不再只看瞬时几何关系而是把目标的短期运动预测也放进了约束条件。带来的副作用是代价矩阵计算量变大但因为联盟决策本身是事件触发整体仿真效率还能接受。6. 几段实操中反复验证的调参笔记6.1 最小转弯半径的设定不能只看飞机参数固定翼无人机的最小转弯半径由速度和坡度角算出但仿真里把半径设得太小会让Dubins路径频繁选择大弧度绕圈能耗激增设得太大路径会变得很直但机动性下降很多目标观测位变成不可达状态。我最终选择了比理论最小值大20%作为仿真基准再用这个值做能耗归一化对比。6.2 单位能耗和转弯因子的标定这个项目里最影响联盟决策结果的两个参数就是单位巡航能耗和转弯放大系数。它们的数值不需要精确到实际油箱但量级关系必须合理。仿真前我用一小段飞行试验数据做标定平飞1000米能耗是基准连续三次转弯的能耗明显高于同样长度的直线把转弯因子调到1.3左右整体决策行为才稳定。6.3 记录数据远远比看实时曲线重要仿真跑起来实时看轨迹很直观但真正用来调参和复现问题的是位置、能耗、联盟成员、触发条件四位一体的数据记录。我在数据结构里给每个联盟切换加了触发原因字段这样每次出现不合理的联盟切换可以直接回溯出是因为能耗超限还是目标航向突变定位问题快很多。一套多无人机追踪仿真走到最后你会发现真正难的不是写出Dubins曲线求解代码而是想清楚每个模块之间的信息流目标估计影响联盟选择联盟选择影响路径规划路径规划影响能耗预测能耗预测又反过来决定下一次联盟切换的时机。把这个闭环理顺了Matlab源码只是按着逻辑填进去而已。这些参数和触发逻辑在每个项目中都不会一模一样但把问题拆到这一层你遇到自己的追踪场景时就清楚该从哪个环节下手了。
RELATED

相关推荐

电机NVH根原因快速排查:谐波计算工具实战解析

电机NVH根原因快速排查:谐波计算工具实战解析

1. 项目概述与问题定义 1.1 为什么要做电机NVH根原因查找 做电机开发的同行应该都遇到过这种情况:台架测试或者整车路试时,某个转速段突然冒出来一个明显的啸叫,频谱一看,频率往往在几百赫兹到几千赫兹之间。客户要求48小时之内给…

📅 2026/10/21 18:01:58
CVE-2025-14528:D-Link DIR-803配置信息泄露漏洞解读

CVE-2025-14528:D-Link DIR-803配置信息泄露漏洞解读

CVE-2025-14528 这串编号,最近在圈子里又让一台老设备重新回到聚光灯下——D-Link DIR-803。一台早就被厂商列为生命周期终止(EOL)的家用路由器,这次摊上的是“配置处理信息泄露”。光看名字或许觉得只是吐点配置出来,…

📅 2026/10/21 17:56:57
从0到2万Star:一套AI编程实操教程的完整复盘

从0到2万Star:一套AI编程实操教程的完整复盘

后台数据页上,Star数跳过2万整数关口的那一刻,我截图发给朋友:“这套AI编程教程,被某主流AI助手产品推荐了。”说实话,比起2万这个数字本身,更让我意外的是推荐带来的那条增长曲线——几乎垂直向上。这套教…

📅 2026/10/21 17:56:57
MORE NEWS

更多资讯

📰

1 个 AI 项目从 0 到 1:完整流程——好的开始,是成功的一半

1 个 AI 项目从 0 到 1:完整流程——好的开始,是成功的一半 这是《AI数字员工系统设计与企业自动化实战》日志连载第 29 篇 作者:老高FDE-AI实战前沿 深度聚焦:企业AI落地实战、AI-Workforce、AI数字员工实战、企业Agent组织设计、…

📰

深入理解Cargo与crates.io:从构建优化到发布实践

从 cargo new 跑通第一个 hello world,到能熟练地在项目里加依赖、跑测试,这中间其实隔着一道很有意思的分水岭。很多人对 Cargo 的印象停留在“包管理工具”这六个字上,知道 cargo build 、 cargo run 、 cargo add 这些高频命令&am…

📰

团队目标管理PPT:从OKR拆解到自动看板的落地闭环

简介:这份《团队目标管理.pptx》面向企业管理者、团队负责人及希望提升目标管理能力的职场人,围绕团队目标的作用、常见目标失效原因、目标制定方法与执行落地展开,帮助解决目标模糊、频繁变动、执行脱节等实际问题。资源包内含1个pptx文件&a…

📰

团队目标管理.pptx:从对齐到复盘的落地工具与避坑指南

简介:这份《团队目标管理.pptx》面向企业管理者、团队负责人及希望提升目标管理能力的职场人,围绕团队目标的作用、常见目标失效原因、目标制定方法与执行落地展开,帮助解决目标模糊、频繁变动、执行脱节等实际问题。资源包内含1个pptx文件&a…

📰

多旋翼无人机鲁棒姿态控制:从PID到H∞的实战指南

去年夏天,我把一套H∞姿态控制器搬上模拟项目X的试验台,看着屏幕上滚转角曲线终于不再乱甩的时候,第一反应不是兴奋,而是有点想骂自己——为了调好之前那套PID参数,我前前后后改了十几个版本,加陷波器、加前…

📰

USB供电充电电路设计:从原理到TP4056实战与避坑指南

简介:这是一份面向电子工程师、硬件设计初学者及便携设备开发者的USB供电充电电路技术资料,围绕USB总线取电为锂电池充电这一核心问题,梳理从原理到电路实现的完整思路。资源为单个PDF文档,压缩包约684KB,内容以电路图…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬