3、环境地图构建:栅格地图、拓扑地图、几何地图的对比与选择

做AGV路径规划,第一步就是选地图。

这话听起来简单,但我见过太多项目栽在地图选型上。有人一上来就搞栅格地图,结果车间太大,内存爆了。也有人迷信拓扑地图,结果在复杂仓库里绕来绕去找不到路。

今天我就把三种主流地图——栅格地图、拓扑地图、几何地图——掰开揉碎了讲清楚。你听完就知道,什么场景该用什么地图。

3.1 栅格地图:最直观,也最吃内存

栅格地图,说白了就是把环境切成一个个小格子。每个格子要么是障碍物(黑色),要么是自由空间(白色)。

我最早做AGV时,用的就是栅格地图。为什么?因为简单。你想想看,一个二维数组就能搞定的事,谁不爱?

核心特点:

  • 分辨率决定精度:格子越小,地图越精细,但内存占用也越大
  • 适合静态环境:一旦环境变了,整张地图得重新建
  • 路径规划算法成熟:A*、Dijkstra、RRT都能直接跑

举个例子。一个100m×100m的车间,如果你用10cm分辨率,那就是1000×1000=100万个格子。每个格子存一个字节,就是1MB。听起来不大?但你要是做三维栅格地图,或者多楼层,那内存就蹭蹭往上涨。

我的经验:

我在一个汽车零部件仓库里用过栅格地图。仓库里全是货架,AGV要走窄通道。当时我选了5cm分辨率,地图建出来效果很好。但后来发现,AGV每走一步都要查地图,CPU占用率直接飙到80%。后来我改成10cm分辨率,精度损失不大,但CPU占用降到了30%。

所以我的建议是:先粗后细。调试阶段用粗分辨率,跑通了再调细。

3.2 拓扑地图:轻量级,但信息有限

拓扑地图,说白了就是一张「节点-边」图。节点代表关键位置(比如路口、工位),边代表路径(比如走廊、通道)。

你想想看,这像不像地铁线路图?它不关心具体的地理位置,只关心「怎么走」。所以拓扑地图特别适合做全局路径规划。

核心特点:

  • 数据量极小:几百个节点就能覆盖整个工厂
  • 路径规划快:用图搜索算法,秒出结果
  • 不依赖精确坐标:适合环境经常变化的地方

但我得提醒你,拓扑地图有个致命弱点——它不包含障碍物信息。什么意思?就是它只知道「从A到B有条路」,但不知道这条路中间有没有临时堆放的货物。

避坑指南:

我曾经在一个物流分拣中心用过纯拓扑地图。当时觉得环境简单,就几个分拣口,拓扑地图够用了。结果运行了三天,AGV撞了两次。为什么?因为分拣口旁边临时堆了包裹,拓扑地图不知道,直接按原路径走,就撞上了。

从那以后,我再也不敢只用拓扑地图了。要么配合传感器做局部避障,要么和栅格地图混着用。

3.3 几何地图:精度高,但建图难

几何地图,就是用点、线、面来描述环境。比如墙是直线,柱子是圆形,货架是矩形。

这种地图精度最高,但建图也最麻烦。你得把环境里的每个物体都抽象成几何形状。而且一旦环境变了,你得手动更新几何模型。

核心特点:

  • 精度极高:可以精确到毫米级
  • 适合结构化环境:比如工厂、实验室
  • 建图成本高:需要人工标注或高精度传感器

说实话,我在实际项目中很少用纯几何地图。为什么?因为太费劲了。你想想看,一个车间里有多少设备、管道、货架?一个个去量尺寸、建模型,光这个活就能干一个月。

我的建议:

几何地图更适合做局部路径规划。比如AGV到了某个工位,需要精确对接。这时候用几何地图描述工位的形状,AGV就能精准停靠。

我做过一个项目,AGV需要把货物放到一个窄货架上。货架宽度只比AGV宽5cm。用栅格地图根本不够,因为栅格地图的精度有限。后来我用几何地图描述了货架的形状,AGV靠着激光雷达实时匹配,停靠精度达到了±1cm。

3.4 三种地图的对比与选择

好了,三种地图都讲完了。你可能会问:「那我到底该用哪种?」

别急,我整理了一张表,你一看就明白。

对比维度 栅格地图 拓扑地图 几何地图
数据量 大(取决于分辨率) 极小 中等
建图难度 低(自动建图) 中(需要手动标注节点) 高(需要精确建模)
路径规划速度 慢(格子多) 快(节点少) 中(需要几何计算)
环境适应性 差(环境变化需重建) 好(只关心拓扑关系) 差(环境变化需更新模型)
典型应用场景 室内导航、扫地机器人 工厂全局路径规划 高精度对接、机械臂抓取

我个人习惯是:混合使用

什么意思?就是全局路径用拓扑地图,局部路径用栅格地图,高精度对接用几何地图。这样既保证了效率,又兼顾了精度。

我的推荐方案:

  • 工厂车间(静态环境):栅格地图为主,拓扑地图为辅
  • 物流仓库(动态环境):拓扑地图为主,栅格地图做局部避障
  • 高精度工位(对接场景):几何地图做局部定位

3.5 实战:用ROS搭建栅格地图

说了这么多理论,我们来点实际的。下面是一个用ROS的gmapping包搭建栅格地图的示例。

# 1. 启动激光雷达驱动
roslaunch my_robot lidar.launch

# 2. 启动gmapping节点
rosrun gmapping slam_gmapping \
  _delta:=0.05 \          # 地图分辨率(5cm)
  _xmin:=-10 \            # 地图范围
  _xmax:=10 \
  _ymin:=-10 \
  _ymax:=10 \
  _particles:=30 \        # 粒子数(越大越精确,但越慢)
  _linearUpdate:=0.5 \    # 移动0.5米更新一次地图
  _angularUpdate:=0.2     # 转动0.2弧度更新一次地图

# 3. 保存地图
rosrun map_server map_saver -f my_map

这段代码我用了很多年。参数调优是关键。比如粒子数,我一般设30-50。设少了地图不准,设多了CPU扛不住。

调参技巧:

如果你发现地图建出来有重影,说明粒子数不够。如果你发现AGV定位飘移,说明更新频率太低。我一般先设一个保守的参数,跑一圈看看效果,再逐步优化。

3.6 小结

三种地图各有优劣,没有银弹。栅格地图适合新手入门,拓扑地图适合老手做全局规划,几何地图适合高精度场景。

我的建议是:从栅格地图开始。等你跑通了,再慢慢加入拓扑和几何地图。别一上来就想搞个大而全的系统,容易翻车。

嗯,下一章我会讲如何用A*算法做路径规划。到时候我会结合栅格地图,手把手教你写代码。敬请期待。