4. 纵向控制基础:PID控制、油门/刹车标定、速度跟踪
各位同学,今天我们聊聊纵向控制。说白了,就是让车按照你想要的速度跑起来。
我刚开始做实车调试那会儿,觉得纵向控制比横向简单多了——不就是踩油门和刹车嘛。结果第一次上路测试,车速忽快忽慢,乘客差点晕车。嗯,从那以后我再也不敢小看纵向控制了。
4.1 纵向控制的核心问题
纵向控制要解决什么问题?三个字:跟得住。
- 目标速度跟踪:给定一个期望速度,车要平稳地达到并保持
- 加速度控制:加减速过程要平滑,不能有冲击感
- 坡道补偿:上坡下坡时,动力输出要自动调整
你想想看,如果一辆车在高速上定速巡航,遇到上坡就掉速,遇到下坡就超速,这谁敢用?
核心指标:纵向控制的评价标准就两个——精度和舒适性。精度看速度误差,舒适性看 jerk(加加速度)。
4.2 PID控制:最经典的纵向控制器
PID控制,我估计大家都学过。但在实际工程中,怎么调参才是关键。
纵向控制的PID公式长这样:
u(t) = Kp * e(t) + Ki * ∫e(τ)dτ + Kd * de(t)/dt
其中:
e(t) = v_desired - v_actual // 速度误差
u(t) = 油门/刹车指令输出
我在项目中遇到过一个问题:只用P控制,车速永远有静差。比如目标60km/h,实际只能跑到59.2km/h。加上I项后,误差才慢慢消除。但I项太大又会引起超调,车会一冲一冲的。
我的调参习惯:先调P让系统稳定,再加I消除静差,最后用D抑制超调。D项要小心,噪声敏感,容易引起抖动。
4.3 油门/刹车标定
这是纵向控制里最容易被忽视的一环。说白了,你得知道踩多少油门对应多少加速度。
标定流程大致如下:
- 开环测试:固定油门开度(比如20%、40%、60%、80%),记录车速变化
- 数据拟合:建立油门-加速度映射表
- 刹车标定:同样方式,建立刹车压力-减速度映射
- 联合标定:油门和刹车的切换区域要平滑过渡
我曾经吃过一次亏:标定时在平路上做的,结果上了高架桥,同样的油门开度,车速就是上不去。后来才意识到,标定必须考虑坡道因素。
注意:油门和刹车不能同时作用!这是纵向控制的大忌。一定要设计好切换逻辑,通常用死区处理——速度误差在±0.5km/h以内时,既不加油也不刹车。
4.4 速度跟踪的实现
有了PID控制器和标定数据,速度跟踪就水到渠成了。但实际工程中,还有几个坑要避开。
先看一个简单的速度跟踪代码框架:
// 速度跟踪主循环
void speedTrackingLoop() {
// 1. 获取当前车速
float v_actual = getVehicleSpeed();
// 2. 计算速度误差
float error = v_desired - v_actual;
// 3. PID计算
float pid_output = pidController.update(error);
// 4. 查表得到油门/刹车指令
if (pid_output > 0) {
// 需要加速
float throttle = lookupThrottleMap(pid_output);
setThrottle(throttle);
setBrake(0);
} else {
// 需要减速
float brake = lookupBrakeMap(-pid_output);
setBrake(brake);
setThrottle(0);
}
// 5. 限幅保护
applySaturationLimits();
}
这里有个细节:查表映射。PID输出的是无量纲的控制量,你得把它映射到实际的油门百分比或刹车压力。这个映射关系就是标定阶段做好的。
4.5 工程中的常见问题
我整理了几个实际项目中踩过的坑:
| 问题 | 现象 | 解决方案 |
|---|---|---|
| 积分饱和 | 长时间误差累积,导致超调严重 | 加积分限幅,或者用抗积分饱和算法 |
| 执行器延迟 | 油门响应慢,控制滞后 | 加入前馈控制,或者用Smith预估器 |
| 传感器噪声 | 车速信号抖动,D项放大噪声 | 加低通滤波,或者只用PI控制 |
| 坡道干扰 | 上坡掉速,下坡超速 | 加入坡道补偿,用IMU估算坡度 |
我的建议:实际项目中,纯PID往往不够用。我一般会在PID基础上加一个前馈项——根据目标加速度直接计算需要的油门开度,PID只负责修正误差。这样响应快,又稳定。
4.6 知识体系总览
下面这张图,把纵向控制的核心逻辑串起来了:
从这张图可以看出来,纵向控制不是简单的PID就完事了。标定映射、切换逻辑、坡道补偿,每一个环节都可能成为性能瓶颈。
我记得有一次,客户反馈说车速在30km/h附近有抖动。查了两天,最后发现是标定表在30km/h附近有个突变点——油门开度从28%跳到32%时,加速度变化太大。后来把标定曲线做了平滑处理,问题就解决了。
所以,做纵向控制,细节决定成败。PID参数调得再好,标定数据不准也是白搭。
总结一下:纵向控制的基础就是PID + 标定 + 跟踪。PID提供控制律,标定提供映射关系,跟踪算法把两者结合起来。工程上,还要考虑积分饱和、执行器延迟、坡道干扰这些实际问题。