第四章:点云预处理与滤波
各位同学,欢迎来到点云预处理这一章。说实话,很多做雷达的朋友容易忽略这一步,觉得算法才是核心。但我可以负责任地告诉你——预处理做不好,后面再牛的算法也白搭。
我自己踩过这个坑。有一次做行人检测,点云里全是噪点,聚类出来一堆假目标。折腾了两周,最后发现是预处理环节的离群点没滤干净。从那以后,我养成了一个习惯:拿到点云数据,先做预处理,再谈别的。
4.1 点云去噪:离群点移除
毫米波雷达的点云,天生就带噪。为什么?因为多径反射、旁瓣干扰、热噪声……这些都会产生一些孤立的、不真实的点。我们管它们叫离群点。
离群点长什么样?你想想看,一个目标明明在10米外,结果点云里突然冒出一个点在50米处,周围啥也没有。这种点,基本就是噪声。
4.1.1 统计滤波法
最常用的方法是统计滤波。原理很简单:
- 对每个点,计算它到K个最近邻的平均距离
- 如果这个平均距离大于某个阈值,就判定为离群点
- 阈值通常设为:
mean + std_mult × std
我一般把std_mult设在1.5到2.5之间。太大会漏掉噪点,太小会把真实目标边缘的点也干掉。
核心参数:
- K(近邻数):通常取20-50
- std_mult(标准差倍数):1.5-2.5
// 伪代码示例:统计滤波
for each point p in cloud:
distances = compute_knn_distances(p, K)
mean_dist = mean(distances)
if mean_dist > global_mean + std_mult * global_std:
mark_as_outlier(p)
4.1.2 半径滤波法
另一种方法是半径滤波。它更直观:
- 以每个点为中心,画一个半径为R的球
- 如果球内的邻居点数少于N,就干掉这个点
这个方法在稀疏场景下特别好用。我记得有一次做高速公路场景,点云很稀疏,统计滤波效果不好,换成半径滤波后,噪点一下就干净了。
我的经验:如果场景点云密度均匀,用统计滤波;如果密度变化大(比如近处密、远处疏),用半径滤波更靠谱。
4.2 下采样:体素滤波
点云数据量太大怎么办?一帧点云可能几万个点,实时处理根本扛不住。这时候就需要下采样。
体素滤波是最经典的方法。说白了,就是把空间切成一个个小立方体(体素),每个体素里只保留一个点——通常是体素内所有点的重心。
4.2.1 体素滤波流程
- 确定体素大小(比如0.1m × 0.1m × 0.1m)
- 把点云分配到各个体素中
- 对每个体素,计算内部点的重心
- 用重心点代替体素内所有点
// 体素滤波核心逻辑
for each point p in cloud:
voxel_idx = floor(p / voxel_size)
voxel_map[voxel_idx].add(p)
for each voxel in voxel_map:
centroid = mean(voxel.points)
filtered_cloud.add(centroid)
4.2.2 体素大小的选择
| 场景 | 推荐体素大小 | 说明 |
|---|---|---|
| 近距离(<30m) | 0.05 - 0.1m | 保留细节 |
| 中距离(30-80m) | 0.1 - 0.2m | 平衡精度与效率 |
| 远距离(>80m) | 0.2 - 0.5m | 点本来就稀疏 |
注意:体素太大,会丢失小目标(比如行人)。体素太小,降采样效果不明显。我一般从0.1m开始试,根据效果微调。
4.3 坐标变换与坐标系对齐
雷达装车上,车在动,雷达坐标系也在动。但我们的地图、规划模块用的是全局坐标系。这就涉及到坐标变换。
4.3.1 常见的坐标系
- 雷达坐标系:原点在雷达中心,x轴朝前,y轴朝左,z轴朝上
- 车体坐标系:原点在车辆后轴中心,方向与雷达坐标系类似
- 全局坐标系:通常是UTM坐标系或自定义大地坐标系
4.3.2 变换矩阵
坐标变换用4×4齐次变换矩阵搞定。它包含旋转和平移两部分:
// 变换矩阵形式
T = | R t |
| 0 1 |
// 其中R是3×3旋转矩阵,t是3×1平移向量
举个例子,从雷达坐标系到车体坐标系:
// 假设雷达安装在车顶,偏移量为(0, 0, 1.5m)
T_radar_to_vehicle =
| 1 0 0 0 |
| 0 1 0 0 |
| 0 0 1 1.5|
| 0 0 0 1 |
// 变换点云
p_vehicle = T_radar_to_vehicle * p_radar
4.3.3 对齐的坑
我曾经犯过一个低级错误:雷达安装时有个小角度偏转,我没标定。结果所有目标的位置都偏了0.5米。后来花了整整一天排查,才发现是旋转矩阵没校准。
避坑指南:坐标变换前,一定要做外参标定。用标定板或者特征点匹配,把旋转和平移量精确算出来。别信安装图纸上的理论值,实际装出来总有偏差。
4.4 本章知识体系
下面这张图,是我自己总结的点云预处理流程。你照着这个走,基本不会出大问题。
嗯,流程就是这样。先去掉噪点,再降采样减少数据量,最后把坐标统一到同一个参考系下。三步走完,你的点云就可以放心交给后面的聚类和跟踪模块了。
本章要点回顾:
- 离群点移除:统计滤波(均匀场景) vs 半径滤波(稀疏场景)
- 体素滤波:体素大小是关键参数,0.1m是常用起点
- 坐标变换:用4×4齐次矩阵,别忘了外参标定
好了,这一章就到这里。下一章我们会讲点云聚类——怎么把预处理后的点云,变成一个个有意义的障碍物目标。