1. Occupancy Grid 概述:什么是占用网格、应用场景(扫地机器人、自动驾驶)、课程整体架构介绍

大家好,欢迎来到《Occupancy占用网格全栈开发实战》的第一课。

我是这门课的主讲。做了这么多年机器人感知,我越来越觉得——占用网格这东西,是机器人理解世界的「地基」。你想想看,不管是扫地机还是自动驾驶车,它们首先要回答一个问题:我周围有没有东西? 占用网格就是用来回答这个问题的。

1.1 什么是占用网格?

占用网格,英文叫 Occupancy Grid。说白了,就是把环境切分成一个个小格子,每个格子记录一个概率值——这个格子被占用的概率有多大。

举个例子。你面前有一面墙。在占用网格里,墙所在的格子概率接近 1.0,空地格子概率接近 0.0,没探测到的地方概率就是 0.5(完全未知)。

我个人习惯把占用网格想象成一张「灰度图」。黑色代表被占满,白色代表完全空,灰色代表不确定。嗯,这样理解起来特别直观。

核心公式(简化版)

每个格子存储一个值:P(occupied) ∈ [0, 1]

  • P = 0.0 → 绝对空闲
  • P = 1.0 → 绝对占用
  • P = 0.5 → 完全未知

我在项目中遇到过不少新手,一上来就纠结「格子到底该设多大」。其实没有标准答案。室内扫地机用 5cm 格子就够,自动驾驶可能要 10-20cm。后面我们会专门讲分辨率怎么选。

1.2 应用场景:扫地机器人

扫地机器人是占用网格最经典的应用。你想想看,它要在一片完全陌生的房间里跑来跑去,还得记住哪里扫过、哪里没扫、哪里有障碍物。

占用网格在这里扮演两个角色:

  • 建图:一边走一边更新格子概率,最终拼出一张完整地图
  • 定位:实时对比当前传感器数据和已有网格,判断自己在哪里

我记得有一次调试扫地机,它老是在沙发腿旁边撞来撞去。后来发现是占用网格更新时,把沙发腿的激光点云当成了噪声滤掉了。嗯,这里要注意——小障碍物很容易被误判为空,这是新手常踩的坑。

避坑指南

我曾经在扫地机项目里,把激光雷达的远距离点直接丢弃,结果导致远处墙壁一直没建出来。后来我改成「远距离点只降低空闲概率,不增加占用概率」,问题就解决了。

1.3 应用场景:自动驾驶

自动驾驶里的占用网格,比扫地机复杂得多。为什么?因为环境是动态的——有车、有人、有自行车,它们都在动。

自动驾驶的占用网格通常分两层:

层级 作用 更新频率
静态占用网格 记录道路、护栏、建筑物等固定障碍物 低频(秒级)
动态占用网格 跟踪行人、车辆等移动物体 高频(毫秒级)

我个人习惯把动态占用网格叫做「热力图」。你看自动驾驶的感知可视化,那些红色方块就是动态占用网格在实时更新。说白了,它告诉规划模块:前方 3 秒内可能有障碍物,请减速

这里有个关键点——自动驾驶的占用网格必须考虑自车运动。你想想看,车在动,传感器也在动,如果不做运动补偿,建出来的网格全是拖影。后面我们会专门讲「坐标变换与网格对齐」。

1.4 课程整体架构介绍

好,聊完了概念和应用,我们来看看这门课到底要讲什么。

我把课程分成四个模块,每个模块解决一个核心问题:

  1. 基础篇:占用网格的数学原理、贝叶斯更新、传感器模型。这部分是地基,必须打牢。
  2. 实战篇:从零手写一个占用网格建图系统。用 C++ 实现,跑真实数据。
  3. 进阶篇:动态占用网格、多传感器融合、GPU 加速。这部分是工业级方案。
  4. 应用篇:在扫地机和自动驾驶场景中部署、调优、避坑。

课程亮点

  • 每一章都有可运行的代码示例
  • 提供真实传感器数据(激光雷达 + 里程计)
  • 覆盖从算法到工程落地的全流程

我建议你按顺序学,尤其是基础篇。为什么?因为占用网格的坑都在细节里。比如「为什么我的网格更新越来越慢?」——答案往往在贝叶斯更新的对数概率实现里。这些我们都会讲到。

1.5 本章小结

这一章我们聊了:

  • 占用网格是什么——把环境切成格子,每个格子存一个概率
  • 扫地机器人怎么用——建图 + 定位,注意小障碍物别被滤掉
  • 自动驾驶怎么用——静态 + 动态两层网格,注意运动补偿
  • 课程怎么安排——基础 → 实战 → 进阶 → 应用

下一章,我们会深入占用网格的数学核心——贝叶斯更新。说实话,这部分我第一次学的时候也觉得有点绕,但一旦理解了,后面所有代码都顺了。我们下章见。

重要提醒

本章所有代码示例和数据集,请在课程配套的 GitHub 仓库中获取。不要自己随便找数据测试,不同传感器的噪声模型差异很大,容易得出错误结论。