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参数的整定方法
好了,原理讲完了,咱们说说怎么调。
我个人习惯的步骤:
- 先把I设成0,只调P,让系统稳定但有静差
- 慢慢增加I,每次增加20%-30%,观察静差是否减小
- 注意看响应速度,I太大会让系统变慢,出现「拖泥带水」的感觉
- 检查超调,如果出现明显的超调,说明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参数设得太大,结果飞机一抬头就拉不回来,差点失速。后来加了积分限幅,问题就解决了。所以记住——I参数宁小勿大,小了只是静差消除慢点,大了可是会炸机的。
好了,I参数就讲到这里。你只要记住三件事:I项消除静差、积分饱和是坑、限幅和分离是解药。下节课咱们聊D参数,那个更刺激。
公众号:蓝海资料掘金营,微信deep3321