点云滤波概述:为什么建图前必须做滤波?

说实话,我刚入行那会儿,也犯过“拿到点云就直接建图”的毛病。结果呢?地图里全是飞点、拖影,连走廊都歪歪扭扭的。后来带我的老工程师只说了一句话:“你连垃圾都没倒干净,就想做饭?”

嗯,点云滤波,就是那个“倒垃圾”的过程。

今天咱们就聊聊,为什么建图前必须做滤波。说白了,就是要把传感器拿到的原始数据,变成真正能用的干净数据。

点云噪声来源分析

我习惯把噪声分成三类:传感器自己的毛病、运动带来的畸变、还有那些不该出现的动态物体。咱们一个一个说。

1. 传感器噪声

这个最基础。激光雷达也好,深度相机也罢,物理器件总有误差。

  • 测量误差:激光束打到物体边缘,可能反射回来一半,测距就不准了。我在项目中遇到过,一个平整的墙面,打出来的点云居然有2cm的波动。
  • 多路径效应:激光在玻璃、镜面之间来回弹,最后测出来的距离比实际远很多。你想想看,明明前面是空的,结果点云里多了一堵墙。
  • 环境光干扰:室外强光下,TOF相机的信噪比会下降,出现大量随机噪点。

避坑指南:我曾经在室外强光下用某款深度相机建图,结果地图上全是“雪花点”。后来加了物理遮光罩,噪声直接降了60%。

2. 运动畸变

这个坑,新手最容易忽略。

激光雷达是一圈一圈扫描的。如果雷达在运动,那这一圈里,前面的点和后面的点,对应的雷达位置其实不一样。结果就是——静止的墙,在点云里变成了扭曲的弧线。

为什么会这样?

因为雷达假设自己在扫描期间没动。但实际它动了。这个偏差,就叫运动畸变。

我的经验:我习惯在滤波之前,先用IMU数据做一次运动补偿。说白了,就是把每个点的坐标,都修正到同一个时间戳下。这样畸变就基本消除了。

3. 动态物体

这个最好理解。你建图的时候,前面走过一个人,旁边开过一辆车。这些物体在点云里出现了,但下一秒就消失了。

如果你不把它们滤掉,地图里就会留下“鬼影”。

  • 行人:走路速度慢,但会留下连续的拖影。
  • 车辆:速度快,可能只出现一两帧,但位置变化大。
  • 飘动的树叶、旗帜:这些属于半动态,时有时无。

注意:动态物体滤波不能一刀切。我见过有人直接把所有移动的点都删了,结果把机器人自身的运动也滤掉了,地图直接崩了。

知识体系框架

下面这张图,是我自己总结的点云滤波知识结构。你可以把它当作一张地图,后面每节课都会对应到其中的一个节点。

点云滤波知识体系 点云滤波 噪声来源分析 常用滤波方法 对建图质量的影响 传感器噪声 运动畸变 动态物体 体素滤波 统计滤波 半径滤波 地图精度 地图一致性 计算效率 核心目标:去除噪声 → 保留结构 → 提升建图质量

滤波到底解决了什么问题?

我直接给你看一组数据。这是我之前做的一个对比实验,同一组数据,滤波前后建图的效果差异。

指标 未滤波 滤波后 提升幅度
点云数量 1,200,000 480,000 减少60%
地图重投影误差 8.5 cm 2.1 cm 降低75%
建图耗时 45 秒 18 秒 减少60%
闭环检测成功率 62% 91% 提升29%

你看,滤波不只是“去掉噪声”那么简单。它直接影响了建图的精度、速度和稳定性。

核心观点:滤波不是可选项,是必选项。不滤波就建图,等于闭着眼睛开车。

一个简单的滤波示例

最后,给你看一段代码。这是PCL里最基础的体素滤波,我习惯用它来做第一步降采样。

#include <pcl/filters/voxel_grid.h>

// 输入点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 输出点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);

// 创建滤波器对象
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
// 设置体素大小:0.05m
sor.setLeafSize(0.05f, 0.05f, 0.05f);
// 执行滤波
sor.filter(*cloud_filtered);

std::cout << "滤波前点数: " << cloud->size() << std::endl;
std::cout << "滤波后点数: " << cloud_filtered->size() << std::endl;

我的习惯:体素大小我一般从0.05m开始试。室内场景0.05m够用,室外大场景可以放到0.1m。太小了降采样效果不明显,太大了会丢失细节。

好了,这一章咱们把滤波的必要性和噪声来源理清楚了。下一章开始,我会带你逐个击破每一种滤波方法。记住,建图前先滤波,这是老司机的共识。

可可精品资料库