4、I参数整定:积分项如何消除静差,以及积分饱和的坑

好,咱们接着聊PID。P参数调完了,你会发现一个很烦人的问题——静差

什么叫静差?说白了,就是你的系统永远到不了目标值。比如你让无人机悬停在10米高度,它死活停在9.8米,就差那0.2米,怎么推油门都不动。这就是静差。

为什么会这样?因为P控制是靠误差驱动的。误差越小,P的输出越小。当误差小到一定程度,P的输出已经不足以克服系统的摩擦力、阻力或者重力了。系统就卡在那儿,不动了。

这时候,就需要I项出场了。

4.1 积分项的本质:算旧账

P项是「看当下」,D项是「预测未来」,那I项呢?I项是「翻旧账」

它把过去所有的误差都累加起来。哪怕现在的误差只有0.01,只要它一直存在,积分项就会一直累积。累积到一定程度,输出就足够大,把系统推过那个坎。

用公式表达就是:

I_out = Ki * ∫(error) dt

这个积分,就是误差对时间的累积面积。误差一直存在,面积就一直增大,输出就一直增大,直到误差归零。

我个人习惯把I项理解为「耐心」。它不着急,但它一直在使劲。只要目标没到,它就慢慢加力,直到你到位为止。

4.2 积分消除静差的原理

咱们用个实际例子说明。

假设你调一个四旋翼的高度环。P项给了50%的油门,飞机停在9.8米。误差是0.2米。P项输出已经饱和了,再加大P只会引起震荡。

这时候加上I项:

  • 第1秒:误差0.2米,积分累积0.2
  • 第2秒:误差还是0.2米,积分累积到0.4
  • 第3秒:积分累积到0.6……

积分输出慢慢增加,油门从50%升到51%、52%……直到飞机升到10米,误差归零,积分停止增长。

你看,这就是I项消除静差的原理——用时间换精度

核心要点:I项不关心你现在的误差有多大,它只关心「这个误差存在了多久」。只要误差存在,它就持续输出,直到误差消失。

4.3 积分饱和:I项的暗面

嗯,这里要注意。I项虽然好用,但它有个大坑——积分饱和

我在项目中遇到过好几次,飞机起飞时高度环积分饱和,结果一上天就疯狂爬升,差点炸机。

积分饱和是怎么发生的?

想象一下这个场景:你的无人机在地面上,目标高度是10米。这时候误差是10米,非常大。积分项开始疯狂累积。但问题是,电机输出已经到100%了,再大的积分输出也加不上去了——输出被限幅了。

但积分还在累积!它不知道输出已经饱和了,它还在那里「哐哐哐」地累加误差。

等到飞机终于飞到10米附近,误差变小了,P项输出也降下来了。但这时候,积分项里已经累积了一个巨大的值。它需要很长时间才能「消化」掉这个累积值。

结果就是:飞机冲过10米,继续往上飞,超调很大,甚至震荡发散。

积分饱和的典型症状:

  • 启动时响应慢,一旦响应就严重超调
  • 系统从大误差恢复时,出现明显的「过冲」
  • 切换目标值时,系统反应迟钝

4.4 积分饱和的解决方案

怎么解决?我常用的方法有几种:

方法一:积分限幅

最简单粗暴的方法。给积分项设一个上限,不让它无限累积。

// 积分限幅示例
integral += error * dt;
if (integral > I_MAX) integral = I_MAX;
if (integral < -I_MAX) integral = -I_MAX;

这个I_MAX怎么设?我一般取输出限幅的20%-30%。比如输出限幅是1000,I_MAX就设200-300。

方法二:积分分离

当误差很大的时候,干脆不让积分工作。等误差缩小到一定范围内,再开启积分。

// 积分分离示例
if (fabs(error) < ERROR_THRESHOLD) {
    integral += error * dt;
} else {
    integral = 0;  // 误差太大,清零积分
}

这个阈值怎么取?我一般取目标值的5%-10%。比如目标高度10米,阈值就设0.5-1米。

方法三:抗积分饱和(Back-calculation)

这个方法更优雅一些。当输出饱和时,把多余的积分量反向减掉。

// 抗积分饱和示例
output = P_out + I_out;
if (output > OUTPUT_MAX) {
    integral -= (output - OUTPUT_MAX) * Kb * dt;
    output = OUTPUT_MAX;
}

这里的Kb是反馈系数,一般取1/Ki左右。这个方法我在飞控里用得最多,效果最好。

我的经验:初学者先用积分限幅,简单可靠。等你对系统有感觉了,再尝试积分分离或抗积分饱和。别一上来就搞复杂的,容易翻车。

4.5 I参数的整定方法

好了,原理讲完了,咱们说说怎么调。

我个人习惯的步骤:

  1. 先把I设成0,只调P,让系统稳定但有静差
  2. 慢慢增加I,每次增加20%-30%,观察静差是否减小
  3. 注意看响应速度,I太大会让系统变慢,出现「拖泥带水」的感觉
  4. 检查超调,如果出现明显的超调,说明I太大了

一个常用的经验公式:

Ki = Kp / Ti

Ti是积分时间常数。对于大多数飞控系统,Ti在0.5-5秒之间。Ti越小,积分作用越强。

我一般先设Ti=2秒,然后根据效果调整。

现象 可能原因 解决方法
静差消除慢 I太小 增大Ki或减小Ti
出现低频震荡 I太大 减小Ki或增大Ti
启动时超调大 积分饱和 加积分限幅或积分分离
响应迟钝 I太大或积分饱和 检查积分限幅,减小I

4.6 知识体系总览

下面这张图,把I参数整定的核心逻辑串起来了。你可以对照着看,心里有个谱。

I参数整定知识体系 积分项 I 消除静差 累积历史误差 克服系统摩擦/阻力 积分饱和 输出限幅后仍累积 导致超调/震荡 积分限幅 积分分离 抗积分饱和 整定方法:先P后I → 逐步增加 → 观察响应

这张图你看懂了吗?左边是I项的作用,中间是它带来的问题,右边是解决方案,底部是整定流程。调参的时候,你就对照着这张图来排查问题。

避坑指南:我曾经在调一个固定翼的俯仰环时,I参数设得太大,结果飞机一抬头就拉不回来,差点失速。后来加了积分限幅,问题就解决了。所以记住——I参数宁小勿大,小了只是静差消除慢点,大了可是会炸机的。

好了,I参数就讲到这里。你只要记住三件事:I项消除静差、积分饱和是坑、限幅和分离是解药。下节课咱们聊D参数,那个更刺激。


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