第四节:线性二次型调节器(LQR)——从理论到实战

各位同学,今天我们来聊聊LQR。说实话,我在做机器人控制的前三年,基本都在跟PID打交道。直到有一次做四旋翼的精准悬停,PID怎么调都抖得厉害——嗯,就是那种“明明理论能行,实际就是不行”的尴尬。后来导师丢给我一句话:“试试LQR吧。”这一试,就打开了新世界的大门。

4.1 LQR到底在解决什么问题?

先别急着看公式。你想想看,一个控制系统最核心的目标是什么?说白了就两条:让状态稳定到目标值,以及别花太多力气。

PID只盯着误差,不管“力气”花得值不值。LQR不一样,它把这两个目标写进了一个数学表达式里——这就是所谓的代价函数。

核心思想:在“状态偏差”和“控制能量”之间找一个最优平衡点。

4.2 理论推导——其实没那么可怕

我们考虑一个线性系统:

ẋ = Ax + Bu

目标是找到控制律 u = -Kx,使得下面的代价函数最小:

J = ∫(xᵀQx + uᵀRu) dt

这里Q和R就是权重矩阵。Q惩罚状态偏差,R惩罚控制量。我个人习惯把Q设成对角阵,每个对角元对应一个状态的权重——比如位置偏差权重给100,速度偏差给10,这样系统会更“在意”位置精度。

推导的关键一步,是假设存在一个矩阵P,满足:

AᵀP + PA - PBR⁻¹BᵀP + Q = 0

这就是著名的Riccati方程。解出P之后,最优反馈增益就是:

K = R⁻¹BᵀP

我在项目中遇到过一个问题:Riccati方程用MATLAB的lqr()函数一秒钟就解出来了,但自己手写迭代求解时,数值稳定性是个大坑。曾经有一次,我迭代了500步还没收敛,最后发现是初始矩阵给得太离谱——嗯,这里要注意,初始P矩阵最好给单位阵的倍数。

实战技巧:别自己写Riccati求解器。用现成的库,比如Python的control库或者MATLAB。把精力花在调Q和R上,那才是LQR的精髓。

4.3 权重矩阵设计——Q和R的“玄学”

说实话,Q和R的设计没有标准答案。我见过新手一上来就把Q设成单位阵,R设成0.1,结果控制量直接饱和——电机烧了。这不是段子,是我亲眼见过的。

我的经验是:

  • 先定R:R代表你愿意花多少“力气”。R越小,控制越猛,但容易震荡。我一般从1开始试。
  • 再调Q:Q的对角元代表你对各个状态的重视程度。比如倒立摆,角度偏差比位置偏差更致命,所以角度对应的Q值要更大。
  • Bryson法则:一个经典的经验公式——Qii = 1/(最大允许偏差)²,R = 1/(最大控制量)²。这个起点通常不错。
状态/控制 最大允许值 权重建议
位置偏差 0.1 m Q₁₁ = 100
速度偏差 0.5 m/s Q₂₂ = 4
控制电压 12 V R = 1/144 ≈ 0.007

避坑指南:我曾经把R设成0.0001,结果仿真完美,上机直接炸机。原因是仿真里没有考虑执行器饱和。记住:LQR设计一定要加控制量限幅,否则理论最优就是实际灾难。

4.4 状态反馈控制——LQR的“眼睛”

LQR假设所有状态都可测量。但现实很骨感——你往往只能测到位置,测不到速度。怎么办?

两个办法:

  1. 用状态观测器(比如卡尔曼滤波器)估计不可测状态。这是正统做法。
  2. 用差分近似:比如位置差分得到速度。简单粗暴,但噪声会被放大。

我个人更推荐第一种。曾经在一个移动机器人项目里,我用差分法算速度,结果地面稍微有点不平,速度信号全是毛刺,LQR直接失控。后来换成卡尔曼滤波,稳如老狗。

# Python示例:LQR状态反馈
import control as ct
import numpy as np

A = np.array([[0, 1], [0, 0]])  # 双积分系统
B = np.array([[0], [1]])
Q = np.diag([100, 10])
R = np.array([[1]])

K, S, E = ct.lqr(A, B, Q, R)
print("最优反馈增益 K =", K)
# 控制律: u = -K @ x

4.5 LQR vs PID——到底选哪个?

这个问题我经常被问到。我的回答是:看场景。

对比项 PID LQR
调参难度 3个参数,凭经验 Q和R矩阵,有理论指导
多变量控制 需要解耦,麻烦 天然支持MIMO
最优性 不保证最优 二次型最优
鲁棒性 较强(积分作用) 较弱(无积分项)
实现复杂度 低,几行代码 中等,需要矩阵运算

我的建议是:

  • 单输入单输出、要求不高 → PID,省事
  • 多输入多输出、要求精准 → LQR,值得
  • 想要两者优点?试试LQR+积分(LQI),既有最优性又有稳态精度

核心总结:LQR不是万能药,但在“多变量、高精度、有模型”的场景下,它比PID强一个量级。我做过一个六轴机械臂的轨迹跟踪,用PID调了一周还是抖,换成LQR半天搞定——这就是理论的威力。

LQR核心 理论推导 Riccati方程 → 最优K 权重矩阵设计 Q惩罚状态,R惩罚控制 状态反馈控制 u = -Kx + 观测器 与PID对比 MIMO vs SISO 有模型、多变量、高精度 → 选LQR

可可精品资料库