传感器数据流基础:摄像头、激光雷达、毫米波雷达、超声波传感器数据格式与特性

各位同学,咱们今天聊聊传感器数据流。说实话,这是整个自动驾驶系统最底层的基石。你想想看,如果传感器数据都搞不清楚,后面的感知、规划、控制全是空中楼阁。

我个人习惯,在讲任何算法之前,先让团队把传感器数据格式吃透。为什么?因为我在项目里吃过亏——有一次,我们花了两周调一个目标检测模型,结果发现是激光雷达的点云坐标系和车身坐标系差了5厘米。嗯,这种坑,踩一次就够了。

摄像头数据:最像人眼,也最像人眼一样“不靠谱”

摄像头是自动驾驶里用得最多的传感器。说白了,它就是一台数字相机,输出的是图像帧。

数据格式:最常见的是BGR或RGB格式,8位或12位深度。分辨率从VGA(640x480)到8K(7680x4320)都有。帧率通常是30fps或60fps。

我建议你重点关注这几个参数:

  • 曝光时间:太短了图像暗,太长了运动模糊。我在高速场景遇到过,曝光时间超过20ms,车辆边缘全是拖影。
  • 增益:晚上自动增益一开,噪点像雪花一样。我曾经调试过一个夜间场景,增益拉到40dB,模型直接罢工。
  • 白平衡:隧道出口瞬间,白平衡切换不及时,整个画面偏蓝。嗯,这个坑我踩过。

核心特性:摄像头提供的是稠密语义信息,但缺乏深度。说白了,它知道“那是个行人”,但不知道“行人离我多远”。

避坑指南:我曾经在雨夜测试,摄像头镜头上的水珠导致整个画面像毛玻璃。后来我们强制加了镜头加热和雨刮器。记住,摄像头最怕的是恶劣天气和光照突变。

激光雷达:点云世界的“尺子”

激光雷达,我习惯叫它LiDAR。它发射激光束,测量反射时间,得到的是三维点云数据。

数据格式:每个点包含(x, y, z)坐标和反射强度(intensity)。有些还带时间戳和环号。常见的格式有PCD、PLY、BIN。

举个例子,一个16线激光雷达,每秒能产生30万个点。每个点占4个float(12字节)加1个intensity(4字节),总共16字节。算下来每秒约4.8MB数据。

// 一个典型的点云数据包结构
struct PointXYZI {
    float x;      // 前向距离,单位米
    float y;      // 左侧距离,单位米  
    float z;      // 高度,单位米
    float intensity; // 反射强度,0-255
    double timestamp; // 时间戳,微秒
    uint8_t ring;     // 激光线束编号
};

我建议你注意两个特性:

  • 稀疏性:距离越远,点越稀疏。100米外的行人可能只有3-5个点。你想想看,就靠这几个点判断是不是人,难度不小。
  • 反射强度:不同材质反射率不同。我在项目中遇到过,黑色车辆反射强度极低,有时候会被当成“空洞”过滤掉。嗯,这是个经典问题。

注意:激光雷达在雨雪天气会有“噪点”——雨滴和雪花会反射激光,产生大量虚假点云。我曾经在暴雨天测试,点云里全是雨滴的反射点,目标检测直接崩溃。后来我们加了基于强度的滤波,才勉强能用。

毫米波雷达:速度感知的“老司机”

毫米波雷达,频率在77GHz或24GHz。它不靠图像,靠电磁波反射。说白了,它是个“瞎子”,但能直接测速度和距离。

数据格式:输出的是目标列表(Target List)或点云。每个目标包含:

  • 距离:0.2米到250米
  • 速度:相对速度,单位m/s
  • 角度:水平方位角
  • RCS:雷达散射截面,反映目标大小

我举个例子,一个典型的毫米波雷达数据包:

// 毫米波雷达目标列表
struct RadarTarget {
    float range;        // 距离,米
    float rangeRate;    // 径向速度,米/秒
    float azimuth;      // 方位角,度
    float elevation;    // 俯仰角,度
    float rcs;          // 雷达散射截面,dBsm
    uint8_t snr;        // 信噪比
    uint8_t status;     // 跟踪状态
};

核心特性

  • 直接测速:这是摄像头和激光雷达做不到的。摄像头需要帧间差分,激光雷达需要多帧匹配。毫米波雷达一发一收,速度就出来了。
  • 穿透性强:雨雾天气照样工作。我曾在浓雾天测试,摄像头什么都看不见,毫米波雷达依然能检测到200米外的卡车。
  • 角度分辨率低:这是它的短板。两个并排的行人,在毫米波雷达看来可能就是一个目标。你想想看,这怎么区分?

个人经验:我建议把毫米波雷达当作“速度传感器”来用,而不是“目标检测传感器”。它的强项是测速,弱项是分类。我曾经见过一个团队,试图用毫米波雷达做行人检测,结果误报率高达80%。

超声波传感器:近距守护的“触角”

超声波传感器,频率40kHz左右。它靠发射声波、接收回波来测距。说白了,就是蝙蝠的声呐。

数据格式:非常简单,就是距离值。通常每个传感器输出一个浮点数,单位厘米。范围从0.2米到5米。

我建议你注意:

  • 锥形波束:超声波不是直线传播,而是呈锥形扩散。锥角通常30-60度。这意味着它无法精确定位障碍物的具体位置。
  • 串扰问题:多个超声波传感器同时工作时,会互相干扰。我在项目中遇到过,左前和右前的超声波同时发射,结果互相收到对方的回波,测距全乱套了。
  • 温度影响:声速随温度变化。0°C时声速331m/s,40°C时354m/s。如果不做温度补偿,测距误差会达到5%以上。

核心用途:超声波传感器主要用于低速场景,比如自动泊车、近距离障碍物检测。它的优势是成本低、功耗低、不受光照影响。劣势是测距短、精度低、无法区分障碍物类型。

四种传感器的数据融合思路

好了,四种传感器都讲完了。你可能会问:这么多数据,怎么融合?

我个人习惯,按照“时空对齐-特征级融合-目标级融合”的流程来做:

  1. 时间对齐:不同传感器帧率不同。摄像头30fps,激光雷达10fps,毫米波雷达20fps。需要做插值或时间戳同步。
  2. 空间对齐:把激光雷达点云投影到图像坐标系,把毫米波雷达目标映射到车身坐标系。这一步需要精确的标定参数。
  3. 特征级融合:在特征层面融合,比如把激光雷达的深度信息叠加到图像特征图上。
  4. 目标级融合:每个传感器独立检测目标,然后用匈牙利算法或卡尔曼滤波做关联。

嗯,这里要注意:融合不是越多越好。我曾经见过一个项目,把四个传感器的数据全部堆到一起,结果模型参数量翻了三倍,效果只提升了2%。

最后提醒:传感器数据流的设计,一定要考虑带宽和延迟。摄像头数据动辄几百MB/s,激光雷达几十MB/s,毫米波雷达和超声波数据量很小。如果全部通过同一个总线传输,很容易造成拥塞。我建议给摄像头单独开一路高速总线,激光雷达和毫米波雷达走另一路。

好了,这一章就到这里。下一章我们会讲数据预处理——如何把这些原始传感器数据变成算法能吃的“干净数据”。