恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
从PID到LQR:二级倒立摆Simulink仿真对比与控制器设计全解析
首页
资讯中心
/
从PID到LQR:二级倒立摆Simulink仿真对比与控制器设计全解析
从PID到LQR:二级倒立摆Simulink仿真对比与控制器设计全解析
发布时间:2026/9/17 18:55:13
1. 为什么拿二级倒立摆练手控制算法的高下之分直线二级倒立摆是控制理论里面最常用来“见真章”的对象。一级倒立摆你靠PD加个前馈就能稳定住但换成二级倒立摆很多在单级上表现不错的方案一下子就失灵了。它比一级难一个数量级又比三级倒立摆克制一点所以自动化专业的研究生课程设计、本科综合实验、毕业设计里基本都会拿它当标准考题。这个题目的核心任务很明确用LQR最优控制和传统PID控制分别去镇定同一套被控对象放到Simulink里做仿真对比然后从调节时间、超调量、抗干扰能力这些维度把两种算法的差距讲清楚。我第一次完整跑完这个课题的时候印象最深的一件事是LQR调好权重矩阵之后六维状态反馈像一把精确的尺子角度一偏离所有状态一起动而PID那边哪怕我把三个环的参数按经验反复试凑上摆杆还是会缓慢漂移最后干脆倒下去。这不是PID本身没用而是二级倒立摆这种强耦合、开环不稳定的多变量系统天然就超出了“单回路逐环整定”的舒适区。Simulink仿真的价值在于你不需要真的买一套固高实验平台也能把整个设计链路走通。从线性化状态空间模型搭建、能控性判定到LQR的Q、R矩阵调参再到PID多环结构的参数整定每一步都能用MATLAB脚本配合Simulink模型复现。对我来说这个课题最大的收获不是学会了某个函数而是搞清楚了“为什么LQR适合多变量系统而PID在多变量场景下局限在哪里”。下面我把完整过程拆开讲适合正在做课程设计、准备复试项目或者单纯想搞懂两种控制器本质区别的读者。1.1 一级到二级的难度跨越不是多了一根杆那么简单很多人觉得二级倒立摆就是在一级倒立摆上面再接一根杆难度最多是翻倍。实际上完全不是这么回事。一级倒立摆只有一个不稳定模态系统的相对阶低你用PD控制就能在平衡点附近稳稳站住。二级倒立摆多了一根铰接连杆系统开环极点里会出现两个右半平面实极点不稳定模态从一个变成两个而且两个摆杆之间通过铰链强耦合下摆一动上摆跟着晃上摆的角速度又反过来影响下摆。这个本质区别直接决定了控制器设计的思路你不能再指望“一个回路管一个变量”因为两个角度互相纠缠任何一个回路的输出都会成为另一个回路的扰动。PID的经典设计哲学是“单输入单输出、逐环击破”面对二级倒立摆这种天生耦合的系统多环PID只能在折中里打转。而LQR的做法是直接建立包含全部状态变量的状态反馈律每个状态都参与控制量的计算从结构上绕开了耦合问题。在做仿真之前的建模阶段还要注意系统是非线性的存在sin、cos项。绝大多数课程设计和论文里的做法是在竖直向上平衡点附近做线性化处理用雅可比矩阵得到线性定常系统。这个线性化范围是LQR和PID都能表现的“舒适区”一旦初始角度偏差超过10度线性控制器基本都会失效仿真发散是常事。后面我会专门讲发散排查这里先记住一个结论所有控制器的参数都是基于线性化模型设计的所以仿真初始条件不要给得太极端。1.2 建立状态方程把物理对象变成数学对象做仿真之前必须先拿到系统的状态空间表达式。直线二级倒立摆的物理构成是一个小车在导轨上水平运动小车上铰接一根摆杆摆杆顶端再铰接第二根摆杆。取状态变量x小车位移θ1下摆杆与竖直方向的夹角θ2上摆杆与竖直方向的夹角x_dot、θ1_dot、θ2_dot对应的速度与角速度控制输入是小车驱动力F输出通常取位移x和两个角度。推导过程可以用牛顿力学也可以用拉格朗日方程。我推荐拉格朗日因为二级摆的约束关系比较复杂牛顿法列方程时铰链反力很容易算错拉格朗日方程直接通过动能和势能求导得到出错率低很多。以常见教学实验平台的参数为例参数数值含义M1.096 kg小车质量m10.103 kg下摆杆质量m20.130 kg上摆杆质量L10.398 m下摆杆长度L20.458 m上摆杆长度l10.199 m下摆质心到转轴距离l20.229 m上摆质心到转轴距离J10.00137 kg·m²下摆转动惯量J20.00196 kg·m²上摆转动惯量b22.915小车摩擦系数g9.8 m/s²重力加速度把这些参数代入拉格朗日方程在θ10、θ20处线性化就能得到标准形式x_dot A x B u其中A是6×6的系统矩阵B是6×1的输入矩阵。A矩阵里最右侧是速度项的单位阵左上角那部分会同时出现重力项和耦合项典型的开环特征值里有两个正实根。计算特征值可以用MATLAB的eig(A)命令仿真前务必先看一眼确认模型的确定不稳定并且不稳定模态的数量是2否则后面控制器设计可能白做。写到这里顺便提一句做课程报告时模型推导部分不要把拉格朗日方程的每一步都抄上去。正确的写法是给出系统动能和势能表达式列出拉格朗日方程说明线性化方法最后直接给出A、B矩阵的数值结果。导师想看的是你懂这个推导逻辑而不是你抄了十页公式。2. LQR的完整设计链路从能控性判定到加权矩阵调参LQR的完整名字叫线性二次型调节器它的目标函数是J ∫(xᵀQx uᵀRu) dt这条式子看起来简单理解起来要抓住两个关键点Q矩阵惩罚状态偏差R矩阵惩罚控制量。Q选得越大系统越“着急”把状态拉回零点响应快但控制力猛容易超调甚至饱和R选得越大系统越“舍不得”用控制力响应变慢但执行机构压力小。LQR的任务就是在Q和R的权衡下求出一个最优状态反馈增益K让控制量u -Kx。设计链路分三步走先验证系统能控再选Q、R最后用lqr函数计算K矩阵回到Simulink里验证闭环响应。2.1 能控性与能观性设计前必查的两件事很多教程会跳过这一步直接调参但我觉得这个环节必须做原因是它能帮你快速发现模型建错了没有。用MATLAB算一下A [...]; % 6x6状态矩阵 B [...]; % 6x1输入矩阵 C [1 0 0 0 0 0; 0 1 0 0 0 0; 0 0 1 0 0 0]; D zeros(3,1); % 能控性矩阵 Co ctrb(A, B); rank_Co rank(Co); % 能观性矩阵 Ob obsv(A, C); rank_Ob rank(Ob);如果rank(Co)不等于6说明系统不完全能控这时候LQR设计出来的结果可能只能镇定部分状态。如果rank(Ob)不等于6说明输出观测不到部分状态状态反馈设计需要额外考虑观测器。直线二级倒立摆的标准模型里这两个秩都是6但如果参数写错、或者线性化时把耦合项丢了秩就可能会掉。我遇到过有人把B矩阵符号弄反结果rank算出来只有5后来发现是拉格朗日方程里广义力的方向取错了。这步的意义在于它把“我的模型对不对”这个抽象问题变成了一个可以量化的数学检验。做仿真之前花两分钟跑一下这个脚本能省下后面排查发散的大量时间。2.2 加权矩阵Q和R的调参逻辑Q矩阵最常用的取法是对角阵对角线每个元素对应一个状态变量的惩罚权重Q diag([q1, q2, q3, q4, q5, q6]); R 1;这里最难理解的是q1到q6怎么定。我的经验是遵循两个原则。第一物理量纲差异决定了权重必须拉开差距。小车位移是米级别的量角度是弧度级别的量速度又是另一个尺度如果不做归一化都取1那LQR会把重心放在数值大的状态上角度偏差根本得不到有效惩罚。所以通常角度对应的权重会比位移大一个数量级以上。第二先取极端值看趋势再逐步收窄。比如你先取Q diag([1000, 10000, 10000, 0, 0, 0])、R 1跑仿真看角度响应如果角度恢复太快但位移震荡严重就加大q1如果控制量波动太大就适当增加R。这个过程就是最优控制的“调参手感”和PID整定里的经验试凑本质一样只是LQR把试凑对象从kp、ki、kd变成了矩阵元素。一个比较稳的起点是Q diag([5000, 20000, 30000, 0, 0, 0]); R 1;速度项的权重通常可以先设0因为你惩罚的是“状态偏离零点”的程度速度最终也会被角度和位移的闭环动态间接约束。如果仿真里速度响应太剧烈再把q4、q5、q6逐个往上加。2.3 计算K矩阵并验证闭环极点和响应选定Q、R之后MATLAB一行命令就能求出反馈增益K lqr(A, B, Q, R);得到的K是一个1×6的行向量分别对应x、theta1、theta2、x_dot、theta1_dot、theta2_dot这六个状态的控制系数。把K带回闭环系统Acl A - B*K; eig(Acl)这时候闭环特征值应该全部落在左半平面而且主导极点的位置直接反映了系统的动态品质。两个典型实部的距离越大响应越快但控制量越大距离越小响应温和但恢复时间拉长。LQR的优势在这里就很清楚了你不需要像PID那样关心每个回路单独的参数而是用Q、R两个矩阵统一表达“状态误差重要还是控制能量重要”剩下的最优化求解交给算法。这不是说LQR不需要经验而是它的调参维度更结构化面对多变量系统时不会陷入“调了角度环就崩位置环”的循环里。3. 传统PID如何处理二级倒立摆这种多变量系统既然要对比就得把PID方案也实实在在做出来。二级倒立摆只有一个控制输入小车驱动力但需要同时镇定三个输出位移、下摆角度、上摆角度这是典型的“多输出单输入”欠驱动系统。用PID做这种系统经典做法是摆出多环级联结构用多个PID控制器的输出叠加成最终控制量。3.1 多环级联结构不是三个独立PID拼起来那么简单常见结构是三个回路并联上摆角环负责稳定theta2下摆角环负责稳定theta1位置环负责稳住小车位移。三个回路各自输出一个控制分量叠加之后作为小车驱动力。u u1 u2 u3 u1 kp1*(theta2_ref - theta2) - kd1*theta2_dot # 上摆角环 u2 kp2*(theta1_ref - theta1) - kd2*theta1_dot # 下摆角环 u3 kp3*(x_ref - x) - kd3*x_dot # 位置环不要在仿真里真的用三个独立的PID模块并行叠加大信号那样很容易饱和而且三个积分环节累积误差会互相打架。很多教材和课程报告里用的是PD加少量积分的结构让内环负责快速镇定角度外环负责慢慢修正位移。位置环的带宽要远低于角度环的带宽否则位置修正会激励角度震荡整套系统就“站不住”了。这里的底层逻辑是频带分离内环快、外环慢。角度环的响应时间常数要做到几十毫秒级别位置环则放到秒级别。如果位置环输出直接叠加太多你会发现角度曲线开始高频抖动然后振荡幅度逐渐扩大最终发散。这不是PID本身不行而是你违反了多环控制最基本的带宽分离原则。3.2 参数整定的经验顺序与常见误区PID参数整定方面我的顺序是先内环后外环先比例后微分最后才考虑积分。第一步只保留上摆角环的P项逐渐增大kp1让系统进入“能站住但来回晃动”的状态。你会看到theta2在小范围内振荡这说明比例增益已经提供了足够的“恢复力”只是缺少阻尼。第二步增加kd1让theta2的振荡衰减下来。这个过程不要追求一次到位每次增加20%左右跑一次全周期仿真看曲线形状。kd1过大的时候仿真里的角度响应会变得非常僵硬甚至出现小周期抖振这就是微分项放大了数值噪声。第三步把下摆角环接上重复kp2、kd2的整定。注意这时theta1和theta2会互相影响上摆环调好的参数在下摆环介入之后可能需要微调这是多环整定里的常态不必烦躁。第四步最后加位置环并且位置环只给很小的比例系数主要是让小车缓慢回位不要指望它主动稳定角度。这里有一个特别常见的误区很多人喜欢给角度环加积分项觉得能消除稳态误差。实际上二级倒立摆在竖直平衡点附近的角度稳态误差本来就应该是零因为系统是对称的重力力矩在平衡点为零P控制就能做到角度无静差。加了积分反而会引入相位滞后让系统更容易振荡。我在跑仿真时试过给theta2加一个ki 0.5的积分项原本稳定的系统直接发散。所以PID里的I项在这个课题里能不用就不用顶多在位置环里加非常小的ki用于消除小车位移的静差。4. Simulink仿真的搭建细节与结果解读模型搭建这个环节课程设计报告里通常只给一张总图但真正动手搭的时候很多细节决定了你的仿真能不能跑出理想曲线。4.1 仿真模型的基本结构State-Space模块和控制器模块推荐的结构是被控对象用一个State-Space模块表示控制器部分单独搭一个子系统。State-Space模块的A、B、C、D矩阵直接填上一节建立的状态空间模型C矩阵根据输出需求取3行或6行。如果你想在Scope里同时观察六个状态那就把C设成6阶单位阵输出全部状态。LQR控制器的Simulink实现非常简单把6个状态接进一个Gain模块增益矩阵就是K输出取反之后接到被控对象的控制输入端。注意顺序状态向量的排列必须和K矩阵的设计顺序完全一致否则增益系数会对错位控制器看起来有效实际是“乱棒打死老师傅”。PID控制器则用Simulink自带的PID Controller模块把三个回路的PD/PID输出用Sum模块叠加再进Saturation限幅。参考输入方面位移参考值x_ref通常设0初始条件设一个小的扰动比如theta1 0.05 rad、theta2 -0.05 rad让系统有一个“从偏转到恢复”的动态过程这样对比曲线才有看头。4.2 仿真步长与求解器最容易忽略的坑仿真发散不一定是控制器设计错了很可能是求解器设置不对。直线二级倒立摆模型里有比较刚性的动态模态A矩阵特征值跨了好几个数量级这时候用固定步长的ode1、ode3很容易出现数值不稳定。我实际测试下来遇到以下场景必须换可变步长求解器初始角度大于5度且控制器增益偏大时固定步长会频繁报“仿真在时间点t处发散”PID方案中微分项较大时dt太小会让导数项数值震荡状态空间模型里包含摩擦系数b和转动惯量J这类数量级差异很大的参数时系统刚性明显推荐直接用Solver选ode45相对误差默认1e-3通常够用如果还发散把相对误差调到1e-6绝对误差调到1e-6再不行就换ode15s。另外Simulink里默认的最大步长是仿真时间除以50对倒立摆这种快动态系统来说太大可以直接把最大步长设为0.001秒。这一步走通了你就躲开了课程设计里最常见的“模型看着没问题但仿真就是发散”的坑。4.3 LQR与PID的仿真曲线对比以Q diag([5000, 20000, 30000, 0, 0, 0])、R 1算出来的LQR增益为例给定初始扰动theta1 0.05、theta2 -0.05、其余状态为0典型结果是指标LQR传统PID多环级联theta2调节时间约1.5秒约3秒以上theta1超调量小于5%10%到20%小车位移最大偏移0.01米以内0.05米以上稳态误差基本为零角度为零但位移有轻微漂移控制量的峰值中等偏大且波动明显LQR的曲线最明显的特征是各状态几乎同步收敛没有“拉锯战”的感觉。这是因为状态反馈里每个控制量都同时利用了六个状态的信息相当于每个瞬间都知道系统的完整位置和速度状态。PID这边则是“独立回路各自为政”上摆角环感受到theta2偏差后输出控制力但这个控制力同时会让下摆的theta1偏得更多下摆角环再输出反向控制力整体上总有一个状态在纠正另一个状态的“副作用”动态过程自然拖沓。从鲁棒性角度说LQR也有优势。把系统参数人为拉偏20%比如把m2改成0.156 kgLQR的闭环响应仍然能稳定只是调节时间变长PID方案则很容易发散因为每个回路的增益都是按原模型调出来的参数一变带宽分离的假设就破了。这些结果别只放在脑子和代码里做成Scope截图放进课程报告效果比任何文字都直观。5. 仿真发散的原因排查步长、初始角、参数不一致这个课题里几乎所有人在跑Simulink时都会撞上发散问题。有的是一开始就发散有的是参数调着调着突然发散。我总结了三类最常见的原因并且走了一遍完整的排查链路。排查的第一步永远是看报错信息。Simulink如果提示类似“仿真在t0.005时发散”先不要怀疑控制器先确认被控对象开环特性对不对。你把控制器的输出端断开直接给0输入看被控对象的开环响应。开环本来就是不稳定的曲线会朝一个方向快速飞出去这是正常的但如果连开环响应的数量级都不对比如几毫秒内角度直接飙到几十弧度那多半是状态空间模型本身有问题常见原因是B矩阵方向反了或者某个质量参数百倍级地填错了。第二步检查初始条件。线性化模型只在平衡点附近有效你给theta1 0.5 rad约28度那LQR和PID都大概率救不回来。碰到这种情况把初始角度逐步缩小到0.1 rad、0.05 rad看看是在哪个值附近从“稳定”变成“发散”。这个临界值能直观反映控制器的鲁棒性范围写报告时反而是加分项。第三步排查求解器设置。把Solver从定步长改成ode45自动变步长把相对误差调到1e-6把最大步长设为0.001。这三个操作能解决九成以上的“莫名其妙的发散”。我用过一次ode1固定步长步长设0.001LQR控制器算出来的K矩阵明明能让闭环极点全在左半平面仿真却照样发散原因就是固定步长求解器在刚性系统上数值误差累积太快。第四步检查限幅和饱和。控制输入F如果设了限幅比如±20N而LQR算出的控制量频繁顶到饱和限幅系统的稳定性就会大打折扣。这时候不要盲目加大限幅应该降低Q中角度权重或增大R让控制量更温和。记住一点线性控制器设计时如果没有考虑饱和那饱和本身就是非线性环节超出线性控制理论的有效范围。第五步检查状态反馈增益的方向。K矩阵的符号错误是隐蔽性最强的错误。一个简单的验证方法是只保留theta1通道的增益把其他增益全置零看闭环系统对theta1的小扰动是否有恢复趋势。如果恢复趋势都不对说明符号反了趁早回头检查状态空间模型和控制器的接线顺序。这几步走完发散问题基本能定位到具体环节。我自己在给学生答疑时90%的发散问题都是出在模型参数或求解器设置上真正控制器算法设计错的比例反而不高。6. 课程报告的组织顺序与参考文献选择仿真做完了曲线也出来了接下来是整个课题的另一半工作量把过程写成能交差的课程报告。报告写得好不好很大程度上取决于结构清不清楚而不是页数多不多。6.1 报告的骨架从摘要到结论的逻辑线一份合格的二级倒立摆课程报告我建议按下面这个顺序组织摘要和关键词。用300字以内概括建模方法、控制器设计思路、仿真结果和核心结论。关键词写“直线二级倒立摆、LQR、PID、Simulink仿真”这类与主题强相关的词。系统建模。交代物理结构、参数表、拉格朗日方程推导、线性化后的状态空间模型。这是全文的技术地基用表格列参数的通用做法。控制器设计。LQR部分写清目标函数、Q和R的选取理由、K矩阵计算结果PID部分写清回路结构、带宽分离原则、参数整定表。仿真分析。放LQR和PID的Scope对比图用表格列出调节时间、超调量、稳态误差等性能指标然后给出结论。总结与体会。简要说明两种算法的适用性以及你在调参过程中遇到的问题和解决思路。报告里最忌讳的是把推导过程全抄一遍、仿真图贴一堆却没有一句分析。导师真正想看的是你的“比较洞察”为什么LQR的调节时间更短为什么PID对参数扰动更敏感这些判断能力比公式推导更能体现你对控制理论的理解程度。6.2 参考文献怎么选参考文献没有必须列多少条的硬性规定但质量比数量重要。我常用的几类文献供参考教材类刘金琨的《先进PID控制MATLAB仿真》、薛定宇的《控制系统计算机辅助设计》、胡寿松的《自动控制原理》这三本基本覆盖了PID整定和Simulink仿真的基础方法。现代控制理论类刘豹的《现代控制理论》或李少远的《线性系统理论》里关于LQR和能控性的章节可以直接引用。论文类在知网或IEEE上搜“inverted pendulum LQR PID”能找到大量学位论文和会议论文选一两篇和你的仿真对象比较接近的主要借鉴他们的建模简化和参数对比思路。引用时注意格式统一课程报告一般用GB/T 7714格式这个可以在学校模板里直接套。不用贪多十几篇足够重点是你确确实实翻阅过。配置完毕。最后再分享一个小经验如果你用的是MATLAB较新版本写课程报告时可以把仿真模型文件和脚本一起打包备份每个参数版本单独存一份。倒立摆仿真这种多参数联合整定的课题你很可能在调PID的时候把一套能跑的LQR参数覆盖掉到时候重新调回来看曲线会浪费很多时间。目录命名用日期加参数说明比如“0412_LQR_Q5000_20000_30000_R1.slx”半年后翻回来还能一眼看清当时做了什么。