第2章:环境建模基础:栅格地图、拓扑地图、几何地图的构建与表示方法

各位同学,咱们今天聊聊环境建模。说白了,就是怎么让机器人「看懂」周围的世界。

我记得刚入行那会儿,带我的老工程师跟我说过一句话:「路径规划好不好,一半看地图建得怎么样。」当时我不太信,后来自己踩了坑才明白——地图是机器人的眼睛,眼睛不好使,腿脚再利索也白搭。

环境建模,就是把真实世界的几何信息、拓扑关系、障碍物分布,用一种机器人能理解的方式存下来。目前主流的三种地图:栅格地图、拓扑地图、几何地图。咱们一个一个说。

2.1 栅格地图(Grid Map)

栅格地图,我习惯叫它「像素地图」。把环境切成一个个小格子,每个格子要么是障碍物,要么是自由空间。简单粗暴,但特别好用。

核心思想:将连续空间离散化为等尺寸的栅格单元,每个栅格赋予一个占用概率值。

我在做AGV(自动导引车)项目时,用的就是栅格地图。仓库地面铺了反光条,激光雷达扫出来的数据噪点特别多。怎么办?我用了概率栅格——每个格子不是简单的0或1,而是0到1之间的概率值。多次扫描后,概率收敛,噪声自然被滤掉了。

栅格地图的构建步骤,我总结为三步:

  1. 传感器数据采集——激光雷达、声纳、深度相机都行
  2. 逆传感器模型——把测量值转换成栅格占用概率
  3. 贝叶斯更新——融合多次观测,更新每个栅格的概率

代码实现其实不复杂。我给你们看一个简化的栅格更新逻辑:

// 伪代码:栅格地图更新
for each laser_scan:
    for each beam in laser_scan:
        // 计算光束穿过的栅格
        cells = bresenham(robot_pose, beam_endpoint)
        for cell in cells:
            if cell == beam_endpoint:
                // 终点:障碍物概率增加
                grid[cell].occupied += 0.6
            else:
                // 路径上:空闲概率增加
                grid[cell].free += 0.4
        // 归一化概率
        grid[cell].probability = grid[cell].occupied / 
                                 (grid[cell].occupied + grid[cell].free)

嗯,这里要注意:栅格尺寸的选择很关键。我见过有人把栅格设成1cm,结果地图大得离谱,路径规划慢得像蜗牛。我个人建议,室内场景用5cm-10cm,室外场景用20cm-50cm。你想想看,精度够用就行,别追求极致。

避坑指南:我曾经在一个项目里把栅格设得太小,导致内存爆了。后来改用八叉树地图(OctoMap),动态调整分辨率——远处用粗栅格,近处用细栅格。效果立竿见影。

2.2 拓扑地图(Topological Map)

拓扑地图,说白了就是「地铁线路图」。它不关心精确的几何位置,只关心节点之间的连通关系。

为什么需要拓扑地图?我举个例子。你让机器人从A点去B点,如果用栅格地图,它得算几千个格子的路径。但用拓扑地图,它只需要知道「从节点1到节点2,走走廊,然后右转」——计算量小得多。

拓扑地图的构成要素:

  • 节点(Node)——代表关键位置,比如路口、门、电梯口
  • 边(Edge)——代表节点之间的连通路径,可以附带距离或时间代价
  • 拓扑关系——谁和谁相连,怎么连

我记得做商场导览机器人时,就用了拓扑地图。商场太大了,栅格地图存下来得好几GB。我改成拓扑地图——每个店铺是一个节点,走廊是边。机器人导航时,先走拓扑路径到目标店铺附近,再切换成栅格地图做精细避障。这叫「粗粒度规划+细粒度执行」。

拓扑地图的构建方法,我常用两种:

方法 原理 适用场景
基于Voronoi图 提取环境中的中轴线,交点作为节点 室内结构化环境
基于关键点检测 识别门、拐角等特征点作为节点 动态变化的环境

注意:拓扑地图的缺点也很明显——它不包含精确的几何信息。如果环境发生微小变化(比如临时放了个桌子),拓扑地图可能感知不到。我建议拓扑地图和栅格地图配合使用,别只用一种。

2.3 几何地图(Geometric Map)

几何地图,就是「CAD图纸」。它用点、线、面、多边形来精确描述环境中的物体。

几何地图的表示方式,我归纳为三种:

  1. 特征地图(Feature Map)——提取环境中的直线、圆弧、角点等几何特征
  2. 占据地图(Occupancy Map)——用概率表示空间是否被占据(和栅格地图类似,但更灵活)
  3. 语义地图(Semantic Map)——给每个物体打标签,比如「这是桌子」「那是椅子」

我做自动驾驶项目时,用的就是几何地图。激光雷达扫描一圈,得到几十万个点云。直接处理太慢了,我提取出车道线、路沿、交通标志牌——这些几何特征足够让车辆知道自己该往哪开。

几何地图的构建流程:

  • 传感器数据预处理(去噪、滤波)
  • 特征提取(直线拟合、角点检测)
  • 数据关联(匹配当前帧和地图中的特征)
  • 地图更新(融合新观测到的特征)

这里我分享一个经验:几何地图对传感器精度要求很高。你想想看,如果激光雷达的测量误差是5cm,那你提取出来的直线位置可能偏差很大。我建议用IMU(惯性测量单元)做辅助,或者用多传感器融合来提升精度。

三种地图对比总结:

地图类型 精度 计算量 适用场景
栅格地图 室内导航、避障
拓扑地图 大范围路径规划
几何地图 自动驾驶、精密操作

2.4 实际项目中的选择策略

说了这么多,你可能会问:到底该用哪种地图?

我的建议是:看任务需求

如果做扫地机器人,栅格地图就够了。如果做园区物流车,拓扑地图+栅格地图混合用。如果做手术机器人,那必须上高精度几何地图。

我最近在做一个项目,用的是「分层地图」——顶层是拓扑地图做全局规划,中间层是栅格地图做局部规划,底层是几何地图做精细操作。三层配合,效果出奇的好。

个人经验:别一开始就想着建完美的地图。先跑起来,再迭代优化。我见过太多人花了两周建地图,结果发现传感器参数没调对,全部重来。先建个粗糙的,验证算法没问题,再慢慢精化。

好了,环境建模基础就讲到这里。下一章咱们聊「动态障碍物检测与跟踪」,到时候我会分享一个我在工厂里遇到的「幽灵障碍物」的坑——挺有意思的,到时候细说。