第四节:线性二次型调节器(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假设所有状态都可测量。但现实很骨感——你往往只能测到位置,测不到速度。怎么办?
两个办法:
- 用状态观测器(比如卡尔曼滤波器)估计不可测状态。这是正统做法。
- 用差分近似:比如位置差分得到速度。简单粗暴,但噪声会被放大。
我个人更推荐第一种。曾经在一个移动机器人项目里,我用差分法算速度,结果地面稍微有点不平,速度信号全是毛刺,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半天搞定——这就是理论的威力。