3. 噪声来源分析:传感器噪声、环境噪声与运动畸变
做点云滤波,第一步不是调参数,而是搞清楚——噪声到底从哪来的。
我刚开始接触点云处理时,也犯过这个错:拿到一帧点云,发现有很多离群点,二话不说就开始调滤波器的阈值。结果折腾半天,效果还是不理想。后来才明白,噪声的源头不同,处理策略完全不同。
这一节,我就带你系统地梳理一下点云噪声的三大来源。你想想看,搞清楚了“敌人”是谁,我们才能对症下药。
3.1 传感器噪声:LiDAR 与 RGB-D 的“先天缺陷”
传感器本身就不是完美的。每种传感器都有自己的“脾气”,了解这些,是选型的第一步。
3.1.1 LiDAR 噪声特点
LiDAR(激光雷达)的噪声,说白了,主要来自两个方面:测距精度和角度分辨率。
- 测距噪声:通常服从高斯分布。比如一个16线机械式LiDAR,在100米处测距误差可能在±2cm左右。但要注意,这个误差会随着距离增加而变大。我在项目中遇到过,用某款32线雷达扫描远处墙面,点云厚度明显增加,这就是测距噪声在作祟。
- 角度噪声:激光发射器的角度抖动,会导致点云在空间中出现“抖动”。这种噪声在远距离会被放大,形成“拖尾”现象。
- 多路径效应:激光打到玻璃或镜面时,会发生多次反射,导致测距值偏大。嗯,这里要注意,这种噪声不是随机的,而是有偏的,常规的统计滤波很难去除。
核心观点:LiDAR 噪声以高斯噪声为主,但多路径效应和边缘效应(激光打在物体边缘时,部分光束打到背景)是典型的非高斯噪声,需要特殊处理。
3.1.2 RGB-D 相机噪声特点
RGB-D 相机(如 Kinect、RealSense)的噪声,比 LiDAR 要复杂得多。我个人习惯把它的噪声分为三类:
| 噪声类型 | 来源 | 特点 |
|---|---|---|
| 深度量化噪声 | 深度值离散化 | 距离越远,量化步长越大,噪声越明显 |
| 结构光/ToF 噪声 | 投射图案或飞行时间测量误差 | 在物体边缘和深色表面尤为严重 |
| 温度漂移噪声 | 传感器发热 | 开机后前几分钟,深度值会缓慢漂移 |
我记得有一次用 RealSense D435 扫描一个黑色哑光物体,结果深度图上一片空洞。这就是典型的“深色表面吸收红外光”导致的信噪比下降。说白了,RGB-D 相机对材质和颜色非常敏感。
避坑指南:我曾经在室内用 RGB-D 相机做 SLAM,发现下午3点阳光斜射进来时,深度图质量急剧下降。后来才意识到,强红外光(阳光)会严重干扰 ToF 传感器。所以,室外场景慎用消费级 RGB-D 相机。
3.2 环境噪声:光照、反射与遮挡
环境噪声,就是传感器“看”到的世界本身带来的干扰。这部分噪声,很多时候比传感器自身的噪声更难处理。
3.2.1 光照影响
对于 LiDAR 来说,光照影响不大,因为它主动发光。但对于 RGB-D 相机,尤其是结构光方案,光照是“天敌”。
- 强光直射:红外光被淹没,深度信息丢失。
- 光照不均:导致局部过曝或欠曝,影响深度计算。
- 动态阴影:移动的物体投下阴影,会造成深度图中的“鬼影”。
3.2.2 反射与透射
这个我深有体会。有一次扫描一个玻璃幕墙的建筑物,LiDAR 点云中出现了大量“飞点”——激光穿透了玻璃,打到了后面的物体上。
- 镜面反射:激光被反射到其他方向,导致该点无回波。
- 透射:激光穿透透明物体(玻璃、水),产生错误测距。
- 漫反射不足:对于高吸光材料(如黑色橡胶),回波信号太弱,信噪比低。
警告:处理包含玻璃、水面、镜面的点云时,不要直接使用全局滤波。我建议先通过反射率或强度信息,将这些区域分割出来,单独处理。
3.2.3 遮挡与边缘效应
遮挡是点云中很常见的现象。一个物体挡住了另一个物体,在点云中就会形成“断层”。
边缘效应则更微妙:当激光束打在物体边缘时,一部分光束打到了物体上,另一部分打到了背景上。传感器会取一个“平均”值,导致边缘点云出现“拖尾”或“膨胀”。
3.3 运动畸变:动态世界的“时空错位”
运动畸变,是 SLAM 中绕不开的话题。说白了,就是传感器在运动过程中采集点云,导致点云发生形变。
3.3.1 为什么会发生运动畸变?
你想想看,一个 16 线 LiDAR 旋转一圈,需要 0.1 秒(10Hz)。在这 0.1 秒内,如果机器人正在运动,那么每一束激光发射时,传感器的位姿都不一样。
结果就是:一个原本是“平面”的墙面,在点云中变成了“曲面”。一个静止的柱子,变成了“倾斜”的。
3.3.2 运动畸变的典型表现
- 旋转畸变:机器人快速转弯时,点云出现“扭曲”。
- 平移畸变:机器人直线加速时,点云被“拉伸”或“压缩”。
- 混合畸变:最常见的情况,旋转和平移同时存在。
我在做 AGV 导航时,遇到过一个问题:小车以 1m/s 的速度行驶,扫描一个 1 米宽的柱子。结果点云中的柱子宽度变成了 1.1 米。这就是运动畸变导致的“拉伸”效应。
3.3.3 运动畸变的消除思路
消除运动畸变,核心思路就是“去畸变”——把每个点都“矫正”到同一个坐标系下。
// 伪代码:运动畸变矫正
for each point in scan:
// 1. 获取该点的时间戳
t = point.timestamp
// 2. 根据时间戳,插值得到该时刻的位姿
pose = interpolate_pose(t, start_pose, end_pose)
// 3. 将点从当前时刻的坐标系,变换到起始时刻的坐标系
point_corrected = pose.inverse() * point
当然,这需要知道传感器的运动轨迹。在 SLAM 中,我们通常用 IMU 或轮式里程计来提供高频位姿估计,然后对每一帧点云进行去畸变。
个人经验:如果 IMU 数据质量不好,或者没有 IMU,可以假设运动是匀速的。虽然精度不如 IMU 辅助,但在低速场景下(< 0.5m/s),效果也还行。我曾经在室内机器人上用过这个“土办法”,跑起来没问题。
3.4 本章知识体系总览
为了让你更直观地理解这三种噪声的关系,我画了一张图:
从这张图你可以看到,三种噪声的根源不同,表现也不同。传感器噪声是“硬件局限”,环境噪声是“外部干扰”,运动畸变是“时空错位”。
在实际项目中,这三种噪声往往是叠加在一起的。比如,一个移动的机器人用 LiDAR 扫描一个玻璃幕墙的建筑——既有传感器噪声,又有环境噪声(反射),还有运动畸变。
所以,没有一种滤波器能解决所有问题。你需要根据噪声的来源,组合使用不同的滤波策略。这也是我们后续课程要深入探讨的内容。
总结一下:
- LiDAR 噪声:以高斯噪声为主,注意多路径和边缘效应
- RGB-D 噪声:对材质、光照、温度敏感,量化噪声随距离增大
- 环境噪声:反射、透射、遮挡是主要挑战
- 运动畸变:必须用 IMU 或里程计辅助去畸变
搞清楚了这些,你再去选滤波器,心里就有底了。下一节,我们会深入讨论具体的滤波算法,看看它们各自擅长处理哪种噪声。