3. 使用Simulink进行一阶倒立摆LQR控制
一阶倒立摆的线性化模型
一阶倒立摆(小车-摆杆系统)的典型状态变量取为:小车位置 x、小车速度 ẋ、摆杆角度 θ(竖直向上为 0)、摆杆角速度 θ̇。在平衡点 θ≈0 附近做小角度线性化(sinθ≈θ,cosθ≈1,忽略 θ̇² 项),可得线性状态空间模型:
状态: x = [x; ẋ; θ; θ̇]
输入: u = 小车水平推力 F
A = [0 1 0 0;
0 0 -m*g/M 0;
0 0 0 1;
0 0 (M+m)*g/(M*l) 0]
B = [0; 1/M; 0; -1/(M*l)]
其中 M=小车质量, m=摆杆质量, l=摆杆质心到转轴距离, g=9.81
取教学示例参数:M=0.5 kg,m=0.2 kg,l=0.3 m,g=9.81 m/s²。代入后 A 中关键项为 -m*g/M=-3.924,(M+m)*g/(M*l)=45.78,B 中 1/M=2,-1/(M*l)=-6.667。该模型在 θ 较小时有效,是 LQR 设计的基础。
LQR 控制器设计与 Simulink 实现
LQR 通过最小化代价函数 J=∫(xᵀQx+uᵀRu)dt 求取最优增益 K=R⁻¹BᵀP,其中 P 由代数 Riccati 方程 AᵀP+PA−PBR⁻¹BᵀP+Q=0 解出。在 MATLAB 中可直接用 lqr(A,B,Q,R) 求解。以下给出完整可运行脚本,先建立模型、计算增益,再在 Simulink 中搭建闭环。
% 一阶倒立摆 LQR 设计脚本(MATLAB)
M = 0.5; m = 0.2; l = 0.3; g = 9.81;
A = [0 1 0 0;
0 0 -m*g/M 0;
0 0 0 1;
0 0 (M+m)*g/(M*l) 0];
B = [0; 1/M; 0; -1/(M*l)];
C = eye(4); D = zeros(4,1);
% 权重选择:优先稳定摆杆,其次定位小车
Q = diag([10, 1, 100, 1]); % q_θ 最大,强调摆角收敛
R = 0.1; % 推力代价较小,允许较大控制量
K = lqr(A,B,Q,R);
disp('LQR 增益 K ='); disp(K);
% 闭环极点验证
Acl = A - B*K;
disp('闭环极点 ='); disp(eig(Acl));
运行后得到一组示例增益(随参数与权重不同而变化):K ≈ [-10.0, -12.6, 71.4, 13.9]。闭环极点实部均为负,说明系统稳定。接下来在 Simulink 中搭建:
- 新建模型,拖入
State-Space模块,填入A,B,C,D,初始状态设为[0;0;0.1;0](摆杆初始偏 0.1 rad)。 - 拖入
Gain模块,值设为-K,实现u=−Kx。 - 用
Mux将 4 路状态合成向量送入 Gain,Gain 输出接 State-Space 的u输入。 - State-Space 输出接
Scope,同时用To Workspace记录x与θ。 - 仿真时间设为 5 s,求解器
ode45,步长自动。
若摆杆初始角度较大(如 0.3 rad),线性化误差会明显增大,可能出现收敛变慢或振荡。此时可减小初始角度,或改用非线性模型验证。
仿真结果判读与调参
运行仿真后观察 Scope:摆角 θ 应从 0.1 rad 快速衰减到 0,小车位置 x 会先向一侧移动以“接住”摆杆,随后回到 0 附近。若 θ 收敛但 x 偏离过大,说明位置权重 q_x 偏低;若控制量 u 饱和或抖动,说明 R 太小。可按以下顺序调整:
| 现象 | 原因 | 调整 |
|---|---|---|
| θ 收敛慢 | q_θ 偏小 | 增大 q_θ(如 100→500) |
| x 回中慢 | q_x 偏小 | 增大 q_x(如 10→50) |
| u 幅值过大 | R 偏小 | 增大 R(如 0.1→1) |
| 高频抖动 | q_θ̇ 偏小 | 适当增大 q_θ̇ |
LQR 要求全状态可测。若实际系统只能测小车位置和摆角,需在 Simulink 中增加观测器(如 Luenberger 观测器)估计
ẋ 与 θ̇,否则反馈量不完整会导致控制失效。可直接使用的 LQR 调参检查表
| 检查项 | 通过条件 | 不通过时的动作 |
|---|---|---|
| 闭环极点实部 | 全部 < 0 | 检查 Q 是否正定、R>0 |
| 摆角稳态误差 | |θ| < 0.01 rad | 增大 q_θ |
| 小车位置稳态误差 | |x| < 0.02 m | 增大 q_x |
| 控制量峰值 | |u| < 10 N(示例) | 增大 R |
| 仿真步长 | ode45 自动,无警告 | 减小最大步长或改用 ode23 |