第二章 传感器模型与数据预处理:雷达、摄像头、激光雷达的数学模型、坐标变换、时间同步、数据对齐

各位同学,欢迎来到实战教程的第二讲。

上一章我们聊了融合跟踪的整体框架。今天要啃的这块骨头,说实话,是整个系统里最“脏”最“累”的活——传感器模型与数据预处理。

你想想看,雷达、摄像头、激光雷达,这三个家伙“看”世界的方式完全不同。雷达告诉你“前方20米有个金属物体”,摄像头告诉你“那个红色的方块看起来像一辆车”,激光雷达则给你一堆密密麻麻的点云。怎么让它们“说同一种语言”?这就是本章要解决的问题。

核心观点:融合跟踪的精度,80%取决于数据预处理的质量。模型再漂亮,输入的是垃圾,输出依然是垃圾。

2.1 雷达传感器模型

雷达,说白了就是靠发射电磁波并接收回波来测距。我个人习惯把雷达模型拆成两部分看:测量模型和噪声模型。

2.1.1 测量模型

对于毫米波雷达,常见的测量输出是:

  • 距离 r:目标到雷达的径向距离
  • 方位角 θ:目标相对于雷达正前方的水平角度
  • 径向速度 v_r:目标沿雷达径向方向的速度分量

数学上可以写成:

r = sqrt(x² + y²)
θ = atan2(y, x)
v_r = (x * vx + y * vy) / r

嗯,这里要注意,雷达的测量是在极坐标系下完成的。而我们的跟踪算法通常工作在笛卡尔坐标系。这个转换,坑很多。

个人经验:我在项目中遇到过,直接把雷达的极坐标测量转换到笛卡尔坐标,然后用标准卡尔曼滤波。结果发现滤波发散。为什么?因为转换后的噪声分布不再是高斯分布了。后来我改用扩展卡尔曼滤波(EKF)或者无迹卡尔曼滤波(UKF),才解决了这个问题。

2.1.2 噪声模型

雷达的噪声通常假设为高斯白噪声,但参数跟距离有关:

σ_r = 0.15 * r + 0.5   (距离标准差,单位米)
σ_θ = 0.5°             (角度标准差)
σ_vr = 0.1             (速度标准差,单位m/s)

你看,距离越远,测距误差越大。这是雷达的物理特性决定的。

2.2 摄像头传感器模型

摄像头嘛,它给我们的是图像。但图像里没有直接的“距离”信息。我们需要通过几何模型来反推。

2.2.1 针孔相机模型

这是最经典的模型。说白了就是小孔成像原理:

u = fx * X / Z + cx
v = fy * Y / Z + cy

其中 (u, v) 是图像像素坐标,(X, Y, Z) 是相机坐标系下的3D点。fx, fy 是焦距参数,cx, cy 是主点偏移。

这里有个关键问题:单目摄像头无法直接测量深度 Z。一个像素点可能对应远处的大物体,也可能对应近处的小物体。这就是所谓的“尺度不确定性”。

避坑指南:我曾经天真地以为,用单目摄像头加一个地面平面假设就能算出距离。结果在坡道上直接翻车。地面不是平的,你的假设就全错了。后来我改用双目或者雷达+摄像头融合,才稳住了。

2.2.2 畸变校正

实际摄像头都有镜头畸变,主要是径向畸变和切向畸变。不校正的话,图像边缘的物体位置会偏:

x_corrected = x * (1 + k1 * r² + k2 * r⁴ + k3 * r⁶)
y_corrected = y * (1 + k1 * r² + k2 * r⁴ + k3 * r⁶)

k1, k2, k3 是畸变参数,需要标定得到。我建议你每次换摄像头或者调整焦距后,都重新做一次标定。

2.3 激光雷达传感器模型

激光雷达,我更喜欢叫它LiDAR。它发射激光束,测量飞行时间(ToF)来得到距离。精度高,但受天气影响大。

2.3.1 测量模型

对于机械旋转式LiDAR,每个激光束的测量可以表示为:

x = r * cos(ω) * sin(α)
y = r * cos(ω) * cos(α)
z = r * sin(ω)

其中 r 是距离,ω 是垂直俯仰角,α 是水平旋转角。

LiDAR的输出是一帧点云,通常包含数万到数百万个点。每个点有 (x, y, z) 坐标,有些还带有反射强度信息。

2.3.2 点云预处理

拿到原始点云后,不能直接用。我一般会做三步:

  1. 地面滤除:用RANSAC或平面拟合,把地面点去掉。不然地面点会干扰目标检测。
  2. 聚类:用DBSCAN或欧式聚类,把属于同一个物体的点聚在一起。
  3. 下采样:用体素滤波器,降低点云密度。不然数据量太大,实时性扛不住。

我的习惯:体素滤波的格子大小我通常设0.1m到0.2m。太小了降不下去,太大了会丢失细节。你可以根据你的场景调一调。

2.4 坐标变换

好了,现在三个传感器都有自己的坐标系。雷达坐标系、相机坐标系、LiDAR坐标系,还有车体坐标系。怎么统一?

说白了就是刚体变换:旋转 + 平移。

P_body = R * P_sensor + T

其中 R 是3x3旋转矩阵,T 是3x1平移向量。这个 (R, T) 就是传感器到车体的外参。

外参标定是个大活。我见过有人用手动测量,结果误差好几厘米。我建议用标定板或者基于自然特征的方法,精度能到毫米级。

重要提醒:坐标变换时,注意旋转顺序和方向。不同的库(比如Eigen、OpenCV、ROS)对旋转的定义可能不同。我曾经因为搞混了“先绕X轴还是先绕Z轴”,排查了整整两天。

2.5 时间同步

时间同步,说白了就是让所有传感器的数据“对齐”到同一个时间戳上。

为什么需要?你想想看,雷达以10Hz工作,摄像头以30Hz工作,LiDAR以20Hz工作。它们的数据到达时间不一样。如果不做同步,你拿到的“同一时刻”的数据,实际上可能差了100ms。对于高速运动的车辆,100ms意味着好几米的位移。

2.5.1 硬件同步 vs 软件同步

同步方式 精度 实现难度 适用场景
硬件同步(GPS PPS + 触发线) 微秒级 高 自动驾驶、高精度融合
软件同步(时间戳对齐) 毫秒级 低 低速、低精度场景

我个人建议,能上硬件同步就上硬件同步。软件同步虽然简单,但遇到传感器延迟抖动大的时候,效果很差。

2.5.2 时间戳对齐算法

软件同步的常用方法是线性插值:

假设雷达在 t1 时刻有数据,摄像头在 t2 时刻有数据
我们要得到 t 时刻的雷达数据(t1 < t < t2)
P(t) = P(t1) + (P(t2) - P(t1)) * (t - t1) / (t2 - t1)

嗯,这里要注意,插值假设物体在短时间内做匀速运动。如果物体急加速或急转弯,插值误差会变大。

2.6 数据对齐

数据对齐,是最后一步,也是最容易出问题的一步。

对齐包括:

  • 空间对齐:通过坐标变换,把所有数据统一到车体坐标系
  • 时间对齐:通过时间同步,保证数据对应同一时刻
  • 语义对齐:比如雷达检测到的目标,和摄像头检测到的目标,是不是同一个物体?这需要关联匹配

语义对齐通常用最近邻匹配或者匈牙利算法。我习惯的做法是:先用马氏距离计算两个目标之间的相似度,然后用匈牙利算法做最优匹配。

避坑指南:我曾经在数据对齐时,忘了考虑传感器之间的遮挡关系。结果雷达检测到的一个目标,在摄像头视角里被另一个物体挡住了。强行关联导致跟踪出错。后来我加了一个可视性检查,才解决了这个问题。

2.7 本章知识体系

下面这张图,是我自己画的本章知识体系结构。你可以把它当作一个“地图”,随时回来查阅。

第二章:传感器模型与数据预处理 雷达模型 • 极坐标测量 • 距离相关噪声 • 径向速度 摄像头模型 • 针孔相机模型 • 畸变校正 • 尺度不确定性 激光雷达模型 • 3D点云测量 • 地面滤除 • 聚类与下采样 坐标变换(刚体变换:旋转R + 平移T) 传感器坐标系 → 车体坐标系 时间同步(硬件同步 / 软件插值) 对齐所有传感器到同一时间戳 数据对齐(空间 + 时间 + 语义)

这张图清晰地展示了本章的脉络:从三个传感器的原始数据出发,经过坐标变换、时间同步,最终完成数据对齐。每一步都有坑,每一步都需要细心处理。

最后说一句:数据预处理没有银弹。不同的传感器配置、不同的应用场景,处理方式都不一样。我的建议是:先跑通一个简单的pipeline,然后根据实际数据不断迭代优化。别想着一步到位。

好了,这一章的内容就到这里。下一章我们会聊目标检测与特征提取,到时候见。

可可精品资料库