1. 从倒立摆开始:为什么需要LQR控制器?

倒立摆是个特别有意思的控制系统实验对象,它本质上是个不稳定系统,就像你试着用手指顶起一根棍子,稍微有点扰动就会倒下。在控制理论中,我们经常用倒立摆来测试各种控制算法,因为它简单直观,但又包含了丰富的动力学特性。

我第一次接触倒立摆是在读研的时候,当时用PID控制器试了半天,发现虽然能让摆杆立起来,但响应总是有点振荡,而且抗干扰能力不强。后来导师推荐我试试LQR控制器,这才发现原来线性二次调节器在处理这类系统时有这么好的效果。

LQR控制器的核心思想很简单:我们既要让系统状态快速收敛到目标值(比如让倒立摆保持竖直),又要尽量减小控制 effort(比如电机输出的力)。这就像开车既要快速到达目的地,又要省油一样,需要在两个目标之间找到平衡。

2. 状态空间建模:把物理系统转化为数学语言

2.1 建立倒立摆的数学模型

我们先从最简单的倒立摆模型开始。假设有个质量为m的小球连接在长度为L的轻杆上,底部有个电机可以施加控制力。当摆角Φ很小时,我们可以用线性近似来简化系统动力学。

根据牛顿第二定律,系统的动力学方程可以推导为:

d²Φ/dt² = (g/L)Φ - (1/(mL²))u

其中g是重力加速度,u是控制输入(电机的扭矩)。

这个二阶微分方程可以转化为状态空间形式。我们定义状态向量x = [Φ, dΦ/dt]ᵀ,那么状态空间方程就是:

dx/dt = Ax + Bu

其中系统矩阵A和控制矩阵B为:

A = [[0, 1],
     [g/L, 0]]
B = [[0],
     [-1/(mL²)]]

2.2 状态空间方程的实际意义

状态空间表示法的好处是它能清晰展示系统内部状态如何演化。第一个状态Φ代表摆角位置,第二个状态dΦ/dt代表角速度。矩阵A描述了系统自身的动力学特性,而矩阵B则表示控制输入如何影响系统状态。

我在实际项目中发现,建立准确的状态空间模型是LQR控制成功的关键。有一次我忽略了杆的质量,结果控制器效果很差,后来重新建模才解决问题。所以建议大家在实际应用中一定要仔细验证模型准确性。

3. LQR控制原理:在性能与控制代价间寻找平衡

3.1 代价函数:LQR的核心所在

LQR控制器的设计围绕着一个二次代价函数展开:

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

这个函数包含两部分:xᵀQx惩罚状态偏差,uᵀRu惩罚控制输入。Q和R就是我们需要调节的权重矩阵。

Q矩阵通常是对角矩阵,对角线上的元素表示我们对各个状态变量的重视程度。在倒立摆例子中,Q[0,0]对应摆角Φ的权重,Q[1,1]对应角速度的权重。

R矩阵是标量或矩阵,表示我们对控制effort的惩罚程度。R值越大,控制器就越"保守",会尽量使用小的控制输入;R值越小,控制器就越"激进",为了快速收敛愿意使用更大的控制力。

3.2 LQR问题的求解

LQR问题的解是一个状态反馈控制器:

u = -Kx

其中增益矩阵K通过求解代数Riccati方程得到。在MATLAB中,我们可以直接用lqr函数计算:

K = lqr(A, B, Q, R);

这个反馈控制器的美妙之处在于,它保证了闭环系统(A-BK)是稳定的,而且是在给定Q和R权重下的最优解。

4. Q矩阵与R矩阵的调参艺术

4.1 Q矩阵的物理意义与调节策略

Q矩阵决定了我们对系统状态的重视程度。在倒立摆系统中,Q矩阵通常是2x2的对角矩阵:

Q = [[q11, 0],
     [0, q22]]

其中q11惩罚角度偏差,q22惩罚角速度。

从我实际调参的经验来看,q11和q22的相对比值比它们的绝对值更重要。一般来说:

  • 增大q11会让系统更积极地去纠正角度偏差
  • 增大q22会让系统对速度变化更敏感,有助于抑制振荡

我常用的调参方法是先固定R=1,然后调整Q矩阵。比如先设q11=1, q22=0,观察系统响应,然后逐步增加q22直到振荡消失。

4.2 R矩阵的影响与选择技巧

R矩阵惩罚控制输入的大小。在倒立摆中,R通常是个标量值:

  • R值小:允许使用大的控制力,系统响应快但可能超调
  • R值大限制控制力大小,系统响应慢但平稳

在实际系统中,选择R值时需要考虑执行器的物理限制。比如电机的最大扭矩是1Nm,那么我们就应该选择R值使得控制输入不会持续超过这个限制。

我有一个实用的调参技巧:先估计系统需要的最大控制输入,然后选择R值使得在最大偏差时控制输入略小于执行器极限。这样可以既保证性能又避免饱和。

4.3 Q和R的协同调节

Q和R不是独立调节的,它们的相对大小才是关键。实际上,只有Q/R的比值影响控制器性能。这意味着你可以固定其中一个而调节另一个。

我个人的习惯是固定R=1,只调节Q矩阵,这样更直观。当找到满意的Q后,如果需要调整控制输入大小,再同时缩放Q和R保持它们的比值不变。

5. 实战调参:从仿真到实际系统

5.1 MATLAB/Simulink仿真环境搭建

我们先在MATLAB中建立倒立摆的仿真模型。首先定义系统参数:

m = 0.1;    % 小球质量(kg)
L = 1;      % 杆长(m)
g = 9.8;    % 重力加速度(m/s²)

A = [0 1; g/L 0];
B = [0; -1/(m*L²)];

然后设计LQR控制器。假设我们更关注快速收敛,选择较大的Q:

Q = [100 0; 0 1];  % 重视角度控制
R = 0.01;          % 允许较大的控制力
K = lqr(A, B, Q, R);

在Simulink中搭建模型时,记得加入执行器饱和、采样时间等实际约束,这样仿真结果才更有参考价值。

5.2 不同参数配置的对比分析

让我们比较两种极端情况:

情况一:追求快速响应

Q = [100 0; 0 1];
R = 0.01;
K = lqr(A, B, Q, R);

这种配置下,系统收敛很快(约0.5秒),但控制输入较大,峰值达到15Nm。

情况二:追求节能平滑

Q = [1 0; 0 1];
R = 100;
K = lqr(A, B, Q, R);

这种配置收敛较慢(约2秒),但控制输入很小,峰值只有2Nm。

通过这样的对比,我们可以清楚地看到Q和R如何影响系统性能。在实际应用中,我们需要根据具体需求找到合适的平衡点。

5.3 调参中的常见问题与解决技巧

在我调参的过程中,遇到过几个典型问题:

问题一:系统振荡 通常是Q矩阵中速度项的权重太小。增加q22的值(角速度权重)可以有效抑制振荡。

问题二:响应太慢 可能是Q值太小或R值太大。尝试增大Q矩阵的值或减小R值。

问题三:控制输入饱和 说明R值太小或Q值太大。增大R值或减小Q值,或者检查执行器能力是否足够。

我建议的调参步骤是:

  1. 先粗略确定Q和R的数量级
  2. 固定R,调节Q直到获得满意的响应速度
  3. 微调Q中的相对权重消除振荡
  4. 最后调整R值优化控制输入大小

6. 从仿真到实际:考虑真实世界的约束

6.1 执行器饱和与抗饱和处理

在实际系统中,执行器都有物理限制。电机有最大扭矩,舵机有最大转角。忽略这些限制会导致性能下降甚至不稳定。

在仿真中,我总会加入饱和模块来模拟执行器限制。如果发现饱和现象,就需要调整R值或重新设计控制器。有时还需要加入抗饱和策略,比如在接近饱和时减小控制增益。

6.2 噪声与滤波处理

真实系统总有传感器噪声和执行器噪声。过大的噪声会影响LQR性能,因为它是全状态反馈,噪声会被直接放大。

我通常会在状态反馈前加入低通滤波器,或者在Q矩阵中适当降低对速度项的权重(因为速度测量通常噪声更大)。在MATLAB中,可以使用kalman函数设计状态估计器来处理噪声问题。

6.3 采样时间与离散化

数字控制器是在离散时间下工作的,所以需要将连续时间的LQR控制器离散化。在MATLAB中,可以使用lqrd函数:

K_d = lqrd(A, B, Q, R, Ts);

其中Ts是采样时间。

选择采样时间时有个经验法则:采样频率应该是系统带宽的10-20倍。对于倒立摆,系统带宽通常在2-5Hz,所以采样时间选0.01-0.02秒比较合适。

7. 高级技巧与性能优化

7.1 权重矩阵的精细调节

除了对角权重,Q和R矩阵还可以包含非对角元素,表示状态变量之间的耦合惩罚。但在实际中,我很少这样做,因为调参太复杂,而且效果往往不明显。

更实用的方法是对不同状态变量使用不同的权重函数,比如在偏差大时使用大权重,接近平衡点时使用小权重。这需要更复杂的非线性控制方法,但性能会更好。

7.2 频域整形与回路传输恢复

对于有强烈噪声或不确定性的系统,单纯的LQR可能不够。这时可以结合频域整形技术,或者使用LQG控制(LQR加Kalman滤波)。

回路传输恢复(LTR)是种高级技巧,先在低频设计LQR性能,再在高频恢复LQR的鲁棒性。这需要较深的理论基础,但在 demanding 的应用中很有效。

7.3 自适应LQR与增益调度

对于参数变化较大的系统,可以使用增益调度

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐