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 油门/刹车标定

这是纵向控制里最容易被忽视的一环。说白了,你得知道踩多少油门对应多少加速度。

标定流程大致如下:

  1. 开环测试:固定油门开度(比如20%、40%、60%、80%),记录车速变化
  2. 数据拟合:建立油门-加速度映射表
  3. 刹车标定:同样方式,建立刹车压力-减速度映射
  4. 联合标定:油门和刹车的切换区域要平滑过渡

我曾经吃过一次亏:标定时在平路上做的,结果上了高架桥,同样的油门开度,车速就是上不去。后来才意识到,标定必须考虑坡道因素。

注意:油门和刹车不能同时作用!这是纵向控制的大忌。一定要设计好切换逻辑,通常用死区处理——速度误差在±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控制器 比例-积分-微分 标定映射表 油门/刹车查表 实际速度反馈 油门/刹车切换逻辑 死区处理 · 防冲突 坡道补偿 IMU坡度估算 · 前馈 安全限幅 加速度限幅 · jerk限制 核心逻辑:目标速度 → PID计算 → 标定映射 → 执行器 → 反馈闭环 辅助模块:切换逻辑 · 坡道补偿 · 安全限幅

从这张图可以看出来,纵向控制不是简单的PID就完事了。标定映射、切换逻辑、坡道补偿,每一个环节都可能成为性能瓶颈。

我记得有一次,客户反馈说车速在30km/h附近有抖动。查了两天,最后发现是标定表在30km/h附近有个突变点——油门开度从28%跳到32%时,加速度变化太大。后来把标定曲线做了平滑处理,问题就解决了。

所以,做纵向控制,细节决定成败。PID参数调得再好,标定数据不准也是白搭。

总结一下:纵向控制的基础就是PID + 标定 + 跟踪。PID提供控制律,标定提供映射关系,跟踪算法把两者结合起来。工程上,还要考虑积分饱和、执行器延迟、坡道干扰这些实际问题。


专注资料整理