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 积分)。

计算结果
摆角 θ
控制输入 u
权重比 Q_θ/R
状态
实时 LQR 稳定化

最优状态反馈 u=−Kx 将小车(蓝色)与摆杆(橙色)恢复到直立。下方为角度 θ 与控制输入 u 的时间序列;周期性施加扰动以展示恢复过程。

理论与主要公式

购物车+摆的小角度线性化模型。状态为 $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](u=-Kx符号约定) 乘以 √(Q/R) 的简化缩放。

LQR 倒立摆模拟器是什么

🙋
「LQR」在控制课上听过,但具体是做什么的?
🎓
简单说就是「想让状态快速回到零。但又不想用太多力」的最优控制。用公式写就是 $J=\int(x^\top Q x + u^\top R u)dt$ 的最小化。Q 大就讨厌「偏差」,R 大就讨厌「输入」。上面的模拟器里,如果把 Q_θ 设成1000,R 设成0.01,你会看到立得非常快但控制输入疯狂摇晃。
🙋
那「角度权重 Q_θ」变大,就是对摆的角度更严格是吧?
🎓
完全对。Q_θ 增大,增益 K 的角度分量就变大,一点点倾斜就会强力推回。反过来 Q_p 增大就对购物车位置更严格。实际中很多场景是「摆绝对不能倒,购物车位置随便动」,所以通常 Q_θ ≫ Q_p。默认的 Q_θ=100, Q_p=1 就是这个平衡。
🙋
下面的图表是输入 u(t) 对吧。改 R 的话 u 变化特别大呢。
🎓
R 就是「输入的代价」。R 小就「输入免费」,优化器就会拼命推,应答快但 u_max 跳天高。R 大就「输入很贵」,就会省着用,慢一点上升但输入波形温和。实际机器有电机功率限制,如果最多只能推200N,你就要调大 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 分解或 Hamiltonian 矩阵特征值分解,MATLAB 的 lqr() 或 Python 的 scipy.linalg.solve_continuous_are() 都能轻松搞定。
实机有传感器噪声和外来干扰,一般没法直接观测到全部状态。Kalman 滤波器是从观测值和内部模型做最小方差的状态估计 $\hat x$,再配合 LQR 增益用 $u=-K\hat x$ 控制,就成了 LQG(Linear Quadratic Gaussian)控制。「分离原理」保证即使最优控制器(LQR)和最优估计器(Kalman 滤波器)分开设计,合在一起也能全局最优。这是 LQR 理论在不完全观测现实中的标准扩展。
基本原理完全一样。人型机器人直立其实是重心在支撑足上方的不稳定平衡,可以用线性倒立摆模型(LIPM)近似。以足端地面反力力矩为输入,用 LQR 或更高级的 MPC(模型预测控制)稳定姿态,这是许多机器人(ASIMO、Atlas 等)的核心。复杂多关节的情况下,把重心动力学抽出来,就能当成这个简单4阶模型的拓展。挺有意思的。
本工具采用小角度近似 $\sin\theta\approx\theta,\ \cos\theta\approx1$,经验上 $|\theta|\lt 20°$ 线性和非线性差不超过几%,但超过30°就不能忽视了。初始角度滑块拉到 $\pm30°$ 时,线性模型「说稳定了」,但实际上可能倒下。实机设计中经常是非线性 Swing-Up(摇上去)加线性稳定两个阶段,或者用能量法、增益自适应、MPC 等手段覆盖更大动作范围。

实际应用

火箭与导弹姿态控制:火箭发射初段推力线在重心下方,处于倒立摆一样的不稳定平衡。SpaceX Falcon 9 的垂直着陆也是通过各个引擎的喷嘴偏转角(Gimbal)用状态反馈控制,把火箭身体扶住。LQR 甚至更高级的 LQR-LQG、MPC 都是这类姿态制御的基础。

两轮自平衡机器人:Segway、Ninebot、爱好者的两轮倒立机器人——全是倒立摆本身。靠陀螺仪和加速度计测车体倾斜,电机输出转矩通过反馈控制,就能直立。教学套件(乐高等)里稳定化常用 LQR 或 PID,本工具里改 Q、R 看到的应答特性,完全就是调参的缩小版。

建筑减振(TMD、AMD):超高层楼和长跨度桥梁顶端放个大质块,地震或风时推动它产生反作用力,抑制建筑摇晃。这个「主动质量减振器」(Active Mass Damper) 的推力就用 LQR 来决定——把建筑振动模态写成状态空间,优化控制力。台北101 的风摇减振、东京晴空树的心柱减振都用了这套理论的亲戚。

人型机器人和外骨骼:ASIMO、Atlas、Digit 这样的人型机器人走路,靠 ZMP(零力矩点)规范加 LQR 系姿态反馈。康复外骨骼穿在人身上,把穿戴者姿态建模成倒立摆,关节电机 LQR 式地输出助力。

常见误解和注意事项

最常见误解是「Q、R 越大越好」。错!LQR 只对「比值 Q/R」敏感。Q=1, R=1 和 Q=100, R=100 给出完全一样的增益 K。重要的是各状态分量的重要度「比率」(Q_p : Q_θ、Q_θ : R)。盲目增大 Q 只会让 u_max 爆炸。试试把 R 降到0.01,看稳定时间缩短的同时 u_max 怎么飙升,就明白了。实机有执行器饱和,R 的选定才是设计水平的体现。

其次线性化对任意初条件都成立的错觉。本工具的 A 矩阵是小角度近似 $\sin\theta\approx\theta$ 推导的,$|\theta|\lt 20°$ 还可以,30° 就不行。初始角度拉到30°时「线性说稳定」但实机会倒。现实倒立摆常用 Swing-Up 和稳定化两个控制段,或能量法、MPC。

最后本工具是「教学简化版 LQR」不是严格最优。真正 LQR 增益需要解4阶代数 Riccati,但在浏览器里实现 Schur 分解太重。所以我们用典型好的基准增益 K=[-1, -1.5, -30, -5](u=-Kx符号约定) 乘以 $\sqrt{Q/R}$ 近似。Q、R 比值的质性影响是对的,但严格最优 K 要用 MATLAB 的 K = lqr(A,B,Q,R) 或 Python 的 scipy.linalg.solve_continuous_are。本工具就是「感受 LQR 是什么」的入门。

使用指南

  1. 用滑块设置Q权重矩阵的位置分量(Qpos)和角度分量(Qang)。从默认值Qpos=1、Qang=100开始,优先考虑角度稳定性时增大Qang
  2. 调整R输入惩罚值(通常0.1~10.0)。增大R降低执行器负荷,减小R提高响应速度
  3. 设置初始角度(±30°≈±0.52rad)后会自动重新计算,并更新增益K、稳定时间t_s、最大输入|u|_max和角度超调

具体计算示例

默认设置(购物车质量M=1.0kg、摆质量m=0.1kg、摆长L=0.5m、Qpos=1、Qang=100、R=1.0、初始角度10°)下,显示的状态反馈增益为K=[-1.0, -1.5, -30, -5.0]。响应稳定时间t_s=2.31秒,最大控制输入|u|_max=5.2N,角度超调27.8%。将R降至0.1后,K=[-3.2, -2.7, -95, -8.9],t_s缩短到1.69秒,|u|_max增至16.6N。

工程实践注意事项