一阶倒立摆MATLAB建模与LQR控制仿真完整教程
简介一份面向自动控制及相关专业学生、MATLAB 学习者的完整实验报告文档内容围绕一阶倒立摆系统的建模、控制与仿真展开。文档从倒立摆的数学建模与控制方法入手重点介绍了 PID 控制和状态空间极点配置两种策略并结合参数优化与 Simulink 仿真完整呈现了从理论推导到实验验证的过程适合作为课程设计、毕业设计或课堂实验的参考。资源为单个 doc 文件共 366KB内含中英文摘要、目录、仿真实验正文、结论与参考文献等结构。目前已有 1451 人学习对于想快速理解倒立摆控制原理并熟悉 MATLAB/Simulink 仿真流程的读者来说是一份高性价比的参考资料。1. 为什么倒立摆是控制理论入门的经典对象我读研那会儿导师给我安排的第一篇文章就是关于倒立摆控制的。当时还没有现在这么多现成代码和教程可以抄只能自己翻文献、啃课本、对着MATLAB一行行调参数。现在回看那段经历倒立摆作为控制理论入门对象确实有它不可替代的价值。倒立摆本质上是一个自然不稳定的系统。你见过街头艺人骑独轮车顶杆子吗杆子立得越高维持平衡越难艺人需要不断前后移动身体来补偿杆子的倾斜。一阶倒立摆控制的物理模型和这个场景完全一致只不过把人和车简化成了一个小车和一根摆杆。为什么说它是经典因为它同时包含了控制理论中几乎所有的核心问题系统建模、非线性特性、不稳定平衡点、欠驱动特性、实时反馈控制。一阶倒立摆只有一个输入也就是小车的控制力却要同时控制两个输出也就是小车位置和摆杆角度这就是典型的欠驱动系统。学过控制的人都知道欠驱动系统的控制器设计比全驱动系统难得多。从教学角度看倒立摆另一个吸引人的地方在于它的数学模型相对简单通过拉格朗日方程就能推导出完整的动力学方程不会像四旋翼飞行器那样一开始就陷入复杂的空气动力学泥潭。这个简单但不过于简单的特性让它成为从理论到仿真再到实物验证的最短路径。从实用角度看MATLAB在工业界和学术界的普及度极高。控制工程师、机器人算法工程师几乎每天都要和MATLAB/Simulink打交道。我见过不少人在面试时被问到倒立摆如何建模、控制策略怎么选如果简历上能写清楚基于MATLAB完成一阶倒立摆建模与仿真面试官对你在控制理论基本功上的信任度会明显不一样。这篇文章我打算用一份完整的MATLAB仿真实验作为载体把从动力学建模到控制器设计再到仿真验证的全过程走一遍。整个过程不需要Simulink纯脚本结合数值积分就能完成——这样做的好处是你能看到每一个数学表达式是如何一步步变成代码的不会出现在Simulink里拖了个模块就通了但也不知道底层到底在算什么的情况。无论你是自动化、机械电子还是机器人专业的学生只要正在学线性系统理论或现代控制理论这篇文章值得你收藏跟着做一遍很多在课本上看不明白的东西会自然串起来。2. 从物理模型到微分方程一阶倒立摆的动力学推导2.1 系统描述与坐标约定先明确我们要研究的对象。一阶倒立摆系统由一个小车和一根固定在车上的摆杆组成摆杆可以在竖直平面内自由旋转。小车的水平位移记为 x摆杆与竖直方向的夹角记为 θ。理想情况是让摆杆保持在竖直向上的位置也就是 θ0。建模之前先做几个约定小车质量 M摆杆质量 m摆杆质心到铰链点的距离 l重力加速度 g 取9.8作用在小车上的水平控制力记为 u。摆杆质量均匀分布转动惯量按 (1/3)ml² 处理这个数值是针对细杆绕端点的转动惯量因为我们关注的是摆杆绕铰链点的转动。这里有个常见误区想提醒一下很多人做倒立摆建模时直接用整根杆长作为 l到后面计算转动惯量时对不上号。建议在建模前就明确约定 l 的含义我后续所有推导都统一把 l 当作质心到转轴的距离。2.2 拉格朗日方程推导完整过程推导动力学方程的常用方法是拉格朗日方程。拉格朗日量 L 定义为系统动能 T 减去势能 V然后对每个广义坐标代入拉格朗日方程。这个系统有两个广义坐标小车位移 x 和摆杆角度 θ。先算动能。小车只有水平移动动能T_cart (1/2)Mẋ²。摆杆的动能稍微麻烦一点需要拆成平动和转动两部分。摆杆质心在惯性系中的位置是 (x l·sinθ, l·cosθ)对时间求导得到质心速度的分量ẋ_cm ẋ l·cosθ·θ̇ ẏ_cm -l·sinθ·θ̇于是摆杆平动动能等于 (1/2)m[(ẋ l·cosθ·θ̇)² (l·sinθ·θ̇)²]展开整理后变成 (1/2)m[ẋ² 2l·cosθ·ẋθ̇ l²θ̇²]。再加上摆杆绕质心的转动动能 (1/2)Iθ̇²整个系统的动能为T (1/2)(M m)ẋ² m·l·cosθ·ẋθ̇ (2/3)m·l²·θ̇²势能只来自摆杆质心高度变化。取小车水平面为零势能面摆杆质心高度是 l·cosθ所以 V m·g·l·cosθ。注意当摆杆竖直朝上时 θ0cosθ1势能最大这正是倒立摆不稳定平衡点的物理来源——系统在最高点势能最大任何微小扰动都会让摆杆滑向势能更低的地方。拉格朗日量 L T - V然后对两个广义坐标分别代入方程。对 x 坐标整理得到(M m)ẍ m·l·cosθ·θ̈ - m·l·sinθ·θ̇² u (1)对 θ 坐标整理得到m·l·cosθ·ẍ (4/3)m·l²·θ̈ - m·g·l·sinθ 0 (2)这两个方程联立就是完整的非线性模型。它们描述了小车位移、摆杆角度、控制力三者之间的耦合关系方程(2)里不含控制力 u说明摆杆角度的变化完全依赖小车加速度通过 cosθ 项传递过来的耦合效应——这也是倒立摆控制器的核心难点。2.3 为什么要做线性化处理方程(1)和(2)是非线性的里面有 sinθ、cosθ、θ̇² 这些项直接用于控制器设计非常困难。工程上的常规做法是在平衡点附近做线性化因为倒立摆控制的目标本来是维持摆杆在小角度范围内稳定θ 很小时可以用小角度近似化简。当 θ 接近 0 时sinθ ≈ θcosθ ≈ 1θ̇² 是二阶小量可以忽略。把这三个近似代入方程整理后得到(M m)ẍ m·l·θ̈ u m·l·ẍ (4/3)m·l²·θ̈ m·g·l·θ这两个方程都是线性常微分方程。选择状态变量为 x1 x小车位置x2 ẋ小车速度x3 θ摆杆角度x4 θ̇摆杆角速度通过代数消元可以得到标准的连续时间状态空间表达式ẋ Ax BuA [0, 1, 0, 0; 0, 0, -mg/M, 0; 0, 0, 0, 1; 0, 0, (Mm)g/(M·l), 0]B [0; 1/M; 0; -1/(M·l)]注意 A 矩阵第三行第三列的 -mg/M 和第四行第三列的 (Mm)g/(M·l) 这两个元素一个符号为正一个为负分别刻画了摆杆角度对小车加速度和角加速度的影响方向。这个符号关系决定了控制输入的极性如果这里搞反控制器一上来就会把系统往错误方向推。2.4 状态空间模型参数设计与稳定性初步分析选取一组典型的物理参数M 0.5kgm 0.2kgl 0.3mg 9.8m/s²。代入状态空间矩阵用MATLAB的 eig 函数计算特征值会发现一个正实部特征值这正是系统不稳定性的数学体现。倒立摆在竖直朝上的平衡点是不稳定的鞍点特征值分布关于虚轴对称一个在右半平面一个在左半平面。这个结论很重要——它告诉我们仅仅靠系统本身的物理特性摆杆不可能稳定在竖直位置必须施加外力闭环控制。从直觉上理解摆杆竖直朝上相当于把一根铅笔尖朝下立在手指头上任何微小的扰动都会让偏移持续放大而不是自动收敛。控制器的任务就是通过小车运动不断追着摆杆的倾倒方向移动把它扶回来。3. 用MATLAB脚本实现模型仿真从状态方程到数值积分3.1 状态空间模型的MATLAB代码实现有了状态空间模型接下来就是把它变成可运行的代码。我建议先把模型单独写成一个函数文件方便后续在仿真主程序、LQR验证、扰动响应测试等多个地方复用。function xdot inverted_pendulum_dynamics(t, x, u_func, params) % 一阶倒立摆非线性动力学模型 % 输入: t 时间, x 状态向量 [位置; 速度; 角度; 角速度], u_func 控制律函数句柄 % 输出: xdot 状态导数向量 M params.M; m params.m; l params.l; g params.g; % 从输入函数获取当前控制力 u u_func(t, x); % 非线性模型 theta x(3); theta_dot x(4); % 系数矩阵 Mmat [Mm, m*l*cos(theta); m*l*cos(theta), (4/3)*m*l^2]; Fvec [u m*l*sin(theta)*theta_dot^2; m*g*l*sin(theta)]; acc Mmat \ Fvec; xdot [x(2); acc(1); x(4); acc(2)]; end如果你只做小角度仿真也可以直接用线性模型function xdot inverted_pendulum_linear(t, x, u_func, params) % 一阶倒立摆线性化模型在垂直向上平衡点附近 M params.M; m params.m; l params.l; g params.g; u u_func(t, x); A [0, 1, 0, 0; 0, 0, -m*g/M, 0; 0, 0, 0, 1; 0, 0, (Mm)*g/(M*l), 0]; B [0; 1/M; 0; -1/(M*l)]; xdot A*x B*u; end我强烈建议读者在实验环节把这两套模型都跑一遍然后对比它们的差异。小角度初始条件下两者几乎重合但初始角度一旦超过10到15度非线性模型的响应曲线就会明显偏离线性模型这时候你就能直观感受到小角度假设的适用范围有多宽。3.2 控制律设计为什么选择LQR而不是PID现在模型有了紧接着的问题是如何让倒立摆维持稳定。最直接的想法是PID控制但PID在倒立摆上有个天然劣势——它是一个多变量耦合系统PID通常只针对单个输出设计很难同时协调小车位置和摆杆角度。虽然你可以做双环PID外环控位置、内环控角度但参数整定非常依赖经验而且PID在强耦合、快动态的系统上鲁棒性往往不够。LQR即线性二次型调节器是倒立摆控制最经典的设计方法。它的思路是设计一个状态反馈控制器 u -Kx使得二次型性能指标 J ∫(xᵀQx uᵀRu)dt 最小。直观理解就是Q矩阵告诉你状态偏差有多贵R矩阵告诉你控制力有多贵LQR自动找到在两者之间最优折中的反馈增益。在MATLAB中使用 lqr 函数% 定义系统 M 0.5; m 0.2; l 0.3; g 9.8; A [0, 1, 0, 0; 0, 0, -m*g/M, 0; 0, 0, 0, 1; 0, 0, (Mm)*g/(M*l), 0]; B [0; 1/M; 0; -1/(M*l)]; C eye(4); D zeros(4, 1); sys ss(A, B, C, D); % 设计LQR Q diag([100, 10, 100, 10]); R 1; K lqr(A, B, Q, R);Q矩阵对角线元素分别对应小车位置误差、速度误差、角度误差、角速度误差的权重。我这里把位置和角度的权重设为100速度和角速度设为10意思是让系统优先保证位置和角度的精确性。实际调参时你可以在仿真中观察曲线再反向调整权重。3.3 纯脚本仿真主程序与可视化不需要Simulink直接用MATLAB的 ode45 就能完成闭环仿真。这里的核心思路是把系统动力学和控制律分离通过函数句柄在数值积分每个时间步自动调用控制律计算输入。% 仿真参数 params.M 0.5; params.m 0.2; params.l 0.3; params.g 9.8; Q diag([100, 10, 100, 10]); R 1; [K, S, e] lqr(A, B, Q, R); % 定义控制律函数 control (t, x) -K * x; % 初始状态摆杆偏15度其余为0 x0 [0; 0; 15*pi/180; 0]; % 仿真时间 tspan [0 5]; % 调用ode45求解 [t, x] ode45((t, x) inverted_pendulum_linear(t, x, control, params), tspan, x0); % 绘制结果 figure(Position, [100, 100, 1200, 800]); subplot(2, 2, 1); plot(t, x(:, 1), b-, LineWidth, 1.5); xlabel(时间 (s)); ylabel(小车位置 (m)); title(小车位置响应); grid on; subplot(2, 2, 2); plot(t, x(:, 3)*180/pi, r-, LineWidth, 1.5); xlabel(时间 (s)); ylabel(摆杆角度 (deg)); title(摆杆角度响应); grid on; subplot(2, 2, 3); u_hist arrayfun((i) -K*x(i, :), 1:length(t), UniformOutput, false); u_hist cell2mat(u_hist); plot(t, u_hist, g-, LineWidth, 1.5); xlabel(时间 (s)); ylabel(控制力 (N)); title(控制力输出); grid on; subplot(2, 2, 4); plot(x(:, 1), x(:, 3)*180/pi, k-, LineWidth, 1.5); xlabel(小车位置 (m)); ylabel(摆杆角度 (deg)); title(相位轨迹); grid on; sgtitle(一阶倒立摆LQR控制仿真结果 (初始偏角15度));仿真结果正常情况下应该是摆杆角度曲线在约1秒内收敛到0度附近过程中会有一次明显的超调之后逐渐衰减到稳定小车位置会在反方向先移动一段距离然后回到零附近——这是线性最优控制器的典型行为控制力曲线呈现出平滑的衰减振荡。如果发现角度发散优先检查符号。摆杆角度状态方程里 A(3,4) 的值以及控制矩阵 B 中对应行的符号如果符号写反反馈力方向就会反越控越乱。这种问题排查起来特别容易让人崩溃因为看着矩阵觉得没问题但仿真就是不动或者乱动。3.4 一个容易踩的坑ode45的精度与事件检测用 ode45 做倒立摆仿真有个细节很多人没注意——ode45是变步长求解器它会根据误差容忍度自动调整步长。但对于倒立摆这类初始阶段动态变化很快的系统默认的误差容忍度在某些极端初始条件下可能会导致结果失真。我踩过的一个具体坑是初始角度给到25度以上时发现结果在不同MATLAB版本上跑出来的曲线不一样。排查到最后发现是 RelTol 默认只有1e-3对快动态系统的瞬态响应捕捉不够精细。建议把选项设置为options odeset(RelTol, 1e-6, AbsTol, 1e-8); [t, x] ode45((t, x) inverted_pendulum_dynamics(t, x, control, params), tspan, x0, options);另外如果在控制律里用到了状态量的符号判断比如分段控制要注意 ode45 的插值阶段可能导致事件检测不准确。更稳妥的方式是用 ode45 的事件函数在摆杆角度超过临界值时终止仿真并提示系统失稳function [value, isterminal, direction] fall_detection(t, x, params) value abs(x(3)) - 30*pi/180; % 摆杆偏离超过30度视为倒下 isterminal 1; % 终止仿真 direction 0; end这样仿真程序就变得有点像真实实验了控制器只管稳定系统事件检测负责判断系统是否已经物理上失稳。后续做实物之前这套仿真逻辑能帮你减少大量不必要的调试时间。4. LQR参数整定的实战经验Q和R矩阵应该怎么调4.1 Q和R的物理含义再深入一点很多教材对Q和R矩阵只是一带而过说根据经验选取。但实际仿真中你很快就会发现Q和R的取值直接决定了控制器的行为倾向值得认真研究。Q diag([q1, q2, q3, q4]) 中对角线元素表示对应状态误差的权重。q1大小车位置误差惩罚大位置收敛快q3大角度误差惩罚大摆杆更硬地维持在竖直方向q2和q4对应速度项如果调得太大系统会变得非常迟钝因为任何速度变化都会受到惩罚控制器就不太敢加速去纠正位置偏差。R 是控制力的惩罚权重。R越大控制力越贵控制器会倾向于用更温柔的方式调节系统代价是响应变慢、超调变大。R越小控制越使劲响应更快但控制力曲线更陡峭实际执行机构可能达不到这么大的力或者输入会饱和。我提供一个从实践中来调参策略先固定 R 1Q 初始设置为 diag([10, 1, 10, 1])跑仿真看角度响应如果角度收敛太慢增大 q3如果小车位置漂移太远后回不来增大 q1如果响应过程中振荡太多适当增大 q2 和 q4。这样逐步调整比一开始就试图找到最优解高效得多。4.2 典型调参轨迹案例分析以我自己的仿真为例第一组参数 Q diag([10, 1, 10, 1])R 1初始角度10度。结果角度大约在1.5秒收敛但小车位置最大偏移接近0.35米对于0.5kg的小车来说这个偏移偏大而且位置曲线回零之后还有明显超调。第二组把 q1 加到100Q diag([100, 10, 100, 10])R 不变。结果小车位置最大偏移降到0.18米但代价是控制力峰值从2.8N升到4.5N。如果执行机构只能输出3N这就说明参数不合适需要反过来降低 q1 或者增大 R。第三组尝试增大 R 到5Q diag([100, 10, 100, 10])R 5。控制力峰值降到2.1N小车偏移略有增大到0.22米角度收敛时间从0.6秒变成1.1秒。这个参数组合在仿真中不如图一华丽但一旦考虑执行机构饱和约束其实更接近实际可部署的方案。参数组合角度收敛时间位置最大偏移控制力峰值适用场景Q[10,1,10,1], R1约1.5s约0.35m约2.8N教学演示响应温和Q[100,10,100,10], R1约0.6s约0.18m约4.5N追求快速收敛执行器余量足Q[100,10,100,10], R5约1.1s约0.22m约2.1N执行器受限的实物系统这组对比背后的规律是通用的权重权衡的本质是你在系统响应快不快和控制代价高不高之间找平衡点。4.3 仿真中发现的一个反直觉现象我在做LQR参数扫描时发现一个有意思的现象当 q1 和 q3 都特别大的时候系统响应并没有变得更快反而开始出现高频微振。原因在于过大的Q会使得反馈增益矩阵K的元素值变得很大系统进入高增益区域这种系统在连续时间模型里可能依然稳定但在数值仿真中由于离散化误差和模型本身的高频模态会出现数值不稳定或抖动。这说明一个道理仿真里的最优参数不代表实际可用的参数。在做实物部署之前一定把执行机构饱和、采样时间、传感器噪声这些非理想因素加进仿真里试一遍。这也是为什么我在后面会强调用非线性模型验证LQR设计的原因——线性控制器设计基于线性模型但如果非线性模型中初始偏角太大线性假设失效控制器就会罢工。5. 从线性到非线性验证控制器的真实鲁棒性5.1 用非线性模型进行闭环验证只在线性模型上调出好看的曲线不算完事真正的考验是把同一个LQR控制器作用到非线性模型上。做法很简单把仿真主程序里调用的函数从 inverted_pendulum_linear 换成 inverted_pendulum_dynamics其他代码都不用动。我实测的结果是初始角度10度时非线性模型和线性模型的响应曲线几乎重合区别小到肉眼难以分辨初始角度增加到20度时差异开始显现非线性模型的收敛时间比线性模型长大约20%初始角度30度时非线性模型在第一个控制周期内就明显表现出更难扶住的趋势角度曲线出现更大的瞬态偏移但LQR控制器仍然能把系统拉回来。如果把初始角度加到45度左右控制器会完全失效系统直接倒下。这个临界角度取决于具体的物理参数和控制权重大约在30到40度之间。从物理直觉上看角度超过这个范围后cosθ 偏离1太多线性化模型与真实系统的差异已经大到增益不再匹配反馈控制力方向虽然没错但强度不足以抵抗重力矩的拉拽。5.2 为什么线性控制器在非线性模型上也能用这个问题在控制理论里叫鲁棒性分析。LQR基于线性模型设计得到的是一个固定的反馈增益K它并没有针对非线性模型做任何优化。但为什么在中等角度范围内它依然有效关键在于闭环系统的稳定裕度。LQR有一个很漂亮的数学性质当R是正定标量且Q取适当的半正定矩阵时得到的闭环系统总是具有至少60度的相位裕度和无限的幅值裕度。这个性质保证了即使被控对象存在一定的模型失配比如非线性项被忽略反馈系统依然有足够的余量来维持稳定。这也是为什么LQR在工程上这么受欢迎的原因之一——很多时候你不需要做精确的非线性控制器设计只要把工作点附近的线性控制器做对、留够裕量就能够在相当大的范围内正常工作。当然这种裕量会随初始偏角的增大而逐渐消耗殆尽所以才有前面看到的临界角度效应。5.3 仿真实验报告的呈现技巧如果你正在写一份基于一阶倒立摆的matlab仿真实验报告有一点值得注意报告不要只贴代码和截图要把建模过程和参数整定过程也记录下来。我的建议是实验报告至少包含以下内容物理模型推导过程简要列出拉格朗日方程推导的关键步骤不需要把每一步都展开但必须让读者能够理解状态空间矩阵是如何从物理方程来的。控制器设计思路讲清楚为什么选LQR、Q和R各代表什么物理含义、你试了哪几组参数、最终选了哪组以及为什么。仿真结果分析除了放角度和位置的响应曲线还要放控制力曲线和相位轨迹。很多人的报告只有角度曲线这就丢失了大量信息。局限性与改进方向如果只做了线性仿真明确说明如果做了非线性验证指出临界角度范围可以简要提一下后续可以考虑的控制器类型比如模糊控制、滑模控制、模型预测控制等。6. 从仿真到实物倒立摆实验的工程化思考6.1 仿真与实物的关键差异把仿真里的LQR控制器搬到实物倒立摆上绝不是直接复制代码那么简单。我陪实验室的师弟调试过一套自制的倒立摆平台踩过不少坎几个典型问题值得提前了解。第一是执行机构饱和。仿真里控制力可以取任意大的值但实物电机有最大输出力矩。解决方法是加饱和限幅然后在仿真里也加上同样的限幅再验证一遍。你会发现加上饱和的模型比理想模型更难稳需要重新调参数。第二是传感器量化噪声。角度传感器有分辨率限制反馈给控制器的角度值不是连续量而是阶梯量。高增益LQR对测量噪声非常敏感——反馈增益K大噪声被放大得也厉害系统会出现明显抖动。第三是采样时间。实物控制系统是离散的MATLAB仿真如果是连续时间积分两者之间有很大差异。建议仿真时就设置成定步长离散仿真模拟真实的采样和控制周期。比如控制周期1ms就用固定步长0.001秒跑仿真看看同样参数下系统能否保持稳定。6.2 如何在仿真阶段提前规避实物调试风险这些坑大部分可以在仿真阶段提前暴露出来。我后面的仿真流程里专门加了一步工程化增强验证% 执行机构饱和 u_sat max(min(u, u_max), -u_max); % 传感器量化模拟编码器分辨率0.01弧度 theta_meas round(theta / 0.01) * 0.01; % 零阶保持器每个控制周期才更新一次控制量 % 配合固定步长求解器使用加上这三样之后控制参数往往需要重新整定。比如之前R5那组参数加上饱和和量化后表现还行而R1那组高增益参数会明显看到系统出现持续微振。这类经验如果能在仿真阶段就积累起来以后上实物调试会从容很多。6.3 从一阶倒立摆延伸出去的学习路线一阶倒立摆只是这个知识体系的入口学会之后可以往几个方向延伸。二阶倒立摆也就是摆杆上再加一节杆动力学复杂度和控制难度都大幅上升是检验现代控制理论掌握程度的经典题旋转倒立摆把直线导轨换成旋转臂涉及离心力和科里奥利力的耦合工程上更接近真实机械臂的控制问题如果把倒立摆控制从LQR换成滑模控制或者自适应控制你又能学到一套截然不同的设计思路。我个人的学习路线是先彻底吃透一阶倒立摆的建模、线性化和LQR设计然后手写一遍仿真代码不依赖任何现成工具箱接着做非线性验证和加入工程约束的增强仿真最后再考虑上实物。每一步都建立在前一步的深刻理解之上这样学出来的东西才真正是自己的。把那段做倒立摆仿真的经历写出来之后回头看整个实验过程最让我有收获感的其实不是最终那条光滑的角度收敛曲线而是在反复调试中终于理解的那些为什么——为什么方程里有的项可以忽略、为什么LQR的Q和R要这样取、为什么仿真里能稳的参数搬到实物上会抖。这些问题每一个单独拎出来都不算难但把它们串在一起的时候控制理论的骨架才真正立了起来。如果你现在正准备做这个实验我的建议是务必从拉格朗日方程开始手动推导一遍哪怕中途算错几次也无所谓算错再纠正的过程反而能帮你把模型彻底吃透。线性化之后把A、B矩阵验证一遍然后才开始写代码。仿真阶段先在线性模型上调通LQR再拿到非线性模型上验证临界角度范围最后加上饱和、量化这类工程约束看看控制器还能不能扛得住。最后再分享一个小技巧做参数扫描的时候不要用一堆subplot图在一张figure里硬拼那样对比起来很不直观。我当时是把不同参数组的响应曲线画在同一个坐标轴里用legend区分再配合上面那张参数对比表格一眼就能看出每组参数的优劣。这套方法无论是写实验报告还是做PPT汇报效果都比零散的曲线截图好得多。本文还有配套的精品资源点击获取