2、环境建模基础:栅格地图、拓扑地图、点云地图的构建与选择。我如何根据场景选择合适的地图?
做轨迹规划这些年,我踩过最大的坑就是——地图选错了。你想想看,明明算法调得挺好,仿真也跑得飞起,一上真机就撞墙。后来我发现,八成是环境建模这一步没走对。
今天咱们就聊聊三种主流地图:栅格地图、拓扑地图、点云地图。我会结合自己的项目经验,告诉你什么时候该用哪个。
2.1 栅格地图:最直观,但别滥用
栅格地图,说白了就是把环境切成一个个小格子。每个格子要么是障碍物(黑色),要么是自由空间(白色)。
构建方式:
- 激光雷达扫描 + 占据栅格更新算法
- 深度相机投影 + 贝叶斯滤波
- 也可以直接加载已知CAD图纸转成栅格
核心参数:分辨率(格子大小)。我习惯用 0.05m 做室内机器人,0.2m 做室外AGV。太小了计算量爆炸,太大了路径不精确。
优点:
- 实现简单,A*、Dijkstra 直接往上怼
- 容易做膨胀层(安全距离)
- 可视化直观,调试方便
缺点:
- 存储量大——100m×100m 区域,0.05m 分辨率就是 400万个格子
- 动态环境更新慢
- 无法表达语义信息(比如“这是桌子”、“那是门”)
我的经验:在仓储AGV项目中,我一开始用了0.02m高分辨率栅格地图,结果路径规划一帧要算200ms。后来改成0.1m,配合分层规划(先粗后细),速度提升到15ms。嗯,这里要注意:分辨率不是越高越好。
2.2 拓扑地图:轻量级,适合大场景
拓扑地图不关心具体几何形状,只关心“节点”和“边”。节点代表关键位置(比如路口、工位),边代表连通关系。
构建方式:
- 手动标注:适合固定路线场景
- 从栅格地图自动提取:用Voronoi图或Thinning算法
- SLAM过程中增量构建
// 一个简单的拓扑地图结构
struct TopoNode {
int id;
double x, y; // 实际坐标(可选)
vector<int> neighbors; // 邻居节点ID
string label; // "充电站"、"A工位"等语义
};
struct TopoEdge {
int from, to;
double cost; // 距离或时间代价
};
优点:
- 存储极小,1000个节点也就几十KB
- 路径搜索极快(图搜索算法)
- 天然支持语义信息
缺点:
- 丢失细节,无法做精确避障
- 构建过程依赖其他地图
- 动态障碍物处理困难
我曾经在一个商场配送机器人项目里,只用拓扑地图做全局规划。结果机器人走到节点之间的“边”上时,被临时摆放的促销展台挡住了。从那以后,我坚持拓扑地图只做“粗规划”,局部避障必须用栅格或点云。
2.3 点云地图:精度之王,但别轻易用
点云地图就是一堆三维点的集合。每个点有 (x, y, z) 坐标,有时还带颜色或反射强度。
构建方式:
- 激光雷达:Velodyne、Livox 等,直接输出点云
- 深度相机:RGB-D 传感器,每个像素反投影成三维点
- 多帧拼接:用ICP或NDT算法对齐
优点:
- 精度极高,毫米级
- 支持三维空间规划(无人机、机械臂)
- 可以做障碍物识别(聚类、分割)
缺点:
- 数据量巨大——一帧16线激光雷达就有3万个点
- 处理复杂,需要GPU加速
- 噪声敏感,需要滤波
避坑指南:点云地图不是越密越好。我见过有人用128线激光建图,一帧30万个点,结果算法跑不动。实际项目中,16线激光 + 体素滤波下采样到0.1m分辨率,效果已经足够。
2.4 如何选择?一张图说清楚
下面这张图是我自己总结的选型逻辑,你可以直接拿去用:
2.5 实际项目中的混合策略
说实话,现实项目很少只用一种地图。我个人习惯用“三层地图架构”:
| 层级 | 地图类型 | 用途 | 更新频率 |
|---|---|---|---|
| 全局规划 | 拓扑地图 | 从A点到B点的路线规划 | 低频(每次任务前) |
| 局部规划 | 栅格地图 | 实时避障、路径平滑 | 中频(10Hz) |
| 感知层 | 点云地图 | 障碍物检测、定位匹配 | 高频(20-50Hz) |
举个例子:我在做园区无人配送车时,全局用拓扑地图(节点是各栋楼门口),局部用栅格地图(分辨率0.2m,实时更新),感知层用16线激光点云做障碍物检测。三层配合,既保证了效率,又兼顾了安全性。
2.6 总结:记住这三句话
- 要精度、要三维 → 点云地图(但要做好下采样)
- 要效率、要简单 → 栅格地图(注意分辨率取舍)
- 要大场景、要语义 → 拓扑地图(配合局部规划使用)
最后说一句:地图选型没有银弹。我见过用栅格地图做100km矿区规划的,也见过用拓扑地图做室内精细避障的。关键是你得想清楚——你的机器人到底需要什么信息才能安全到达目的地?想明白这个,地图自然就选对了。