第1章:PID控制基础

各位同学好,我是老张。在无人车横向控制这个领域摸爬滚打了十来年,今天咱们来聊聊PID控制。说实话,PID这东西看着简单,但真正用好它,我踩过的坑可不少。

先说说我的理解。PID控制,说白了就是三个字:比、积、微。比例告诉你现在差多少,积分告诉你过去差了多少,微分则预测未来会差多少。三者配合,就能让车子稳稳地沿着车道走。

1.1 比例控制:最直观的反馈

比例控制,就是根据当前误差的大小,给出相应的控制量。误差越大,控制力度就越大。

核心公式: u(t) = Kp × e(t)

其中 e(t) 是当前误差,Kp 是比例增益

我在做车道保持项目时,一开始只用了比例控制。结果呢?车子在直道上还行,一到弯道就来回摆动,像个醉汉开车。为什么会这样?因为比例控制有个天生的毛病——稳态误差。

你想想看,如果车子刚好偏离了车道中心,比例控制会给出一个转向角。但这个转向角可能不足以完全纠正偏差,于是车子就停在了一个有偏差的位置上。这就是稳态误差。

我的经验: 比例增益Kp不能太大,否则系统会震荡。我一般从0.5开始试,慢慢往上调,直到系统开始出现轻微震荡,然后回调20%。

1.2 积分控制:消除稳态误差

积分控制,就是累积过去的误差。只要误差一直存在,积分项就会不断增大,直到把误差消除干净。

核心公式: u(t) = Ki × ∫e(t)dt

Ki 是积分增益

嗯,这里要注意一个坑——积分饱和。我曾经在一个项目中吃过这个亏。当时车子长时间停在原地,积分项不断累积,等车子重新启动时,控制量已经大到离谱,车子猛地一甩头,差点撞上护栏。

避坑指南: 积分饱和是PID控制中最常见的坑之一。解决办法是限制积分项的最大值,或者在误差过大时暂停积分。

1.3 微分控制:预测未来

微分控制,说白了就是看误差的变化趋势。如果误差在快速增大,微分项就会给出一个较大的控制量,提前抑制误差的扩大。

核心公式: u(t) = Kd × de(t)/dt

Kd 是微分增益

我记得有一次调试无人车,在高速弯道上,比例和积分控制都调好了,但车子过弯时总有点滞后。加了微分项之后,车子就像提前知道了弯道一样,转向动作变得非常平滑。

我的建议: 微分项对噪声非常敏感。如果传感器信号有抖动,微分项会把噪声放大。我一般会在微分项前面加一个低通滤波器。

1.4 PID参数整定方法

参数整定,说白了就是找到三个合适的Kp、Ki、Kd值。我常用的方法有两种:

试凑法

  1. 先调Kp,让系统稳定但允许有稳态误差
  2. 再加Ki,消除稳态误差
  3. 最后加Kd,改善动态响应

Ziegler-Nichols法

  1. 先把Ki和Kd设为0
  2. 增大Kp直到系统开始等幅震荡,记录此时的Kp(称为临界增益Ku)和震荡周期Tu
  3. 按表格计算参数
控制器类型 Kp Ki Kd
P 0.5Ku - -
PI 0.45Ku 1.2Kp/Tu -
PID 0.6Ku 2Kp/Tu Kp×Tu/8

1.5 数字PID实现

在实际的嵌入式系统中,我们用的是数字PID。说白了就是把连续的积分和微分用离散的方式近似。

// 位置式PID
float pid_update(float setpoint, float measurement) {
    float error = setpoint - measurement;
    
    // 比例项
    float p_term = Kp * error;
    
    // 积分项(带抗积分饱和)
    integral += error * dt;
    if (integral > integral_max) integral = integral_max;
    if (integral < -integral_max) integral = -integral_max;
    float i_term = Ki * integral;
    
    // 微分项
    float derivative = (error - last_error) / dt;
    float d_term = Kd * derivative;
    
    last_error = error;
    
    return p_term + i_term + d_term;
}

1.6 抗积分饱和

前面提到了积分饱和的问题。这里详细说说怎么处理。

三种常用方法:

  • 限幅法: 直接限制积分项的最大值
  • 积分分离法: 误差过大时暂停积分
  • 反计算法: 当输出饱和时,反向调整积分项

我个人最常用的是限幅法,简单有效。但要注意,限幅值不能设得太小,否则积分项起不到作用。我一般设为最大控制量的20%-30%。

我曾经踩过的坑: 有一次把积分限幅设得太小,结果车子在长上坡路段一直有稳态误差,怎么都消除不了。后来把限幅值放大了一倍,问题就解决了。

知识体系总览

下面这张图展示了PID控制的核心逻辑和各个部分之间的关系:

PID控制知识体系 设定值 误差 e(t) 测量值 PID控制器 比例 Kp 积分 Ki 微分 Kd 控制量 u(t) 被控对象 抗积分饱和 参数整定方法

这张图把PID控制的核心流程都串起来了。从设定值和测量值得到误差,误差进入PID控制器,经过比例、积分、微分三个通道的处理,求和后得到控制量,再去控制被控对象。同时,积分项需要配合抗积分饱和机制,而参数整定方法则指导我们如何找到合适的Kp、Ki、Kd值。

好了,这一章的内容就到这里。PID控制虽然基础,但它是无人车横向控制的基石。把这一章吃透了,后面的内容就好办了。


公众号:蓝海资料掘金营,微信deep3321