PID算法(2)
PID算法的输出比喻为直升机的上升力,那么积分项最终抵消的是重力以及向下的阵风力,
一 如果到达100米稳定之后,此时积分项等于重力,之后,来了阵风而且阵风一直在,怎么处理,积分项是不是保持增加的值不变?
这个问题问到点子上了。如果阵风一直在,情况就变了——积分项不是保持不变,而是会稳定在一个新的固定值,正好等于对抗“重力 + 持续阵风”所需的力量。
让我详细解释这个关键区别。
首先,直接回答你的问题
如果阵风一直在:
-
积分项不会无限增加
-
积分项会稳定在一个新的、更大的固定值
-
这个新值 = 对抗重力(50) + 对抗持续阵风(假设10) = 60
为什么不会无限增加?
因为当系统达到新的平衡时,误差会变为0。
新稳态的建立过程
| 时间 | 高度 | 误差 | 积分项 | 升力 | 净力 | 说明 |
|---|---|---|---|---|---|---|
| t0 | 100 | 0 | 50 | 50 | 0 | 原稳态,无风 |
| t1 | 阵风开始(持续下压力=10) | |||||
| t1 | 95 | +5 | 50→51 | 50→51 | -9 | 被压下,升力不足 |
| t2 | 94 | +6 | 51→53 | 51→53 | -7 | 还在下降 |
| t3 | 93 | +7 | 53→56 | 53→56 | -4 | 下降变慢 |
| t4 | 92 | +8 | 56→60 | 56→60 | 0 | 达到平衡! |
| t5 | 92 | +8 | 60 | 60 | 0 | 稳定在92米? |
| t6 | 92 | +8 | 60 | 60 | 0 | ❗误差≠0 |
等等!这里有问题——虽然受力平衡了(升力=重力+阵风),但高度并没有回到100米,而是停在了92米,误差=+8。
问题:为什么高度没回到100米?
因为积分项只负责提供力量,不负责提供位置记忆。
在新的平衡点:
-
升力60 = 重力50 + 阵风10 ✓ 受力平衡
-
但高度92米,误差+8米 ✗ 位置不对
那积分项会不会继续增加,把高度推回100米?
会!这正是积分的神奇之处!
完整的持续阵风响应过程
阶段一:找到受力平衡点(t1-t4)
| 时间 | 高度 | 误差 | 积分 | 升力 | 运动 | 说明 |
|---|---|---|---|---|---|---|
| t1 | 95 | +5 | 50→51 | 51 | 下降 | 力不够 |
| t2 | 94 | +6 | 51→53 | 53 | 下降 | 还在降 |
| t3 | 93 | +7 | 53→56 | 56 | 下降变慢 | 接近平衡 |
| t4 | 92 | +8 | 56→60 | 60 | 停止下降 | 受力平衡 |
此时:升力=60,重力+阵风=60,停止运动,但高度=92米,误差=+8米。
阶段二:积分继续累加(t5开始)
关键来了:虽然停止了运动,但误差≠0!
| t5 | 92 | +8 | 60→61 | 61 | 开始上升 | 积分继续加 |
| t6 | 93 | +7 | 61→62 | 62 | 上升 | 升力>总阻力 |
| t7 | 94 | +6 | 62→63 | 63 | 上升 | 继续 |
| t8 | 95 | +5 | 63→64 | 64 | 上升 | 加速 |
| ... | ... | ... | ... | ... | ... | |
| t12 | 99 | +1 | 68→69 | 69 | 上升 | 接近目标 |
| t13 | 100 | 0 | 69 | 69 | 受力不平衡! | 到达目标 |
阶段三:新的稳态(t13以后)
在t13时刻:
-
高度=100米,误差=0
-
积分=69
-
升力=69
-
总阻力 = 重力50 + 阵风10 = 60
-
净力=+9!还在上升!
所以系统会继续上升,产生负误差,积分下降,最终稳定在:
积分 = 60,高度=100米
最终稳态的数学推导
设:
-
重力 = G = 50
-
持续阵风 = W = 10
-
总阻力 = G + W = 60
在最终稳态:
-
高度=100米 → 误差=0
-
升力 = 总阻力 = 60
-
升力 = 积分项(因为P=0,D=0)
所以:
积分项_最终 = 60
关键结论
| 情况 | 积分项变化 | 最终值 | 说明 |
|---|---|---|---|
| 阵风短暂 | 增加后减少 | 回到原值(50) | 只补偿临时扰动 |
| 阵风持续 | 增加到新值 | 稳定在新值(60) | 永久补偿持续负载 |
积分项的智慧:
-
它能自动区分临时扰动和持续负载
-
对临时扰动:暂时增加,扰动消失后回归
-
对持续负载:永久增加到新值,提供持续补偿
一个直观的类比:背包爬山
想象你在爬山(目标山顶):
-
平路(无风):
-
你背着10kg包(重力)
-
体力消耗稳定(积分=10)
-
-
遇到一段持续上坡(持续阵风):
-
需要更多体力
-
你开始喘气(积分增加)
-
找到新节奏后,稳定在更高体力消耗(积分=15)
-
但速度可能稍慢(高度略低?不,最终会恢复)
-
-
到达缓坡(阵风消失):
-
体力消耗降回10kg水平
-
关键是:你不会在上坡路段一直累加体力直到累死,而是会调整到新稳态——这正是积分项做的事。
实际工程中的处理
如果阵风一直持续,积分项会稳定在新值,不需要特殊处理。但要注意:
1. 确保积分项有足够范围
c
// 积分项要能覆盖最大可能的负载 #define MAX_INTEGRAL (MAX_OUTPUT / Ki) // 保证能提供最大所需力量
2. 考虑积分限幅
即使阵风持续,也要防止积分无限大:
c
if (integral > MAX_INTEGRAL) {
integral = MAX_INTEGRAL;
}
3. 监控系统能力
如果阵风太大,需要的积分超过物理极限:
c
if (integral >= MAX_INTEGRAL && error > 0) {
// 报警:系统能力不足,无法克服持续扰动
}
总结
如果阵风一直在:
-
积分项不会无限增加,而是会稳定在一个新的固定值
-
这个新值 = 对抗重力 + 对抗持续阵风所需的力量
-
系统最终能回到目标高度(100米),因为积分会一直累加直到误差为0
-
最终稳态时:误差=0,积分=新负载值,系统完美补偿持续扰动
这就是积分项的真正强大之处——它能自动学习并永久补偿任何持续存在的负载或扰动。
本回答由 AI 生成,内容仅供参考,请仔细甄别。
可见积分项跟多个因素相关,跟距离目标值的远近相关,跟阻止向目标值变化的阻力相关,当距离目标值越远,当外界阻力越大, 这个积分项就会越大,
积分系数是工程师主动设置的一个东西,主要跟阻力相关,跟初始值相关性不大
二 积分项的系数一旦确定,那么距离目标值越远那么积分项越大,那么说从不同的初始值开始那么积分项不是不一样大吗?
你的这个问题非常敏锐,确实触及了PID控制中积分项的一个核心特性。
简单直接的回答是:是的,从不同的初始值开始,积分项的最终稳定值是一样的,但它在过程中积累的“总量”确实不一样。
让我用一个具体的对比来解释这个看似矛盾的现象。
首先,我们区分两个概念
在讨论积分项时,容易混淆两个不同的量:
-
积分项的瞬时值:在某个时刻,积分项具体是多少
-
积分项的最终稳态值:系统稳定后,积分项固定在哪个数值
你的问题涉及到的是前者,而我们需要理解的是这两者的关系。
场景对比:从不同初始值开始
假设:
-
目标高度:100米
-
重力需要积分=50
-
没有外部扰动
-
同一个PID参数(Ki相同)
场景A:从50米开始
| 时间 | 高度 | 误差 | 积分累加 | 积分瞬时值 | 说明 |
|---|---|---|---|---|---|
| t0 | 50 | +50 | +50 | 0→50 | 开始累加 |
| t1 | 55 | +45 | +45 | 50→95 | 继续 |
| t2 | 60 | +40 | +40 | 95→135 | 累积 |
| ... | ... | ... | ... | ... | |
| t10 | 95 | +5 | +5 | 495→500 | 接近目标 |
| t11 | 98 | +2 | +2 | 500→502 | 更近 |
| t12 | 99 | +1 | +1 | 502→503 | |
| t13 | 100 | 0 | 0 | 503 | 到达目标 |
最终积分稳态值 = 50(因为重力需要50)
场景B:从80米开始
| 时间 | 高度 | 误差 | 积分累加 | 积分瞬时值 | 说明 |
|---|---|---|---|---|---|
| t0 | 80 | +20 | +20 | 0→20 | 开始累加 |
| t1 | 83 | +17 | +17 | 20→37 | 继续 |
| t2 | 86 | +14 | +14 | 37→51 | |
| ... | ... | ... | ... | ... | |
| t7 | 97 | +3 | +3 | 131→134 | |
| t8 | 98 | +2 | +2 | 134→136 | |
| t9 | 99 | +1 | +1 | 136→137 | |
| t10 | 100 | 0 | 0 | 137 | 到达目标 |
最终积分稳态值 = 50(还是50)
关键发现
| 场景 | 起始高度 | 过程中的最大积分 | 最终稳态积分 |
|---|---|---|---|
| A | 50米 | 503 | 50 |
| B | 80米 | 137 | 50 |
结论:
-
过程中:从越低的地方开始,积分项累积得越大(503 vs 137)
-
最终:不管从哪里开始,积分项都会衰减到同一个值(50)
为什么最终能回到同一个值?
这是因为积分项有自平衡机制:
从50米开始的例子
到达100米时,积分=503,但重力只需要50。多余的453从哪里来?从上升过程中累加的。
然后会发生什么?
-
积分=503 → 升力=503(远大于重力50)
-
直升机疯狂上升 → 产生巨大负误差
-
负误差让积分快速下降
-
经过多次震荡,最终停在50
从80米开始的例子
到达100米时,积分=137,多余的87同样会在后续震荡中消耗掉。
所以,初始位置只影响“超额积分”的大小,不影响最终稳态值。
一个直观的类比:充电电池
想象一个充电电池(积分项)给一个电机(执行器)供电,电机要提升一个重物(重力):
-
从低处开始(50米):
-
需要很长时间才能把重物提上来
-
电池一直在放电(积分累加)
-
到达目标时,电池电量很低(积分很大?等等,这个类比反了...)
-
让我换个更好的类比:
更好的类比:蓄水池与水泵
想象一个蓄水池(积分项)给水泵供电,水泵要把水抽到山顶的水库(目标高度):
-
从山脚开始抽(50米):
-
需要抽很长时间
-
蓄水池的水位会降得很低(积分累积很大负值?还是不对...)
-
实际上,积分项更像是水泵的功率记录:
| 起始位置 | 抽水时间 | 总耗电量(积分累积) | 最终稳定功率 |
|---|---|---|---|
| 山脚 | 长 | 大 | 维持流量所需功率 |
| 半山腰 | 短 | 小 | 同样维持流量所需功率 |
最终稳定功率是一样的,但总耗电量(过程中的积分累积)不同。
数学解释
积分项的变化:
dIdt=Ki×e(t)dtdI=Ki×e(t)
从起始到稳态的总积分变化:
ΔItotal=∫0∞Ki×e(t)dtΔItotal=∫0∞Ki×e(t)dt
这个总面积,不管从哪里开始,最终都会被后续的负误差抵消,直到:
Ifinal=负载KiIfinal=Ki负载
实际工程中的意义
这个特性带来几个重要的工程结论:
1. 积分项不需要初始化
不管你从什么状态启动系统,积分项会自动调整到正确的值。不需要告诉控制器“当前负载是多少”。
2. 启动位置越低,过程越剧烈
从50米启动比从80米启动:
-
积分项累积更大
-
超调更严重
-
震荡时间更长
这就是为什么工程师会设计软启动或积分分离——避免从极低位置启动时积分过度累积。
3. 积分限幅很重要
既然从不同起点会导致不同的积分峰值,我们需要:
c
#define MAX_INTEGRAL 500 // 保证从最低点启动也不会溢出
总结
回到你的问题:
从不同的初始值开始那么积分项不是不一样大吗?
是的,过程中的积分项峰值不一样大。
但最终的稳态积分值是一样的,都等于对抗持续负载所需的值。
这就像:
-
从北京开车到上海,和从天津开车到上海
-
过程中消耗的总油量不同
-
但到了上海后,怠速时的油耗是一样的
积分项的美妙之处在于:它自动记录了需要多少力量来对抗负载,而这个记录不受起始点影响,只取决于负载本身。
更多推荐


所有评论(0)