说到无人机路径规划算法,我最初入行的时候觉得这个词有点被高估了。路径规划嘛,从起点飞到终点,中间躲开障碍物,地面上自动驾驶研究了这么多年,空中不该更难到哪里去。直到我把第一台多旋翼飞起来,把真实的三维栅格地图和机载算力摆到面前,才发现这问题是典型的"听起来容易做起来难"——三维空间搜索、动力学约束、有限的机载计算资源、传感器误差、动态环境,每一个维度都在把这个方向往更深的地方推。
这篇内容是我基于多年做无人机系统开发和算法研究的经历,对路径规划算法从传统到智能再到学习范式的一次系统梳理。它不打算复述教科书,而是想讲清楚几件事:无人机路径规划到底在优化什么、约束什么;从A*到RRT、从粒子群到深度学习,每个算法家族的核心思想和适用边界;以及真正把算法放到机载平台上跑的时候,你会遇到哪些论文里不会写的坑。适合刚接触这个方向的研究生、准备做路径规划方向毕设的本科生,以及已经在做飞控或任务系统、想补规划算法这块短板的工程师。
1. 无人机路径规划到底在解决什么问题:从"飞起来"到"飞得聪明"
1.1 一个看似简单的问题,为什么能被研究几十年
路径规划的数学描述其实很简洁:在一个已知或部分已知的三维工作空间中,给定起点和目标点,找一条连续轨迹,在满足无人机动力学约束、避障约束、任务时间约束的前提下,最小化某个代价函数。代价函数通常取路径长度、飞行时间、能量消耗,或者安全性的某种度量。
但问题就藏在"约束"两个字里。地面机器人面对的是二维平面,无人机是三维空间,搜索维度直接升一维,计算量指数增长。固定翼无人机有最小转弯半径,多旋翼虽然有悬停能力,但有最大俯仰角、最大速度和加速度限制。这意味着规划出来的路径不仅要"几何上不碰障碍物",还要"物理上飞得出来"。这两者之间的差距,是很多新手第一次把自己写的A*路径接到飞控上时,发现飞机在空中直接抽搐的原因之一。
所以严格讲,无人机路径规划可以分为两个层面:任务层面的宏观路径规划,解决"往哪个方向飞";轨迹层面的运动规划,解决"怎么控制飞机飞好这条线"。很多综述把两者混在一起谈,实际工程中它们是两个模块,跑在不同的控制周期上。宏观规划器的更新频率往往只有1到10Hz,而底层轨迹跟踪控制器跑在50到200Hz,两者之间还要有专门的轨迹平滑层。
1.2 评价一个路径规划算法的核心指标
评价算法好坏,不能只看"找到没有"和"快不快"。工程上通常看四个维度,而且这四者常常互相矛盾。
- 最优性:找到的路径相对于代价函数的接近程度。A在有相容启发函数时能保证最优,RRT能渐进最优,但"渐进"意味着要花大量时间采样。
- 完备性与概率完备性:完备意味着如果路径存在,算法一定能找到;概率完备意味着随着采样数趋于无穷,找到路径的概率趋于1。Dijkstra和A*是完备的,RRT系列是概率完备的。这个区别决定了算法能用在哪类问题上。
- 计算效率:决定算法能否实时跑。这个指标在论文里经常被一笔带过,但在机载嵌入式平台上是被卡得最死的。
- 路径质量:包括路径长度、平滑度、飞行时间的综合表现。工程里最常见的坑是:算法求出的最短路径由大量折线段组成,直接交给飞控会被当作"瞬时改变航向"的指令,导致飞行颠簸甚至触发保护。所以路径生成之后往往还要做平滑,这就引入了一个新的问题。
理解了这四个指标,再看后面所有算法,就有一条清晰的评价主线:每个算法都是在这四个目标之间的某种妥协。
1.3 发展脉络:从静态搜索到学习驱动的三次转向
以我的观察,路径规划这几十年的发展可以粗略分成三个阶段。
第一阶段以图搜索和采样为主旋律。Dijkstra(1959)和A*(1968)奠定了栅格地图上的完备搜索范式;1986年Khatib提出人工势场法;1998年LaValle提出RRT,2000年代初RRT*、PRM把采样方法推向成熟。这个阶段的思维底色是"确定性":环境已知或基本静止,算法在几何空间中找一条满足代价的路径。
第二阶段是群体智能优化算法的爆发。遗传算法、粒子群、蚁群,大约从2000年开始被大量引入路径规划。这个阶段的思维底色是"全局搜索":不追求实时,而是试图在复杂约束和多目标优化中找到更接近全局最优的解。论文里非常热闹,实际工程落地效果却参差不齐。
第三阶段是学习和感知驱动的规划。深度学习让无人机具备了从视觉图像里直接感知环境的能力,强化学习则让"规划"从"显式搜索"走向"策略学习"。这个阶段的思维底色是"不确定性下的自适应":环境不是给定的,而是感知出来的;障碍物不是静止的,而是动态的。同时,学习方法的可解释性和安全性问题也在这些年被反复讨论。
有了这条时间线,接下来几章分别拆开讲,你就能理解每个算法为什么在那个时代被提出来,又为什么在今天仍然有一席之地。
2. 确定性时代的经典算法:A*与RRT为什么到今天还不过时
2.1 A*:图搜索的效率标杆和它在三维栅格里的表现
A的原理,说穿了就是把Dijkstra的"盲目扩展"改成"有方向地扩展"。它用 f(n)=g(n)+h(n) 来评估节点优先级,其中 g(n) 是从起点到当前节点的真实代价,h(n) 是从当前节点到目标的启发式估计。当 h(n) 满足一致性条件,也就是对任意相邻节点,h(n) ≤ c(n,n')+h(n') 时,A不仅完备,而且最优。
这个"启发式"是A的灵魂。在三维栅格地图里,最常用的启发式是三维欧氏距离:h(n)=sqrt((x-x_goal)^2+(y-y_goal)^2+(z-z_goal)^2)。它天然满足一致性,计算量也很小。如果你想让A搜得快一点,可以尝试在启发式里加入"最小转弯代价"或者"地形代价"的估计——代价估得越接近真实代价,搜索就越高效。但注意,一旦启发式高估了真实代价,你可能丢失最优性,工程上这叫"不可采纳的启发式",有时候为了实时性可以接受,但要知道自己在做什么。
我在实际工程里用A处理三维栅格的一个经验是:不要直接在原始分辨率上做全局搜索。一方面,一个1km乘1km乘200m的区域,如果栅格分辨率是1m,就是2亿个栅格单元,内存和耗时都很难看;另一方面,底层规划根本不需要那么高的分辨率。比较常见的做法是先建一个低分辨率的全局栅格地图(比如5m或10m),用A搜出一条全局走廊,再在走廊的局部区域用高分辨率地图做细节规划。这种"由粗到细"的策略,比单次高分辨率搜索能快一到两个数量级。
A*的代码实现本身不算难,但有两个容易踩的坑。一是CloseSet的重判条件,如果你用OpenSet和ClosedSet两个结构,要注意扩展节点时判断的是"已经在ClosedSet里就跳过",而不是"曾经在OpenSet里就跳过",否则在某些地图上会漏掉最优解。二是邻域的选择,二维栅格常常用8邻域,三维栅格如果用26邻域,搜索空间会急剧膨胀;实际很多场景用6邻域就够,代价是路径会稍微绕一点,反正后续要平滑,这个绕的成本通常可以接受。
2.2 RRT与RRT*:为什么随机采样方法能在高维空间胜出
A*的优势建立在"栅格化"上,但栅格化本身在高维空间里是灾难:维度一高,栅格数量指数级增加,这就是所谓的"维度诅咒"。RRT的思路则完全不同——不显式地离散化整个空间,而是随机地在连续空间中采样,把采样点连接到已有的随机树上。这样它天然地避开对自由空间的完整建模,在高维或复杂几何环境中效率非常高。
RRT的核心流程可以用一段伪代码概括:
Tree = {start} while not timeout: q_rand = random_sample() q_near = nearest_neighbor(Tree, q_rand) q_new = steer(q_near, q_rand, step_size) if collision_free(q_near, q_new): Tree.add(q_new) if distance(q_new, goal) < threshold: return extract_path(Tree, q_new)看起来很简单,但每一步都有讲究。random_sample() 的分布可以改造:如果完全均匀随机,搜索会很散;实践中常见做法是以一定概率直接采样目标点附近(比如10%的概率直接把 q_rand 设为 q_goal),这样能大幅加速收敛。nearest_neighbor() 在三维空间直接遍历树找最近点就行,树节点上千之后每帧遍历一次也还扛得住。collision_free() 是性能瓶颈,因为要对 q_near 到 q_new 的线段做连续碰撞检测,一般要按步长多次采样检测。
RRT在RRT基础上加了"重连"操作:新节点加入后,检查其邻域内的已有节点,如果从新节点到这些节点的路径比原来的父节点路径更短,就重新接线。这个rewire过程让RRT具备了渐进最优性——随着采样点增加,路径会越来越接近最优。代价是每一帧的计算量都比RRT大不少,在机载平台上需要权衡。
在无人机路径规划里,RRT家族最吸引人的地方在于:它可以很自然地扩展到动力学层面,也就是Kinodynamic RRT——把无人机的速度、加速度甚至角速度约束直接塞进steer()步骤,让生成的路径在物理上就是可飞的。我见过不少团队把Kinodynamic RRT用在城市峡谷环境的局部规划上,效果比单纯A*加平滑好很多。但它的随机性也带来可复现性差的问题,同样的起点终点,两次跑出的路径可能完全不同,这在需要轨迹可预测的行业中是个缺点。
2.3 人工势场法:理解它的陷阱,才能理解为什么要混合多种方法
人工势场法的思想很直观:目标点产生引力场,障碍物产生斥力场,无人机沿着势场的合力方向运动。它最大的优点是计算极快、适合在线避障,所以在移动机器人里很受欢迎。但无人机用势场法有个经典问题——局部极小值。当无人机进入U形障碍物的凹槽里时,引力和斥力合成出现合力为零的点,无人机会在那里反复震荡,这就是所谓的死锁。
教科书里给出的解法包括添加随机扰动、使用虚拟障碍物推动、把势场扩展到带高度维的形式等。但在工程实践中,我几乎没见过把纯势场法作为无人机唯一规划器的。更常见的用法是把它作为局部避障的一个低层"保险":全局路径规划器负责大方向,局部检测到突发障碍物时,用势场法快速推开,同时向全局规划器发请求重新规划。纯势场法的问题不在于它本身,而在于你把它放在整个架构的哪个位置。
2.4 经典算法的工程对比与选型第一原则
这一代算法的对比信息整理成一张表,方便做选型时快速参考。
| 算法 | 完备性 | 最优性 | 计算效率 | 适用场景 | 主要坑 |
|---|---|---|---|---|---|
| Dijkstra | 完备 | 最优 | 较低 | 静态小地图 | 盲目扩展,搜索范围大 |
| A* | 完备 | 有相容启发时最优 | 较高 | 栅格化全局规划 | 分辨率选择、启发式设计 |
| 人工势场法 | 不保证 | 不保证 | 极高 | 局部避障 | 局部极小值、参数敏感 |
| RRT | 概率完备 | 不保证 | 高 | 高维/连续空间 | 路径抖动、不光滑 |
| RRT* | 概率完备 | 渐进最优 | 中 | 高维优化 | 收敛慢、资源消耗 |
我在这代算法上的一条核心体会是:不要期待一个算法同时满足"完备、最优、实时、平滑"四个要求,它们之间本来就是互斥的。工程上最合理的起点是"A做全局静态规划 + RRT或DWA做局部动态规划",这两种算法的互补性远比它们之间的竞争关系重要。先把这条主线跑通,再谈优化和扩展。
3. 智能优化算法:粒子群、遗传、蚁群能解决什么问题
3.1 三种代表性算法的核心思想
遗传算法(GA)受生物进化启发:把路径编码为一串基因(例如一系列航点坐标),初始种群随机产生一批路径,用适应度函数(综合路径长度、安全性、飞行时间等)评价每条路径,然后通过选择、交叉、变异迭代进化。它的优势是天然支持多目标优化,你可以把路径长度、转弯角度、禁飞区穿越惩罚全部加权放进适应度函数,算法会在迭代中自动寻找权衡解。
粒子群算法(PSO)的直观理解是:一群粒子在搜索空间里飞行,每个粒子记住自己的历史最优位置,同时参考整个群体的历史最优位置来调整自己的速度。位置更新公式是:
v_i(t+1) = w*v_i(t) + c1*r1*(pbest_i - x_i(t)) + c2*r2*(gbest - x_i(t)) x_i(t+1) = x_i(t) + v_i(t+1)看到 w、c1、c2 这三个参数,你就知道为什么这类算法常被称为"调参游戏"。w 是惯性权重,控制粒子维持原来速度的倾向;c1 是自我认知系数,c2 是社会认知系数。工程上默认的 w 从0.9线性衰减到0.4,是一种很常用的策略。PSO在三维连续空间的位置搜索上非常直接,因此很多文献用它来做无人机三维航迹规划,把一条由N个航点组成的三维路径看作一个粒子。
蚁群算法(ACO)的核心是正反馈机制。蚂蚁在经过的路径上留下信息素,信息素浓度高的路径吸引更多蚂蚁选择,从而留下更多信息素。在路径规划里,可以把栅格地图或路网图的每条边赋予信息素浓度,最终收敛到一条信息素浓度最高的路径。这个机制特别适合"组合优化"类型的路径问题,比如多目标点访问顺序的优化。
3.2 为什么它们在论文里很热闹,落地时却很尴尬
我必须给想直接把这套算法用于无人机实际飞行的朋友泼一盆冷水。这类智能优化算法有一个共同问题:它们都需要在迭代中逐步逼近最优解,而每一次迭代都要评估大量候选解(一个种群几十上百个个体、一个粒子群几十个粒子),每个候选解一次评估往往就相当于一次路径代价计算。在三维栅格地图上跑一轮GA或PSO,耗时通常是几十秒到几分钟级别。这个时间尺度,放在需要秒级重规划的动态环境中,是完全不可接受的。
另一个问题是参数敏感性。w、c1、c2、变异率、交叉率、种群规模,每一个参数都要针对具体地图调,换个地图可能又得重新调。很多研究者花了大量精力调参,最后得到的最优路径,和A*在同样地图上花几百毫秒搜索出来的路径相比,提升往往不到5%,计算耗时却高了两三个数量级。这种性价比在工程决策里很难站住脚。
不过,如果把问题域缩窄到"离线全局规划",智能算法还是有不可替代的价值。大型三维环境下的多目标航迹规划,比如无人机需要依次访问10个任务点并且覆盖一定区域,或者带复杂禁飞区和多约束的航迹规划,这类问题搜索空间巨大,传统图搜索会面临内存和耗时双爆炸,而GA或PSO可以在可接受时间内找到一条工程上可用的次优解。所以我的建议是:把智能算法定位成"离线任务规划器"而不是"在线路径规划器",它们会和A*、RRT形成很好的互补。
3.3 实战中的混合套路:用智能算法搜索走廊,用采样算法做细节
具体怎么混合?分享一个我亲测有效的套路。
先用PSO或GA在低分辨率栅格地图上搜索出一条"路径走廊"。注意,这条走廊不是一条精确路径,而是一系列球形或柱形的可行区域——算法只需要保证走廊内的每个点大概率不碰障碍物,不需要精确到栅格级别。这一步搜索空间大,但低分辨率地图计算量可控,通常秒级能完成。
接着把走廊区域内的地图切出来,用高分辨率地图跑RRT*或带动力学约束的RRT。因为搜索空间被走廊限制住了,RRT的随机采样不需要在全图撒点,收敛速度会快很多,同时又能发挥RRT在高精度连续空间中的优势。
最后再做轨迹平滑和速度规划。整个流程下来,全局最优性由第一步的智能算法兜底,虽然不保证全局最优,但走廊已经避开大范围劣质区域;局部精细化和动力学可行性由第二步RRT保证;计算量则被控制在了可机载执行的范围。这个混合架构我在多个项目里用过,稳定性远好于单用一个算法。
4. 学习与感知时代:强化学习和视觉感知如何改变路径规划
4.1 强化学习的路径规划框架:状态、动作、奖励三件套
强化学习把路径规划重新定义成一个序贯决策问题:无人机在每个时刻处于某个状态 s_t(位置、速度、朝向、局部障碍物信息等),采取一个动作 a_t(加速度指令、航向角变化量等),环境返回奖励 r_t,并转移到下一个状态 s_{t+1}。算法目标是学一个策略 π(a|s),让累积奖励最大化。
在这个框架下,路径规划不再是一个"一次性的搜索问题",而是一个"反复试错中学会决策"的问题。DQN用深度网络拟合Q值函数,适合离散动作空间;DDPG和PPO则能处理连续控制。我在无人机避障项目里经常用PPO,因为它对超参数的敏感度比DDPG低,训练更稳,而且自带的采样效率优化在机器人控制任务上表现不错。
Reward设计是这个框架里最见功力的地方。一个常见的错误是只给"到达目标+1,撞上障碍物-1"这种稀疏奖励,这对无人机来说几乎没法训练,因为学习信号太稀疏。实践中要把奖励拆细:距离目标每缩短一点给一个小的正奖励,靠近障碍物给惩罚,速度超过安全范围给惩罚,转弯过急给惩罚。把奖励函数设计到能反映"你希望无人机表现出什么行为"的程度,训练才能收敛。
但这里有个残酷的现实:仿真里训练好的策略,移植到真实无人机上往往会"水土不服"。仿真中的动力学模型、传感器噪声、光照条件,和现实总有差距,这就是sim-to-real gap。行业里目前的主流解决方案不是追求完美的端到端,而是把学习算法生成的策略作为先验,在真机上用少量样本做微调,或者用domain randomization在仿真中随机化大量参数来增强泛化性。这条路能走通,但远没有论文里看起来那么平顺。
4.2 视觉感知是路径规划的"眼睛":感知-规划闭环
路径规划能不能做出正确的决策,高度依赖于上游感知的质量。这就是"无人机视觉感知"在业内被频繁讨论的原因——没有可靠的障碍物检测和定位,规划器再强也只是在空中盲目飞行。
一个典型的视觉感知-规划闭环是这样:机载摄像头采集图像,经过深度神经网络做语义分割或障碍物检测(比如识别出电线、树枝、建筑边缘),同时通过视觉里程计或视觉SLAM估计无人机自身位置,构建局部占用栅格地图;这个局部地图再和全局地图融合,输入给规划器。规划器重新规划路径后,由底层控制器执行,整个闭环以10到30Hz的频率不断刷新。
这里的工程细节非常多。运行在嵌入式平台上的感知模型必须有非常小的计算量,所以像YOLO系、轻量级分割网络这类模型在机载平台上的部署很常见。帧率也远比分辨率重要——10Hz的障碍物检测,比2Hz的"高清图片"对规划的实际帮助大得多,因为无人机在高速运动时,低帧率感知意味着障碍物在两次检测之间可能已经移动了很大距离。我在做机载系统时,宁可牺牲分辨率也要保帧率。
4.3 端到端规划与"学习+传统"混合路线的现实对比
端到端的思路很吸引人:摄像头图像直接进神经网络,输出控制指令,路径规划被隐含在网络的权重里。好处是省去了大量的感知-建图-规划模块,坏处是可解释性差:你无法知道网络为什么选择了某条路径。
对于无人机这种安全关键的系统,"可解释性差"不是一种简单的风格偏好,而是工程上的核心障碍。一旦出现一次飞行事故,如果系统是基于A*决策的,你可以回放地图、检查路径代价的每一步,很快定位问题;但如果是神经网络直接决策的,你只能给出一堆权重和激活值,很难回答"为什么在那里选择绕到障碍物左侧而不是右侧"。客户以及你自己作为工程师,都不会舒服。
所以目前行业里更靠谱的路线是混合架构:用深度学习做感知(识别障碍物和地物),用传统规划算法做路径决策,用强化学习做特定子问题(比如局部避障策略、复杂地形的动态调整)。我倾向于把"端到端"看作长期探索方向,而把"学习+传统"看作当前工程落地的最优解。
5. 动态环境与多机协同:路径规划最现实的考验
5.1 动态障碍物与在线重规划
把无人机从"已知静态环境"放到"有车辆移动、有人流穿梭、有其他无人机干扰"的现实环境中,路径规划的难度会有质变。静态规划器算出的路径,可能在几秒后就因为有新障碍物出现而不可行。解决思路有两类。
一类是"重规划"思路:持续感知环境变化,一旦发现原路径被堵或者新的动态障碍物进入安全范围,立刻触发局部重规划。这类方法的瓶颈在触发频率和规划耗时:如果重规划一次要几秒钟,而障碍物几米每秒地移动,重规划还没完成就可能撞上了。所以局部规划器必须足够快,这也就是为什么DWA(动态窗口法)这类"在短时间窗口内采样速度指令、选一条能避开障碍物的方法"在无人机低空飞行里很常见。
另一类是"预测+避让"思路:不把所有障碍物当作随机事件,而是尝试对动态障碍物的运动做短时预测(比如用卡尔曼滤波或简单的恒定速度模型),在代价函数里把"未来可能碰撞"的量估计进去。这里我特别推荐速度障碍法(VO)及其多智能体版本RVO:它不直接规划路径,而是计算"当前速度如果保持不变,最早的碰撞时刻",然后从一系列候选速度中选一个既能避开碰撞又能朝目标前进的速度。RVO的核心假设是对方也会采取同样的避让规则,这让它非常适合多无人机之间的相互避让。
5.2 多无人机协同规划:集中式与分布式的取舍
多无人机协同路径规划是这几年需求增长最快的方向之一——多机编队巡检、多机协同搜索、多机同时到达。规划层面的问题一下子复杂起来:不仅要保证每架无人机自身避障,还要保证机与机之间互相不碰撞,同时还要满足任务层面的协同约束(比如同时到达、保持编队阵型、覆盖效率最大化)。
集中式规划的思路:把所有无人机的状态统一放入一个规划问题里求解,比如用混合整数规划或图搜索在联合状态空间找解。这个思路理论上能得到全局最优,但计算复杂度随无人机数量爆炸式增长,两三架还能忍,超过五架基本就不可行了。我见过一些项目把集中式规划离线算好,飞行时只做跟踪,算是把复杂计算和实时执行分离开了。
分布式规划则让每架无人机独立计算,通过通信交换位置和意图,用一致性协议或优先级协商来避免冲突。常见的做法是"优先级规划":给每架无人机分配优先级,优先级高的先规划路径,优先级低的在规划时把高优先级无人机的路径当作动态障碍物避让。这种方法的计算量基本不随无人机数量灾难性上升,但在高动态任务中,通信延迟和丢包会成为主要矛盾。我实际做过的经验是:编队数量在10架以下,分布式优先级规划配合RVO避让是最容易落地且扩展性好的方案;超过10架甚至几十架,就得考虑分层架构——上层做任务分配,下层做编队保持和避碰。
5.3 被低估的不确定性:感知误差比算法本身更致命
很多从论文走向工程的人在动态环境中栽跟头,往往不是因为算法选错了,而是没有考虑"传感器看到的和实际场景有偏差"。激光雷达和视觉传感器的距离测量都有噪声,GPS在楼宇峡谷和树冠下有明显的多径误差,IMU会漂移。当规划器依赖的这些输入本身不准确时,即使算法再精妙,也难免出错。
处理不确定性的工程手段通常有三个层次。第一层是最简单的"膨胀障碍物":把检测到的障碍物半径向外扩大一个安全余量,余量大小参考传感器误差的3σ。说白了就是"我宁愿多绕一点,也不接近不确定的地方"。第二层是概率建模:用占据栅格地图的概率形式表示环境,规划时把每个栅格的占据概率乘进代价函数。第三层是用机会约束规划或者鲁棒优化,从数学上保证碰撞概率不超过某个阈值——这种方法学术价值高,但工程落地复杂,一般团队不太会直接使用。
我的建议是,第一层是最容易被忽略却性价比最高的。很多无人机项目的事故,追根溯源不是算法不强,而是安全余量没留够。规划器名义上规划了一条距离障碍物50厘米的路径,但传感器误差一叠加,实际距离可能只有20厘米甚至更近,一个突风就完蛋。所以我在实际系统里,安全余量永远优先于路径最优性。
6. 工程落地的选型经验与踩坑记录
6.1 不同应用场景下,算法选型的快速对照
前面几章讲了算法原理和发展脉络,但最实际的永远是"我这个场景该用什么"。我按常见的四类无人机任务场景给一个选型建议,仅代表个人经验。
| 应用场景 | 环境特征 | 优先考虑算法 | 原因 |
|---|---|---|---|
| 室内巡检/建图 | 静态为主、空间狭小、GPS不可用 | A全局 + DWA局部,或RRT | 地图规模可控,完备性更可靠 |
| 户外测绘/航测 | 开阔、预定义航线 | 直线段航点规划+最小转弯半径约束 | 任务主导,路径规划压力不大 |
| 电力巡检/桥梁检测 | 复杂结构物、有静态障碍物 | 离线智能算法搜走廊 + 在线RRT | 全局避绕复杂障碍物,局部精细化 |
| 城市低空物流/动态避障 | 动态障碍物多、不确定性高 | RVO避让 + 势场法局部推挤 + A*重规划 | 实时性优先,安全余量要足 |
| 多机编队巡检 | 机间冲突为主 | 分布式优先级规划 + RVO | 扩展性好,通信开销可控 |
这张表不算普适,但作为起点足够用。实际项目里还需要根据计算平台、传感器配置、任务节拍进一步细化。
6.2 机载算力预算:为什么论文算法跑不到真机上
机载平台和桌面电脑的差距,是路径规划从论文到产品之间最现实的一道坎。像Pixhawk这类开源飞控平台虽然能跑简单规划任务,但稍微复杂的算法就要交给机载计算机(比如NVIDIA Jetson系列或更小的嵌入式板卡)。这类平台的CPU算力通常比桌面电脑低一个数量级,内存也小得多。
我建议在项目初期就把算力预算定下来:例如,全局重规划允许耗时2秒,局部重规划必须在100毫秒内完成,感知帧率不低于10Hz,留给路径规划模块的CPU占用率不超过30%。定了这个预算,很多算法的适用性立刻清晰:A在低分辨率三维栅格上通常能满足秒级重规划,RRT在大地图上往往超预算,GA/PSO基本只能离线用,深度强化学习策略如果不在NPU上加速也容易吃满CPU。
栅格地图的内存也要提前算。一个1000乘1000乘100的三维栅格,如果每个栅格用1字节存储占据概率,大约95MB,机载平台上有些吃得下,有些吃不下。实际做法是把地图分块加载,或者用八叉树结构(OctoMap)稀疏存储,空区域不占内存——这个优化在三维路径规划里几乎是必做的。
6.3 坐标系和单位,最容易让人翻车的隐藏坑
路径规划算法本身再复杂,也怕坐标系和单位搞错。无人机系统涉及多个坐标系:地理坐标系(经纬度)、导航坐标系(ENU或NED)、机体系、地图坐标系。规划器通常在地图坐标系下运行,而飞控输出的是地理坐标或者本地导航坐标,两者转换一旦出错,表现就是"规划的路径和实际飞行的路径整体偏了一个角度或平移了一段距离"。
我早期踩过一个很典型的坑:地图构建用的是ENU(东-北-天),底层飞控的期望航向角用的是NED(北-东-地)的约定,结果坐标转换里少乘了一个旋转矩阵,无人机在测试场上飞出了一条整体方向偏了大约45度的路径。排查过程倒查了几个坐标系,最后发现是旋转矩阵的顺序写错了。这种问题在仿真里很难暴露,因为仿真环境的数据往往是自洽的,到了真机上才原形毕露。我的建议是:在系统联调之前,单独做一个坐标系转换的单元测试,把经纬度、地面站坐标、地图坐标往返转换一次,保证误差在厘米级。
6.4 路径平滑:让规划结果真正"飞得出来"
规划器输出的路径本质上是一条线段序列,每个拐点对无人机来说就是一次瞬时的大角度航向变化,这在物理上是不可实现的。所以路径生成之后,一定要做平滑处理。
最简单的做法是用B样条或贝塞尔曲线对路径做插值。基于控制点的B样条能把路径变得光滑,同时可以通过控制点密度控制路径对原始线的贴近程度。别一味追求绝对光滑而把路径拉得远离障碍物,那样会增加飞行距离,也会降低安全性。
更进阶的做法是"轨迹优化":在满足动力学约束(最大速度、最大加速度、最小转弯半径)的前提下,以最短时间或最小能量为目标,用线性二次规划或模型预测控制对路径做优化。这个方向已经很成熟,很多开源框架(比如ETH的轨迹生成工具)可以直接复用。不过我要提醒的是,轨迹优化层一旦引入,你要把它和路径规划层放在不同的控制周期上考虑,否则会陷入"优化太慢拖垮实时性"的尴尬。
6.5 我给新入坑者的建议顺序
如果刚接触无人机路径规划,我的个人建议是:先别急着上深度学习。先把A在二维栅格上跑通,然后扩展到三维栅格;再把RRT和RRT在同一套地图上跑通,体会一下"完备搜索"和"采样搜索"在效率与最优性上的差异;然后用Gazebo或PX4仿真环境,把规划器和飞控接起来,跑通"规划到跟踪"的闭环;最后再加感知模块。很多人在第一步都没做扎实,就直接跳到端到端,最后卡在仿真与现实差距上,反而花了最多时间。
这个顺序不是我拍脑袋定的。它跟我自己从论文到真机的成长路径几乎一致,也是我见过的成功率最高的路线。
最后再说一次我这些年最大的感触:路径规划从来不缺新算法,缺的是把算法放到真机上以后,仍然能让它稳定工作的工程能力。A*和RRT这种老算法,就是因为简单、可解释、容易调试,才能在几十年后依然活跃在机载平台上。如果你能把一个算法从仿真跑到真机,把坐标系、安全余量、算力预算这些"脏活"都干利索,你手里的路径规划能力,就已经超过大多数只写论文的人。