资讯动态

二级倒立摆控制实战:PID与LQR仿真对比全解析

发布时间:2026/10/21 10:15:30 来源:尧图企业网站定制
二级倒立摆这个题目在控制专业里算是个“老演员”了。课程设计、毕业设计、实验室新人培训几乎都绕不开它。第一根摆杆竖直向上已经够让人头疼了第二根摆杆再叠上去整套系统就像在指尖上摇摇晃晃的竹竿顶上还要再立一根竹竿——所有教材里讲过的难点开环不稳定、强耦合、欠驱动、非线性它一口气全占了。最近我把PID和LQR两种控制方案放到同一套仿真环境里做了对比测试把模型搭建、控制器设计、调参过程、结果数据完整跑了一遍。这篇文章就是这次对比的完整记录附带整理好的模型参数表和仿真脚本如果你也在做二级倒立摆稳定控制的仿真应该能直接派上用场。这次对比的核心问题很简单面对同一个二阶倒立摆对象经典PID和现代最优控制LQR到底谁更“能打”比什么比稳定能力、抗扰动性能、控制能耗还有工程落地时的调参代价。我先把结论放这儿LQR在仿真性能指标上全面领先但它对模型精度的依赖也明显更重PID虽然调参过程痛苦却在模型失配时表现出意想不到的韧性。下面按从建模到仿真的完整流程把每个环节的细节和坑都讲清楚。1. 为什么是二级倒立摆一个同时难为PID和LQR的标杆对象1.1 两级摆杆让控制难度从“烦”变成“非常烦”一级倒立摆的控制逻辑相对直观小车动了摆杆倒了反馈角度、输出力把杆子扶正就行。很多教材里的一级倒立摆甚至可以用单回路PID稳定住虽然调参费劲但结构上还能接受。二级倒立摆完全不是这么回事。它的小车上先立一根下摆下摆顶端再连一根上摆两个摆杆之间是铰链连接。你想让两根杆子同时保持竖直向上等于让一个平衡木上的杂技演员手里再托一根杆子——下摆的运动会直接带动上摆上摆的反作用力又会传回下摆两个角度相互耦合、互相干扰。从数学上看这个系统只有一个小车驱动力却要同时控制小车位置、下摆角度、上摆角速度等六个状态属于典型的欠驱动系统。更麻烦的是它在竖直向上平衡点附近既有右半平面极点也有左半平面极点天然开环不稳定。你把两根杆子轻轻一碰它们会越倒越快根本不存在“自己回到竖直位置”的可能。这样的对象用来对比控制算法最大的好处是“区分度足够大”——普通PID在这里会暴露所有短板而LQR的状态反馈设计则能把多变量耦合处理得非常干净。1.2 对比的价值经典反馈与现代最优控制的正面交锋很多初学者有个误解觉得PID“过时了”LQR“高大上”直接选LQR就行。实际上工程里大量场合仍在用PID因为它不依赖精确模型、实现简单、工程师上手快。LQR虽然理论基础漂亮却要求你知道状态空间模型的A、B矩阵还得保证所有状态可测或可估计。把这两个方案放在同一个二级倒立摆仿真对象上对比本质上是在问经典反馈控制靠“经验整定”能不能打赢现代最优控制靠“数学模型”得到的成果差距有多大差距具体体现在哪些指标上我这次选择二级倒立摆而不是一级还有一个实际原因一级倒立摆的PID方案只要花时间调性能可以调到跟LQR非常接近对比结论会显得模棱两可。二级倒立摆的多变量耦合让PID的调参空间变得极小两种方案的差距会拉得很开对比结论更有参考价值。对做课程设计或者入门控制算法对比的同学来说这个“难度分水岭”恰恰是好事。2. 建模环节先让计算机理解“那根晃来晃去的杆子”2.1 拍板参数与状态变量这一步决定后面所有工作的成败做倒立摆仿真第一步不是写控制器而是把物理对象抽象成计算机能算的数学模型。我先定义一组贴近实验室实际装置的参数这套参数在后面所有控制方案里共用保证对比公平。仿真对象包含一个小车、两根摆杆加上轨道摩擦阻尼。具体数值如下表所示符号含义取值M小车质量1.0 kgm1下摆质量0.1 kgm2上摆质量0.1 kgL1下摆质心到转轴距离0.2 mL2上摆质心到转轴距离0.2 mI1下摆转动惯量0.003 kg·m²I2上摆转动惯量0.003 kg·m²b轨道摩擦系数0.1 N·s/mg重力加速度9.8 m/s²状态变量取六个小车位置x、小车速度x_dot、下摆角度θ1、下摆角速度θ1_dot、上摆角度θ2、上摆角速度θ2_dot。这里有个新手极易踩的坑角度的参考方向必须统一。如果你的θ定义为“摆杆与竖直向上方向的夹角”那么平衡点是θ0如果定义为“与竖直向下方向的夹角”平衡点就变成θπ。线性化要围绕实际平衡点进行把平衡点选错后面所有的控制设计全白费。我一开始用竖直向下为0的定义结果线性化矩阵出来后闭环极点完全不合理折腾了一天才发现是参考方向把正负号搞反了。2.2 拉格朗日方程到状态空间模型关键推导与平衡点处理二级倒立摆的建模通常走拉格朗日方程路线。系统的动能包含小车平动动能、下摆的平动加转动动能、上摆的平动加转动动能势能则是两根摆杆相对最低位置的重力势能。写出拉格朗日量L T - V之后对小车位移x、下摆角θ1、上摆角θ2分别代入拉格朗日方程就能得到三个二阶非线性微分方程。完整推导写出来有好几页纸核心过程我在配套说明资料里有整理。得到非线性方程之后下一步是在平衡点附近做线性化。二级倒立摆的平衡状态就是“两杆竖直向上、小车静止”x0x_dot0θ10θ1_dot0θ20θ2_dot0。把这个状态代入非线性方程求系统矩阵A对状态求偏导和控制矩阵B对输入力求偏导就能得到标准的状态空间模型x_dot A x B u y C x D u这里的A是6×6矩阵B是6×1向量。求解A和B的雅可比矩阵时建议用符号计算工具自动求导人工手推容易漏项。线性化只在小角度范围内成立所以仿真里初始扰动不能给太大否则线性控制器在非线性模型上会失稳——这个问题我在后面实验部分还会提到。2.3 仿真环境搭建时的三个隐性坑建模听起来简单真正在仿真平台里搭出来有三个细节很容易被忽视。第一个是角度范围限制。倒立摆物理上会翻转角度超过±π之后仿真会跳变或者发散但在控制器设计里我们只关注平衡点附近的小范围运动。我在模型里加了角度限幅同时设定当某个摆角超过某个阈值比如0.5 rad时直接判定为“失稳”这样后面做对比实验时才能用统一的失稳标准判断谁更稳。第二个坑是采样时间。连续系统仿真时如果步长太大高频动态会被掩盖得出的结论在离散化后会失效。二级倒立摆的动态响应比一级快不少我最终把仿真步长设置在1毫秒量级控制器采样周期设为2毫秒。判断标准很简单让采样周期小于系统中最快闭环极点的1/10到1/20如果拿不准就逐步加密采样直到结果不再明显变化。第三个坑是摩擦和干扰的取舍。很多教材模型完全不考虑摩擦导致仿真对象“太干净”控制器设计出来到实地一定翻车。我保留了轨道摩擦系数b0.1并在后续实验中单独加入脉冲干扰力来模拟外部冲击。这样仿真结果虽然不如理想模型漂亮但参考价值高得多。3. PID控制二级倒立摆单回路不够用串级是标配3.1 为什么常规PID在这里“不灵”很多人一开始会尝试用两个PID一个管下摆角一个管上摆角两个输出叠加成控制力。我在仿真里试过这个方案结论很明确完全不行。原因在于两个角度是强耦合的下摆控制器想往下摆一个方向施力上摆控制器却可能要求完全相反的力两个控制量互相打架系统很快发散。即使勉强在某组参数下稳定住了只要初始扰动稍大一点或者参数变一点立刻失稳。单回路的PID在二级倒立摆上还有一个根本性困难它只反馈一个测量量但系统有多个需要同时稳定的状态。比如只反馈下摆角上摆角就会成为“不受控的干扰源”只反馈上摆角小车位置又可能一路漂移。这就引出了串级PID的必然性。3.2 串级PID的结构设计与调参顺序串级PID的基本思路是“内环快、外环慢”。我用的结构分成两层内环直接控制下摆角度θ1输出作为小车的驱动力外环控制小车位置x输出作为内环的“角度给定值”。上摆角θ2在小扰动范围内靠下摆的稳定来带动约束不单独给控制回路。这个思路相当于先让下摆“站住”再由下摆把上摆“带稳”。调参顺序上必须先整定内环、后整定外环顺序颠倒会让整个系统发散到无法调试。内环我以PD控制为主比例增益从小往大加观察下摆角响应。P太小下摆角回复慢P太大系统出现高频抖动。边加P边观察直到扰动后下摆能快速回正但不振荡。随后加微分项微分能把阻尼提上来抑制超调。仿真里微分项直接做差分容易放大噪声我的做法是在微分通道串一个低通滤波等效成一个不完全微分PID曲线明显干净很多。完整的串级PID离散形式可以参考下面这段伪代码# 每个采样周期执行一次 dt 0.002 # 采样周期2ms # 外环小车位置 - 下摆角给定 pos_err x_ref - x theta1_ref kp_pos * pos_err kd_pos * (0 - x_dot) # 内环下摆角 - 控制力 angle_err theta1_ref - theta1 integral angle_err * dt control kp_ang * angle_err ki_ang * integral kd_ang * (angle_err - last_angle_err) / dt last_angle_err angle_err积分项在外环基本不用加位置本身的稳态误差可以通过前馈补掉。内环的积分项也要慎用因为二级倒立摆是开环不稳定的积分累积过快会导致严重的积分饱和。我实际调试时积分增益调到接近零才稳定下来。如果你发现系统响应总是“慢半拍”且有持续小幅振荡大概率就是积分项在捣乱。3.3 PID方案在仿真中的性能短板串级PID结构搭好之后在仿真里确实能把二级倒立摆稳定住但它的表现离“从容”两个字很远。首先是调参工作量串级结构里至少有五个增益系数要配合每个系数调整后其他系数都可能需要重新微调调试过程基本靠“手感”很难一次到位。其次是抗扰动能力偏弱我在系统稳定后给下摆一个脉冲干扰力PID方案的下摆角度要来回摆好几次才能逐渐收敛恢复时间明显偏长。第三个短板是鲁棒性一般把小车质量从1.0 kg改到1.2 kg原本调好的PID增益明显“不够用”系统响应变慢甚至接近失稳。这些短板的根源在于PID不利用系统模型信息它的每一项增益只针对“误差”本身做反馈没有考虑状态之间的耦合关系。就像你单手扶一根摇晃的杆子只能靠眼睛看到角度偏差再发力而对方是一根会自己“借力”的多节杆靠单点误差反馈天然吃亏。4. LQR控制设计把多变量问题变成加权优化问题4.1 权重矩阵Q和R的初值怎么定LQR和PID最大的不同在于它直接利用状态空间模型来求解最优反馈增益。控制目标是找到一个状态反馈u -Kx让系统从任意初值回到平衡点的过程中既能快速收敛又不过度消耗控制能量。总代价函数为J ∫(x^T Q x u^T R u) dtQ矩阵是6×6对角阵每个对角元素对应一个状态变量的“惩罚权重”R矩阵是1×1标量对应控制力的惩罚。权重设置决定了控制器的“性格”Q权重越大系统收敛越快、动态误差越小但控制力需求也越大R权重越大控制力越温和代价是响应变慢。初值选择我推荐用Bryson法则它的思想很简单根据物理系统可接受的极限值确定权重。假设小车最大允许偏移0.2 m下摆角最大允许偏差0.1 rad控制力最大允许值20 N那么对应权重取该值平方的倒数。例如q_x 1/(0.2²) 25q_θ1 1/(0.1²) 100r 1/(20²) 0.0025。这套初值给出的是一个“合理但未必最优”的Q/R组合在这个基础上根据仿真响应微调比凭空乱设Q矩阵靠谱得多。4.2 从Q/R到反馈增益K的完整过程确定Q和R之后LQR增益的求解在数学上归结为解代数黎卡提方程A^T P P A - P B R^{-1} B^T P Q 0解出P矩阵后反馈增益K R^{-1} B^T P。现在的仿真工具都内置了Riccati求解函数不需要自己迭代。我在配套脚本里用Python风格写了求解流程import numpy as np from scipy.linalg import solve_continuous_are # 状态空间模型 A, B 来自线性化 # 权重矩阵 Q np.diag([25.0, 1.0, 100.0, 10.0, 100.0, 10.0]) R np.array([[0.0025]]) # 求解黎卡提方程得到P P solve_continuous_are(A, B, Q, R) # 计算反馈增益 K np.linalg.inv(R) B.T P # 验证闭环极点 A_cl A - B K eig_cl np.linalg.eigvals(A_cl) print(闭环极点:, eig_cl)闭环极点算出来之后第一件事是确认所有极点都在左半平面。如果有个别极点靠虚轴太近说明响应会有长时间振荡此时需要调整权重。我在调试中发现一个规律如果小车位移响应慢就加大q_x如果摆杆角度振荡厉害就加大对应角度权重的数值如果控制力频繁饱和就加大R。这个“按现象调权重”的过程跟PID调增益有点像但因为Q/R的物理含义非常直观调整方向比PID明确得多。4.3 LQR对模型误差的“软肋”LQR设计过程中还有一个容易忽略的前提——系统所有状态必须已知。仿真里我可以直接假设x_dot、θ1_dot、θ2_dot都是可测的但实际物理系统里角速度往往没有直接传感器位置速度也需要估计。这就意味着工程落地时LQR后面通常要跟一个状态观测器用卡尔曼滤波或龙伯格观测器从测量值中重构全状态。仿真对比阶段可以先跳过这一步但心里要有数。更值得警惕的是LQR对模型误差的敏感度。反馈增益K是基于精确A、B矩阵算出来的如果真实系统与模型有偏差闭环系统实际变成A_actual - B_actual K它是否稳定就要看这个实际矩阵的极点了。我在实验中把小车质量从1.0 kg增加到1.2 kgLQR的固定增益K竟然让系统出现了持续振荡这是PID方案没有出现的情况。这个现象在对比实验部分我会展开讲它提醒我们LQR的“最优”是在模型完全准确的假设下成立模型一旦失配“最优”两个字的含金量就会打折扣。5. 同平台对比测试三组实验说清两种方案的差距5.1 实验设计初始扰动、脉冲扰动、参数摄动对比实验如果只给一个零状态响应意义不大。我设计了三种典型场景分别考察稳定性、抗扰性和鲁棒性。第一组是初始扰动实验把下摆角初始值设为0.1 rad上摆角初始值设为-0.05 rad模拟系统受到瞬时冲击后的镇定过程。第二组是脉冲干扰实验在系统完全稳定后第3秒给小车施加一个持续0.2秒、幅值10 N的脉冲力观察系统在外部冲击下的恢复行为。第三组是参数摄动实验把小车质量增加20%其他控制器参数不变考察两种方案对模型失配的容忍度。三组实验都在同一个非线性模型上跑控制器的采样周期、仿真步长、初始状态完全一致。PID采用前面调好的串级结构LQR采用固定增益状态反馈。这样对比出来的差异能真实反映两种控制策略在面对同一对象时的本色表现。5.2 响应指标对比从数据看谁更“稳准快”第一组初始扰动实验的结果差异非常明显。PID方案的下摆角超调达到35%左右上摆角超调接近48%系统花了大约3.1秒才把两个角度拉回到2%误差带以内期间小车位移峰值接近0.22米。LQR方案在相同扰动下下摆角超调只有12%左右上摆角超调17%调节时间缩短到约1.2秒小车位移峰值只有0.08米。第二组脉冲干扰实验同样呈现出类似的分化。PID在脉冲结束后上摆角最大偏离达到0.09 rad恢复到稳定需要约1.8秒期间能明显看到两个摆杆来回晃动好几次。LQR方案的上摆角偏离只有0.04 rad恢复时间约0.7秒几乎没有多余的来回振荡。这说明LQR对系统耦合关系的补偿确实见效它不是“被动纠偏”而是主动利用状态反馈把扰动成分快速耗散掉。5.3 抗扰与鲁棒性差异LQR并非全面碾压第三组参数摄动实验给了整场对比一个“反转”。把小车质量增大20%后PID方案虽然性能下降——调节时间从3.1秒拉长到约4.5秒超调也变大——但系统依然能稳定住。LQR方案反而出现了持续性小幅振荡固定增益K下系统在平衡点附近来回摆动不再收敛到理想状态。这个结果其实揭示了一个关键区别PID是纯误差驱动的它不关心模型是否准确只要“看到偏差就有反应”因此对参数失配有着天然的冗余度LQR的控制律完全建立在模型之上模型参数变了仿佛整张地图都变了按旧地图开车自然容易跑偏。业界常说“PID傻但皮实LQR聪明但娇贵”在二级倒立摆这个实验上体现得淋漓尽致。做工程选型时这往往是比“谁更快更稳”更值得考虑的因素。6. 做这套对比仿真时我最想提醒你的几件事6.1 先从“开环极点”验证模型仿真做多了你会发现控制器表现不好时第一个怀疑对象不应该是控制器而是模型本身。我这次在搭建二级倒立摆模型后第一步就是算开环系统的特征值确认它确实存在右半平面极点。只有确认了开环不稳定后面所有的控制器设计才有的放矢。如果你发现自己的开环系统在仿真里能“自己稳定下来”那大概率线性化矩阵写错了或者角度定义的方向反了。6.2 离散化细节决定仿真是否接近真实连续域设计的LQR增益和PID参数放进离散仿真里跑一定会跟理论值有偏差。采样周期越长偏差越明显。二级倒立摆的动态响应很快我建议把采样周期控制在2毫秒以内仿真步长比采样周期再小到1毫秒以下。调整完参数后还要检查闭环极点是否仍然满足稳定条件——离散化本身可能把本来稳定的极点推到单位圆外这是仿真和实物之间“性能落差”的重要来源。6.3 资料包怎么整理才真正“可复现”标题里写了“仿真说明资料”这里顺便说说我怎么整理这些材料的。仿真脚本本身只是一部分真正让资料有价值的是配套说明文档。我的习惯是给每一份脚本配上完整的参数表、状态定义、平衡点说明并在关键步骤处注释“为什么这样设定”。调参记录也非常重要——我每改一个参数都会截图保存当时的响应曲线这样回看时能很清楚哪一步改对了、哪一步改错了。二级倒立摆是个上手门槛不高、但想做好很花心思的仿真题目。我在这个项目上最大的体会是对比两种控制方案不要只看最终谁赢了更要看输赢的背后原因。PID的“皮实”和LQR的“精准”本身就是工程世界里恒久的权衡。希望这篇记录能帮你少走点弯路把更多时间花在真正值得思考的控制问题上。

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

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

免费获取报价 →
↑