第四节:参考路径生成——车道中心线提取、三次样条插值、路径平滑处理
各位工程师朋友,大家好。今天我们来聊聊参考路径生成这个模块。
说实话,在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+ | 高 | 复杂道路 |
说白了,三次样条是性价比最高的选择。我在量产项目中一直用这个方案。
三、路径平滑处理——去掉“毛刺”
插值后的路径看起来已经很顺了,但实际控制时你会发现:车辆还是会有微小的抖动。为什么?因为样条曲线虽然数学上连续,但曲率变化可能很剧烈。
我常用的平滑方法有两种:
- 滑动平均滤波:对相邻几个点的y值做加权平均。简单有效,但会引入延迟。
- 曲率约束优化:在路径生成时加入曲率变化率的约束。效果更好,但计算量大。
实战技巧:我一般先用滑动平均做粗平滑,再用曲率约束做精调。这样既保证了实时性,又避免了路径突变。
平滑处理的伪代码:
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个点比较合适。
四、知识体系总览
下面这张图总结了参考路径生成的完整流程:
从图中可以看到,三个步骤环环相扣。任何一个环节出问题,最终路径都会“跑偏”。
五、总结与避坑清单
最后,我把自己踩过的坑整理成一份清单,供大家参考:
- 中心线提取:一定要检查左右线的有效检测距离,不一致时用车道宽度估算。
- 三次样条插值:采样点间距尽量均匀,否则样条曲线会在稀疏区域“乱跳”。
- 路径平滑:滑动窗口不要太大,3~7个点足够。曲率约束的权重需要标定。
- 实时性:如果计算资源有限,可以离线生成样条系数表,在线查表插值。
一个小技巧:在Simulink中,我习惯用MATLAB Function模块封装三次样条插值算法。这样既方便调试,又能直接生成C代码用于嵌入式部署。
好了,关于参考路径生成的内容就讲到这里。记住:路径是控制的基础,路径不准,控制再好也没用。希望大家在实际项目中少走弯路。