第3章 航迹规划基础:问题定义、约束条件与空间建模
各位同学,今天我们正式进入航迹规划的核心地带。说实话,很多新手一上来就盯着算法看,结果代码跑通了,飞机却飞不起来。为什么?因为连问题都没定义清楚。
我个人习惯,做任何规划之前,先问三个问题:我们要解决什么问题?有什么限制?在什么空间里找答案? 这三点搞明白了,后面的事情就顺了。
3.1 航迹规划问题定义
航迹规划,说白了就是:在满足一堆约束条件的前提下,找一条从起点到终点的最优路径。这里的“最优”可能是距离最短、油耗最少、威胁最小,或者综合起来最划算。
我遇到过不少团队,上来就追求“全局最优”,结果计算量爆炸,飞机都落地了还没算完。你想想看,实际工程中,我们往往需要的是“足够好且算得快”的路径。
一个标准的航迹规划问题,通常包含以下要素:
- 起点与终点:无人机起飞点和任务目标点
- 规划空间:三维环境,包含地形、障碍物、禁飞区
- 性能指标:航程、时间、能耗、威胁暴露度等
- 约束条件:动力学、防撞、通信等(下面会细讲)
- 输出结果:一系列航点坐标,或者连续的轨迹曲线
核心公式(简化版):
min J = w1 * L + w2 * T + w3 * E
s.t. 动力学约束
防撞约束
通信约束
其中 J 是总代价,L 是航程,T 是时间,E 是能耗,w1、w2、w3 是权重系数。权重怎么调?嗯,这得看具体任务——侦察任务可能更看重时间,运输任务可能更看重能耗。
3.2 约束条件:飞得起来,撞不上,连得上
约束条件就是“红线”,碰了就出事。我把它分成三类,每一类都有血泪教训。
3.2.1 动力学约束
无人机不是质点,它有物理极限。你规划出来的路径,飞机得能飞出来才行。
- 最大转弯半径:固定翼无人机转弯需要半径,太小了会失速。我见过有人规划出直角转弯的路径,结果飞机直接螺旋下坠……
- 最大爬升/俯冲角:垂直方向也有极限,尤其是多旋翼,爬升太快电机可能过载
- 速度范围:有最小速度(失速速度)和最大速度(结构限制)
- 加速度限制:急加速急减速,电机和电池都受不了
避坑指南:我曾经在项目中忽略了最小转弯半径,结果仿真完美,实飞时飞机在第一个弯就失控了。后来我学乖了,规划完路径后,先用运动学模型仿真一遍,看看飞机能不能跟得上。
3.2.2 防撞约束
这个好理解——不能撞山、撞楼、撞其他无人机。但在多无人机协同中,防撞约束要分两层:
- 静态障碍物:地形、建筑物、禁飞区。通常用膨胀法处理,把障碍物边界往外扩一个安全距离
- 动态障碍物:其他无人机、飞鸟、临时闯入的飞行器。这需要实时检测和避让
多机协同中,机间防撞是最头疼的。我记得有一次做3架无人机编队,两架飞机在交叉点差点撞上,距离只有5米——还好有备用避撞逻辑。从那以后,我强制要求机间安全距离至少是机身长度的3倍。
3.2.3 通信约束
这个很多人容易忽略。无人机之间、无人机与地面站之间,通信不是无限的。
- 通信距离:超出范围就失联,数据链会断开
- 通信带宽:传图像、传状态信息,带宽有限,不能什么都传
- 通信延迟:尤其是卫星通信,延迟可能几百毫秒,协同控制要考虑这个
- 通信拓扑:是星型、网状还是链式?不同拓扑对路径规划影响很大
注意:通信约束往往是“软约束”——断了不会立刻坠毁,但任务会失败。我建议在规划阶段就把通信质量作为代价函数的一部分,而不是简单的“通/不通”二值判断。
3.3 规划空间建模:把现实世界装进计算机
现实世界是连续的、复杂的,但计算机只能处理离散的、结构化的数据。所以我们需要空间建模——把环境抽象成计算机能理解的形式。
常用的方法有两种:栅格法和Voronoi图法。我分别讲讲。
3.3.1 栅格法
栅格法最直观——把空间切成一个个小格子。每个格子标记为“可通行”或“不可通行”。
- 优点:简单、直观、容易实现。A*算法、Dijkstra算法都能直接用
- 缺点:精度和计算量矛盾。格子小了,计算量爆炸;格子大了,路径不精确
- 适用场景:二维平面、障碍物规则的环境
我个人的经验:栅格大小取无人机机身长度的1.5倍左右比较合适。太小了没必要,太大了容易漏掉窄通道。
// 栅格法伪代码示例
struct Grid {
int x, y, z; // 栅格坐标
bool is_obstacle; // 是否障碍物
double cost; // 通行代价
};
// 初始化栅格地图
Grid map[100][100][50];
for (int i = 0; i < 100; i++)
for (int j = 0; j < 100; j++)
for (int k = 0; k < 50; k++) {
if (is_inside_obstacle(i, j, k))
map[i][j][k].is_obstacle = true;
else
map[i][j][k].is_obstacle = false;
}
3.3.2 Voronoi图法
Voronoi图法更聪明一些。它把障碍物当作“种子点”,然后生成一系列多边形区域。每个区域内的点到对应障碍物的距离最近。
- 优点:生成的路径天然远离障碍物,安全性高;节点数少,计算快
- 缺点:路径不一定最优,可能绕远路;对动态环境适应性差
- 适用场景:障碍物稀疏、需要快速生成安全路径的场景
我记得在某个项目中,我们用Voronoi图做初始路径规划,然后用B样条曲线平滑,效果出奇的好——既保证了安全,又兼顾了飞行品质。
两种方法对比:
| 特性 | 栅格法 | Voronoi图法 |
|---|---|---|
| 空间表示 | 离散网格 | 连续多边形 |
| 计算复杂度 | O(n³) 随分辨率指数增长 | O(m log m) m为障碍物数量 |
| 路径质量 | 锯齿状,需平滑 | 较平滑,但可能绕路 |
| 动态环境 | 易更新 | 需重建 |
| 工程推荐 | 室内、结构化环境 | 野外、稀疏障碍物 |
3.4 本章知识体系总览
下面这张图是我自己画的,把本章的核心逻辑串起来了。你仔细看一遍,应该能对航迹规划基础有个整体认识。
3.5 小结
这一章我们讲了三个核心问题:
- 问题定义:明确目标、指标和输出
- 约束条件:动力学、防撞、通信,一个都不能少
- 空间建模:栅格法简单粗暴,Voronoi图法聪明高效,看场景选
嗯,说实话,这些基础概念看起来简单,但真正用好需要大量实践。我见过太多人把栅格法用在了不适合的场景,结果路径规划出来根本没法飞。也有团队把Voronoi图法玩出了花,配合曲线平滑,效果堪比老司机手动规划。
下一章我们会深入具体的规划算法,但前提是——你得把今天这些基础吃透。否则,算法再花哨,也是空中楼阁。
课后小作业:找一张你所在城市的地图,用栅格法手动划分一下,看看哪些区域是障碍物,哪些是可通行区域。然后想想,如果用Voronoi图法,结果会有什么不同?
公众号:蓝海资料掘金营,微信deep3321