PID 的花样:先看懂模糊 PID 和单神经元自适应 PID

PID 之外还有一堆名字:分段 PID、模糊 PID、自适应 PID、神经网络 PID、专家 PID。它们都在回答同一件事------Kp、Ki、Kd 这三个数,由谁、在什么时候决定。

下面只把两支最有代表性、也最容易自己动手写的讲透:一支把"调参经验"写进规则------模糊 PID ;一支让参数自己长------单神经元自适应 PID。

模糊 PID:把老师傅的调参手感,写成一套规则

为什么需要它

普通 PID 的参数是人试出来的。试参像炼丹:Kp 大了摆,加 Kd;Kd 放大噪声,又回头加 Kp......试到一套能用的,换一辆车、换个工况,又得从头来。

模糊 PID 的思路是:调参时有经验的人不是瞎试,他嘴上有一套话------"误差大,猛一点;误差在变小,收一点;误差快归零,别再加力"。把这一套话固化成规则,让机器自己按规则改参数,人不就解放了?

它的完整链路

模糊 PID 常做成"模糊自整定":输入是误差 e 和误差变化率 Δe,输出是三个参数增量 ΔKp、ΔKi、ΔKd,主控制器还是那个 PID。中间隔着四步:

① 论域与量化。 e、Δe 的真实范围各不相同,先各自映射到一个统一论域,比如 −3, 3。论域被分成几档,每档一个名字:负大 NB、负中 NM、负小 NS、零 ZO、正小 PS、正中 PM、正大 PB。

② 模糊化:算"属于哪档"的程度。 拿三角形隶属度函数举例:论域里某个值落在两档之间,就被拆成两个 0~1 的数,叫隶属度。e 映射后是 2.4,落在 PM 和 PB 之间,得到 0.6 属于 PM、0.4 属于 PB------隶属度可以理解成"它有多像这一档"。

③ 模糊推理:两两组合查规则表。 e 取它命中的档,Δe 取它命中的档,两两组合,去规则表里查该给什么。Kp、Ki、Kd 各有一张表,规则长这样(这里只摘 5 档示意,完整的常用 7×7):

text 复制代码
            Δe:  NB   NS   ZO   PS   PB
e:   NB        PB   PB   PM   PM   PS
     NS        PB   PM   PM   PS   ZO
     ZO        PM   PM   PS   ZO   NS
     PS        PM   PS   ZO   NS   NM
     PB        PS   ZO   NS   NM   NM

每个命中的组合都把"e 的隶属度 × Δe 的隶属度"累加到对应输出档上。

④ 去模糊:把一堆"档和隶属度"变成一个数。 用各档的隶属度对档位值做加权求和(重心式的意思),再反映射回真实范围,得到这一拍的 ΔKp、ΔKi、ΔKd。累加进参数,PID 按增量式出输出:

text 复制代码
kp += Δkp; ki += Δki; kd += Δkd;
output = kp*(e - e_pre) + ki*e + kd*(e - 2*e_pre + e_ppre)

它治什么病,代价是什么

它治的病是"手动试参没经验、工况又多变"。常见的小车直行验证里,两只电机转速不一致让车越走越偏;不调参时角度一路涨,接上模糊 PID 后,角度会收敛在一个小区间里来回飘。

代价也写在名字里:精度可能比精心调出来的普通 PID 低------它换来的是不用手调,不是更准。论域怎么分、规则怎么写,仍然靠经验;规则写少了等于没升级,写多了又难 debug。想入门,先把它的四步链路在代码里走一遍(量化 → 隶属度 → 两两查表 → 去模糊),比背概念有用得多。

单神经元自适应 PID:让参数自己长出来

为什么需要它

工厂里一台设备能跑几十年。零件会磨损、管道会腐蚀、换了备件......对象慢慢变了,出厂时调好的 PID 参数不再是当前的最佳。人不可能天天蹲在那里重调。

于是有人想:参数能不能自己在运行中调整? 这就是自适应 PID。

把增量式 PID 看成单个神经元

单神经元自适应 PID 最妙的一步,是重新看了一眼增量式 PID 的公式:

text 复制代码
Δu = Kp*(e - e_pre) + Ki*e + Kd*(e - 2*e_pre + e_ppre)

它分明就是"三个输入 × 三个权值求和":输入是 x1=e−e_pre、x2=e、x3=e−2e_pre+e_ppre,权值就是 Kp、Ki、Kd。这不就是一个神经元吗?树突收三个输入,权值乘完求和,轴突输出 Δu。

那"学习"发生在哪?权值不再由人钉死,而是按学习规则每一拍在线更新------让它在运行中自己逼近"当前对象该有的那组参数"。

神经元怎么学:有监督 Hebb 规则

神经元学习的通用套路是调权值:新权值 = 旧权值 + 学习速率 × 信号 × 输入。这里用的是有监督的 Hebb 学习规则------它是有监督 Δ 规则(拿输出和期望比、让误差变小)和无监督 Hebb 规则(同时活跃的联系被强化)的结合:既按误差修正,又能区分强化和弱化。

套到增量式 PID 上,三个权值各自独立更新:

text 复制代码
w_p += ηp * e * u * x1      // x1 = e - e_pre
w_i += ηi * e * u * x2      // x2 = e
w_d += ηd * e * u * x3      // x3 = e - 2*e_pre + e_ppre

ηp、ηi、ηd 是三个方向各自的学习速率;e 是误差,u 是当前输出,xi 是各自的输入。计算输出前,权值先归一化(w'i = wi / Σ|w|),再乘一个比例系数 K:

text 复制代码
u(t) = u(t-1) + K * (w'p*x1 + w'i*x2 + w'd*x3)

K 决定调整的快慢:越大跟得越快,太大系统会抖;对象时延变大时,K 必须调小才稳。

实际工程里还有个改进:人们发现权值的在线修正主要和 e、Δe 有关,于是把更新输入里的信号从 e 换成 e+Δe,收敛更利索。

它治什么病,代价是什么

它治的病是"对象会随时间漂、人没法反复重调"。代价也明确:多了三个学习速率和一个 K,调它们同样有门道;学习过程不保证收敛,参数可能越调越歪,要有上下限兜底。对小车上绝大多数"对象不变、能离线试出来"的场合,普通 PID 加前馈就够了------别为用而用。

其它花样,只给一句话分辨

  • 分段 PID(增益调度):人离线把工作点切成几段,每段预排一套参数,段间插值过渡------最省事,先上它通常最划算;
  • 专家 PID:把老手的"如果超调大就减 Ki、传感器掉线就进保护"这类判断写成规则库,由推理机选用------更像一套带整定的处置协议;
  • 更广义的神经网络 PID:让网络当控制器,或让网络输出 Kp/Ki/Kd------单神经元自适应,正是这条线里最简单的一号。

怎么挑

对象固定、能离线试:普通 PID + 前馈。工作点会变、规则你能写清:分段,再往上才是模糊。对象随时间漂:单神经元自适应,记得给权值设界。到专家系统和大网络那层,问题往往已经不是"调 PID"了。

最后橘猫说

PID 的花样,争的都是"三个参数由谁、在什么时候决定"。模糊 PID 把人嘴里的调参经验,变成论域、隶属度、规则表、去模糊这条完整流水线,输出参数增量;单神经元自适应 PID 把增量式 PID 看成一个三输入神经元,让权值按有监督 Hebb 规则在线长出来。前者把经验交给规则,后者把参数交给学习------都省了手,也都要为省下的那双手付代价。

说实在的,前馈 + PID 已经可以解决绝大部分问题了,如果还是不行,你不应该考虑修改 PID,而是想想结构和算法以及极端环境下有没有 bug 才对。

最后蜘蛛说

如果一种理论声称历久弥新,就像忒修斯之船,那它还是它吗,可能不是原本的它了吧,但是一定是更新的它

相关推荐
铅笔小新z1 小时前
【stm32】全彩led灯(PWM)
stm32·单片机·嵌入式硬件
澄纸气2 小时前
STM32 外部中断实战:对射式计数器和编码器计数器,两个实验跑通 EXTI
stm32·单片机·嵌入式硬件
2501_922639582 小时前
率能半导体 SS6286L直流双向马达驱动芯片:18V/7A,覆盖电子锁、玩具、无线充电、机器人四大应用场景
stm32·单片机·嵌入式硬件·硬件工程
铅笔小新z4 小时前
【stm32】PWM呼吸灯
stm32·单片机·嵌入式硬件
深圳老胡4 小时前
RTX 与其他 RTOS 操作系统的差异及优缺点分析
笔记·stm32·单片机·代码规范
happygrilclh4 小时前
LVGL 移植整体流程
stm32
Brilliantwxx6 小时前
【STM32】 RTC 实时时钟详解:从概念到预分频器
stm32·单片机·嵌入式硬件·mcu·bash
lhbweilai10 小时前
分析FreeRTOS内核对象API的源码实现(四)
c语言·stm32·单片机
inrichtt13 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件