LQR 倒立摆模拟器 返回
控制工程模拟器

LQR 倒立摆模拟器 — 最优状态反馈控制

用 LQR 状态反馈稳定小车上的倒立摆。调节 Q 与 R 权重,学习响应速度与控制力之间的折衷设计。

参数设置
位置权重 Q_p
角度权重 Q_θ
输入惩罚 R
初始角 θ_0
°

小车质量 M=1.0 kg、摆杆质量 m=0.1 kg、摆长 L=0.5 m、重力 g=9.81 m/s²、仿真时长 5 s(dt=0.01 s,RK4 积分)。

计算结果
增益 K
整定时间 t_s(5%)
峰值输入 |u|_max
角度超调
时间响应与控制输入

上:小车位置 p(t)(蓝色)与摆角 θ(t)(橙色,deg)/下:控制输入 u(t)(绿色,N)

理论与主要公式

小角度线性化的小车—摆模型。状态 $x=[p,\dot p,\theta,\dot\theta]^\top$,输入 $u$ 为施加在小车上的水平力:

$$\dot x = A x + B u,\quad A=\begin{bmatrix}0&1&0&0\\0&0&-\tfrac{mg}{M}&0\\0&0&0&1\\0&0&\tfrac{(M+m)g}{ML}&0\end{bmatrix},\ B=\begin{bmatrix}0\\ \tfrac{1}{M}\\0\\ -\tfrac{1}{ML}\end{bmatrix}$$

LQR 通过最小化二次型代价 $J=\int_0^\infty(x^\top Q x + u^\top R u)\,dt$ 求得状态反馈增益:

$$u = -K x,\qquad K = R^{-1} B^\top P$$

$P$ 为代数 Riccati 方程 $A^\top P + PA - PBR^{-1}B^\top P + Q = 0$ 的对称正定解。

本工具面向教学,采用基准增益 K=[1, 1.5, 30, 5] 并按 √(Q/R) 线性缩放,未在浏览器中求解 Riccati 方程。

什么是 LQR 倒立摆模拟器

🙋
「LQR」我在控制课上听过,但它具体在做什么?
🎓
简单说,LQR 同时兼顾两件事:让状态尽快回到零,但又不要用太多控制力。它最小化 $J=\int(x^\top Q x + u^\top R u)dt$。Q 大就讨厌「偏差」,R 大就讨厌「输入」。试试把 Q_θ 调到 1000、R 调到 0.01,摆角瞬间立起来,但输入 u(t) 也会变得非常剧烈。
🙋
原来如此。所以增大角度权重 Q_θ 就是让控制器对摆角更敏感?
🎓
是的。提高 Q_θ 会让增益 K 中与角度相关的分量变大,稍有倾斜就被强力推回。提高 Q_p 则对小车位置苛刻。实机设计上通常「摆绝不能倒,小车位置可以适度漂移」,所以 Q_θ ≫ Q_p 是惯例。默认 Q_θ=100、Q_p=1 正是这种偏向。
🙋
下面那张图就是输入 u(t) 吧?我调 R 它变化好大。
🎓
R 是控制力的代价。R 越小,优化器就当输入「免费」,使劲推,响应快但 |u|_max 暴涨;R 越大,优化器就要节俭,输入波形温和但稳定较慢。实机上根据执行器饱和来决定 R——比如电机只能出 200 N,就调大 R 把 |u|_max 控制在那个上限以内。
🙋
「整定时间」指什么?
🎓
指摆角 |θ| 进入初始值的 5% 以内并且不再越出所需的时间。这是衡量「多快、多干净地稳下来」最常用的标量指标。增大 Q_θ 或 Q_p 可以缩短整定时间,但代价是 |u|_max 上升——这种折衷正是 LQR 设计的核心。

常见问题

代数 Riccati 方程 $A^\top P + PA - PBR^{-1}B^\top P + Q = 0$ 给出无穷时域 LQR 问题的最优代价矩阵 $P$。一旦解出 $P$,最优增益就唯一为 $K=R^{-1}B^\top P$。$P$ 为对称正定矩阵,物理意义为「当前状态为 $x$ 时,未来全期最小代价等于 $x^\top P x$」。标准数值解法基于 Schur 分解或 Hamilton 矩阵的特征值分解,MATLAB 的 lqr() 与 Python 的 scipy.linalg.solve_continuous_are() 都能一行调用。
实机存在传感器噪声与过程扰动,几乎不可能直接测到所有状态。Kalman 滤波器是最小方差状态估计器,把含噪测量与内部模型融合得到 $\hat x$,再用 LQR 增益作 $u=-K\hat x$,整体即 LQG(线性二次高斯)控制。「分离原理」证明:最优调节器(LQR)与最优估计器(Kalman 滤波器)可独立设计,整体仍然是随机意义下的最优闭环。这是把 LQR 理论搬到不完美观测现实的标准扩展。
原理一致。人形机器人直立时,质心位于支撑多边形(脚底)上方,处于不稳定平衡,可用线性倒立摆模型(LIPM)近似。以地面反作用力矩为输入,用 LQR 或 MPC 稳定姿态的研究非常多,本田 ASIMO、Boston Dynamics Atlas、Agility Robotics Digit 等都内置了同类控制律。复杂多关节机器人也能抽出质心动力学,归结为这种小维度的 cart-pole 拓展。
本工具的状态空间模型基于小角度近似 $\sin\theta\approx\theta,\ \cos\theta\approx1$。经验上 $|\theta|<20°$ 时线性与非线性模型差异在几个百分点以内,超过 $30°$ 误差就不可忽略。把初始角调到 $\pm30°$,本模拟器仍会在线性模型上显示「稳定」,但实机摆杆惯性较大,回摆剧烈,线性假设崩塌,控制常常失败。现实倒立摆通常用基于能量的 Swing-Up 控制把摆送到 $|\theta|<15°$,再切换到 LQR;更宽工作域则用增益调度或 MPC。

实际应用

火箭与导弹姿态控制:火箭起飞瞬间推力线在质心之下,与倒立摆动力学完全相同。SpaceX Falcon 9 的垂直回收,正是通过状态估计驱动发动机摆角,让箭体保持垂直平稳下降。LQR 及其衍生(LQG、MPC)是大多数运载与导弹姿态控制器的基础。

两轮自平衡机器人:Segway、Ninebot、爱好者级两轮平衡车本质就是倒立摆。陀螺仪与加速度计测量车体倾角,反馈到车轮力矩上保持直立。教育用套件(如 LEGO Mindstorms)的平衡车多用 LQR 或 PID 实现。本模拟器调节 Q、R 的体验,几乎可以直接迁移到实机调参。

高层建筑的主动调谐质量阻尼器:超高层建筑与长跨桥梁用主动质量阻尼器(AMD)对抗地震与风振——顶部巨大质量主动反向运动以抵消晃动。把结构的振型写成状态空间,再用 LQR 求执行器力,是基本设计思路。台北 101 的风振阻尼器与东京晴空塔的中央柱阻尼器都运行着 LQR 类控制律。

人形机器人与外骨骼:ASIMO、Atlas、Digit 等人形机器人的步态控制融合 ZMP(零力矩点)框架与 LQR 类姿态控制器。康复用外骨骼把穿戴者建模为倒立摆,关节电机按 LQR 风格输出辅助力矩,帮助患者重新获得站立平衡感。

常见误区与注意事项

最常见的误区是「把 Q 或 R 调得越大性能越好」。LQR 的解只取决于比值 Q/R——把 Q、R 同时乘以同一常数得到的 K 完全相同。真正起作用的是状态各分量之间的相对权重(Q_p 与 Q_θ 之比)以及状态与输入之间的相对权重(Q_θ 与 R 之比)。盲目放大 Q 只会让 |u|_max 爆炸。试着在本工具里把 R 调到 0.01:整定时间确实变短,但 |u|_max 会冲到几百牛顿。综合考虑执行器极限选择合理的 R 才是工程功夫。

其次是「以为线性化模型对任何初始条件都成立」。本工具的 A 矩阵基于 $\sin\theta\approx\theta$,仅在 $|\theta|<20°$ 范围内准确。把初始角滑块拨到 $30°$,本模拟器仍显示「线性模型稳定」,但实机摆杆惯性会让回摆过头,线性假设崩塌,控制常常失败。现实倒立摆几乎都采用 Swing-Up(起摆)+ Stabilize(稳定)双控制律:当 $|\theta|<15°$ 时再切到 LQR。

最后请记住本工具是「面向教学的简化 LQR」,并非严格最优解。真正的 LQR 增益需要求解 4 维代数 Riccati 方程,在浏览器里实现 Schur 分解过于重;因此我们采用典型表现良好的基准增益 K=[1, 1.5, 30, 5],并按 $\sqrt{Q/R}$ 线性缩放。Q、R 比值对响应的定性影响可正确观察,但要得到严格最优 K,请使用 MATLAB 的 `K = lqr(A,B,Q,R)` 或 Python 的 `scipy.linalg.solve_continuous_are`。本工具的目标是直观理解「LQR 是什么」,并非替代数值求解器。