3、环境建模:栅格地图、八叉树地图、拓扑地图、Voronoi图

环境建模,说白了就是给无人机画一张它能看懂的地图。你想想看,无人机自己又没有眼睛,它怎么知道哪里能飞、哪里不能飞?全靠我们给它建的这个模型。

我做了这么多年路径规划,踩过最大的坑就是——选错了地图模型。有一次项目赶工期,我随手用了栅格地图,结果无人机在复杂地形里绕了半天出不来。嗯,从那以后我再也不敢轻视环境建模这一步了。

今天咱们就把四种主流的地图模型掰开揉碎讲清楚。每种模型我都会结合自己的项目经验,告诉你什么时候该用、什么时候千万别用。

3.1 栅格地图(Grid Map)

栅格地图是最直观的一种。就是把空间切成一个个小格子,每个格子标记为「可通行」或「不可通行」。就像你玩扫雷游戏一样,每个格子要么安全,要么有雷。

核心思想:用离散的网格单元表示连续空间,每个单元存储占用状态。

我在做室内无人机巡检项目时,就用的栅格地图。因为室内环境结构规整,走廊、房间边界清晰,栅格化之后路径规划特别快。

优点

  • 实现简单——二维数组就能搞定,代码量少
  • 算法兼容性好——A*、Dijkstra、RRT都能直接跑
  • 更新方便——发现障碍物,改对应格子的值就行
  • 适合静态环境——仓库、厂房这种固定场景特别好用

缺点

  • 分辨率两难——格子大了精度不够,格子小了内存爆炸
  • 存储浪费——空旷区域也占内存,其实大部分格子都是空的
  • 路径锯齿——规划出来的路径全是折线,无人机飞起来一抖一抖的
  • 三维扩展困难——三维栅格地图的内存消耗是立方的,100×100×100就是100万个格子

我的建议:如果你做的是二维平面上的无人机巡检,且环境不大(比如100m×100m以内),栅格地图是最省心的选择。但要是做三维城市飞行,赶紧往下看八叉树。

3.2 八叉树地图(Octree Map)

八叉树地图是栅格地图的升级版。它聪明在哪呢?——哪里需要精细,哪里就多切几刀;哪里空旷,哪里就少切几刀。

我记得第一次接触八叉树是在做森林巡检项目。树林里大部分空间是空的,只有树干和树枝是障碍物。如果用栅格地图,内存直接爆掉。八叉树完美解决了这个问题。

工作原理

八叉树把三维空间递归地分成8个立方体。如果一个立方体全是空的,就不再细分;如果包含障碍物,就继续切8块。这样,空旷区域用一个大格子表示,复杂区域用很多小格子表示。

// 八叉树节点结构(简化版)
struct OctreeNode {
    bool is_occupied;      // 是否被占用
    bool is_leaf;          // 是否是叶子节点
    OctreeNode* children[8]; // 8个子节点
    float size;            // 节点大小
    Vector3 center;        // 节点中心坐标
};

优点

  • 内存高效——空旷区域只存一个节点,比栅格地图省几十倍内存
  • 自适应分辨率——近处精细、远处粗糙,符合传感器特性
  • 支持概率更新——每个节点可以存占用概率,处理传感器噪声
  • 三维友好——天生就是三维数据结构

缺点

  • 实现复杂——指针操作多,容易内存泄漏
  • 查询效率波动——最坏情况下要遍历到最深叶子节点
  • 动态更新慢——移动障碍物需要重建部分树结构
  • 路径规划适配麻烦——A*不能直接在八叉树上跑,需要额外处理

我曾经踩过的坑:有一次在八叉树上直接跑RRT,结果因为节点大小不一致,碰撞检测时好时坏。后来我加了一层「节点均匀化」处理,把不同大小的节点统一成相同分辨率再规划路径,问题才解决。

3.3 拓扑地图(Topological Map)

拓扑地图不关心「空间长什么样」,只关心「哪些地方能去、怎么连通」。它把环境抽象成一张图:节点是关键位置(路口、地标),边是连通路径。

你想想看,我们人类认路也是这样的——「先走到那个红绿灯,然后右转,再直走200米」。没人会记着路上每一块砖的位置吧?拓扑地图就是模仿这种思维方式。

优点

  • 极其轻量——几十个节点就能表示整个园区
  • 规划速度快——图搜索算法秒出结果
  • 适合大范围——城市级、园区级路径规划首选
  • 自然支持分层——可以建粗粒度拓扑和细粒度拓扑

缺点

  • 精度低——只知道怎么走,不知道具体位置
  • 建图困难——自动提取拓扑结构是个研究难题
  • 无法处理细节障碍——小障碍物在拓扑图上体现不出来
  • 更新成本高——环境变了,拓扑结构可能要重新建

我的经验:拓扑地图最适合做「全局规划」,比如无人机从A栋飞到B栋。但到了B栋附近,就得切换成栅格地图或八叉树做「局部规划」,处理楼宇间的细节障碍。两种地图配合使用,效果最好。

3.4 Voronoi图

Voronoi图是个很有意思的东西。它把空间划分成多个区域,每个区域里只有一个「种子点」。区域内任何位置到该种子点的距离,都比到其他种子点近。

用在路径规划上,Voronoi图的边界线就是「最安全路径」——因为边界上的点离所有障碍物都最远。我做无人机编队飞行时特别喜欢用这个,能保证每架无人机都离障碍物远远的。

优点

  • 天然安全——路径沿着障碍物之间的中线走,碰撞风险最低
  • 路径平滑——Voronoi边界的曲率变化小,适合无人机飞行
  • 支持多目标——多个种子点对应多个目标,天然支持多目标规划
  • 数学性质好——有成熟的算法库支持(如CGAL、Boost)

缺点

  • 计算量大——高维Voronoi图构建复杂度高
  • 动态环境不友好——障碍物移动了,整个图要重新算
  • 路径不是最短——安全路径往往比最短路径长很多
  • 边界退化问题——障碍物密集时,Voronoi边界变得很窄,无人机过不去

注意:Voronoi图在二维空间表现很好,但扩展到三维就复杂了。三维Voronoi的边界是平面,计算量指数级增长。我一般只在二维平面规划时用Voronoi,三维场景还是老老实实用八叉树。

3.5 四种地图对比总结

特性 栅格地图 八叉树地图 拓扑地图 Voronoi图
内存占用 极低
规划速度
精度 高(取决于分辨率) 高(自适应)
动态适应性
三维支持
实现难度
典型场景 室内巡检 森林、城市 园区、道路网 编队、避障

3.6 如何选择?我的实战建议

说实话,没有一种地图是万能的。我个人的选择策略是这样的:

  1. 先看维度——二维场景优先考虑栅格地图或Voronoi图;三维场景直接上八叉树
  2. 再看范围——小范围(100m以内)用栅格;大范围(公里级)用拓扑
  3. 最后看动态性——环境变化快用栅格;环境固定用八叉树或Voronoi

还有一个技巧:混合使用。我最近的项目就是拓扑地图做全局规划,八叉树做局部规划,两者之间通过「地图切换层」衔接。效果出奇的好,既保证了全局效率,又兼顾了局部精度。

一句话总结:栅格地图是入门首选,八叉树是三维标配,拓扑地图是大范围利器,Voronoi图是安全路径专家。选对地图,路径规划就成功了一半。

环境建模四种地图对比 栅格地图 八叉树地图 拓扑地图 Voronoi图 如何选择? 看场景 维度:二维 vs 三维 范围:小范围 vs 大范围 动态性:静态 vs 动态 推荐:拓扑全局 + 八叉树局部 = 最佳组合

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