参考车速生成:从路径规划到平滑输出的完整链路

各位工程师朋友,今天我们来聊聊纵向控制里一个容易被忽视、但极其关键的环节——参考车速生成。说白了,就是告诉你的车「接下来该怎么跑」。

我刚开始做纵向控制时,总觉得只要PID调得好,车速就能跟住。结果有一次在实车测试中,参考车速直接从60km/h跳变到0,车身猛地一抖,安全员差点没把我赶下车。嗯,从那以后我才真正重视起参考车速的生成逻辑。

一、基于路径规划的期望速度曲线

路径规划模块会输出一条轨迹,包含位置、曲率等信息。但速度怎么定?这其实是个优化问题。

我个人习惯把期望速度拆成三个维度来考虑:

  • 道路限速:地图或感知给出的法定限速
  • 曲率约束:弯道太急,速度必须降下来
  • 舒适性约束:横向加速度一般控制在2~3 m/s²以内

举个例子,假设路径上有一段曲率半径为50m的弯道,最大横向加速度设为2.5 m/s²,那么最大安全速度就是:

v_max = sqrt(a_lat_max * R) = sqrt(2.5 * 50) ≈ 11.18 m/s ≈ 40 km/h

我在项目中遇到过一个问题:曲率约束算出来的速度太低,导致车辆在弯道前急减速,后车差点追尾。后来我加了一个「曲率变化率」的约束,让减速过程更平滑。

核心思路:期望速度曲线 = min(限速, 曲率约束速度, 舒适性速度, 目标车速)

二、基于驾驶员模型的加速度规划

有了期望速度曲线,下一步就是规划加速度。你想想看,如果直接让车辆去跟踪速度曲线,那加速度会非常突兀。我们需要模拟人类驾驶员的操作习惯。

我常用的模型是这样的:

a_ref = k_p * (v_desired - v_current) + k_d * (a_desired - a_current)

其中:

  • v_desired:当前时刻的期望速度
  • v_current:当前实际速度
  • k_p:比例系数,控制响应快慢
  • k_d:微分系数,抑制加速度突变

这里有个坑——我曾经把k_p调得太大,结果车辆在跟车时出现明显的「点头」现象。后来我加了一个前馈项,根据坡度、风阻等提前补偿,效果好了很多。

小技巧:加速度规划时,建议加入「预瞄距离」的概念。比如提前1~2秒看前方的速度变化,而不是只看当前时刻。这样更符合人类驾驶习惯。

三、平滑处理与限幅

规划出来的加速度信号,直接发给执行器?千万别。我见过太多工程师栽在这个环节。

平滑处理主要做三件事:

  1. 低通滤波:滤掉高频噪声,常用一阶低通或滑动平均
  2. 加速度限幅:一般限制在±3 m/s²以内,急加速/急减速会触发保护
  3. 加加速度限幅:也就是加速度的变化率,限制在±2 m/s³以内

我曾经在一次测试中,因为忘记加加加速度限幅,车辆在起步时加速度从0瞬间跳到2 m/s²,乘客直接后仰撞到头。嗯,从那以后我把加加速度限幅写进了代码的强制检查项。

// 伪代码示例:平滑处理
float smooth_acc = low_pass_filter(raw_acc, 0.1);  // 截止频率10Hz
float clamped_acc = clamp(smooth_acc, -3.0, 3.0);  // 限幅
float jerk_limited_acc = rate_limit(clamped_acc, 2.0); // 加加速度限幅

注意:平滑处理不是越平滑越好。过度滤波会导致响应延迟,在紧急制动场景下可能造成碰撞。建议根据场景动态调整滤波参数。

四、整体流程框架

下面这张图是我自己总结的参考车速生成流程,你可以对照着理解:

路径规划轨迹 期望速度曲线 (限速/曲率/舒适性) 加速度规划 (驾驶员模型) 平滑处理与限幅 (滤波/限幅/加加速度) 参考加速度输出 车辆状态反馈

你看,整个流程其实不复杂。但每个环节都有细节需要打磨。我建议你在实际项目中,先把期望速度曲线和加速度规划跑通,再逐步加入平滑和限幅逻辑。别想着一步到位。

五、参数调优经验

最后分享几个参数调优的实战经验:

参数 推荐范围 我的经验
k_p (速度比例) 0.5 ~ 2.0 高速场景用大值,低速用小值
k_d (加速度微分) 0.1 ~ 0.5 太大容易震荡,太小响应慢
加速度限幅 ±3.0 m/s² 舒适模式建议±2.0
加加速度限幅 ±2.0 m/s³ 这个值别超过3.0,否则乘客会晕

避坑指南:我曾经在雨天测试时,发现同样的参数在干燥路面和湿滑路面表现完全不同。后来我加了一个路面附着系数估计模块,动态调整加速度限幅值。嗯,这个经验分享给你。

好了,关于参考车速生成的核心内容就这些。记住,好的纵向控制不是让车跑得快,而是让车跑得「像人」——平稳、安全、可预测。

专注资料整理