4. 比例积分(PI)控制基础:P控制与I控制的作用、PI控制器的传递函数、时域特性

这一章我们聊聊PI控制。说白了,就是比例和积分怎么一起干活。

很多人上来就调KP和KI,调了半天却不知道为什么这么调。我以前也是这样,直到有一次在高速测试时车子一直在车道中线来回晃,才真正意识到——这两个参数背后的物理含义没搞透。

本章我们从原理出发,讲清楚P和I到底在干什么,它们的传递函数长什么样,时域下又会表现出什么特性。弄懂了这些,后续调参才能有的放矢。

PI控制器核心逻辑与知识体系 输入偏差 e(t) 比例支路 Kp 积分支路 Ki∫ PI控制器输出 被控对象 PI控制器 = 比例 P(立即响应当前偏差)+ 积分 I(消除历史累积误差) 特点:兼顾动态响应速度与稳态精度,是车道保持中最常用的控制律

4.1 P控制——当前误差的“放大器”

比例控制,就是根据当前偏差的大小,成比例地输出控制量。

  • 本质:控制量 = Kp × e(t),e(t)是当前时刻的横向偏差或航向角偏差。
  • 作用:偏差越大,方向盘的修正角度就越大。相当于一个可以调节的弹簧。
  • 效果:能快速响应偏差,但有静差。比如你跑直线,用P控制总会差那么几厘米,没法完全压到中线。

我记得第一次调P参数时,把Kp设得比较大,结果车辆左右来回晃,像喝醉了一样。后来才明白,P只能“看到”现在,看不到过去。

核心结论:P控制提供响应速度,但无法消除稳态误差。

4.2 I控制——历史误差的“记账本”

积分控制,记住所有历史偏差,并累积起来产生控制量。

  • 本质:控制量 = Ki × ∫ e(t) dt,就是对偏差随时间进行积分。
  • 作用:只要偏差还存在,积分项就会不断增长,直到把偏差彻底消除。
  • 效果:消除静差,但会引入滞后和超调。积分太强,车子就会“过冲”。

我在项目中遇到过一件事:一条长直道,P控制始终偏左2厘米。加上I控制后,慢慢就修正回来了。但KI调大了,过弯时又开始甩尾。

个人建议:I参数宁小勿大。积分是双刃剑,消除静差的同时,也带来了超调和振荡的风险。

4.3 PI控制器的传递函数

把P和I合在一起,就有经典的PI控制律了。用传递函数表达更清楚。


时域形式:u(t) = Kp·e(t) + Ki·∫e(t)dt

复域形式(拉普拉斯变换):
U(s) = Kp·E(s) + Ki·E(s)/s

PI控制器的传递函数:
Gc(s) = U(s)/E(s) = Kp + Ki/s

你可以这么理解:Kp是增益,Ki/s是一个积分器。两者并联,一个管当前,一个管过去。

工程释义:Gc(s) = Kp + Ki/s,低频时积分项主导(高增益),高频时比例项主导(低增益)。这就是为什么PI控制器能同时兼顾稳态和动态。

4.4 时域特性——看PI控制器怎么“动”

我们看一个典型的阶跃响应曲线,就能知道PI控制器的脾气。

特性 P控制 PI控制
稳态误差 存在静差 完全消除
响应速度 快 略慢于纯P
超调量 无(或很小) 可能有超调
稳定性 容易稳定 需要仔细调参

说白了,纯P控制就像个莽夫,反应快但不够准。加了I之后,像个老司机,知道修正过去的错误,但调不好就容易“开过头”。

为什么会这样?因为积分项会“记账”,帐记得多了,输出就会滞后于实际需要。你想想看,过弯时本来应该柔一点,但积分项还在追前面的偏差,结果转向过度了。

避坑指南:我曾经调一个项目,KI设得偏高,结果车辆在弯道出口出现明显的“回正过头”现象。排查了三天才发现是积分饱和。后来加了抗积分饱和(anti-windup)机制才解决。所以说,I参数不是越大越好,要配合限幅一起用。

4.5 从频域角度看PI

换个角度,从频域看PI控制器,会更直观。

  • 低频增益:趋于无穷大(因为积分项),意味着稳态误差为零。
  • 高频增益:趋向Kp,意味着动态响应能力由Kp决定。
  • 转折频率:ω_z = Ki / Kp,在此频率附近,比例和积分作用相当。

嗯,这里要注意。转折频率决定了PI控制的“作用区间”。低于这个频率的误差信号,积分起主要作用;高于这个频率,比例起主要作用。设计PI时,一般会让转折频率低于系统的带宽,避免积分干扰动态。

实践技巧:我习惯先用纯P控制跑一遍,找到让系统刚好出现振荡的Kp值,然后取一半作为基准。再慢慢加入I,直到稳态误差消失。这样能保证不翻车。

4.6 工程中的PI实现方式

在实际代码里,我们一般用增量式PID实现(只计算变化量),避免全量积分的麻烦。


// 典型PI控制器实现(位置式)
float integral = 0;
float prev_error = 0;

float pi_controller(float setpoint, float measurement, float dt) {
    float error = setpoint - measurement;
    integral += error * dt;  // 累加积分
    float output = Kp * error + Ki * integral;
    // 输出限幅
    if (output > MAX_OUTPUT) output = MAX_OUTPUT;
    if (output < -MAX_OUTPUT) output = -MAX_OUTPUT;
    prev_error = error;
    return output;
}

注意:积分项一定要加限幅。否则长时间偏差会导致积分饱和,等你需要改方向时,输出还在“还旧账”。

4.7 PI控制的局限

PI控制不是万能的。在车道保持中,它有几个死穴:

  • 对高频噪声敏感:积分会把噪声一起累积。
  • 参数适应性差:弯道和直道可能需要不同参数。
  • 无法预测未来:只能根据过去和现在控制。