2. 权重矩阵Q与R的物理含义:状态代价与控制代价的博弈
好,咱们直接切入正题。
很多初学者拿到LQR,第一反应就是——Q和R到底怎么设?随便填几个数试试?
我刚开始做LQR调参时也这么干过。结果呢?要么系统抖得像筛子,要么响应慢得像蜗牛。后来我才明白,Q和R不是数学符号,它们背后是实实在在的物理博弈。
2.1 一句话说清Q和R的本质
说白了,LQR的优化目标就是:
J = ∫ (xᵀQx + uᵀRu) dt
这个公式里:
- xᵀQx —— 状态代价。衡量系统偏离目标有多“疼”。
- uᵀRu —— 控制代价。衡量你用力控制有多“累”。
你想想看,这不就是一场拔河吗?
Q这边使劲拉,想让状态误差快速归零;R那边拼命拽,不让控制量太大。谁赢了,系统的性格就随谁。
核心理解:
- Q越大 → 系统越“急”,响应快但容易抖
- R越大 → 系统越“稳”,动作小但响应慢
2.2 Q矩阵的每一项到底代表什么?
Q矩阵通常是对角阵。为什么?因为这样每一项都对应一个状态变量,物理意义非常清晰。
假设你的状态向量是:
x = [位置, 速度, 角度, 角速度]ᵀ
那么Q矩阵就是:
Q = diag(q₁, q₂, q₃, q₄)
每一项的含义:
| Q元素 | 对应状态 | 物理含义 |
|---|---|---|
| q₁ | 位置误差 | 位置偏差的“惩罚力度” |
| q₂ | 速度误差 | 速度偏差的“惩罚力度” |
| q₃ | 角度误差 | 角度偏差的“惩罚力度” |
| q₄ | 角速度误差 | 角速度偏差的“惩罚力度” |
举个例子。我在做倒立摆项目时,角度误差q₃设得特别大。为什么?因为角度一偏,摆杆就倒了,这是生死攸关的事。位置误差q₁反而可以小一点,反正最后能稳住就行。
我的调参习惯:
先确定哪个状态最重要,给它最大的Q值。其他状态按重要性递减。比如倒立摆:角度 > 角速度 > 位置 > 速度。
2.3 R矩阵:控制代价的“价格标签”
R矩阵通常是一个标量(单输入系统)或对角阵(多输入系统)。
它的物理含义很直接:你愿意为控制付出多大代价?
- R很小(比如0.01):控制很“便宜”,系统可以猛打猛冲。响应快,但执行器容易饱和,甚至损坏。
- R很大(比如100):控制很“昂贵”,系统会小心翼翼。动作温柔,但响应慢得像老牛拉车。
我曾经在一个无人机项目中,R设得太小。结果呢?电机疯狂转动,电池几分钟就耗光了。后来我把R调大了10倍,续航直接翻倍。代价是响应慢了0.3秒,但完全能接受。
避坑指南:
我曾经犯过一个低级错误——Q和R的量纲没对齐。位置误差是米,控制量是牛,数值差了好几个数量级。结果LQR算出来的增益完全不能用。
记住:Q和R的数值要基于物理量纲来设定。如果位置误差在0.01米量级,控制力在10牛量级,那Q和R的比值就要考虑这个尺度差异。
2.4 Q与R的博弈:一张图看懂
为了让你更直观地理解,我画了一张图:
这张图我想表达的是:没有绝对的“最优Q和R”,只有“最适合你需求的Q和R”。
2.5 实战中的Q/R设定策略
说了这么多理论,来点实际的。我总结了一套Q/R设定的“三步法”:
- 量纲归一化:先把所有状态和控制量归一化到[0,1]区间。这样Q和R的数值就有可比性了。
- 初始值设定:Q取单位阵,R取1。然后跑一次仿真,看看响应曲线。
- 迭代调整:
- 如果响应太慢 → 增大对应状态的Q值(或减小R)
- 如果振荡太厉害 → 减小Q值(或增大R)
- 如果控制量饱和 → 增大R值
一个实用技巧:
我习惯用Bryson's Rule作为起点:
Q_ii = 1 / (最大允许状态误差)²
R_jj = 1 / (最大允许控制量)²
这样设定出来的Q和R,物理意义非常清晰。然后再根据实际响应微调。
2.6 一个真实案例
最后分享一个我实际做过的项目——四旋翼无人机的高度控制。
状态变量:高度误差、垂直速度误差
控制量:油门指令
初始设定(Bryson's Rule):
- 最大高度误差:0.5m → q₁ = 1/(0.5²) = 4
- 最大速度误差:2m/s → q₂ = 1/(2²) = 0.25
- 最大油门变化:50% → R = 1/(0.5²) = 4
仿真后发现:高度响应太慢,超调量小但调节时间长达8秒。
于是我把q₁从4调到20,响应时间缩短到3秒。但代价是油门出现了小幅振荡。
最后我把R从4调到10,振荡消失,调节时间4.5秒。嗯,这个结果我能接受。
记住:
LQR调参没有标准答案。你的任务不是找到“最优解”,而是找到“最符合你需求的解”。
Q和R的博弈,说白了就是你想要多快,愿意付出多大代价。
公众号:蓝海资料掘金营,微信deep3321