资讯动态

一阶倒立摆双PID稳定控制:模糊PID与传统PID对比仿真全解析

发布时间:2026/10/21 22:03:40 来源:尧图企业网站定制
一阶倒立摆这个东西凡是学过控制原理的人多少都跟它打过照面。我第一次认真做它是在接手一个“基于模糊PID传统PID的一阶倒立摆双PID稳定控制对比仿真设计”题目的时候。说实话刚开始我想得挺简单——模型是现成的控制器是现成的无非是把两个PID接上去再套一个模糊整定跑几条曲线收工。真正动手才发现难点根本不在Simulink里怎么连线而在三个地方一是双PID为什么要分成内外环、哪个内哪个外二是模糊PID到底“模糊”在哪里规则表怎么写才不会一被追问就露馅三是对比仿真怎么做才能公平、说明书怎么写才能让人信服。这篇文章就把这三件事一次说清楚。无论你是正在做课程设计的学生还是想快速验证控制方案的工程师照着这套思路走至少能少踩一半的坑。1. 被控对象与控制任务一阶倒立摆到底在控什么1.1 模型与状态小车、摆杆和四个状态变量一阶倒立摆的物理结构并不复杂一辆小车在水平导轨上运动摆杆通过转轴安装在小车上小车受到水平控制力F。任务很直观——让摆杆保持竖直向上同时让小车停在希望的位置上。但如果要给这个系统做仿真就得先把数学模型写出来。忽略摆杆宽度和转轴摩擦的简化模型用下面两个方程描述[ (Mm)\ddot{x} b\dot{x} ml\ddot{\theta}\cos\theta - ml\dot{\theta}^2\sin\theta F ][ (Iml^2)\ddot{\theta} mgl\sin\theta -ml\ddot{x}\cos\theta ]其中各符号含义和我在仿真里用的典型参数如下表。这套参数在课程设计里非常常见换一组参数只会影响整定数值不会改变控制结构。符号物理含义数值M小车质量1.0 kgm摆杆质量0.1 kgl摆杆质心到转轴的距离0.25 mI摆杆绕质心的转动惯量0.006 kg·m²b小车运动阻尼系数0.1 N/(m/s)g重力加速度9.8 m/s²系统状态可以选取为四个小车位置x、小车速度(\dot{x})、摆杆角度(\theta)、摆杆角速度(\dot{\theta})。为什么要四个状态因为被控对象有四个积分环节——两阶机械运动对应两个位移量每个位移量都要有一阶速度量配套。控制器的任务就是根据这四个状态量的测量值计算出合适的小车水平力F。这个系统开环不稳定。直观上理解摆杆重心在转轴上方重力矩的方向是让摆倒下来而不是立起来所以平衡点附近的线性化模型一定有一个右半平面极点。这也是为什么不能用简单的比例控制保持稳定——单靠P项系统要么慢慢倒下要么来回晃震荡发散。必须要引入阻尼项也就是角度环里的微分作用。1.2 双PID的双环结构位置环为什么“寄居”在角度环之上所谓“双PID稳定控制”最常见的实现不是两个PID并联一起输出力而是串级结构内环是角度环输入摆角误差输出小车水平力F。外环是位置环输入位置误差输出“目标倾角修正量”(\theta_{ref})。通俗地说位置环的任务是告诉角度环“车偏了多少你要稍微往这个方向倾斜一点让我借惯性把小车身拉回来”。这个逻辑和你在马路上骑自行车是一个道理——你身体倾多少取决于你想往哪边转弯而你身体是否真的倾成了那个角度是另一个更快的内环调节过程。这样做的好处是职责清晰角度环保证“摆不倒”位置环保证“车到位”。如果让两个PID都直接输出力叠加它们就会在同一时间尺度上争夺执行器参数极难调甚至会出现位置环和角度环互相打架的情况——一个让小车往左加速另一个让摆杆往右回正结果是车没到位摆先倒了。还有个关键点内环带宽要高于外环。工程上常说“内环快外环慢”位置环的输出只是角度环的参考值它本身不直接参与高频摆动控制。在整定时也要遵循这个顺序先内后外。2. 传统双PID的参数整定内环PD先行外环PID跟进2.1 内环先摆稳PD是主控制器积分放后面传统双PID方案的第一步是先把角度环单独调稳。做法很简单断开位置环给角度环一个小的角度阶跃比如(\theta_{ref}0.1) rad然后用PD控制器驱动小车。我起始参考试的是(K_{p1}60)、(K_{d1}10)这个量级能让摆角在1秒内回到参考值附近。为什么内环积分要放后面因为摆立控制的核心诉求是快速响应。积分项会在瞬态过程中引入相位滞后摆杆还没到位积分已经积累了一大堆“历史欠账”等误差翻转方向时这些积分反而会推着摆杆继续往反方向走。更麻烦的是一旦控制力进入饱和积分继续累积解除饱和后输出会猛地往外甩——这就是经典的“积分饱和”。所以在Simulink里用自带的PID Controller模块时至少要勾选抗积分饱和选项我一般选back-calculation方式。内环整定有个判断标准给0.1 rad阶跃摆角响应没有明显超调或者超调不超过10%调节时间落在0.5到1秒区间内就可以认为内环合格。不用追求“极限快”因为小车加速度过猛时惯性力反而会冲击摆杆使摆角超调变大。稳比快重要。2.2 外环路程怎么加目标转角修正与位置收敛内环稳定后把外环位置PID接上。位置环的输出不是力而是角度参考增量(\theta_{ref})也就是说位置环输出的单位是弧度。这是初学者最容易糊涂的地方——你要时刻记得自己接的是串级结构两个PID输出量纲不同。外环整定我习惯从(K_{p2})开始从小到大逐步加。一开始取0.5位置响应慢但安全然后慢慢加到2.5左右观察小车是否能在3秒内到达0.2米的目标位置且整个过程摆角峰值不超过0.3 rad。这个过程中如果小车来回抖动就说明外环增益太大或者内环带宽不够需要先回去检查内环。位置环的微分项(K_{d2})用来抑制位置变化率我取的0.8积分项(K_{i2})放在最后0.5左右负责消除位置稳态误差。为什么积分放最后因为位置环本来就慢积分项在慢回路里不容易激起振荡但仍要控制在一以内太大会让小车“过冲—回退—再过冲”循环好一阵。最终我在这组模型参数下用过的传统双PID整定结果如下表供参考控制环输出方向KpKiKd内环角度环水平力 F (N)60210外环位置环角度参考 Δθref (rad)2.50.50.82.3 我踩过的整定误区整定过程里最容易犯的几个错我挨个说一遍。第一先调外环。位置环一开内环还没立稳外环给出大角度指令摆杆直接倒。正确顺序一定是先内后外。第二内环积分加太大。很多教材喜欢把PID三项都写满但摆立内环真的不需要很强的积分作用Ki取2左右够用了。我见过有人把内环Ki调到10结果摆杆稳定后还在缓慢“漂移”因为积分在不停修正一个本来就不大的稳态误差反而制造了新误差。第三把内环调得“过稳”。有人为了无超调把Kd1加得很大结果系统变得迟钝外环一切进去就发飘。内环只需要保证基本稳定和快速跟随剩下的事情要留给外环去处理。第四忽略带宽分层。外环如果调得太猛位置虽然是跟上去了但摆角全程在振荡这就是内外环时间尺度没有拉开的表现。外环的响应周期至少要慢内环两三倍慢不下来就先检查内环够不够快。3. 模糊PID的改造方案改内环、保结构、守公平3.1 “模糊PID”的正确定义自整定参数而不是另起炉灶题目里的“模糊PID”在绝大多数教材和课程设计里指的是“模糊自整定PID”而不是用模糊控制器把PID整个替换掉。两者的差别很大前者保留了PID的结构模糊推理只负责在线修正(K_p)、(K_i)、(K_d)三个系数后者是用模糊规则直接输出控制量本质上是一个模糊PD控制器。我强烈建议对比方案选前者理由只有一个公平。当传统PID和模糊PID共用同一套控制器框架、同一个被控对象时仿真结果的差异纯粹来自模糊逻辑那部分答辩时一句话就能说清“性能提升来自哪里”。如果换成直接模糊控制器人家会反问一句“你到底是换了控制器还是换了一种控制思想”——这就说不清了。具体做法是给内环角度PID加一个模糊修正层模糊推理以角度误差e和误差变化率ec为输入输出三个增量(\Delta K_p)、(\Delta K_d)、(\Delta K_i)然后叠加到基准参数上[ K_p K_{p0} \Delta K_p,\quad K_d K_{d0} \Delta K_d,\quad K_i K_{i0} \Delta K_i ]这里的(K_{p0})就是上一章整定出来的传统PID参数。模糊层只负责“微调”不负责“重来”。3.2 模糊化、论域、隶属度与量化因子设计模糊自整定器第一步是确定论域。倒立摆正常工作范围里角度误差一般不超过0.6 rad角速度不超过3 rad/s所以我用的论域如下变量范围处理e[-0.6, 0.6] rad量化因子 Ke10映射到 [-6, 6]ec[-3, 3] rad/s量化因子 Kec2映射到 [-6, 6]ΔKp[-0.3, 0.3]比例因子 αp0.05输出到实际修正量ΔKi[-0.5, 0.5]比例因子 αi0.08ΔKd[-0.2, 0.2]比例因子 αd0.02量化因子的作用是把物理量映射到模糊论域。比如角度误差0.3 rad乘上Ke10之后就是3正好落在论域中间偏大的位置。这个映射关系如果弄反了模糊控制器的灵敏度会完全不对——要么迟钝得像没加反馈要么敏感得来回乱跳。隶属度函数我用三角形七个语言值NB、NM、NS、ZO、PS、PM、PB。为什么不用高斯型因为三角形足够简单计算量小而且在仿真里精度差异完全可以忽略。我唯一做了一点微调把NS和PS的峰值向ZO方向收拢一点相当于在小误差区间加密档位让模糊控制器在小角度范围内更敏感。这个做法其实就是变增益思想——同样的7档在不同区间的分辨率不一样。在MATLAB里我是用fuzzyLogicDesigner旧版本叫Fuzzy Logic Designer或fuzzy命令先建好FIS文件然后在Simulink里拖一个Fuzzy Logic Controller模块直接引用这个FIS。注意不同版本MATLAB打开模糊设计工具的名称不一样但概念都是同一个。3.3 规则表设计的第一原则跟着误差趋势走模糊规则是整套方案里最值得花时间的地方。很多人拿到规则表就开始抄抄完也不知道为什么。其实核心逻辑就一句话误差大用力拉误差小轻轻扶误差变化快提前刹车。具体到(\Delta K_p)规则遵循的是“误差大增益大误差小增益小”的主调但同时要结合误差变化率。比如误差已经是正大误差变化率还在正向增大说明摆杆正在加速远离平衡点这时候要把Kp调到最大反过来误差正大但误差变化率是负的说明摆杆已经在回头Kp就不用那么猛否则会撞过头。我用的(\Delta K_p)规则表如下行是e列是ece\ecNBNMNSZOPSPMPBNBPBPBPMPMPSZOZONMPBPBPMPSPSZOZONSPMPMPMPSZONSNSZOPMPMPSZONSNMNMPSPSPSZONSNSNMNMPMZOZONSNMNMNMNBPBZOZONSNMNMNBNB(\Delta K_d)的规则逻辑相反误差大时负修正减小Kd让系统更果断误差小时正修正增大Kd加强阻尼防振荡。(\Delta K_i)只在误差小且变化慢时给正向修正用来消除稳态残差误差大时要么不变要么负修正防止积分饱和。规则表写完一定要做一步验证编译之后用模糊推理表面图Surface Viewer看一下输出是否连续光滑。如果表面出现明显尖刺说明某些规则之间互相冲突仿真里会出现不明原因的抖动排查起来很头疼。3.4 为什么先只模糊内环题目叫“模糊PID传统PID”那到底哪一环模糊、哪一环传统我的选择是内环模糊自整定PID外环保持传统PID。原因有三。第一倒立摆系统的不确定性主要集中在角度环。摆杆受到的突发扰动、角度大幅偏离平衡点这些情况都直接作用于内环内环最需要快速变增益位置环天生就是慢回路给传统PID足够的时间也能完成回中任务。第二保留一个传统PID环节对比组之间就有了“公共变量”。仿真结果出来之后你可以说“在位置环完全相同的情况下仅将内环改为模糊自整定系统性能就有明显提升”——这种结论比“我换了两个环、性能变了”更有说服力。第三模糊规则数量会爆炸。一个模糊PID内环要三条规则表Kp、Ki、Kd每个表7×749条规则如果外环也模糊还要再来49×3条规则调试工作量和出现异常的可能性都成倍增加。先只做内环是性价比最高的方案。4. Simulink仿真搭建从状态方程到可复现的模型4.1 把动力学方程变成框图推荐的建模范式Simulink里搭倒立摆的模型有好几种路子直接用积分器加Fcn模块、写S函数、用Simscape拖物理模型。我个人最推荐用MATLAB Function封装动力学方程理由是容易复用、出问题好排查。首先把动力学方程里耦合的(\ddot{x})和(\ddot{\theta})解出来。对前面那两个方程做代数消元可以得到显式表达式[ A (Mm)(Iml^2) - (ml)^2\cos^2\theta ][ \ddot{\theta} \frac{(Mm)mgl\sin\theta - ml\cos\theta\left(F - b\dot{x} ml\dot{\theta}^2\sin\theta\right)}{A} ][ \ddot{x} \frac{F - b\dot{x} - ml\ddot{\theta}\cos\theta ml\dot{\theta}^2\sin\theta}{Mm} ]注意这里(\ddot{x})的表达式中出现了(\ddot{\theta})所以在MATLAB Function里要先计算(\ddot{\theta})再计算(\ddot{x})顺序不能反。MATLAB Function里的核心代码可以写成下面这样function dx pendcart_dynamics(x, F, p) % x [x_pos; x_vel; theta; theta_vel] x_vel x(2); theta x(3); theta_vel x(4); A (p.Mp.m)*(p.Ip.m*p.l^2) - (p.m*p.l*cos(theta))^2; thpp ((p.Mp.m)*p.m*p.g*p.l*sin(theta) - ... p.m*p.l*cos(theta)*(F - p.b*x_vel p.m*p.l*theta_vel^2*sin(theta))) / A; xpp (F - p.b*x_vel - p.m*p.l*thpp*cos(theta) p.m*p.l*theta_vel^2*sin(theta)) / (p.Mp.m); dx [x_vel; xpp; theta_vel; thpp]; end对应的初始化脚本p.M 1.0; p.m 0.1; p.l 0.25; p.I 0.006; p.b 0.1; p.g 9.8; th0 0.1; % 初始摆角 0.1 rad ≈ 5.7 度 x0 0; % 初始位置 xInit [x0; 0; th0; 0]; % 初始状态在模型里我把这个函数放在一个MATLAB Function模块中输入是四个积分器的输出向量和控制器输出F输出是导数向量再接回积分器。四个积分器排成一条链xdd积分得xdxd积分得xthdd积分得thdthd积分得th。这样搭出来的模型结构清晰改参数只需要改初始化脚本。初始化脚本里可以顺便把PID参数和模糊规则文件都引用进来比如定义Kp060、Kd010这些变量Simulink的PID模块参数栏直接填变量名。这样换一组参数不用打开模型改模块属性跑仿真自动化程度高很多。4.2 五个藏在暗处的坑搭模型时我踩过不少坑这里分享五个最容易让人卡住的。第一个是代数环。如果动力学方程里的(\ddot{x})和(\ddot{\theta})互相代换Simulink会报代数环错误。解决办法就是上面那种显式解法——先把(\ddot{\theta})解出来再代进去算(\ddot{x})从数学上断开耦合。第二个是单位。角度单位必须全程用弧度。Simulink里三角函数模块默认是弧度制Scope里想看度数可以在信号后端接一个Gain模块乘以180/pi但控制器反馈路径上的角度信号千万别乘——我见过有人把0.1 rad的角度信号当10度反馈回去系统直接发散。第三个是微分噪声。裸用Derivative模块会对高频噪声无穷放大仿真里不明显但一旦你把随机噪声加入反馈通道或者后续做实物会非常痛苦。建议直接用PID Controller模块内部带滤波的微分项带宽参数N取20到100之间。N太小微分作用被严重削弱N太大又会把噪声放大回来。第四个是限幅与抗饱和。执行器力限幅放在小车输入处我用的±20 N。外环输出的角度参考限幅放在角度环设定值入口我用±0.5 rad。限幅位置如果放错了比如限在模糊输出之后、PID积分之前抗饱和逻辑就失效了。第五个是求解器。纯连续系统用ode45变步长没问题但只要你在控制回路里加了采样保持模块、或者PID是离散模式就得改定步长求解器。我的习惯是控制周期取0.01秒仿真步长取0.001秒也就是采样周期的十分之一精度和速度都比较合适。4.3 激励设计三件套阶跃、脉冲、持续力做对比仿真激励不能只有一个。我用三组典型激励分别考察不同性能维度第一组是基准阶跃。初始让摆在0.1 rad的偏角下释放位置目标在0.2秒时从0阶跃到0.2米。这一组主要看两种方案从静止到稳定跟踪的基本性能。第二组是脉冲扰动力矩。仿真到3秒时给摆杆施加一个0.5 N·m、持续0.2秒的力矩脉冲。这用来模拟摆杆受到突发撞击——比如碰了一下或者风突然吹了一下。重点看摆角最大偏离量和恢复时间。第三组是持续小车外力。仿真到6秒时给小车施加一个2N的持续水平拉力持续1秒后撤去。这组考察持续扰动下的位置偏置和撤力后系统能否自动回中。在Simulink里这三类信号用Step模块、Pulse Generator模块叠加就可以实现。关键是让两组控制器在完全相同的激励序列下运行初值、目标、扰动发生时刻全部一致对比才有意义。5. 对比维度、量化指标与报告写作5.1 三组对比实验的观测重点仿真跑完之后对比不能只看“曲线谁画得更好看”。三组实验分别要看不同的关注点初始释放那一组看摆角峰值。传统PID在0.1 rad初值下通常会有明显超调我的示例参数下摆角峰值大约到0.16 rad左右模糊PID因为有模糊层在小误差阶段自动收Kp、放Kd摆角峰值能压到0.12 rad以内。脉冲扰动那一组看的是摆角最大偏离和收敛节奏。力矩脉冲打下去之后传统PID需要大约1.5秒把摆角压回±0.02 rad的稳定带模糊PID因为误差变化率的模糊修正响应更快这个时间能缩短到1秒左右。这个差别很直观地证明了模糊自整定对瞬态阻尼的改善。持续力那一组看位置偏移和撤力回中。持续2N外拉力作用下小车会偏离目标位置一段距离撤力后能不能回到0。这组主要考验位置环的传统PID两组方案在最终稳态上差距不大但动态过程中摆角的“晃动幅度”会有区别——模糊PID会让整个回中过程更平滑。5.2 指标选择超调、调节时间、ITAE与控制力峰值曲线对比是定性判断指标计算是定量判断。报告里至少要算下面这几个指标指标定义对应观测点超调量(峰值-终值)/终值×100%位置阶跃响应调节时间进入±2%终值带后不再出去的时间摆角、位置稳态误差终值与参考值的差位置控制力峰值仿真期内执行器输出的最大值力信号ITAE(\int_0^T t |e(t)| dt)重点看角度误差动态过程综合质量ITAE这个指标值得单独说。它把时间权重乘在误差绝对值前面意味着“后期还存在的误差”比“前期存在的误差”更严重所以能很好地反映系统能不能快速收尾。传统PID在阶跃瞬态阶段误差大且拖尾ITAE往往明显偏高模糊自整定PID虽然初始反应差别不大但尾部收敛快ITAE数值下来一截。以我用的这组模型参数为例典型结果大致是位置超调从12%降到6%左右位置调节时间从2秒缩到1.5秒角度ITAE降低约30%控制力峰值基本相当。注意这些数字是这组参数下的示例结果换一组模型参数数值会变但趋势一致——模糊自整定在阻尼表现上的优势是结构性的。5.3 说明报告的结构与几张图怎么放说明报告别写成流水账我建议按这个结构来组织项目背景与任务描述。简单交代被控对象、控制目标、两种方案的提出动机一两页足够。被控对象建模。给动力学方程、参数表、线性化后的极点位置说明系统为什么开环不稳定。双PID控制方案设计。必须画一张双环控制框图——位置环输出角度参考给角度环角度环输出力给被控对象。这张图是全文的枢纽一定要画清楚。模糊自整定PID设计。放FIS结构图、论域表、隶属度函数图、规则表。规则表至少展示Kp那一张Kd和Ki的可以叙述规律并引用表。仿真与结果对比。三组激励对应的对比曲线加一个指标汇总表。结论。三条以内每条一句话比如“模糊内环在瞬态阻尼上优于传统内环”“两种方案稳态误差均已消除”“模糊方案控制力峰值未增加”这类可验证的结论。关于图片我最有体验的一点是不要直接截图Simulink里的Scope。Scope图默认底色深、线型杂、坐标刻度不统一放进报告观感很差。正确做法是用to workspace模块或导出功能把仿真数据导出来再用脚本统一绘图线宽、字体、图例、坐标范围全部保持一致。两条曲线放一张图里对比时间轴对齐横轴写“时间/s”纵轴写“摆角/deg”或“位置/m”图例写“传统双PID”和“模糊PID传统PID”。这样出来的图答辩老师一眼就能看懂。绘图的脚本很简单核心就是load数据和plottime tout; figure; subplot(2,1,1); plot(time, theta_trad_deg, b-, LineWidth, 1.5); hold on; plot(time, theta_fuzzy_deg, r--, LineWidth, 1.5); xlabel(时间/s); ylabel(摆角/deg); legend(传统PID, 模糊PID传统PID); grid on;这种图放两三张就够了——一张角度对比、一张位置对比、一张控制力对比。再多评委也看不过来。做完这套对比我最大的体会是倒立摆仿真项目的核心功力不在建模型而在“对比怎么做才不糊弄人”。两组控制器必须共用同一套被控对象、同一套初始条件、同一套扰动序列整定传统PID时留下的参数直接作为模糊方案的基准值模糊层只做修正最后把数据导出统一绘图、统一算指标。整个过程坚持“可复现”三个字你就会发现说明报告其实是水到渠成的副产品而不是最后临时拼凑出来的文档。如果你后面想把这个项目再往前推一步我建议把外环也改成模糊PID做一组“双模糊”方案一起对比看看位置环模糊化到底能带来多少额外收益。或者把仿真模型里的摩擦、间隙、传感器量化噪声都加进去让模糊方案在更恶劣的条件下接受考验——那会是一篇更耐看的进阶版报告。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑