环境建模基础:栅格地图、几何地图、拓扑地图的构建方法与适用场景对比
做路径规划这么多年,我越来越觉得一个道理:地图选不对,后面全白费。你想想看,就像出门导航,你拿着一张手绘的涂鸦地图和拿着高德地图,走路的策略能一样吗?
环境建模,说白了就是把机器人看到的物理世界,翻译成它能理解的数学语言。今天咱们就聊聊三种最经典的地图模型:栅格地图、几何地图、拓扑地图。我会结合我踩过的坑,把它们的构建方法和适用场景掰开揉碎了讲清楚。
一、栅格地图(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)
几何地图不画格子,它用点、线、面来描述环境。说白了,就是提取环境的“骨架”。
构建方法
构建几何地图通常分两步:
- 特征提取:从激光点云或图像中提取直线、角点、圆弧。比如用 RANSAC 算法拟合墙面直线。
- 特征关联:把不同时刻提取的特征匹配起来,构建全局的几何模型。
我个人习惯用线段特征。为什么?因为室内环境大部分是直线墙。你想想看,一个走廊就是两条平行线,一个房间就是四条线围成的矩形。用线段表示,比用几千个栅格点高效得多。
一个小技巧:提取直线时,别用最小二乘法直接拟合。我踩过坑——最小二乘法对离群点太敏感。用 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、结构化环境 | 园区巡检、任务规划 |
我的建议:实际项目中,很少只用一种地图。我习惯的做法是:底层用栅格地图做精确避障,中层用几何地图做特征匹配和定位,顶层用拓扑地图做全局路径规划。三层配合,既保证了精度,又兼顾了效率。
好了,环境建模这块就聊到这儿。下一章咱们会深入讲路径规划算法,到时候你会看到,地图选对了,算法跑起来才顺手。有什么问题,欢迎在课程群里交流。