4、车道线跟踪与状态估计:卡尔曼滤波原理、基于卡尔曼滤波的车道线跟踪、车道线置信度评估、车道线丢失与重捕获策略

各位同学,欢迎来到第四章。这一章,咱们要啃一块硬骨头——车道线的跟踪与状态估计。

说实话,我当年刚接触ADAS时,觉得车道线检测已经够难了。后来才发现,检测只是第一步。真正让系统稳定跑起来的,是跟踪和估计。你想想看,摄像头每一帧都在抖动,光照忽明忽暗,车道线还可能被遮挡。如果每一帧都重新检测,那结果肯定跳来跳去,车辆也会跟着画龙。

所以,我们需要一个“大脑”,来平滑预测车道线的位置。这个大脑,就是卡尔曼滤波器。

4.1 卡尔曼滤波原理:从“猜”到“准”

卡尔曼滤波,说白了就是一种最优估计算法。它不完美,但它在噪声中能给出最靠谱的答案。

我习惯用一个比喻来解释:你站在一个房间里,想猜出温度是多少。你有一个温度计,但它有误差。你还有一个经验,知道温度不会突然变化。卡尔曼滤波就是把你“猜的”和“测的”结合起来,得出一个更准的值。

它的核心是两个步骤:

  • 预测(Predict):根据上一帧的状态,猜一下当前帧的状态。
  • 更新(Update):用当前帧的观测值,修正这个猜测。

数学上,它用五个公式搞定。嗯,这里我直接给出最常用的离散形式:

// 预测步骤
x_pred = A * x_prev + B * u
P_pred = A * P_prev * A^T + Q

// 更新步骤
K = P_pred * H^T * (H * P_pred * H^T + R)^(-1)
x_est = x_pred + K * (z - H * x_pred)
P_est = (I - K * H) * P_pred

别被公式吓到。我来拆解一下:

  • x:状态向量,比如车道线的位置、曲率、斜率。
  • P:协方差矩阵,代表你对当前状态有多不确定。
  • Q:过程噪声,代表模型本身的不确定性。比如车辆突然加速,你的预测就会不准。
  • R:测量噪声,代表传感器的误差。摄像头抖动、光线变化都会增大R。
  • K:卡尔曼增益。它决定了你更相信预测还是观测。K大,就信观测;K小,就信预测。
我的经验:调参时,Q和R的比值是关键。我刚开始做项目时,把R设得太小,结果滤波器对噪声特别敏感,车道线抖得厉害。后来把R调大了一些,系统反而更稳了。记住,有时候“迟钝”一点反而是好事。

4.2 基于卡尔曼滤波的车道线跟踪

好了,理论讲完,咱们看看怎么用在车道线上。

我一般把车道线建模成三次曲线:

y = C0 + C1 * x + C2 * x^2 + C3 * x^3

其中:

  • C0:横向偏移(车辆中心到车道线的距离)
  • C1:航向角(车辆与车道线的夹角)
  • C2:曲率
  • C3:曲率变化率

状态向量 x 就是 [C0, C1, C2, C3]^T。观测向量 z 是每一帧检测到的车道线点。

这里有个坑:状态转移矩阵 A 怎么设计?

我建议用恒定曲率模型。说白了,就是假设车道线的曲率变化很慢。这样A矩阵就是一个简单的单位矩阵加上时间步长的影响。代码实现如下:

// 状态转移矩阵 A (恒定曲率模型)
// dt 是帧间时间差
A = [1, dt, 0.5*dt^2, 0;
     0,  1,      dt,   0;
     0,  0,       1,  dt;
     0,  0,       0,   1];

观测矩阵 H 就简单了,它把状态映射到观测空间。因为我们直接观测的是曲线参数,所以H就是单位矩阵。

注意:如果车辆在弯道中突然变道,恒定曲率模型会失效。我曾经遇到过这种情况,卡尔曼滤波器的预测值跟实际值差了半米多。解决方案是:检测到方向盘转角突变时,临时增大过程噪声Q,让滤波器更快地跟上实际变化。

4.3 车道线置信度评估

跟踪做好了,但你怎么知道跟踪的结果靠不靠谱?

这就需要置信度评估。我一般从三个维度来打分:

维度 评估方法 权重
检测质量 检测到的车道线点数量、点与曲线的拟合残差 40%
跟踪一致性 卡尔曼滤波的新息(innovation)大小,即观测值与预测值的偏差 35%
物理合理性 车道线宽度是否合理、曲率是否突变、横向偏移是否在车道内 25%

具体实现时,我会给每个维度一个0到1的分数,然后加权求和。如果总分低于0.6,我就认为这条车道线不可靠。

避坑指南:我曾经只依赖检测质量,结果在隧道里吃了大亏。隧道内光线均匀,车道线检测质量很高,但车辆其实在弯道中,跟踪结果跟实际偏差很大。后来加入了跟踪一致性评估,新息突然变大时,系统能及时降低置信度。

4.4 车道线丢失与重捕获策略

这是最考验系统鲁棒性的地方。车道线丢失是家常便饭,关键是丢了之后怎么办。

我总结了一套“三步走”策略:

  1. 短暂丢失(< 0.5秒):直接用卡尔曼滤波的预测值。这时候置信度较高,预测值足够用。
  2. 中度丢失(0.5 - 2秒):降低预测值的置信度,同时扩大检测区域。比如,原本只在图像下半部分搜索,现在扩大到全图。另外,可以尝试用另一侧车道线来推断丢失侧的位置。
  3. 长时间丢失(> 2秒):放弃当前跟踪,重新初始化。这时候必须触发报警,提醒驾驶员接管。

这里有个小技巧:重捕获时,不要直接跳到新检测到的车道线。我习惯做一个“软切换”——用新检测值和旧预测值做加权平均,权重随时间逐渐过渡。这样车辆不会突然抖动。

我的经验:在高速公路上,车道线丢失最常见的原因是路面反光。我后来加了一个“历史轨迹缓存”,把过去10秒的车道线轨迹存下来。当检测丢失时,用历史轨迹做模板匹配,重捕获成功率提高了30%以上。

好了,这一章的内容就到这里。卡尔曼滤波不是万能的,但它确实是车道线跟踪的基石。下一章,咱们会讲控制策略,看看怎么用这些跟踪结果去控制方向盘。

记住,理论要落地,实践出真知。回去把代码跑一跑,调一调Q和R,你会对卡尔曼滤波有更深的理解。