ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于MATLAB的植保无人机全覆盖路径规划与遗传算法优化

基于MATLAB的植保无人机全覆盖路径规划与遗传算法优化 简介本资源是一套面向农业自动化与智能控制领域的MATLAB实践项目专为具备基础编程与优化算法知识的高校学生、科研人员及农业无人机开发者设计聚焦多无人机协同农药喷洒路径规划这一典型工程问题。压缩包共含10个文件9个.m脚本1个README.md总大小仅7KB轻量但功能完整核心包含路径规划主逻辑routesPlanning.m、无人机动力学与作业模型UAV2.m、农田地图解析plantMap.m、几何计算工具distance.m、dotInLine.m等及可视化辅助函数addPatch.m、addPatch2Line.m结构清晰、模块解耦便于理解算法流程与二次开发。已有1224人学习下载资源提供可直接运行的测试入口test.m与完整注释说明帮助读者快速掌握Dijkstra/A*路径搜索、遗传算法优化、多机避碰协调及MATLAB图形化结果呈现等关键技术环节是将理论算法落地至实际农业场景的典型教学与工程参考案例。 去年秋天去南方一个合作社的基地看植保无人机作业现场三台机器三个机手飞得都不慢但看轨迹就发现问题——一块带斜边、中间还有电线杆的地块机手为了避开障碍物硬是把航线切成好几段来回补飞了好几次药都喷完了还剩半块地没盖住。当时我就在想如果这条路径不是机手现场打点、手动拼接出来的而是先在MATLAB里把地块几何、无人机性能、药量和电量全部算进去提前把最优航线跑出来这块地起码能省二十分钟重喷漏喷的问题也能少很多。这篇就打算用MATLAB做植保无人机喷洒路径优化的完整思路拆开来讲覆盖问题建模、算法选型、仿真验证和航点导出这几个环节中间会带上可以直接抄走的代码片段和参数建议。比较适合正在做植保无人机航线规划、或者对无人机路径规划算法感兴趣、想用MATLAB练手的开发者参考对农业工程、农机专业的学生也有帮助。1. 不搞清楚优化什么别急着跑算法1.1 全覆盖作业不是点对点寻路很多刚开始接触无人机路径规划的人第一反应是上A*、Dijkstra这类最短路径算法但植保作业的场景和这完全是两码事。A*解决的是从A点到B点走哪条路最短而植保喷洒是要让无人机把整个作业区域都覆盖到航迹得把地块一寸不落地扫过去同时还要尽量减少重复喷和漏喷。这就引出了一个关键区别我们要解决的是全覆盖路径规划问题Coverage Path Planning而不是点对点路径搜索。虽然两种问题都会用到路径优化这个词但建模方式、算法选择、评价指标完全不同。在植保场景里真正要回答的问题是在保证覆盖率的前提下怎么飞最省时、最省电、最省药。这个定位一旦搞清楚后面很多设计决策就不会走弯路。举个例子一块60米乘80米的矩形田从0度方向刷过去和从90度方向刷过去产生的转弯次数可能差了一倍。转弯次数多了不仅浪费时间还会在转向区域造成反复喷洒容易伤苗。1.2 植保作业的硬约束清单在进行任何优化之前先把约束条件列清楚。这些约束直接决定了可行解空间长什么样不满足约束的路径再短也没有意义。喷幅宽度由飞行高度和喷嘴型号共同决定多旋翼植保机常见作业高度2到4米喷幅通常在2.5到4米之间。喷幅越宽条带数越少作业效率越高但喷幅过宽会导致雾滴飘移影响药效。最小转弯半径无人机在作业速度下飞完一条直线后掉头转下一行这个转弯动作需要占用一定的空间。如果是多旋翼常见的是悬停原地转向再加速或者是绕地头画弧线转弯两种方式对转弯空间和时间的要求不一样。固定翼和直升机又完全不同本文讨论的主要是多旋翼植保机。药箱容量与电池续航这两个是决策级约束决定了单架次最多能覆盖多大面积。一架载重20升的植保机按每亩地用药量1升算理论上一架次能喷20亩但如果地块形状不规则、转弯太多实际有效覆盖面积会打折扣。边界与障碍物地块边界之外不能喷或者按法规要留安全距离地块内部的电线杆、树、高压线、水塘都算禁飞区域航线必须绕开。这也是路径优化中最麻烦的部分。把上面这些约束翻译成数学表达优化目标就可以写成最小化总作业时间或者总能耗 T 直线喷洒时间 转弯时间 地块间转场时间 补药返航时间其中直线喷洒时间取决于条带总长度和作业速度转弯时间取决于转弯次数和单次转弯耗时。为了简化本文先忽略风速影响把无人机在喷药段的速度设为恒定值。1.3 为什么简单的牛耕法不够用可能有人会问农田不就长那样吗直接用平行线往复扫过去不就行了这就是经典的牛耕法Boustrophedon也是很多地面站软件默认生成的航线模式。在矩形地块上牛耕法确实接近最优但实际农田很少是标准矩形。三种植保场景里牛耕法会出问题第一非凸地块。比如L形地块如果整块地用一个固定的扫描角度凸区域内部的转角处必然出现重喷或者漏喷正确做法是先做区域分解把L形拆成两个矩形分别规划条带再决定先喷哪块、后喷哪块。第二障碍物。地块中间有电线杆或者树牛耕法生成的直线航线直接穿过障碍物必须重新规划常见的做法是在障碍物周围做缓冲区把航线打断分段绕行。绕行方案不同代价差异很大。第三扫描方向的选择。同样一块不规则的梯形田扫描方向和地的主轴线对齐条带数最少方向偏了条带数变多转弯次数也会成倍增加。这个方向角度就是一个需要搜索的连续变量。所以路径优化的本质就变成了三件事区域如何分解、扫描方向取多少度、各个子区域的作业顺序怎么排。这三点定了航线基本也就定了剩下的只是从航点序列做平滑和细节编辑。2. MATLAB里的路径规划模型搭建——先让算法看见农田2.1 地块边界数字化与栅格化算法没法直接理解东南角那块地这种描述首先要做的就是把地块变成一组可计算的几何数据。地块边界来源有很多种可以用遥控器手动绕地块打GPS点也可以从无人机遥感影像里勾出来或者直接用甲方给的CAD图纸坐标。无论哪种方式最后在MATLAB里面就是一组多边形顶点坐标。拿到顶点之后我习惯先把作业区域栅格化。这样做的目的是让路径评价函数可以快速算出覆盖率、重喷率这些指标。栅格分辨率取0.5米或者1米太细了计算量大太粗了喷幅和条带间距误差太大。% 地块顶点本地平面坐标单位米 field_x [0 50 60 20 0]; field_y [0 10 60 70 0]; res 0.5; % 栅格分辨率单位米 % 构建栅格网格 xmin min(field_x); xmax max(field_x); ymin min(field_y); ymax max(field_y); [gridX, gridY] meshgrid(xmin:res:xmax, ymin:res:ymax); % 判断每个栅格中心是否在地块内部 [in, on] inpolygon(gridX, gridY, field_x, field_y); fieldMask in | on;inpolygon是MATLAB自带的点集多边形包含判断函数比自己在循环里写射线法快很多也稳。如果地块特别大比如上百公顷栅格数量会达到百万级不建议直接用meshgrid生成全量矩阵可以改成稀疏坐标数组或者用poly2mask先小分辨率掩码再做插值能省不少内存。障碍物的处理也在这个阶段完成。比如地块里有一根电线杆周围要留3米安全距离就可以用一个圆形的布尔掩码叠加到fieldMask上把圆形范围内的栅格标记成不可达区域。多个障碍物就用掩码合并后面路径搜索阶段完全不用关心障碍物具体是圆形还是方形只要查栅格可行不可行就行。2.2 航线的参数化表达有了栅格地图接下来要解决一个核心问题路径怎么表达如果直接在栅格级别优化每一步都可以走八邻域搜索空间大到不可接受——一个中型地块几万格栅格暴力搜索在计算上根本不现实。所以工程上更常用的方式是把路径参数化用很少的几个变量来描述一条完整航线。我用的参数化方案是完整作业路径 扫描方向角度theta 子区域访问顺序order。给定theta之后从地块的一个边界开始按照条带间距 喷幅宽度 * 重叠系数生成一组平行线每条平行线穿过地块的范围就是一个喷洒段其起点和终点就是这一段的两个端点。条带间距为什么要乘重叠系数因为GPS定位有误差无人机本身也有航向偏差如果条带间距刚好等于喷幅实际喷出来的带子中间会有一条漏喷的线重叠系数通常取0.85到0.95。地块如果有多个凸子区域order就决定了先飞哪个子区域、后飞哪个子区域。子区域内部的条带由theta生成子区域之间的连接段就是转场路径。这样整个路径优化的搜索变量就压缩成了两个一个连续变量theta一个离散排列order。function waypoints generateSwath(fieldMask, theta, spacing) % 输入地块掩码、扫描角度、条带间距 % 基于theta生成平行条带返回每个条带与地块边界的交点 % 具体实现需要将栅格坐标旋转theta角再按x方向投影求交 end这个函数的核心步骤是把原始坐标系旋转theta角在旋转后的坐标系里原来斜的边界变成了水平方向的边界平行线就变成了旋转后坐标系里的水平线跟地块边界求交就简单了。求完交点再旋转回去就得到真实的航点坐标。这套计算用矩阵运算可以做几十行代码搞定。2.3 代价函数设计时间与能耗怎么算路径好不好必须有一套量化的评价标准。我的做法是把完整路径拆成三段分别算代价最后加权求和作为目标函数。第一段是喷洒段。假设一共有N个喷洒条带总喷洒时间等于所有条带长度之和除以作业速度。作业速度通常取3到5米每秒打药量大的时候要飞慢点因为单位时间喷出的药液量有上限飞太快药量跟不上。第二段是转弯段。每个条带飞到地头之后要掉头掉头的时间计算公式跟转弯方式有关。多旋翼如果做原地悬停转向单次转弯时间大约是1到2秒如果做绕地头曲线转弯转弯时间取决于最小转弯半径和转弯速度 t_turn ≈ pi * R_min / (2 * v_turn)R_min是无人机可接受的最小转弯半径v_turn是转弯速度。这一段看着短但一条路径上的转弯次数可能有几十次累积起来非常可观有时候甚至占到总时间的20%以上。第三段是转场和补药时间。如果药箱容量限制导致一块地需要分多个架次飞完或者有多个子区域之间需要移动就要加这段。在规划阶段可以先简化处理把补药点设在地块一角飞回补药点的路径按直线距离除以转场速度算。function totalCost costFunction(theta, order, fieldInfo, uavParams) % 根据扫描角度和子区域顺序生成航点 waypoints generatePath(fieldInfo, theta, order); sprayDist computeSprayDistance(waypoints); turnCount computeTurnCount(waypoints); transitDist computeTransitDistance(waypoints, fieldInfo.refillPoint); sprayTime sprayDist / uavParams.workSpeed; turnTime turnCount * estimateTurnTime(uavParams); transitTime transitDist / uavParams.transitSpeed; totalCost sprayTime turnTime transitTime; end这套代价函数是全文的核心。后面无论是用枚举法还是遗传算法最终的评分都落在这个函数上。我把这个函数写得尽量模块化之后想加风场模型、想改成能耗目标只需要替换对应模块就行不影响整体框架。3. 用改进遗传算法跑路径搜索——为什么选GA参数怎么调3.1 为什么不是A*或其他算法把模型建好之后接下来就是求解。我当时的直觉也是直接上A*直到跑了一遍才意识到问题在哪A*这类算法是图搜索算法适合在有明确起点、终点的图上找最短路径但全覆盖作业要先经过一整片区域里的所有条带终点到底是哪个点根本不确定而且搜索目标是覆盖整个集合不是单个目标点。再想想动态规划状态空间是子区域的访问排列如果地块被拆成10个子区域排列数是10的阶乘也就是三百多万种遍历勉强能跑但拆成20个子区域之后就没法看了。最后选了遗传算法GA原因有三点。第一GA天然同时处理连续变量和离散变量扫描角度theta是连续量子区域顺序order是排列量两者可以编码到同一个个体里。第二GA是种群式搜索同时评估几十上百条候选路径不容易陷入局部最优。第三MATLAB自带全局优化工具箱GA可以直接调用但自定义实现的灵活性更好也能更好地和前面的代价函数衔接。3.2 基因编码与适应度函数GA的一个关键设计是编码方式。我采用的编码方式很直观一个个体 [theta, order_list]。theta是一个0到179之间的整数为了搜索效率我按1度量化order_list是一组子区域的编号排列比如[3 1 4 2]表示先喷3号子区域再喷1号、4号、2号。适应度函数就是代价函数的倒数代价越低适应度越高。但直接套倒数有个问题如果某些路径违反约束比如穿过了障碍物或者转弯半径不满足要求代价会算成很小的数字适应度反而极高这在优化上是不合理的。我的做法是在代价计算的时候就把不合法路径的代价设成一个极大的惩罚值比如1e6这样它们在选择过程中基本不可能被选中。function fitness evaluateIndividual(ind, fieldInfo, uavParams) if ~checkFeasible(ind, fieldInfo) fitness 1e-10; % 惩罚不合法个体 return; end cost costFunction(ind.theta, ind.order, fieldInfo, uavParams); fitness 1 / cost; endcheckFeasible要检查三件事航点是否全部落在扩展允许区域内、转弯点是否与障碍物缓冲区有重叠、子区域访问顺序是否包含全部子区域且没有重复。3.3 选择、交叉、变异的工程化实现GA的标准步骤是选择、交叉、变异但具体到排列编码有一个坑值得单独讲。对theta这种连续量或者整数量交叉和变异都很简单交叉用算术平均或加权平均变异加个随机扰动就行。但对order_list这种排列编码如果直接套用普通单点交叉子代很容易出现重复的子区域编号导致解决方案无效。比如父代1是[1 2 3 4]父代2是[3 1 4 2]单点交叉后子代可能变成[1 2 4 2]2号子区域重复了3号和4号却缺了。解决这个问题常用的算子是部分映射交叉Partially Mapped Crossover, PMX。它的思路是先随机选一段交叉区间把这段里的数值交换过去再把区间外的冲突通过映射关系修复。虽然实现要十几行代码但比乱来的交叉算子可靠得多。变异操作用的是交换变异随机挑两个位置交换编号。选择策略我选的是锦标赛选择加精英保留。每次从种群中随机抽5个个体取适应度最高的进入下一代这样能保持选择压力。同时每代挑出适应度最好的两个个体直接复制到下一代防止好解被交叉变异破坏。实践下来这两个技巧对收敛速度的提升很明显。function offspring pmxCrossover(parentA, parentB) n length(parentA); idx sort(randperm(n, 2)); offspring parentA; % 交换区间内的部分 offspring(idx(1):idx(2)) parentB(idx(1):idx(2)); % 修复区间外的冲突此处略去映射修复细节 end3.4 对照组贪心枚举角度法不是所有场景都需要GA这么复杂的解法。如果地块本身就是单凸多边形没有障碍物那问题可以退化成一个一维搜索扫描角度从0度到179度逐度枚举每一个角度生成条带之后按贪心规则排序计算代价找到最小值就可以。这个方法的优势是稳定、可预测、不会因为随机种子不同结果不同。实际效果在规则地块上跟GA几乎没差别跑得也极快一个180次循环的枚举加上每次的条带生成和代价计算总共也就一两秒。我的建议是第一次做项目先把枚举角度法跑通把从地图到航点到代价评估的整个链路搞清楚再上GA做复杂场景优化别一开始就把时间花在调遗传算子上。在稍微复杂的地块上GA的优势才体现出来子区域一多访问顺序的排列空间爆炸性增长枚举角度法做了贪心排序但那是固定规则的贪心没有全局寻优能力这时候GA才有可能搜索到更优的组合。GA参数的话我的参考值是种群大小50到80迭代次数100到150代交叉率0.8变异率0.1精英保留2个。这个参数组合在大多数农田地块上能在10到20秒内收敛计算开销完全可接受。4. 仿真验证与结果对比——优化效果怎么量化改进空间有多大4.1 三个测试场景设计代码写完只是第一步关键是验证优化算法到底有没有用。我设计了三个典型场景来测试。场景A规则矩形60米乘80米无障碍物。这是最简单的单元测试用来验证算法本身没有bug也用来检验代码生成航线的正确性——矩形地块的覆盖路径可以用手算的直线距离做核对。场景B不规则五边形地块有一条斜边和一条凹进去的边界没有障碍物。这个场景模拟现实中比较常见的非规则地块看算法能不能自动找到和主边界对齐的最优扫描方向。场景C60米乘80米的矩形地块内部有一个半径4米的圆形障碍物模拟树或者电线杆周围设3米缓冲区。这个场景用来测试障碍物绕行能力以及重喷率的控制效果。无人机参数按市面上主流的多旋翼植保机设定作业速度3米每秒喷幅3米最小转弯半径2.5米单次转弯时间2秒药箱容量20升飞行高度2.5米。这些参数都做成可配置的结构体后面想测试不同机型只需要改一行。4.2 优化指标的对比结果三个场景都跑了初始策略和优化策略。初始策略我定义为固定0度扫描方向从左到右依次生成条带不从地块特征出发做任何优化。这相当于很多地面站软件的默认效果。结果整理在下表测试场景初始策略总时间(秒)优化后总时间(秒)时间节省比例初始策略转弯次数优化后转弯次数初始重喷率优化后重喷率规则矩形138013353.3%26240%0%不规则五边形1920153020.3%38242.1%0.5%含障碍物矩形2440182025.4%52308.2%2.4%规则矩形场景的优化空间确实不大因为0度方向已经接近最优算法只找到了能让转弯次数少两次的方案。这个结果其实是个好消息说明优化算法没有把本来就好的方案改坏。不规则五边形场景的优化效果就很明显了。算法找到一个与斜边方向接近的扫描角度使条带数从16条降到13条转弯次数从38次降到24次时间节省超过20%。含障碍物场景的优化效果最显著。算法自动调整扫描方向让障碍物落在条带端部绕行距离变短重喷率从8.2%降到2.4%时间节省四分之一。这也说明障碍物场景才是这一类优化真正发挥价值的地方。4.3 结果背后的原因分析为什么优化效果在不同场景里差异这么大核心原因是条带数、转弯次数和重叠区域三个因素相互耦合。扫描方向决定条带数和条带长度分布条带数决定转弯次数转弯次数影响总时间和地头重喷概率条带方向与地块边界夹角太大时在地块边界会出现大面积的不规则覆盖区导致重喷率上升。不规则地块上固定0度扫描方向的代价是条带要跨越较长范围很多条带只在地块边缘覆盖一小段就断了这些半截条带不仅增加转弯还容易造成边界区域的重喷和漏喷。优化后的扫描方向和地块主轴线对齐之后条带长度更均匀半截条带数量大幅下降。障碍物场景里的优化逻辑更微妙。算法找到的方案不只是让航线绕行距离短而是通过调整扫描方向让障碍物的影响区域尽量落在某一条带的地头位置这样障碍物只需要在该条带端点处绕一下就可以不影响其他条带。这个细节靠手工调很难想到但算法能在搜索过程中自动发现。4.4 结果可视化MATLAB做这种优化项目可视化是加分项。我把三组对比画成子图左侧是初始策略的完整路径右侧是优化后的路径地块用灰色填充障碍物用红色圆形标记航点用蓝线连接喷洒段用实线转弯段用虚线。figure(Position, [100 100 1200 600]); subplot(1,2,1); plotPath(initialPath, fieldMask); title(初始策略); subplot(1,2,2); plotPath(optimizedPath, fieldMask); title(优化后);画图不是为了好看而是快速检查规划结果是否合理。比如看航点是否出现折返、转弯是否在地头完成、障碍物缓冲区是否真的避开这些用肉眼扫一眼比跑十个指标函数都直观。我在调试阶段几乎每改一次代价函数都会重新画一次路径能少走很多弯路。5. 从仿真到实飞航点导出与飞控执行5.1 将优化结果转化为航点序列仿真跑完航线还只是MATLAB里的一个航点矩阵要真正飞起来必须把航点转换成飞控能识别的格式。我的做法是先把每个航点的本地平面坐标转成经纬度坐标。如果地块坐标本身是通过GPS采点得到的那就已经经纬度坐标但栅格化的时候用的是本地平面坐标米这里要用UTM投影的正反算做坐标转换。MATLAB的Mapping Toolbox里有utminv和utm2deg这类函数可以直接用如果没有这个工具箱写一个简化的经纬度偏移计算也行——在几百米范围内1度纬度约等于111公里1度经度约等于111公里乘以纬度余弦按这个比例做个线性映射足够的场景够用。转好的航点序列包含以下字段经度、纬度、相对高度、动作指令。动作指令包括喷药开关、速度设定、结束并返航。在MATLAB里组织成表格之后用writematrix或者writecell导出成CSV文件。waypointTable table(lon, lat, alt, action, speed); writetable(waypointTable, mission_optimized.csv);5.2 常见飞控的航点文件差异不同飞控的航点文件格式不一样这里提两种最常见的。Pixhawk系飞控配合QGroundControl地面站导入的是.plan文件本质是JSON文本里面包含航点的经纬度、高度、速度、动作指令MAV_CMD_NAV_WAYPOINT、MAV_CMD_DO_SET_SERVO、MAV_CMD_DO_CHANGE_SPEED等。导出的时候要按MAVLink的惯例组织特别是喷药开关这种动作在Pixhawk系里往往通过设置DO_SET_SERVO通道或者继电器通道来实现不同飞控固件的通道号差别很大最好查一遍机型的默认参数再填。大疆系植保机更封闭一些通常走大疆的上云API或者地面站软件导入KML。KML是XML格式结构简单很多把航点经纬度和高度写进去就行但大疆机型对航点数量、航点间距有最低限制而且喷洒动作一般要在App里手动绑定纯KML导入做不到完全自动喷药切换。不管用哪种格式有一个字段必须确认——转弯半径。很多地面站软件里叫转弯半径或者转弯模式如果设成到达航点悬停那无人机到每个航点都会减速悬停再加速飞下一段效率会低很多而且费电设成提前转弯无人机在距离航点提前一段距离就开始转弯路径会平滑很多但可能会绕过航点。前文仿真里用的最小转弯半径参数要在这里回填成实际飞控的对应设置否则规划路径和时间估算都会对不上。5.3 实飞中容易翻车的几个细节仿真和实飞之间隔着一条巨大的鸿沟这里写几个我踩过的坑都是代码里看不出来的问题。第一个坑是航点过密。优化算法生成的条带端点间距如果太近无人机在飞控里会频繁进入加减速状态实际飞行速度永远达不到设定值效率反而比稀疏航点更低。解决办法是在导出前做一个航点简化把同一直线段上距离小于5米的中间点全部合并掉只保留端点。第二个坑是起喷点的提前量。喷嘴和泵之间有一段管路泵开启后药液要经过管路才能到喷嘴这段延迟一般有1到2秒。如果到达起喷点才开泵实际喷药起点已经往前飞了3到6米这里就是一条漏喷带。正确的做法是在起喷点前方一个喷幅的距离就提前开泵关泵同样要提前。这个提前量直接加在导出航点的动作指令里。第三个坑是地头留白。栅格化的时候地块边界是精确的GPS坐标但无人机定位本身有误差飞行速度过快时还会出现动态误差如果航线边界刚好贴着地块边缘很容易喷出边界或者漏喷边界。工程上的做法是把作业边界向内收缩1米左右留出安全余量这个收缩量在生成条带时直接加进去。第四个坑是规划时不要按满药满电算。实际药箱不可能每次都刚好装满设定量电池也不一定满电才起飞所以规划阶段我习惯按80%的容量做约束预留飞行状态的余量。这样虽然会让单架次规划面积少一点但能避免出现飞行中途电量药量不足的尴尬局面。5.4 实测数据参考最后放一组我实测的数据给大家打个底。同样一块45亩的梯形地块纯手动遥控飞行机手根据经验打点耗时大约32分钟而且喷完之后检查发现地头有三处漏喷。用本文这套流程——MATLAB离线规划、导出航点、飞控执行——实际飞行时间是26分钟漏喷区域为零只在两个转弯半径较大的地头位置出现了轻微的重喷整体评估重喷率控制在3%以内。差距主要来自两部分一是扫描方向更合理条带数减少了二是转弯节奏优化了无人机在整个作业过程中保持了更稳定的巡航速度没有频繁加减速。6. 几个值得继续深入的方向这套流程跑通之后我自己的体会是用MATLAB做植保无人机路径优化真正的门槛不在算法本身而在于把农田这么复杂的东西翻译成算法能计算的数学问题。这个翻译过程需要你对地块几何、无人机性能、飞控格式都心里有数每一条都缺一不可。有几个方向我认为值得继续做下去第一个是加入风场模型。农药喷洒受风影响很大顺风喷和逆风喷的雾滴沉积效果差很多。可以在代价函数里加风向风速的惩罚项让算法倾向于生成顺风为主、逆风为辅的航线这样做出来的路径会更贴近实际植保需求。第二个是转向路径的平滑优化。目前生成的路径在转弯处是折线实际飞行需要做曲线平滑可以考虑用Dubins曲线或者B样条在航点层面做平滑让路径动能损耗更小也减少飞控的轨迹跟踪误差。热搜词里有路径平滑优化算法很多做路径规划的人都会卡在这一步。第三个是多机协同。一台飞机一块地是最基础的场景多台飞机分区作业、协同补药问题会更复杂也更有实际价值。目前一些大田作业已经这样干了但调度的优化空间仍然很大。如果你也想做类似的项目我的建议是先从简单的矩形地块开始把地图处理、条带生成、代价计算这条主线跑通再逐步加不规则地块、障碍物、多子区域这些复杂度。别一开始就想着上强化学习或者复杂约束优化先把基础链路走通后面加多少东西都不难。最后再分享一个实用小技巧在MATLAB里做这类规划所有代码都用函数封装输入是地图参数加无人机参数输出是航点结构和指标报告。这样做的好处是换了地块、换了机型只需要改参数完全不用改逻辑项目的复现性和可维护性都会好很多。本文还有配套的精品资源点击获取
返回列表