参考车速生成:从路径规划到平滑输出的完整链路
各位工程师朋友,今天我们来聊聊纵向控制里一个容易被忽视、但极其关键的环节——参考车速生成。说白了,就是告诉你的车「接下来该怎么跑」。
我刚开始做纵向控制时,总觉得只要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秒看前方的速度变化,而不是只看当前时刻。这样更符合人类驾驶习惯。
三、平滑处理与限幅
规划出来的加速度信号,直接发给执行器?千万别。我见过太多工程师栽在这个环节。
平滑处理主要做三件事:
- 低通滤波:滤掉高频噪声,常用一阶低通或滑动平均
- 加速度限幅:一般限制在±3 m/s²以内,急加速/急减速会触发保护
- 加加速度限幅:也就是加速度的变化率,限制在±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,否则乘客会晕 |
避坑指南:我曾经在雨天测试时,发现同样的参数在干燥路面和湿滑路面表现完全不同。后来我加了一个路面附着系数估计模块,动态调整加速度限幅值。嗯,这个经验分享给你。
好了,关于参考车速生成的核心内容就这些。记住,好的纵向控制不是让车跑得快,而是让车跑得「像人」——平稳、安全、可预测。