第四节:参考路径生成——车道中心线提取、三次样条插值、路径平滑处理

各位工程师朋友,大家好。今天我们来聊聊参考路径生成这个模块。

说实话,在LKA系统里,参考路径就是车辆的“眼睛”和“大脑”之间的桥梁。你感知到了车道线,但怎么让车沿着车道中心走?这就是参考路径要解决的问题。

我个人习惯把参考路径生成拆成三步:提取车道中心线 → 三次样条插值 → 路径平滑处理。每一步都有坑,咱们一个一个说。

一、车道中心线提取——从两条线到一条线

摄像头通常输出左右两条车道线的多项式系数。比如左线是 y = aLx³ + bLx² + cLx + dL,右线同理。

那中心线怎么取?最简单的方法:左右对应点取平均

核心公式:

ycenter(x) = (yleft(x) + yright(x)) / 2

我在项目中遇到过一个问题:当车辆在弯道中,左右车道线的有效检测距离不一样。左线能看50米,右线只能看30米。这时候如果直接平均,远端的中心线会严重偏左。

避坑指南:我曾经因为没处理这个问题,导致车辆在长弯道中突然向一侧猛打方向。后来我加了一个逻辑:只取左右线都有效的区域,超出部分用单侧线加车道宽度估算。

提取后的中心线是一组离散点:

# 伪代码示例
x_points = [0, 5, 10, 15, 20, 25, 30]  # 纵向距离
y_points = [0.1, 0.3, 0.8, 1.5, 2.4, 3.5, 4.8]  # 横向偏移

这些点就是后续插值的原材料。

二、三次样条插值——让路径更“顺滑”

为什么不用多项式拟合?你想想看,车道线检测本身就有噪声,用高阶多项式拟合容易过拟合,低阶又表达不了复杂弯道。

三次样条插值的好处是:分段低阶,整体连续。每段是一个三次多项式,段与段之间保证一阶、二阶导数连续。

我的经验:在ADAS中,我通常使用自然样条(Natural Spline),端点处二阶导数为零。这样路径在起点和终点不会出现不必要的弯曲。

三次样条的数学形式:

S(x) = a_i + b_i(x - x_i) + c_i(x - x_i)² + d_i(x - x_i)³
其中 x ∈ [x_i, x_{i+1}]

求解系数需要解一个三对角方程组。嗯,这里要注意:如果点间距不均匀,系数矩阵会变复杂。我建议在提取中心线时,尽量让x点等距分布。

插值方法 连续性 计算量 适用场景
线性插值 C0 直道、低速
三次样条 C2 弯道、高速
B样条 C2+ 复杂道路

说白了,三次样条是性价比最高的选择。我在量产项目中一直用这个方案。

三、路径平滑处理——去掉“毛刺”

插值后的路径看起来已经很顺了,但实际控制时你会发现:车辆还是会有微小的抖动。为什么?因为样条曲线虽然数学上连续,但曲率变化可能很剧烈。

我常用的平滑方法有两种:

  1. 滑动平均滤波:对相邻几个点的y值做加权平均。简单有效,但会引入延迟。
  2. 曲率约束优化:在路径生成时加入曲率变化率的约束。效果更好,但计算量大。

实战技巧:我一般先用滑动平均做粗平滑,再用曲率约束做精调。这样既保证了实时性,又避免了路径突变。

平滑处理的伪代码:

def smooth_path(y_raw, window_size=5):
    y_smooth = []
    for i in range(len(y_raw)):
        start = max(0, i - window_size//2)
        end = min(len(y_raw), i + window_size//2 + 1)
        y_smooth.append(np.mean(y_raw[start:end]))
    return y_smooth

注意:滑动窗口不能太大。我曾经设过15个点的窗口,结果路径被“拉直”了,车辆在弯道中直接切内线,差点压到路沿。窗口大小一般取3~7个点比较合适。

四、知识体系总览

下面这张图总结了参考路径生成的完整流程:

参考路径生成知识体系 车道中心线提取 三次样条插值 路径平滑处理 左右线平均 → 离散点 分段三次多项式 → C2连续 滑动平均 / 曲率约束 最终参考路径 ⚠ 注意有效区域 ⚠ 等距采样 ⚠ 窗口大小3~7

从图中可以看到,三个步骤环环相扣。任何一个环节出问题,最终路径都会“跑偏”。

五、总结与避坑清单

最后,我把自己踩过的坑整理成一份清单,供大家参考:

  • 中心线提取:一定要检查左右线的有效检测距离,不一致时用车道宽度估算。
  • 三次样条插值:采样点间距尽量均匀,否则样条曲线会在稀疏区域“乱跳”。
  • 路径平滑:滑动窗口不要太大,3~7个点足够。曲率约束的权重需要标定。
  • 实时性:如果计算资源有限,可以离线生成样条系数表,在线查表插值。

一个小技巧:在Simulink中,我习惯用MATLAB Function模块封装三次样条插值算法。这样既方便调试,又能直接生成C代码用于嵌入式部署。

好了,关于参考路径生成的内容就讲到这里。记住:路径是控制的基础,路径不准,控制再好也没用。希望大家在实际项目中少走弯路。


专注资料整理