4. 点云生成与滤波

各位同学,今天我们来聊聊毫米波雷达点云处理中最基础、也最考验功夫的一环——点云生成与滤波。说实话,我在刚入行那会儿,总觉得点云数据拿到手就能直接用,结果被现实狠狠教育了一顿。你想想看,雷达回波里混杂着地面反射、雨雪噪声、甚至旁边卡车的二次反射,如果不做滤波,定位系统分分钟给你跑偏。

4.1 点云数据结构

先说说点云长什么样。毫米波雷达输出的点云,本质上是一组离散的检测点。每个点通常包含以下信息:

字段 含义 典型范围
x, y, z 三维空间坐标(米) [-100, 100]
range 径向距离 [0.5, 250]
doppler 多普勒速度(米/秒) [-40, 40]
azimuth 水平方位角(度) [-60, 60]
elevation 俯仰角(度) [-15, 15]
snr 信噪比(dB) [0, 40]

我个人习惯用结构体来组织这些数据。在嵌入式C代码里,我会这样定义:

typedef struct {
    float x;           // 米
    float y;           
    float z;           
    float range;       // 径向距离
    float doppler;     // 多普勒速度
    float azimuth;     // 弧度
    float elevation;   // 弧度
    float snr;         // 信噪比
    uint32_t timestamp; // 时间戳,微秒
} RadarPoint_t;

这里有个细节——时间戳。我在项目中遇到过,如果不同传感器的时间基准没对齐,融合出来的位置能差出半米。所以每个点云帧必须带上精确的时间戳,最好是雷达硬件直接打上的。

4.2 噪声滤除

噪声滤除,说白了就是把那些明显不靠谱的点扔掉。常见的噪声来源有:

  • 热噪声:接收机自身产生的随机波动
  • 多径反射:信号打在地面或建筑物上反弹回来
  • 雨雪杂波:水滴或雪花产生的散射
  • 闪烁噪声:目标快速移动导致的相位抖动

我常用的滤波策略是三步走:

  1. 信噪比门限:SNR低于8dB的点直接丢弃。这个阈值我调过很多次,太低会引入噪声,太高又会丢掉弱目标。
  2. 距离一致性检查:如果一个点的距离和它相邻帧的距离跳变超过3米,大概率是野点。
  3. 多普勒一致性:静止目标的doppler应该接近0,如果出现明显非零值,可能是多径干扰。

核心原则:宁可漏检,不要误检。在定位场景中,一个错误点比十个缺失点更致命。

4.3 静态杂波抑制

静态杂波抑制,这是高精地图融合里最关键的预处理步骤。为什么?因为地图里已经包含了静态环境信息,雷达再检测到静止点,那就是冗余甚至干扰。

我曾经在一个隧道场景里吃过亏。隧道墙壁的反射非常强,雷达每帧能生成上百个静态点。如果不做抑制,这些点会严重干扰定位匹配。我的做法是这样的:

// 静态杂波抑制伪代码
void suppress_static_clutter(RadarPoint_t *points, int num_points) {
    for (int i = 0; i < num_points; i++) {
        // 多普勒速度接近0,且连续3帧位置变化小于0.2米
        if (fabs(points[i].doppler) < 0.5f) {
            // 检查历史帧
            if (is_position_stable(points[i], history_buffer)) {
                points[i].valid = false;  // 标记为静态杂波
            }
        }
    }
}

嗯,这里要注意:不能一刀切地把所有低速点都干掉。比如行人走路的速度也就1-2米/秒,如果门限设得太宽,会把行人当成杂波滤掉。我一般保留0.5米/秒以下的点,但会额外检查它们的空间分布是否与地图中的静态物体匹配。

实战技巧:结合高精地图做静态杂波抑制效果最好。把雷达点投影到地图坐标系,如果落在已知的建筑物、护栏、路沿上,直接标记为静态杂波。这样既干净又不会误伤动态目标。

4.4 聚类算法

聚类,就是把属于同一个物理目标的点归到一起。毫米波雷达的点云稀疏且不规则,常用的聚类方法有:

算法 优点 缺点 适用场景
DBSCAN 不需要预设类别数,能处理任意形状 参数敏感,计算量大 稀疏点云,目标数量未知
欧式聚类 实现简单,速度快 对点云密度敏感 近距离,点云较密
基于网格的聚类 计算效率高 边界处理粗糙 实时性要求高的场景

我个人最常用的是DBSCAN。为什么?因为毫米波雷达的点云密度不均匀——近处点很密,远处点很稀疏。DBSCAN的密度连通性正好能处理这种情况。

不过DBSCAN有两个参数需要调:eps(邻域半径)和minPts(最小点数)。我一般这样设初始值:

  • eps:根据雷达角分辨率来定。比如角分辨率是1°,100米处的点间距大约是1.7米,那eps设2米比较合理。
  • minPts:对于汽车目标,至少需要3-5个点才能构成一个可信的聚类。

避坑指南:我曾经在高速场景中把两个并排行驶的车辆聚成了一个类。原因是它们距离太近,且相对速度一致。后来我加了一个多普勒速度的约束——同一个聚类内的点,多普勒速度差异不能超过2米/秒。这样就把相邻但速度不同的目标分开了。

4.5 知识体系总览

下面这张图概括了本章的核心逻辑。从原始回波到可用的目标点云,每一步都在做减法——去掉噪声、去掉静态杂波、把散点聚成有意义的目标。

点云生成与滤波流程 原始回波数据 点云生成 CFAR检测+角度估计 噪声滤除 SNR门限+一致性检查 静态杂波抑制 多普勒+地图匹配 聚类算法 DBSCAN / 欧式聚类 目标级点云输出 每个步骤都在减少数据量,提升信噪比,为后续定位融合做准备

你看,整个流程就像筛沙子——先把大石头(噪声)扔掉,再把小石子(静态杂波)过滤掉,最后把沙子聚成一堆一堆(聚类)。每一步都有它的道理,也都有它的坑。

好了,关于点云生成与滤波,我就讲这么多。记住一点:在嵌入式平台上跑这些算法,一定要考虑计算资源和实时性。我见过有人把DBSCAN的复杂度优化到O(n log n),但代价是聚类精度下降。怎么平衡?嗯,这就是工程的艺术了。

可可精品资料库