第二讲:数据采集基础——毫米波雷达原始数据结构解析

大家好,我是你们的老朋友。今天咱们聊聊雷达数据采集中最基础、也最绕不开的话题——原始数据结构。

说实话,我刚入行那会儿,拿到第一份雷达数据时,整个人是懵的。一堆十六进制数,完全不知道从哪下手。后来踩了不少坑,才慢慢摸清楚门道。今天我就把这些经验掰开揉碎了讲给你听。

一、雷达数据到底长什么样?

毫米波雷达输出的数据,按处理深度可以分为三个层次:ADC数据、点云数据、目标列表。这三个层次,说白了就是「原始信号→中间结果→最终结论」的递进关系。

核心观点:ADC数据是「原材料」,点云数据是「半成品」,目标列表是「成品」。做数据回放和复现,你至少得懂前两层。

我习惯用一张图来理解它们的关系。你看下面这个流程:

ADC 原始数据 复数IQ采样值 点云数据 距离/速度/角度/强度 目标列表 跟踪ID/状态/属性 1D/2D FFT CFAR + 聚类 数据回放与复现的核心:理解每一层的格式与含义 最原始,数据量最大 中间结果,可做二次处理 最终输出,应用层使用

二、ADC数据——最原始的「原材料」

ADC数据,就是模数转换器直接采出来的原始信号。你想想看,雷达发射一个调频连续波(FMCW),遇到目标反射回来,混频后得到中频信号,再经过ADC采样——这就是ADC数据的来源。

ADC数据的特点:

  • 复数形式:通常包含I(同相)和Q(正交)两路,每个采样点是一个复数
  • 数据量大:一帧数据可能有几十万到上百万个采样点
  • 无意义的外观:直接看就是一堆数字,必须经过处理才能解读

我的经验:我在调试某款77GHz雷达时,发现ADC数据里总有周期性毛刺。后来查了半天,原来是电源纹波耦合进了模拟前端。所以,ADC数据质量直接决定了后续处理的成败——这个坑我替你们踩过了。

ADC数据的典型存储格式如下:

// 假设每帧有 N 个chirp,每个chirp有 M 个采样点
// 数据排列方式(常见的一种):
// [chirp1_I0, chirp1_Q0, chirp1_I1, chirp1_Q1, ..., chirp1_IM-1, chirp1_QM-1,
//  chirp2_I0, chirp2_Q0, ...]

// 用Python读取的示例:
import numpy as np

def read_adc_data(file_path, num_chirps, num_samples):
    raw = np.fromfile(file_path, dtype=np.int16)
    # 交错排列:I, Q, I, Q, ...
    iq = raw[0::2] + 1j * raw[1::2]
    # 重塑为 [chirp, sample] 矩阵
    return iq.reshape(num_chirps, num_samples)

嗯,这里要注意:不同厂商的雷达,ADC数据的排列方式可能不一样。有的先存所有chirp的I路,再存Q路;有的按chirp交错存储。拿到数据后,第一件事就是搞清楚排列格式。

三、点云数据——从信号到「点」的蜕变

ADC数据经过1D FFT(距离维)、2D FFT(速度维)、CFAR检测、角度估计等一系列处理后,就得到了点云数据。

点云数据里每个点通常包含:

字段 含义 典型范围 备注
距离 (Range) 目标到雷达的径向距离 0.1 ~ 200 m 分辨率取决于带宽
速度 (Velocity) 目标的径向速度 -40 ~ +40 m/s 正号表示靠近
方位角 (Azimuth) 水平方向角度 -60° ~ +60° 取决于天线布局
俯仰角 (Elevation) 垂直方向角度 -15° ~ +15° 部分雷达不支持
信噪比 (SNR) 信号强度指标 0 ~ 60 dB 越高越可靠

点云数据比ADC数据「友好」多了。每个点都有物理意义,你可以直接画在二维或三维坐标里。但要注意——点云不是目标,它只是「疑似目标的信号峰值」。

避坑指南:我曾经在高速场景测试时,发现点云里有一堆「鬼点」——明明路上没车,却检测出几十个点。后来排查发现,是路边的护栏产生了多径反射。所以,点云数据一定要结合场景理解,别盲目相信。

四、目标列表——雷达的「最终答案」

目标列表是雷达处理器对点云进行聚类、跟踪后输出的结果。每个目标代表一个「真实存在的物体」,通常包含:

  • 目标ID:用于跨帧跟踪的唯一标识
  • 位置信息:距离、角度(有时直接给x/y坐标)
  • 运动状态:速度、加速度
  • 属性标签:如「行人」、「车辆」、「静止物」
  • 置信度:该目标的可信程度

目标列表的数据量很小——一帧可能只有几个到几十个目标。但信息密度最高,是上层应用(如AEB、ACC)直接使用的数据。

举个例子,目标列表的JSON格式大概长这样:

{
  "frame_id": 1024,
  "timestamp_us": 1234567890,
  "targets": [
    {
      "id": 1,
      "range_m": 25.3,
      "azimuth_deg": -2.1,
      "velocity_mps": -5.2,
      "snr_db": 28.5,
      "type": "vehicle",
      "confidence": 0.95
    },
    {
      "id": 2,
      "range_m": 12.8,
      "azimuth_deg": 1.5,
      "velocity_mps": 0.3,
      "snr_db": 18.2,
      "type": "pedestrian",
      "confidence": 0.78
    }
  ]
}

五、三种数据怎么用?

做数据回放与复现,我建议你按这个思路来:

  1. 调试算法时:用ADC数据,从头跑一遍信号处理链,验证每个环节是否正确
  2. 分析场景时:用点云数据,可视化观察目标分布,发现异常检测结果
  3. 验证系统时:用目标列表,对比雷达输出与真值(如激光雷达或GPS)的差异

我的习惯:我会把三种数据同时保存下来。ADC数据占空间大,但最「原汁原味」;点云数据是调试的主力;目标列表方便做自动化测试。三者配合,才能把问题彻底搞清楚。

六、数据采集的注意事项

最后,分享几个我在数据采集中总结的要点:

  • 时间戳必须精准:不同数据源的时间同步是复现的基础,差1毫秒都可能对不上
  • 记录环境信息:温度、湿度、雷达安装位置——这些看似无关,但出问题时就是关键线索
  • 数据完整性校验:采集过程中加CRC校验,避免文件损坏导致白忙一场
  • 标注异常场景:遇到特殊场景(如隧道、强雨雪)时,在日志里做标记,方便后续分析

好了,这一讲的内容就是这些。三种数据结构——ADC、点云、目标列表——是雷达数据处理的基石。你只有把它们彻底搞懂了,后面的回放和复现才能得心应手。

可可精品资料库