环境建模基础:栅格地图、几何地图、拓扑地图的构建方法与适用场景对比

做路径规划这么多年,我越来越觉得一个道理:地图选不对,后面全白费。你想想看,就像出门导航,你拿着一张手绘的涂鸦地图和拿着高德地图,走路的策略能一样吗?

环境建模,说白了就是把机器人看到的物理世界,翻译成它能理解的数学语言。今天咱们就聊聊三种最经典的地图模型:栅格地图、几何地图、拓扑地图。我会结合我踩过的坑,把它们的构建方法和适用场景掰开揉碎了讲清楚。

一、栅格地图(Occupancy Grid Map)

这是我最常用的一种,也是入门门槛最低的。栅格地图把环境切分成一个个小格子,每个格子要么是“空闲”,要么是“占用”,要么是“未知”。

构建方法

构建过程其实不复杂。你给机器人装个激光雷达或者声呐,让它转一圈。每扫到一个障碍物,就把对应的格子标记为占用。没扫到的地方,标记为空闲。嗯,这里要注意:传感器有噪声,所以通常用概率模型,比如贝叶斯更新。

我记得有一次做仓储机器人项目,一开始直接用二值化(0或1),结果机器人老撞到货架腿。后来改成概率栅格,每个格子存一个占用概率,问题就解决了。

核心公式(简化版):

P(occupied | z) = 1 / (1 + exp(-log_odds))
log_odds = log_odds_prior + log_odds_update

每次观测 z 来了,就更新这个格子的对数几率。简单说,就是“信心的累积”。

适用场景

  • 室内结构化环境:比如办公室、仓库、走廊。格子大小一般设 5cm~20cm。
  • 需要精确避障:比如扫地机器人,必须知道哪里是墙、哪里是沙发腿。
  • 多传感器融合:激光雷达 + 深度相机,都能往栅格上投影。

避坑指南:我曾经在一个大厂房里用 2cm 分辨率的栅格地图,结果内存爆了。你想想看,100m x 100m 的区域,2cm 格子就是 2500 万个格子,每个格子存一个 float,光地图就占 100MB。后来我改成 10cm 分辨率,内存降到 4MB,路径规划速度也快了 10 倍。

二、几何地图(Geometric Map)

几何地图不画格子,它用点、线、面来描述环境。说白了,就是提取环境的“骨架”。

构建方法

构建几何地图通常分两步:

  1. 特征提取:从激光点云或图像中提取直线、角点、圆弧。比如用 RANSAC 算法拟合墙面直线。
  2. 特征关联:把不同时刻提取的特征匹配起来,构建全局的几何模型。

我个人习惯用线段特征。为什么?因为室内环境大部分是直线墙。你想想看,一个走廊就是两条平行线,一个房间就是四条线围成的矩形。用线段表示,比用几千个栅格点高效得多。

一个小技巧:提取直线时,别用最小二乘法直接拟合。我踩过坑——最小二乘法对离群点太敏感。用 RANSAC 或者 Split-and-Merge 算法,鲁棒性好很多。

适用场景

  • 结构化环境:工厂车间、办公楼、医院。这些地方几何特征明显。
  • 需要轻量级地图:比如无人机,内存和算力都有限,几何地图比栅格地图省资源。
  • 定位与建图(SLAM):很多 SLAM 算法(如 Cartographer)底层其实也在用几何特征做回环检测。

代码示例:用线段拟合墙面

# 伪代码:Split-and-Merge 算法
def split_and_merge(points, threshold):
    if len(points) < 2: return []
    # 找距离两端连线最远的点
    d_max, idx = find_farthest_point(points)
    if d_max > threshold:
        # 分裂
        left = split_and_merge(points[:idx+1], threshold)
        right = split_and_merge(points[idx:], threshold)
        return left + right
    else:
        # 合并为一条直线
        return [Line(points[0], points[-1])]

三、拓扑地图(Topological Map)

拓扑地图最抽象。它不关心具体尺寸,只关心“哪里能到哪”。说白了,就是一张节点-边图。节点代表关键位置(比如房间、路口),边代表连通关系(比如走廊、门)。

构建方法

构建拓扑地图有两种思路:

  • 手动定义:人工标出关键节点和连接。适合固定场景,比如酒店送餐机器人,节点就是各个房间门口。
  • 自动生成:从栅格地图或几何地图中提取。比如用 Voronoi 图提取道路骨架,或者用图像细化算法(Thinning)提取中轴线。

我记得有个项目是做园区巡检机器人。园区很大,用栅格地图的话,路径规划要算好几秒。后来我改成拓扑地图,节点就是每个路口和关键设备点,边就是道路。路径规划从几秒降到了几十毫秒。

注意:拓扑地图不擅长处理细节避障。你想想看,它只知道“从A到B有一条路”,但不知道这条路中间有没有临时放了个箱子。所以拓扑地图通常要配合局部规划器(比如 DWA)一起用。

适用场景

  • 大规模环境:比如整个园区、商场、博物馆。栅格地图太大,拓扑地图轻量。
  • 任务级规划:比如“从1号门到3号仓库”,拓扑地图天然适合做这种高层规划。
  • 人机交互:给用户看拓扑地图,比看密密麻麻的栅格地图直观得多。

四、三种地图的对比总结

特性 栅格地图 几何地图 拓扑地图
精度 高(取决于分辨率) 中(取决于特征提取) 低(只关心连通性)
内存占用 高(O(n²)) 中(O(n)) 低(O(n))
构建难度 低(直接传感器映射) 中(需要特征提取) 高(需要抽象和提取)
路径规划速度 慢(A* 在栅格上搜索) 中(在几何空间搜索) 快(图搜索)
典型应用 扫地机器人、AGV SLAM、结构化环境 园区巡检、任务规划

我的建议:实际项目中,很少只用一种地图。我习惯的做法是:底层用栅格地图做精确避障,中层用几何地图做特征匹配和定位,顶层用拓扑地图做全局路径规划。三层配合,既保证了精度,又兼顾了效率。

好了,环境建模这块就聊到这儿。下一章咱们会深入讲路径规划算法,到时候你会看到,地图选对了,算法跑起来才顺手。有什么问题,欢迎在课程群里交流。