4. 布赖恩特法则:一种经典的Q矩阵对角线赋值方法,适用于SISO系统
说到LQR的权重矩阵调参,很多新手第一反应就是“瞎试”。
嗯,我当年也干过这事。调了半天,系统要么抖得像筛子,要么慢得像蜗牛。
后来一位老前辈甩给我一句话:“试试布赖恩特法则。” 说实话,这方法简单到让我有点怀疑——但效果确实稳。
4.1 布赖恩特法则的核心思想
布赖恩特法则,说白了就是一套给Q矩阵对角线赋值的“经验公式”。
它专门针对SISO系统(单输入单输出)。对于MIMO系统,这方法只能当个起点。
它的逻辑是这样的:
- 你希望哪个状态量收敛得快,就把对应的Q对角线元素设大一点
- 你希望控制量别太猛,就把R设大一点
- Q矩阵的非对角线元素,统统设为零
为什么非对角线设为零?
我个人习惯是:先解耦再调参。布赖恩特法则正是这个思路——假设各状态之间没有耦合,简化问题。
核心公式:
Q = diag(q₁, q₂, ..., qₙ)
其中 qᵢ = 1 / (允许的最大偏差)²
举个例子:
假如你的系统状态是位置x和速度v。你希望位置偏差不超过0.1米,速度偏差不超过0.5米/秒。
那么:
- q₁ = 1 / (0.1)² = 100
- q₂ = 1 / (0.5)² = 4
R值怎么取?我一般先设R=1,然后根据控制量的实际输出再调整。
4.2 布赖恩特法则的适用场景
这方法不是万能的。我在项目中遇到过几次翻车的情况,总结下来:
| 场景 | 适用性 | 说明 |
|---|---|---|
| SISO系统 | ✅ 非常适用 | 状态少,耦合弱,效果立竿见影 |
| MIMO系统 | ⚠️ 仅作初值 | 状态耦合强时,需要进一步优化 |
| 非线性系统 | ❌ 不推荐 | 需要结合其他方法(如增益调度) |
| 快速原型验证 | ✅ 强烈推荐 | 几分钟就能拿到可用的参数 |
4.3 布赖恩特法则的调参步骤
我一般按下面这几步走,稳得很:
- 确定状态量的物理意义——比如位置、速度、角度等
- 设定每个状态允许的最大偏差——根据工程要求来
- 按公式计算qᵢ——1 / (偏差)²
- 设R=1——作为初始值
- 仿真验证——看响应速度、超调量、控制量是否合理
- 微调——如果响应太慢,增大qᵢ;如果控制量太大,增大R
小技巧:
我曾经在调一个位置伺服系统时,发现位置响应总是慢半拍。按布赖恩特法则算出来的q值偏小,我直接翻了3倍,效果立竿见影。记住:法则给的是起点,不是终点。
4.4 布赖恩特法则的局限性
你想想看,这方法假设状态之间没有耦合。但实际系统哪有这么理想?
比如一个倒立摆系统,角度和角速度是强耦合的。你用布赖恩特法则算出来的Q矩阵,可能只能让系统勉强稳定,但动态性能一般。
避坑指南:
我曾经在一个四轴飞行器的姿态控制中用了布赖恩特法则,结果发现俯仰和滚转通道互相干扰。后来我不得不引入非对角线元素,才把解耦做好。所以——布赖恩特法则只适合做初值,别指望一步到位。
4.5 布赖恩特法则的变体
在实际工程中,我见过几种变体:
- 加权布赖恩特法则:在qᵢ的基础上乘以一个权重系数,用于平衡不同状态的重要性
- 自适应布赖恩特法则:根据系统实时状态动态调整qᵢ,适用于时变系统
- 混合法则:布赖恩特法则 + 极点配置,先用布赖恩特算初值,再用极点配置微调
我个人比较喜欢第三种。先用布赖恩特法则快速拿到一组可用的参数,然后用极点配置把闭环极点挪到理想位置。这样既快又准。
4.6 布赖恩特法则的代码实现
下面是一个Python示例,演示如何用布赖恩特法则生成Q矩阵:
import numpy as np
def bryants_rule(max_deviations, R=1.0):
"""
布赖恩特法则:生成Q矩阵对角线元素
参数:
max_deviations: list, 每个状态允许的最大偏差
R: float, 控制权重,默认1.0
返回:
Q: numpy array, 对角线Q矩阵
R: float, 控制权重
"""
q_values = [1.0 / (dev**2) for dev in max_deviations]
Q = np.diag(q_values)
return Q, R
# 示例:位置偏差0.1m,速度偏差0.5m/s
max_dev = [0.1, 0.5]
Q, R = bryants_rule(max_dev)
print("Q矩阵:\n", Q)
print("R值:", R)
输出结果:
Q矩阵:
[[100. 0.]
[ 0. 4.]]
R值: 1.0
你看,代码就这么几行。但实际调参时,我建议你多跑几次仿真,看看不同q值下的响应曲线。
4.7 布赖恩特法则的知识体系
下面这张图,是我自己总结的布赖恩特法则知识结构。你一看就明白:
4.8 总结
布赖恩特法则,说白了就是一套“按物理意义赋值”的土办法。它不完美,但胜在简单、直观、有效。
我个人建议:
- 新手先用它入门,快速拿到一组可用的参数
- 老手用它做初值,再结合其他方法优化
- 千万别迷信它,实际系统总有意外
嗯,布赖恩特法则就聊到这。下一章我们聊聊另一种经典的Q矩阵赋值方法——你猜是什么?
公众号:蓝海资料掘金营,微信deep3321