第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 防撞约束

这个好理解——不能撞山、撞楼、撞其他无人机。但在多无人机协同中,防撞约束要分两层:

  1. 静态障碍物:地形、建筑物、禁飞区。通常用膨胀法处理,把障碍物边界往外扩一个安全距离
  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 本章知识体系总览

下面这张图是我自己画的,把本章的核心逻辑串起来了。你仔细看一遍,应该能对航迹规划基础有个整体认识。

航迹规划基础:知识体系 航迹规划问题 问题定义 约束条件 空间建模 起点/终点/性能指标 动力学/防撞/通信 栅格法 / Voronoi图法 核心:在约束下,于建模空间中寻找最优路径 图3-1 航迹规划基础知识体系 💡 我的建议:先搞清约束条件,再选建模方法 约束越严格,对建模精度的要求就越高

3.5 小结

这一章我们讲了三个核心问题:

  • 问题定义:明确目标、指标和输出
  • 约束条件:动力学、防撞、通信,一个都不能少
  • 空间建模:栅格法简单粗暴,Voronoi图法聪明高效,看场景选

嗯,说实话,这些基础概念看起来简单,但真正用好需要大量实践。我见过太多人把栅格法用在了不适合的场景,结果路径规划出来根本没法飞。也有团队把Voronoi图法玩出了花,配合曲线平滑,效果堪比老司机手动规划。

下一章我们会深入具体的规划算法,但前提是——你得把今天这些基础吃透。否则,算法再花哨,也是空中楼阁。

课后小作业:找一张你所在城市的地图,用栅格法手动划分一下,看看哪些区域是障碍物,哪些是可通行区域。然后想想,如果用Voronoi图法,结果会有什么不同?


公众号:蓝海资料掘金营,微信deep3321