2. Occupancy基础
在自动驾驶与机器人感知中,Occupancy(占据)描述的是三维空间里“哪里有东西、哪里是空的”。它不依赖具体物体类别,而是把环境离散化为可查询的空间单元,回答“该位置是否被占据”。理解占据栅格、体素、点云、深度图和语义占据这几个基础概念,是后续时序融合与场景补全的前提。
一、核心原理:从连续世界到离散占据
真实世界是连续的,传感器输出也是离散采样。占据表达的核心是把空间划分为规则或不规则的单元,再为每个单元赋予占据状态或概率。常见形式包括:
- 占据栅格(Occupancy Grid):通常指二维栅格,每个格子记录被占据概率,常用于地面平面导航与避障。
- 体素(Voxel):三维空间中的立方体单元,是三维占据栅格的基本单位。体素分辨率决定空间精度与计算量。
- 点云(Point Cloud):由激光雷达或深度相机得到的离散三维点集合,是原始观测,不是占据表示本身。
- 深度图(Depth Map):图像像素到相机的距离,可反投影为点云,再体素化得到占据。
- 语义占据(Semantic Occupancy):在占据基础上为每个体素附加类别标签,如车辆、行人、道路、建筑等。
关键区别:点云和深度图是“观测”,占据栅格和体素是“空间表示”,语义占据是“带类别的空间表示”。时序融合通常发生在体素或语义体素层面。
二、方法流程:从传感器到语义占据
典型处理链路可以概括为:传感器采集 → 深度/点云 → 坐标统一 → 体素化 → 占据概率估计 → 语义标注 → 时序融合。下面给出一个简化的体素化与占据统计示例:
输入: 点云 P = {p_i | p_i = (x_i, y_i, z_i)}
参数: 体素边长 v = 0.2 m, 范围 X[-40,40], Y[-40,40], Z[-3,5]
步骤:
1. 对每个点 p_i 计算体素索引:
ix = floor((x_i - X_min) / v)
iy = floor((y_i - Y_min) / v)
iz = floor((z_i - Z_min) / v)
2. 统计每个体素内点数 n(ix,iy,iz)
3. 若 n > 0 则标记为占据, 否则为空闲或未知
4. 可选: 用射线投射区分“被遮挡的未知”与“真正空闲”
输出: 占据体素集合 O = {(ix,iy,iz) | n > 0}
深度图转点云时,常用针孔模型:给定像素 (u,v) 和深度 d,可计算相机坐标系下的三维点。多传感器融合时,还需通过外参把点云统一到自车坐标系或世界坐标系。
三、案例/场景:城市路口中的语义占据
假设自车经过一个城市路口,激光雷达和环视相机同时工作。激光点云给出精确几何,但远处稀疏;相机深度图稠密,但深度噪声较大。将两者体素化后,可以得到一个局部三维占据场:
- 地面附近体素被标记为“道路”或“可行驶区域”。
- 车辆轮廓体素被标记为“车辆”,行人区域标记为“行人”。
- 建筑物和树木标记为“静态障碍物”。
- 被遮挡区域保持“未知”,不强行填充,避免误判。
此时语义占据不仅告诉规划模块“前方有障碍”,还告诉它“障碍是车还是人”,对行为预测和决策更有价值。
四、常见术语与对比清单
| 术语 | 空间维度 | 数据形式 | 典型用途 |
|---|---|---|---|
| 占据栅格 | 2D | 概率栅格 | 地面导航、避障 |
| 体素 | 3D | 立方体单元 | 三维占据、时序融合 |
| 点云 | 3D | 离散点集 | 几何测量、配准 |
| 深度图 | 2.5D | 像素深度 | 稠密深度、反投影 |
| 语义占据 | 3D | 体素+类别 | 场景理解、预测规划 |
五、误区与复盘
常见误区一:把点云直接当作占据。点云是稀疏观测,体素占据才是空间状态。误区二:认为体素越小越好。分辨率过细会导致内存和计算爆炸,且远距离点云稀疏,细体素反而大量为空。误区三:忽略“未知”状态。把未观测区域当作空闲,会导致规划器误入遮挡区。
复盘时建议检查三点:体素分辨率是否与传感器有效距离匹配;是否区分了占据、空闲和未知;语义标签是否与几何占据一致。只有这些基础概念清晰,后续的时序融合与场景补全才有稳定的输入表示。