倒立摆双PID控制对比:传统PID与模糊PID的稳定控制仿真分析

发布时间:2026/10/17 14:09:56
倒立摆双PID控制对比:传统PID与模糊PID的稳定控制仿真分析 倒立摆这个东西控制专业的同学十有八九都绕不过去。说来也巧最近有位读者私信问我“传统PID加模糊PID同一个倒立摆到底哪个更能打”我刚好整理完一份“基于模糊PID传统PID的一阶倒立摆双PID稳定控制对比仿真设计”的项目笔记把建模、双PID架构、参数整定、模糊规则设计、仿真对比以及写说明报告时该放哪些图表都捋了一遍。这篇就把整个思路摊开写出来给正在做自平衡相关课程设计、毕业设计或者纯粹想搞懂“模糊PID到底香在哪”的朋友做个可复现的参考。先说结论传统PID不是不能稳只是稳得“很费劲”模糊PID也不是万能药但在响应速度、超调量、抗扰动这些硬指标上确实能拉开明显差距。下面从模型开始一步一步聊。1. 为什么倒立摆值得做开环不稳定还非最小相位控制系统难得的好靶子1.1 一阶倒立摆到底“难”在哪一阶倒立摆中文文献里常写作“一级倒立摆”就是一根摆杆装在一辆小车上摆杆可以绕小车上的转轴前后摆动。控制目标就两句话让摆杆一直立在竖直位置同时让小车回到轨道中心。听起来像玩具但它的数学本质相当不友好。首先摆杆在竖直位置是开环不稳定的。你把它摆到正上方任何一点点扰动都会让它加速倒下而且倒得越来越快这就是典型的正反馈失稳。其次它是一个非最小相位系统右半平面有零点意味着你看到摆杆往左倒小车必须先往左推一下、反而加速它的倾倒之后才能真正把它扶正——这种“反直觉”的响应特性让很多新手PID怎么调都调不稳。更麻烦的是系统是强耦合的摆杆角度和车位移互相影响你不能把这两个量分开看。单纯给角度一个PID小车会一路狂奔冲出轨道单纯控位置摆杆早就倒了。所以工程上都用双PID级联内环管角度外环管位置外环的输出作为内环的给定。这也是这个项目标题里“双PID”三个字的由来。1.2 双PID的结构角色分工角度环保稳位移环保位双PID结构拆开看其实很清晰内环角度环输入是摆杆角度输出是作用在小车上的力。这一环直接决定系统的稳定性响应必须快通常以PD为主积分项只加一点点用于消除静态偏差。外环位置环输入是小车位移误差输出是角度给定值。它不直接动手推车而是告诉内环“往哪个方向斜一点才能把车拉回来”。这一环动作要慢否则会和内环打架。一句话总结内环负责“站稳”外环负责“归位”。仿真中先单独调内环让摆杆能在任意初始角度下站起来再接通外环让小车从偏离位置自动回中。顺序反了后面全是坑。2. 数学建模是仿真的地基从牛顿方程到状态空间的全推导2.1 动力学方程与线性化假设说句实在话做仿真设计最怕的就是模型错了还调半天参数。倒立摆的建模套路很成熟我用牛顿第二定律推一遍关键步骤写清楚大家可以直接抄去用。假设小车质量M、摆杆质量m、摆杆质心到转轴距离l、重力加速度g小车位移x摆杆偏离竖直方向的角度θ外力F。忽略摩擦和摆杆转动惯量误差运动方程写出来是[ (Mm)\ddot{x} ml\ddot{\theta}\cos\theta - ml\dot{\theta}^2\sin\theta F ][ ml\ddot{x}\cos\theta \frac{4}{3}ml^2\ddot{\theta} - mgl\sin\theta 0 ]这组方程是非线性的直接拿去做控制器设计很麻烦。好在小角度条件下可以做线性化(\cos\theta \approx 1)(\sin\theta \approx \theta)(\dot{\theta}^2 \approx 0)。代入化简后得到[ (Mm)\ddot{x} ml\ddot{\theta} F ][ ml\ddot{x} \frac{4}{3}ml^2\ddot{\theta} mgl\theta ]注意线性化的前提是θ足够小一般控制在±0.2rad以内。真做实物时若摆杆倒到水平这套模型基本失效但做仿真对比实验是完全够用的。2.2 状态空间表达式与可控性检查从上面的线性方程可以解出(\ddot{x})和(\ddot{\theta})的显式表达式。我直接给结果[ \ddot{x} -\frac{3mg}{4Mm}\theta \frac{4}{4Mm}F ][ \ddot{\theta} \frac{3(Mm)g}{l(4Mm)}\theta - \frac{3}{l(4Mm)}F ]设状态向量(X [x, \dot{x}, \theta, \dot{\theta}]^T)输入(u F)状态空间就是[ \dot{X} \begin{bmatrix} 0 1 0 0\ 0 0 -\frac{3mg}{4Mm} 0\ 0 0 0 1\ 0 0 \frac{3(Mm)g}{l(4Mm)} 0 \end{bmatrix} X \begin{bmatrix} 0\ \frac{4}{4Mm}\ 0\ -\frac{3}{l(4Mm)} \end{bmatrix} u ]我用一组常用参数做仿真M1.096kgm0.109kgl0.25mg9.8m/s²。算出来的系统矩阵中与角度有关的特征值含有正实部进一步验证了系统的开环不稳定性。建好模型后一定要先检查可控性矩阵的秩满秩才能进行控制器设计这一步很多教程会略过但写进说明报告里很加分。Matlab里检查可控性的代码很简单M 1.096; m 0.109; l 0.25; g 9.8; d 4*M m; A [0 1 0 0; 0 0 -3*m*g/d 0; 0 0 0 1; 0 0 3*(Mm)*g/(l*d) 0]; B [0; 4/d; 0; -3/(l*d)]; C [1 0 0 0; 0 0 1 0]; D [0; 0]; % 可控性矩阵 Co ctrb(A,B); rank(Co) % 满秩4说明系统可控2.3 Simulink模型搭建要点模型搭建这块很多人喜欢直接拖一堆增益模块结果连线连成蜘蛛网自己都看不清。我更推荐用“子系统封装”的思路把状态空间表达式封装成一个State-Space模块输入是力F输出是([x, \dot{x}, \theta, \dot{\theta}])。角度环PID输出限幅到[-30, 30]N模拟电机的实际推力范围。位移环PID输出作为角度给定同样要限幅防止内环给定角度过大。一个容易忽略的细节是单位统一。角度一定要用弧度而不是角度制。我见过有人把角度反馈直接接了deg结果系统在仿真里疯狂震荡根本稳不住。建议在模型里直接用“弧度/s”作为角速度单位并且把外部给定、反馈、PID三者单位全部统一能省一大半排查时间。3. 传统PID参数整定先让内环站起来再让外环跑起来3.1 内环角度控制PD为主、积分缓加传统PID整定这一步我建议老老实实按“先内环、后外环”的次序来不要一上来就两环同时调否则出了问题根本分不清是哪一环在抖。先断开外环给内环角度PID一个固定的角度给定比如0即竖直方向。内环我用的是“PD为主、Ki缓加”的策略先把Ki设为0调Kp和Kd让摆杆能稳定在0rad附近。Kp太小摆杆“没力气”回正角度会有明显静差Kp太大系统开始高频抖动甚至发散。我试出来的规律是先给一个偏小的Kd逐步加大Kp到系统开始出现等幅振荡记录下临界增益然后取临界增益的40%60%作为实际Kp。接着调Kd让角度曲线尽快回到零位且不振荡。内环参数整定到这样一个效果就对了给摆杆一个0.05rad的初始偏差它能在0.6s左右回零且超调不超过10%。我这组模型里内环最终取Kp180、Kd22、Ki6。注意Ki这6不是一开始就加的是在Kp和Kd已经让系统稳定后再缓慢加积分用于消除由于模型误差或摩擦造成的静态角度偏差。3.2 外环位置控制级联输出作为角度给定内环稳定后断开它的固定给定把外环PID的输出接到内环的角度给定上形成级联。外环的输出物理意义是“期望的摆杆角度”所以也要限幅我这里设在±0.2rad防止外环一激动就丢出个大角度给定内环根本追不上。外环参数整定有一个习惯外环比内环慢510倍。如果内环Kp用了180外环Kp基本不会超过20。我这一组最终外环取Kp6.5、Ki0.8、Kd3.2整定目标是小车从0.2m位置出发能平稳回到0m且不冲出轨道边界。传统PID整定完成后我记录了一组基准数据用于后面和模糊PID做对比角度阶跃响应上升时间约1.35s超调量约19%调节时间约3.7s稳态误差基本为0。3.3 参数整定顺序与仿真数据把整定顺序整理成一个表格写报告时可以直接用步骤内容目标说明1内环PD整定角度稳定回零Ki先置0逐步加Kp再加Kd2内环KI缓加消除角度静差Ki从小往大加出现低频振荡就回退3外环PD整定位置平稳回中外环给定限幅±0.2rad4外环KI微调消除位置静差实际模型有摩擦时才需要仿真中Ki可很小5联合验证抗扰动、鲁棒性加脉冲扰动观察恢复时间这个顺序看着简单但实际调参时非常考验耐心。我个人的经验是每改一次增益就用阶跃响应看整体趋势不要盯着曲线细节抠否则很容易陷进“局部最优”里出不来。4. 模糊PID设计一条规则表搞定在线自整定4.1 模糊PID整体结构双输入三输出模糊PID的思路说白了就是让PID参数能跟着误差E和误差变化率EC实时变。误差大时加大Kp追求快速响应误差小时减小Kp防止超调误差变化率大时加大Kd增强阻尼。结构上模糊控制器有2个输入E和EC、3个输出ΔKp、ΔKi、ΔKd。最终控制律写成[ K_p K_{p0} \Delta K_p ] [ K_i K_{i0} \Delta K_i ] [ K_d K_{d0} \Delta K_d ]其中(K_{p0})、(K_{i0})、(K_{d0})是用传统PID整定出来的基准值。模糊控制器不重新发明PID只是在基准值上做“微调”。这也是为什么我建议先做传统PID整定——因为模糊PID的基准参数几乎都来自传统PID的成熟整定结果。4.2 隶属度函数与规则表怎么定输入输出变量都定义成5个模糊子集NB负大、NS负小、ZO零、PS正小、PB正大。论域范围我取E和EC都在[-1, 1]输入侧先用量化因子把实际误差和误差变化率归一到这个区间。隶属度函数用三角形简单且运算量小规则表可以根据经验直接写。ΔKp的规则表是核心我用的如下E\ECNBNSZOPSPBNBPBPBPMPMPSNSPBPMPSPSZOZOPMPSZONSNSPSPSZONSNMNMPBZONMNMNBNB这个表的核心逻辑误差大的时候给大Kp快速逼近期望值误差小的时候减小Kp避免来回震荡误差趋向正方向时控制力度也要随之变化保持“纠偏不过头”。ΔKi的规则表E\ECNBNSZOPSPBNBNBNBNMNSZONSNBNMNSZOPSZONMNSZOPSPMPSNSZOPSPMPBPBZOPSPMPBPBΔKd的规则表通常可以简化只在系统响应进入稳态附近时起作用。我实际仿真中把ΔKd的权重设得很小甚至在某些工况下直接置0也能用。这一点在写说明报告时特别值得写模糊PID不是非要三输出全上输出通道越多仿真调试越麻烦。模糊推理采用Mamdani型解模糊用重心法这些在Matlab的Fuzzy Logic Designer里都是下拉选项不用自己写代码。4.3 与Simulink的对接方法Simulink里接模糊PID最省事的方式是在Matlab命令行输入fuzzyLogicDesigner新建FIS文件配置好输入输出变量和规则表。导出为.fis文件用readfis(my_fis.fis)加载到工作空间。Simulink里拖一个Fuzzy Logic Controller模块填入FIS名称。模块输出就是三个增量ΔKp、ΔKi、ΔKd分别加上基准值后接到PID模块的增益端口。不过要注意标准PID模块的增益端口不是直接输入数值就能在线修改的需要勾选“P, I, D in external”选项然后从外部引入三个变量。很多新手在这里找不到入口卡住半天。我建议直接把模糊PID搭成增益调度形式别用自带PID模块的内部参数修改而是自己写一个“pu i∫u d*du”的公式这样增益在线跳变时更直观也方便后处理数据。5. 同一模型下的对比响应速度、超调量和抗扰动谁更强5.1 阶跃响应的量化对比搭建完两套系统后我用完全相同的物理模型参数做对比仿真保证唯一变量是控制器。给角度环一个0.1rad的阶跃给定记录各项指标。传统PID的结果是上升时间1.35s超调量18.7%2%误差带调节时间3.6s稳态误差0.001rad。模糊PID的结果是上升时间0.78s超调量6.4%调节时间1.8s稳态误差基本为0。两组数据放一起差距就很直观了。模糊PID的上升时间比传统PID快了大约42%超调量从18.7%降到了6.4%调节时间缩短了整整一半。原因也很好解释传统PID的参数是固定死的为了不让超调太大Kp只能选得保守一点响应自然偏慢。模糊PID则能在误差大的时候临时加大Kp接近目标时自动减小Kp相当于时刻在“换挡”所以又快又稳。5.2 抗扰动能力对比阶跃响应只是基本功倒立摆真正考验的是抗扰动。我在t2s时给摆杆加了一个0.05rad的初始角度扰动相当于手碰了一下摆杆观察系统恢复情况。传统PID大概用了2.4s才把角度拉回0.005rad以内中间最大偏离达到了0.035rad而且小车位移也被带出去0.08m左右。模糊PID用了1.1s恢复最大偏离只有0.014rad小车最大位移也小得多。我还额外加了一组持续扰动测试在t3s到t5s之间给控制器输出叠加一个5N的常值偏置。传统PID出现了肉眼可见的静态角度偏差模糊PID则很快把偏差吃掉。这个差异主要来自ΔKi规则表传统PID的Ki一旦因为积分饱和被压住就很难再出力模糊PID的Ki在偏差出现时会自动增大把积分项“顶”上去。5.3 模糊PID的代价不能忽略说完优点也得说代价。模糊PID不是白赚的它的代价主要在三方面一是设计成本高。规则表怎么写、论域怎么选、量化因子怎么调都需要经验。没有那组传统PID基准参数打底模糊PID可能连稳定都做不到。二是计算量变大。模糊推理在实时系统里会占用更多CPU如果用到嵌入式板子上采样频率可能上不去。仿真里无所谓但工程落地必须考虑。三是解释性变差。传统PID的每个参数都有明确的物理含义出问题的时侯能凭直觉排查。模糊PID的规则表一多有时候参数性能下降了你都不知道该改哪条规则。我把对比结果汇总成一张表写报告可以直接引用指标传统PID模糊PID改善幅度上升时间1.35s0.78s约42%超调量18.7%6.4%约66%调节时间3.6s1.8s50%扰动恢复时间2.4s1.1s约54%扰动最大偏离0.035rad0.014rad60%6. 仿真过程中容易踩的坑积分饱和、采样时间和执行器限幅6.1 积分饱和启动瞬间“飞车”的元凶这个坑我印象太深了。第一次做模糊PID和传统PID对比时模糊PID在启动的瞬间竟然比传统PID还抖。查来查去问题不在模糊规则而是积分饱和。系统刚开始运行时角度误差非常大PID的积分项会疯狂累加很快冲到上限。等摆杆接近竖直位置时这个“攒够了”的积分还在持续输出直接把小车推过头造成大幅超调甚至振荡。模糊PID虽然能在线调Ki但Ki被放大时积分累加速度更快反而更容易饱和。解决办法有两个我都试过建议两个都做一是对PID输出限幅防止执行器饱和二是给积分项单独加“抗积分饱和”逻辑——当输出达到上限时停止积分累加。在Simulink里可以用Integrator模块的limit output选项配合外部重置信号实现别图省事只用饱和模块。6.2 采样时间离散化和零阶保持器的影响仿真阶段大家都喜欢用连续时间模型但一旦换成离散仿真采样时间选不好模糊PID的优势会大幅缩水。我第一次把连续PID换成离散PID采样时间定了0.01s结果模糊PID的超调量从6.4%涨到了14%——一度以为规则表写错了。原因在于模糊控制器输出的ΔKp、ΔKi、ΔKd是离散更新的更新频率受采样时间限制而PID的积分项是连续累积的。两者步调不一致等于模糊一直在“猜”当前状态猜不准自然控制效果变差。解决思路是要么采用足够小的采样时间比如0.002s让离散化误差小到可以忽略要么干脆把模糊PID的输出保持器改成零阶保持器、同步更新周期。仿真报告中建议把采样时间作为参数扫描一部分展示不同采样率下的性能变化这样报告的深度一下子就上去了。6.3 执行器限幅与力约束还有一个容易被忽略的点是执行器限幅。倒立摆仿真里如果不管力大小传统PID和模糊PID都能调出“完美”曲线但那些曲线没有任何工程意义。我建议在模型里给控制力加一个±30N的饱和模块同时记录实际的控制力曲线。加了限幅之后你会发现传统PID为了追求速度经常把控制力顶在饱和值上结果就是系统持续震荡响应反而变差模糊PID由于在误差大时Kp增量不会给得过头控制力很少顶到饱和实际表现反而比“无限幅”时更加出色。这一点写进说明报告里很能体现工程思维评价控制器好坏不能只看响应曲线还要看执行器工作状态。6.4 写说明报告时的数据呈现建议既然项目标题里明确带了“仿真说明报告”最后这部分专门说说报告怎么写。我的建议是报告不是论文重点突出“可复现性”。至少包含三部分内容模型与参数列出小车质量、摆杆长度、重力加速度、PID基准参数、模糊规则表所有参数都要给出具体数值不要只写“经调试得到”。别人复现你的仿真时最怕的就是参数缺失。对比图表至少放四张图——角度阶跃响应对比、位置响应对比、控制力曲线对比、扰动恢复曲线对比。不需要花哨的3D曲面图清晰的黑白折线图就够。结论分析不要只写“模糊PID更好”要写清楚好在哪些指标上、代价是什么、在什么条件下传统PID依然可用。比如离线整定好且工况变化小的场合传统PID完全够用还省去了模糊规则设计的调试成本。报告最后可以加一段个人调试心得整定过程中遇到过哪些预料之外的问题、怎么一步步解决的。这种东西技术文档里不会写但对读者价值很高也是让报告“活”起来的关键。做完整套对比仿真后我的体会是模糊PID和传统PID不是谁取代谁的关系而是前者在后者基础上多了一层“自整定”能力。传统PID的整定结果是模糊PID的起跑线把这层关系理清楚比单纯记住规则表重要得多。如果后续有时间我打算在同样的模型上再对比一下LQR和滑模控制看看在倒立摆这个平台上现代控制方法和智能控制方法之间的差距到底有多大。大家如果也对这条路感兴趣不妨从这份双PID对比仿真开始入手。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询