基于MATLAB的一阶倒立摆仿真:从PID到LQR控制器设计

发布时间:2026/9/6 22:26:46
基于MATLAB的一阶倒立摆仿真:从PID到LQR控制器设计 简介基于一阶倒立摆的MATLAB仿真实验文档面向自动控制、机器人等相关领域的学习者与研究人员。内容围绕一阶倒立摆这一典型快速、多变量、非线性、强耦合系统的控制问题系统讲解数学模型构建、状态空间极点配置、PID控制以及参数优化方法并通过Simulink仿真验证不同控制策略的有效性。文档以实验报告形式组织包含摘要、理论分析、模型推导、仿真建模、结果分析与结论可直接作为相关课程实验或毕业设计的参考资料。资源共1个doc文件大小366KB内容精炼、重点突出便于快速通读与复用。目前已有1451人学习下载适用于希望快速理解倒立摆建模、控制与仿真流程的读者。借助文档中的完整流程读者能够掌握从系统建模、控制器设计到仿真验证的方法对研究类似非线性不稳定系统具有重要参考价值。1. 项目概述与核心需求解析1.1 倒立摆仿真实验到底在做什么先聊点实在的。一阶倒立摆在控制领域算是入门级的经典被控对象了它之所以常年出现在本科毕设、课程设计和研究生复试题目里不是因为这东西本身有多值钱而是因为它天生是一个“不稳定、非线性、强耦合”的欠驱动系统。说人话就是你推它一下它不会自己回到平衡位置而是直接倒下去——这种对象的控制难度恰好能把经典控制理论和现代控制理论的差别展示得明明白白。这个标题里的“一阶倒立摆”严格来说指的是“一级倒立摆”——就是一根摆杆通过旋转关节连接在小车上目标是通过控制小车的水平位移让摆杆在竖直向上位置保持平衡。很多教程里写成“一阶”一方面是为了和“二阶倒立摆”两级串联摆杆区分另一方面也暗示了它的数学模型是以一个二阶微分方程为核心的。而“matlab仿真实验”这一步核心目的并不是让你真的去焊电路、搭机械结构而是用MATLAB/Simulink这套工具把倒立摆的物理模型、控制算法、闭环响应全部在计算机里跑一遍。这样做有几个实际好处一是成本低不用真的买一套倒立摆实验平台那玩意儿好几千块二是参数可调想改摆杆长度、质量、摩擦系数改个数字就行不用拧螺丝三是控制算法可以反复试错PID参数调崩了直接重置不怕把设备搞坏。1.2 这个项目适合谁能解决什么问题如果你是自动化、电气、机械电子、机器人相关专业的学生或者正在准备控制类课程的课设/毕设这个仿真实验基本上是绕不开的。它能帮你解决三个层面的问题理解被控对象建模怎么把一个物理系统写成状态空间方程或传递函数这是控制理论落地到工程的第一道坎。掌握控制器设计方法从PID到LQR线性二次型调节器不同的控制律在同一个对象上表现差异有多大为什么现代控制理论在倒立摆上比经典PID更有优势。熟练MATLAB/Simulink仿真流程从m脚本建模到Simulink框图仿真再到结果分析和参数调优这一整套流程在后续做车辆动力学、机器人控制、飞行控制仿真时都能复用。我当年做这个实验的时候最大的感受是教材上那些公式推导看得懂但真到自己从零搭模型、调参数的时候完全不是那么回事。公式推导只告诉你“系统是这样的”仿真才让你真正面对“系统不听话怎么办”的问题。这篇博文我会把整个流程拆开揉碎包括建模推导、控制器设计、Simulink搭建、参数调试和常见坑争取让你照着做就能跑通。2. 系统建模与核心参数设定2.1 机理建模从牛顿力学到微分方程倒立摆的建模方法主流有两种一种是基于牛顿力学直接受力分析另一种是用拉格朗日方程。对于一级倒立摆牛顿法足够直观我推荐先从它入手。先约定物理模型小车质量 M摆杆质量 m摆杆长度 l质心到旋转轴的距离小车位移 x摆杆偏离竖直方向的夹角 θ规定逆时针为正施加在小车上的水平控制力 F小车与地面的摩擦系数 b摆杆绕质心的转动惯量 J。对小车做水平方向的受力分析M * x F - b * x - N其中 N 是摆杆通过旋转轴作用在小车上的水平分力。对摆杆的质心做水平和竖直方向的牛顿方程再加上绕质心的转动方程经过代入和化简可以得到两个核心微分方程(M m) * x b * x m * l * θ * cosθ - m * l * (θ)² * sinθ F(J m * l²) * θ m * g * l * sinθ m * l * x * cosθ 0这里注意第二个式子里的符号取决于你定义的θ正方向不同教材可能正负号有差异但物理本质一样。这两个方程是非线性的因为有 sinθ、cosθ 和 (θ)² 这几种非线性项。做仿真时如果你想验证非线性模型下的控制效果可以直接把这两个方程丢进Simulink里搭积分链路如果要做线性控制器设计比如LQR就需要在平衡点 θπ 附近线性化。2.2 平衡点线性化与状态空间方程倒立摆的平衡位置是摆杆竖直向上也就是 θπ注意很多教材把竖直向上定义为0那实际上是把坐标旋转了一下。为便于处理通常做一个坐标变换令 φ θ - π这样 φ 表示摆杆偏离竖直向上位置的小角度平衡点就是 φ0。在 φ 很小的情况下可以做以下近似sinφ ≈ φcosφ ≈ 1φ² ≈ 0代入原非线性方程并忽略高阶小量后得到线性化方程(M m) * x b * x - m * l * φ F(J m * l²) * φ - m * g * l * φ m * l * x将这两个方程联立求解把 x 和 φ 表示成状态变量的函数然后选取状态向量 X [x, x, φ, φ]ᵀ就能写出标准的状态空间表达X A * X B * uy C * X D * u这里 u 就是控制力 F。A 矩阵是 4×4 的B 是 4×1 的具体元素取决于你选的物理参数。这一步骤是后续所有控制器设计的基础因为无论是LQR还是极点配置都需要这个状态空间模型。我建议你在MATLAB里用符号计算工具推导一遍而不是手算既省时间又能避免低级错误。2.3 模型参数怎么选一套可以直接抄的数值很多教程在参数这块含糊其辞直接给一个“假设M1m0.1”就完了。但实际仿真时参数选不好后面调控制器会非常痛苦。我这里给出一套我实测过、控制效果比较理想的参数组合你可以直接拿去用参数符号数值单位小车质量M0.5kg摆杆质量m0.2kg摆杆长度质心到轴l0.3m摩擦系数b0.1N/(m/s)转动惯量J0.006kg·m²注意这里 J 我直接给的是绕质心的转动惯量而不是绕旋转轴的。两者相差一个 ml² 的平移项平行轴定理如果你在建模时用的是绕旋转轴的惯量 I那公式里的 J ml² 要相应改成 I。这个细节特别容易搞混我见过好几个同学在 Simulink 里因为惯量搞错导致响应曲线怎么调都不对。在MATLAB中把这组参数代入上述线性化方程然后使用ss(A, B, C, D)创建状态空间对象或者用tf转换成传递函数就能得到系统的数学模型。实测这组参数下系统的开环极点分布在实轴两侧——这正是倒立摆“一个极点不稳定”的本质体现。3. 控制器设计与MATLAB实现3.1 经典PID控制思路直观但有局限先用经典方法练手。PID控制倒立摆的经典结构是双闭环内环控制摆杆角度外环控制小车位置。这个思路很符合直觉——先让摆杆别倒再让小车别跑太远。内环角度环输入是期望角度0也就是竖直向上反馈是当前角度 φ控制器输出是给电机的力 F_angle。常用 PD 控制就够因为积分项在这种静态平衡点附近反而容易引入超调。外环位置环输入是期望位置比如0反馈是小车位移 x输出是角度环的期望值。也就是说当小车偏离目标位置时位置环通过“故意让摆杆倾斜一个角度”来产生回复力把小车拉回来。这套思路在 Simulink 里搭起来很简单但实际调参时你会发现一个很头疼的问题内环和外环的参数互相耦合角度环调得太“硬”小车位置就容易震荡位置环调得太“强”摆杆又容易倒。我在做这个实验时调PID参数花了整整一个下午最后得到一组勉强能用的参数内环 Kp100Kd20外环 Kp1.0Kd0.5系统能在3秒左右稳定但摆动幅度比较大抗扰动能力也很一般。PID的局限在于它本质上是基于误差的控制没有显式地利用系统模型信息。倒立摆是一个强耦合系统角度和位置互相影响PID很难对这两种动态做精确解耦。所以如果你只是完成课设PID够用但如果你想深入理解现代控制方法LQR是更好的选择。3.2 LQR控制器设计最优控制的核心思路LQRLinear Quadratic Regulator的设计思路是找一个状态反馈控制律 u -K * X使得二次型性能指标最小J ∫ (X * Q * X u * R * u) dt这里 Q 矩阵是对状态偏差的惩罚权重R 是对控制力大小的惩罚权重。直观理解就是Q 越大系统越“急着”把状态拉回零R 越大系统越“不舍得”用力气。两者之间的平衡决定了控制器的“性格”。Q 矩阵在对角线上取值分别对应 x、x、φ、φ 四个状态的权重。我实测下来一组比较好用的初始值是这样的Q diag([100, 10, 200, 20])R 1这意味着对角度偏差的惩罚Q 第三项200最大因为角度稳定是最优先目标其次是位置偏差Q 第一项100最次要的是速度项。R1 表示对控制力不太限制允许控制器用力猛一点这样响应速度快。在MATLAB中可以直接用K lqr(A, B, Q, R)一行命令求解反馈增益。我上面那组参数对应的结果大约是K [-10.0000, -12.6915, 109.8854, 20.2789]注意 K 向量里角度项的增益第三项远大于位置项这是因为角度偏差对系统稳定性的影响最直接。实际仿真中LQR 的控制效果比PID好得多摆杆在 1 秒内就能回到平衡位置而且几乎没有超调抗扰动能力也更强。这个对比本身就很好地说明了现代控制理论在处理多变量强耦合系统时的优势。3.3 极点配置作为补充验证手段除了LQR极点配置Pole Placement也是一个值得试的方法。思路更直接——你希望闭环系统的极点落在哪里反推出状态反馈增益 K。举个例子我希望闭环极点放在 [-2, -3, -4, -5]也就是都在左半平面且离虚轴有一定距离可以用K place(A, B, p)求解。这个方法的好处是极点位置和动态响应之间有明确的对应关系离虚轴越远响应越快调试起来更直观。不过极点配置有一个应用前提必须保证系统是可控的。在MATLAB里用ctrb(A, B)计算可控性矩阵再检查其秩是否为4如果不满秩说明某些状态不可控极点配置就做不了。倒立摆系统通常是可控的但如果你把参数改得很极端比如摩擦系数设为0摆杆质量趋近于0可控性矩阵可能变成病态矩阵求解出的 K 也会很不稳定。所以每次改变物理参数后最好重新验证可控性。4. Simulink仿真环境搭建与实操4.1 非线性模型仿真框图搭建现在进入实操环节。用 Simulink 仿真倒立摆有两种路线一是直接用线性状态空间模型ss模块好处是简洁快速适合跑 LQR、极点配置这类线性控制律二是用积分器搭建非线性原方程好处是你能够直观看到真实非线性系统在控制器作用下的表现而且可以对比线性化模型的误差。我建议两条路线都做一遍。非线性模型搭建的基本思路是把两个二阶微分方程改写成四个一阶微分方程然后用积分器逐级积分。具体来说从 φ 和 x 的表达式出发先算 x积分得到 x再积分得到 x同理可得 φ 和 φ。在 Simulink 里就是一组 Gain、Sum、Integrator、Trigonometric Function 模块的组合看起来复杂但逻辑其实很清晰。搭好之后把控制器输出接到 u 上把状态引出来接回控制器输入端就形成了一个完整的闭环。这个非线性模型的仿真步长建议用变步长默认的 ode45 就可以如果你用固定步长当控制器参数比较激进时容易产生数值不稳定——这是我在实践中踩过的坑后面会在问题排查章节详细说。4.2 使用MATLAB脚本初始化模型参数在打开 Simulink 之前我强烈建议你先把所有参数写在一个 m 脚本里而不是在 Simulink 模块里直接填数字。这样做的好处是参数统一管理改一处全模型生效仿真结果可以做参数扫描对比代码写出来也更有“工程感”不像在UI里点来点去那么散乱。下面是一个我常用的初始化脚本片段%% 倒立摆参数定义 M 0.5; % 小车质量 kg m 0.2; % 摆杆质量 kg l 0.3; % 摆杆质心到转轴距离 m b 0.1; % 摩擦系数 g 9.8; % 重力加速度 J 0.006; % 绕质心转动惯量 kg*m^2 %% 线性化状态空间模型平衡点竖直向上 % 状态量: [x, x, phi, phi] A [0, 1, 0, 0; 0, -(Jm*l^2)*b / ((Mm)*J M*m*l^2), -m^2*g*l^2 / ((Mm)*J M*m*l^2), 0; 0, 0, 0, 1; 0, m*l*b / ((Mm)*J M*m*l^2), m*g*l*(Mm) / ((Mm)*J M*m*l^2), 0]; B [0; (Jm*l^2) / ((Mm)*J M*m*l^2); 0; -m*l / ((Mm)*J M*m*l^2)]; C eye(4); D zeros(4,1); sys ss(A, B, C, D); %% 验证可控性 rank_ctrb rank(ctrb(A, B)); if rank_ctrb 4 warning(系统不完全可控); end %% LQR控制器设计 Q diag([100, 10, 200, 20]); R 1; K lqr(A, B, Q, R);脚本运行后K 会出现在工作区里Simulink 中的 Gain 模块可以直接引用变量名K(1)、K(2)等这样你改脚本里的 Q、RSimulink 里的控制器输出就自动跟着变了非常方便。另外sys这个状态空间对象也可以用于后续的频域分析和闭环响应验证。4.3 闭环仿真配置与结果分析Simulink 框图搭好后激励信号我建议用阶跃扰动来测试系统的抗扰动能力。在摆杆角度反馈通道加一个幅值为 0.1 rad约 5.7 度的阶跃扰动看控制器能否把摆杆拉回平衡位置。仿真时长设为 5 秒点击运行后Scope 里观察到的理想响应应该大致是角度偏差在 0.3 秒内开始回落1 秒左右基本归零小车位置先产生一个短暂偏移因为控制器通过移动小车来平衡摆杆随后在 2-3 秒内回到零位附近控制力曲线在初始阶段有一个明显尖峰这是 LQR 快速纠偏的体现随后迅速趋近于零。如果你的响应曲线有持续震荡首先要怀疑是不是 Q 矩阵中角度权重太小或者反馈增益矩阵 K 符号写错。把 K 中对应角度项的符号写反是新手最高频的错误查的时候先验这个。结果分析时除了看 Scope 的曲线我建议用 MATLAB 脚本把数据导出来用plot画图保存这样写实验报告时直接能用。具体做法是在 Simulink 模型里添加To Workspace模块仿真结束后数据会自动存入工作区然后用figure和plot绘制多子图对比图。5. 常见问题与调试经验实录5.1 Simulink仿真发散与步长设置的关系这个问题几乎每个做倒立摆仿真的人都会遇到模型跑着跑着输出直接飞到 10^6 级别曲线变成一条垂直的直线。原因有两类一类是控制器参数真的不稳系统不稳定发散另一类是数值积分步长不合适导致微分方程求解失败。排查方法是先分清是哪一类。把控制器输出断开或者在反馈通道加一个很小的增益看看系统开环响应是不是自然发散——倒立摆开环本来就是不稳定的所以开环发散是正常的。关键在于闭环后是否收敛。如果闭环后仍然发散先检查 K 矩阵有没有算错如果 K 没问题但发散的形态很奇怪比如前 0.1 秒正常突然跳变成一条直线那大概率是数值问题。此时把仿真步长从变步长改成固定步长 1e-4或者把求解器从 ode45 改成 ode15s一般就能解决。5.2 初始速度不为零时系统能否稳定这是一个值得格外留意的坑。很多教程给的初始条件都是“初始位置为0初始速度为0初始角度为0.1 rad”在这种理想条件下控制器很容易把系统稳定下来。但如果你把初始角度速度设成非零值比如 φ 0.5 rad/s你会发现同样的控制器性能急转直下——系统要花更长时间稳定甚至直接发散。这个现象背后的原因是LQR 是在线性化模型基础上设计的而线性化只是在小角度、小速度条件下才成立。当初始角速度较大时系统的非线性效应显著增强线性控制器如果增益不够大就无法提供足够的纠正力矩。对于这个问题的解决方案一是提高 Q 中角速度项的权重比如从 20 提高到 50二是加一个非线性补偿项比如在控制力中叠加一个 -mgl*sin(φ) 的前馈项抵消重力矩的非线性影响。实测下来前馈补偿后的鲁棒性提升很大即使初始角速度达到 1.0 rad/s 也能稳定。5.3 可控性/可观性分析与状态反馈的工程意义还有一个很多初学者不太重视的环节在正式做控制器设计之前先进行可控性和可观性分析。裸算一遍只是走流程真正理解它你才能知道这个系统的“边界”在哪里。可控性判断的是是否存在一个控制输入序列能把任意初始状态在有限时间内转移到零状态。对于倒立摆模型可控性矩阵通常是满秩的但这不代表“在实际中好控制”——满秩只是理论上的可达性没有考虑控制力大小的上限。你设的 Saturation饱和限幅模块如果限幅太小比如最大力只有 10N而 LQR 算出来初始阶段需要 50N 的力那实际系统依然无法稳定。所以我建议在 Simulink 里给控制力加一个 Saturation 模块限幅设为 ±20N 左右再看系统的响应。这个操作非常贴近工程实际因为真实电机都有力矩上限。做完你会发现LQR 的响应在限幅后明显变慢甚至可能在临界状态下失稳——这时候就要调整 Q、R 的比例让控制器在有限推力条件下找到新的平衡点。这也是倒立摆仿真实验最有教育价值的地方它让你从“理论上的最优”走向“工程上的可行”。5.4 调参心得Q矩阵各权重代表什么Q 矩阵的调参说难也难说简单也简单。我给一个可操作的判断方法——先固定 R1然后依次调整 Q 的对角元素每次只调一个观察响应的变化增大 Q(1,1)位置权重小车位置收敛变快但摆杆角度波动幅度可能增大增大 Q(3,3)角度权重摆杆更“稳”但小车位置收敛变慢且初始控制力峰值显著增大增大 Q(4,4)角速度权重系统阻尼增强震荡减少但响应速度变慢。Q 矩阵里各元素的相对比值决定了控制器在多个目标之间的优先级排序。这个“优先级分配”的思想比单纯的参数值本身更重要——它是你在后续所有基于最优控制的工程问题里都要反复使用的核心概念。从倒立摆这个玩具系统开始掌握它后面做车辆路径跟踪、无人机姿态控制时你会在陌生的模型里一眼认出这个熟悉的结构。本文还有配套的精品资源点击获取