2.1 PID
2.1 PID
Sarzn何为控制; 为什么要控制
從一般意義上說,控制是指控制主體按照給定的條件和目標,對控制客體施加影響的過程和行為。
开环与闭环
开环控制是最朴素的控制, 闭环控制是引入了反馈量的控制模式
一个经典的例子是, 一个电机在旋转, 如果开环控制, 因为他没有反馈的获取, 所以如果你用手抓住它, 电机不知道它被抓住了, 电机的力不会改变, 电机就会被你给抓停; 对应的, 如果是闭环控制, 电机会获得一个阻力变大了的反馈(严格来说是转速变低了), 电机就知道自己被挡住了, 于是根据这个反馈值加大它转动的力度, 实现就算你抓住了它, 它也能继续转动的效果
理解PID
你是超人,手里(隔空)托着一个 1kg 的物块。你唯一能操纵的量是你手臂的力 F
这个力 F 就是控制系统里的控制量, 执行机构是你的手臂, 被控系统是物块, 而物块的位置, 速度是它的系统状态
你想让物块去到某个位置或者稳稳悬停住, 但你不能直接设定位置, 只能通过不断的调 F 来间接实现. 这就是控制问题的本质, 你能控制的东西(F)和你想要的结果(位置)之间隔着一层物理
物块 1kg, 我们来受力分析看看:
- 重力
- 空气阻力
(系数 k 取-1) - 手臂力
牛二:
代入 m=1kg , G=-10N, k=-1
物理宏观世界中运动是连续的, 求速度和位置需要使用积分, 也就是利用逼近思想, 假设极短时间以内, 比如 0.1s内, 加速度, 速度, 位置都是可以求得的
也就是说每 0.1s 更新一次系统, 因此第 i 次更新的系统物块的各个状态是这样的:
这就表明, 如果给出物块的初速和初位置, 那么我们只需要 F 就能控制这整个系统了
PID的三个参数
P 控制器 - Proportional, 比例
感性认知: 离目标越远, 我 P 控制器的输出越大
: 当前的第 i 时刻 : 在第 i 时刻, 我的目标 : 在第 i 时刻, 我的位置 : 在第 i 时刻, 我离目标的距离 : 是要手动调节的 p 控制器的参数 : 在第 i 时刻 p 控制器的输出值
根据如上公式可以看出, 如果离目标值越远(error 越大), 那么我的输出就会越大(P_i 越大); 如果目标值越近(error 越小), 那么我的输出就会越小(P_i 越小)
现在我们要控制这个物块的位置, 观察式子我们会发现, P 控制器的输出是由 error 的值决定的.
- 在
取到一些合适的值(<临界值)的时候, 系统呈现渐进稳定的状态. 在这种情况下: 系统会最终稳定到一个值, 我们称此时的系统状态为: 稳态(注意, 在数学上这仍然是渐进稳定, 但在工程上, 由于残差小到测不出, 我们认为这就是稳定静止不动), 此时重力和手臂的力相互抵消, 物块静止 - 在
取到一个临界值(=临界值)的时候, 系统呈现临界稳定的状态. 在这种情况下: 系统会在 target 两侧来回震荡永不停息 - 在
取到特别大的值(>临界值)的时候, 系统呈现发散的状态. 在这种状态下: 系统会离 target 越来越远, 整个物块跑飞了seeyou lala
假设我们的物块到了预定的位置 target, 按理来说我应该保持手臂的这个力道让物块静止在 target 位置才对. 但是这时候 error 为 0, 所以 P 控制器的输出为 0, 即手臂出力为 0. 由于重力的作用, 物块仍然会往下掉落.
这就表明, 单凭 P 控制器我们永远也无法让物块达到 target 的位置, 因为一旦物块达到 target, P 控制器的输出就为 0 了, 物块就又会往下掉落.
所以我们如果只试用不同的 P 参数, 我们只能让物块的稳态点无限的趋近于 target, 但却达不到 target, 这就是误差. 由于此时物块是稳态, 于是我们叫这种物体处于稳态时, 还与 target 相差的值为稳态误差值
那物块会平衡在哪里呢? 物块要静止,合力必须为零,即手臂必须持续出
所以通过上面的公式你也能看出, 在只控制 P 参数的时候, 稳态误差 只能减弱不能消除
其实上面的话严格来说是不对的: 因为这句话只在维持目标状态需要非零控制输出时成立(这里就是有重力这个常值扰动)被控对象若是纯积分环节且无常值扰动,P 的稳态误差就是零
刚刚我们说到控制物块的位置, 现在我们将对象转变一下, 如果我们去控制物块的速度呢? 参照下面的仿真器, 试着在评论区讲出控制速度时的各种情况
I 控制器 - Integral, 积分/累加
感性认知: 稳态时达不到目标? 我让这个值随时间再加上去!
: 当前的第 i 时刻 : 第 i 时刻与 的差距 : 前 i - 1 时刻的 总和 : 前 i 时刻的 总和 : 是要手动调节的 i 控制器的参数 : I 控制器的输出值
于是我们总共的手的力道
I 为什么能把稳态误差消减成 0?
假设系统进入了稳态, 也就是 x 不再变化
如果此时误差
所以稳态下唯一的可能是 error = 0.
这时
观察下面的仿真器, 带你更好的理解这个过程
D 控制器 - Derivative, 微分/差分
感性认知: 要是我们能够预判, 知道快到目标了就提前减速, 这样就不会超调了. 那我怎么知道快到目标了呢? – error 一次比一次小就是快到了, 这时候把输出提前减下来就好了
: 当前的第 i 时刻 : 第 i 时刻与 的差距 : 第 i - 1 时刻与 的差距 : 与 的差值 : 是要手动调节的 D 控制器的参数 : D 控制器的输出值
于是我们总共的手的力道
其实说 D 控制器是预判还是有点不对的, D 控制器更像是一个减震器, 增加了系统的阻尼 感觉上是把震荡给压下去了
观察下面的仿真器, 带你更好的理解这个过程
调参顺序
- 先调 P:从小往大加,调到响应够快、开始出现轻微振荡为止
- 再加 D:把振荡压下,同时噪声一大就往回收
- 最后加 I:慢慢往上加直到稳态误差消失,加多了会加重超调和拖长沉降时间
| 物理角色 | 解决 | 副作用 | |
|---|---|---|---|
| P | 弹簧 | 把物块拉回来 | 消不掉稳态误差 |
| I | 补常值扰动 | 稳态误差归零 | 超调大、沉降慢、易失稳 |
| D | 阻尼器; 减震器 | 压振荡, 抬高 I 的上限 | 放大噪声、微分冲击 |
除此之外有关 PID 还有许多常见的补充算法
积分限幅: 当
绝对值超出某给定值 时, 符号不变, 绝对值恒等于 这一定程度上防止积分过大系统失控或输出过高损坏设备
积分分离: 需要一个
分离阈值参数 当 大于某给定值 时, 和 保持为 0 不参与计算 防止积分过大导致严重超调问题
变速积分: 需要两个
区间参数 A, B 以及一个把 [A, B] 映射到 [0, 1] 的单调减函数 需要额外乘一个系数 当 绝对值大于某给定值 B 时, k = 0 当 绝对值小于某给定值 A 时, k = 1 当 绝对值在 [A, B] 时, k 以某种函数形式从 1 减小到 0, 一般情况下线性函数即可 防止积分过大导致严重超调问题
微分先行: 把原本
的差值变成当前值的反向差值 加快系统响应速度, 避免过度提前预判导致减速 适合用于给定指令频繁升降的场合, 可以避免指令的改变导致超调增大
输出限幅: 需要一个幅度限制参量
当输出值绝对值超过某给定值 时, 绝对值恒等于 一定程度上防止输出过高损坏设备, 也算尊重现实
目前我们只关注了位置这一个目标, 但是速度呢? 所以除此以外还有多环 PID 和 前馈算法等等🧀, 我们以后再聊









