2. 点云生成技术

各位同学,欢迎来到第二章。上一章我们聊了雷达的基本原理和信号模型,算是打了个地基。这一章,我们要真正开始「造房子」了——从原始的回波数据中,把那些代表目标的「点」给提取出来。

说白了,点云生成就是雷达感知的「第一道工序」。你想想看,雷达接收到的是一堆乱七八糟的时域信号,我们要从中找出哪些是目标,哪些是噪声,然后还要把这些目标的位置、速度信息给算出来。嗯,这就是本章要干的事。

2.1 CFAR检测算法:从噪声中揪出目标

先问大家一个问题:雷达回波里,目标信号和噪声混在一起,你怎么判断某个位置到底有没有目标?

最简单的办法是设一个固定门限——超过门限就算目标。但我在实际项目中吃过这个亏。有一次做车载雷达测试,场景从空旷的高速切换到密集的城区,固定门限直接崩了:要么漏检,要么虚警满天飞。为什么?因为噪声的强度是变化的啊!

所以,我们需要一种能自适应调整门限的算法。这就是CFAR(Constant False Alarm Rate,恒虚警率)检测。

2.1.1 CFAR的核心思想

CFAR的思路其实很朴素:对于待检测的单元,我们看看它周围的「邻居」是什么水平。如果它比邻居明显高出一截,那大概率就是目标。这个「邻居」区域,我们叫它参考窗。

具体来说,CFAR会做这几步:

  1. 选定一个待检测单元(CUT,Cell Under Test)
  2. 在CUT周围设置保护单元(防止目标能量泄漏到参考窗)
  3. 在保护单元外侧设置参考单元,计算噪声功率的估计值
  4. 根据噪声估计值和预设的虚警概率,计算出门限值
  5. 比较CUT的功率和门限,超过则判为目标

关键公式:

门限 T = α × P_noise

其中 α 是门限因子,由虚警概率 P_fa 和参考单元数 N 决定:α = N × (P_fa^(-1/N) - 1)

2.1.2 常见的CFAR变体

我在项目中用过好几种CFAR,各有各的脾气:

类型 原理 适用场景 我的经验
CA-CFAR 取参考单元的平均值 均匀噪声环境 最简单,但多目标时容易漏检
SO-CFAR 取左右参考窗中较小的均值 多目标场景 能分辨近距离目标,但虚警略高
GO-CFAR 取左右参考窗中较大的均值 杂波边缘场景 防止在杂波边界产生虚警
OS-CFAR 对参考单元排序,取第k个值 多目标+杂波混合 鲁棒性最好,但计算量大

我的建议:刚开始做项目,先用CA-CFAR跑通流程。等遇到性能瓶颈了,再根据具体问题换SO或OS。别一上来就搞复杂的,容易把自己绕进去。

2.1.3 代码实现示例

下面是一个简化的CA-CFAR实现,我习惯用Python做原型验证:

import numpy as np

def ca_cfar(rd_map, guard_len=4, ref_len=8, p_fa=1e-4):
    """
    CA-CFAR检测
    rd_map: 距离-多普勒图 (2D数组)
    guard_len: 保护单元半长
    ref_len: 参考单元半长
    p_fa: 虚警概率
    """
    n_rows, n_cols = rd_map.shape
    detections = np.zeros_like(rd_map, dtype=bool)
    
    # 计算门限因子
    n_ref = 2 * ref_len
    alpha = n_ref * (p_fa ** (-1.0 / n_ref) - 1)
    
    for i in range(ref_len + guard_len, n_rows - ref_len - guard_len):
        for j in range(ref_len + guard_len, n_cols - ref_len - guard_len):
            # 提取参考窗
            ref_window = rd_map[
                i - ref_len - guard_len : i + ref_len + guard_len + 1,
                j - ref_len - guard_len : j + ref_len + guard_len + 1
            ]
            # 去掉保护单元和CUT
            guard_mask = np.ones_like(ref_window, dtype=bool)
            guard_mask[
                ref_len : ref_len + 2*guard_len + 1,
                ref_len : ref_len + 2*guard_len + 1
            ] = False
            noise_power = np.mean(ref_window[guard_mask])
            
            # 判决
            threshold = alpha * noise_power
            detections[i, j] = rd_map[i, j] > threshold
    
    return detections

注意:上面的代码是教学用的简化版。实际工程中,边界处理、并行加速、浮点精度都是坑。我曾经在嵌入式平台上因为float精度问题,导致门限计算偏差,排查了两天才找到原因。

2.2 距离-多普勒图生成

CFAR检测是在距离-多普勒图上做的。那这个图是怎么来的?

简单说,雷达发射一串调频连续波(FMCW),每个chirp回波经过采样得到一组数据。对每个chirp做FFT(距离维FFT),得到距离信息。再对同一距离门上的多个chirp做FFT(多普勒维FFT),就得到了速度信息。这两次FFT的结果,就是距离-多普勒图(Range-Doppler Map,简称RD图)。

2.2.1 生成流程

  1. 数据重组:将ADC采样数据按chirp和采样点排列成矩阵
  2. 距离维FFT:对每个chirp做加窗、FFT,得到距离谱
  3. 多普勒维FFT:对每个距离门,跨chirp做加窗、FFT,得到速度谱
  4. 取模:得到幅度值,形成RD图

我个人习惯在距离维FFT后先做一次CFAR,再在多普勒维FFT后做第二次CFAR。这叫2D-CFAR,能有效抑制噪声,但计算量也翻倍。具体用哪种,看你的算力够不够。

2.2.2 关键参数

参数 含义 典型值
采样率 Fs ADC采样频率 10-40 MHz
chirp数 N_chirp 一个帧内的chirp数量 64-256
采样点数 N_sample 每个chirp的采样点数 128-512
距离分辨率 ΔR c / (2 × B),B为带宽 0.04-0.1 m
速度分辨率 ΔV λ / (2 × T_frame) 0.1-0.5 m/s

避坑指南:我曾经在RD图上看到一条亮线,以为是目标,结果发现是电源噪声耦合进了ADC。所以生成RD图后,先看看静态场景下的底噪是否均匀,这是判断系统健康度的好方法。

2.3 点云聚类:DBSCAN与欧式聚类

CFAR检测完,我们得到了一堆「点」。但这些点里,一个目标可能对应好几个点(比如一辆车可能有多个反射点)。我们需要把这些属于同一个目标的点聚在一起,形成「目标簇」。

这就是聚类要做的事。

2.3.1 欧式聚类

欧式聚类是最直观的方法:设定一个距离阈值,把距离小于阈值的点归为一类。

算法步骤:

  1. 从任意一个未分类的点开始
  2. 找到它周围距离小于阈值的所有点
  3. 把这些点归为一类,并继续扩展
  4. 直到没有新点加入,再处理下一个未分类的点

优点:简单、快。缺点:对阈值敏感,且无法处理密度不均匀的情况。

我的经验:欧式聚类适合场景简单的项目,比如空旷停车场。但在城市道路这种密集场景下,阈值设小了会把一辆车分成好几块,设大了又会把相邻的车合并。我后来基本都改用DBSCAN了。

2.3.2 DBSCAN聚类

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)能解决欧式聚类的痛点。它基于密度的思想:如果一个区域点的密度足够高,就把它划为一个簇。

DBSCAN有两个关键参数:

  • eps:邻域半径
  • minPts:一个核心点邻域内最少包含的点数

算法把点分为三类:

  • 核心点:邻域内至少有minPts个点
  • 边界点:邻域内点数少于minPts,但属于某个核心点的邻域
  • 噪声点:既不是核心点也不是边界点

DBSCAN的好处是:能发现任意形状的簇,还能自动识别噪声。这在雷达点云中特别有用——那些孤立的虚警点会被标记为噪声,不会干扰目标判断。

2.3.3 参数调优建议

说实话,DBSCAN的参数调起来挺玄学的。我分享几个经验:

  • eps:先根据目标的物理尺寸估算。比如一辆车宽2米,那eps设1-1.5米比较合理
  • minPts:一般设3-5。设太小容易把噪声也聚进来,设太大又会漏掉小目标
  • 先降维:如果点云包含距离、速度、角度等多维信息,可以先做PCA降维到2-3维再聚类,效果往往更好

注意:DBSCAN的时间复杂度是O(n²),点云数量超过1000个时,实时性可能扛不住。我在一个项目中用DBSCAN处理3000个点,每帧耗时50ms,最后不得不改用KD-Tree加速。

2.4 本章知识体系

下面这张图展示了点云生成的完整流程,我画了个SVG方便大家理解:

点云生成技术流程 ADC原始数据 距离维FFT 加窗 + FFT 多普勒维FFT 跨chirp FFT RD图 CFAR检测 CA / SO / GO / OS 点云聚类 DBSCAN / 欧式聚类 目标点云输出

从这张图可以看得很清楚:原始数据经过两次FFT得到RD图,再经过CFAR检测提取出候选点,最后通过聚类形成目标点云。每一步都有它的意义,缺一不可。

好了,这一章的内容就到这里。点云生成是整个雷达感知系统的基石,后面的目标跟踪、分类都依赖于这一步的质量。希望大家在实际项目中多动手、多调试,把每个环节吃透。

可可精品资料库