倒立摆系统作为控制理论中的经典实验平台,一直是验证各类控制算法效果的试金石。二级倒立摆相比一级倒立摆,其非线性特性和耦合程度显著增加,对控制器的设计要求更为严苛。这个项目通过Matlab/Simulink环境,对PID和LQR两种主流控制策略进行对比仿真,为工程实践中的控制器选型提供直观参考。
二级倒立摆的动力学特性主要体现在三个方面:首先是欠驱动特性——仅通过底部的直线电机提供单一控制输入,却需要同时稳定摆杆角度和滑台位置;其次是强非线性——当摆杆偏离平衡位置较大时,系统方程中的三角函数项会引入显著非线性;最后是多变量耦合——滑台移动与摆杆摆动之间存在动态能量交换。这些特性使得简单的PID控制往往难以胜任,而LQR这类基于状态空间的设计方法则展现出独特优势。
采用拉格朗日方程建立系统数学模型。定义滑台位置为x,下摆杆角度为θ₁,上摆杆角度为θ₂,系统动能T和势能V可表示为:
code复制T = 1/2*M*ẋ² + 1/2*m₁*(ẋ² + l₁²θ̇₁² + 2l₁ẋθ̇₁cosθ₁)
+ 1/2*m₂*(ẋ² + L₁²θ̇₁² + l₂²θ̇₂² + 2L₁ẋθ̇₁cosθ₁ + 2l₂ẋθ̇₂cosθ₂ + 2L₁l₂θ̇₁θ̇₂cos(θ₁-θ₂))
V = m₁gl₁cosθ₁ + m₂g(L₁cosθ₁ + l₂cosθ₂)
通过拉格朗日算子L=T-V,最终得到系统的非线性微分方程组。在平衡点附近进行线性化处理,得到状态空间表达式:
code复制ẋ = Ax + Bu
y = Cx + Du
其中状态变量x=[x, ẋ, θ₁, θ̇₁, θ₂, θ̇₂]ᵀ,控制输入u为电机施加的力。
我们实验室使用的倒立摆装置实测参数如下:
这些参数将直接代入仿真模型。特别要注意的是,上下摆杆的转动惯量需要根据实际几何形状计算,不能简单视为质点。
采用串级PID控制架构:
具体实现时,先将两个摆杆的角度误差加权融合:
code复制θ_err = k₁θ₁ + k₂θ₂ (k₁+k₂=1)
然后设计角度PID控制器输出电机速度指令,再通过位置PID修正速度指令中的直流分量。
使用试凑法结合Ziegler-Nichols规则进行参数整定:
实际调试中发现,由于二级倒立摆的双摆耦合效应,需要将理论计算值再减小30%-40%才能获得稳定控制。
在Simulink中搭建模型时需注意:
关键仿真参数设置:
matlab复制simTime = 10; % 仿真时长
fixedStep = 0.001; % 固定步长
solverType = 'ode4';% 龙格库塔法
基于2.1节得到的线性化模型,提取A,B矩阵:
matlab复制A = [0 1 0 0 0 0;
0 0 -m1*g/M 0 -m2*g/M 0;
0 0 0 1 0 0;
0 0 (M+m1)*g/(M*l1) 0 m2*g/(M*l1) 0;
0 0 0 0 0 1;
0 0 m1*g/(M*l2) 0 (M+m2)*g/(M*l2) 0];
B = [0; 1/M; 0; -1/(M*l1); 0; -1/(M*l2)];
Q矩阵对角元素对应状态变量[x, ẋ, θ₁, θ̇₁, θ₂, θ̇₂]的权重:
matlab复制Q = diag([10, 1, 100, 10, 100, 10]);
R = 0.1; % 控制量权重
通过Bryson规则确定初始值:
code复制Qii = 1/(允许最大偏差)²
R = 1/(允许最大控制量)²
使用Matlab命令求解反馈矩阵K:
matlab复制[K,S,e] = lqr(A,B,Q,R);
得到的反馈增益矩阵:
code复制K = [-3.16 -4.12 180.3 25.6 135.2 18.9]
实际系统中部分状态不可直接测量,需设计全维观测器:
matlab复制obsv_rank = rank(obsv(A,C)); % 检验能观性
L = place(A',C',obs_poles)'; % 观测器极点配置
观测器极点通常取为控制器极点的2-3倍。
设置滑台位置阶跃指令0.1m,得到响应曲线:
LQR在动态性能上优势明显,得益于其多变量协调控制能力。
在t=5s时施加0.5N的脉冲干扰力:
LQR表现出更强的鲁棒性,因其在设计时已考虑扰动抑制。
改变摆杆质量±20%:
LQR对模型参数变化具有更好的适应性。
采样周期选择:
编码器信号处理:
电机非线性补偿:
c复制if(u>0) u += 0.3;
else if(u<0) u -= 0.3;
安全保护机制:
模糊PID控制:
在传统PID基础上增加模糊推理机,根据误差大小动态调整参数:
c复制if(fabs(e_angle)<5°) // 小误差区间
Kp=Kp1, Ki=Ki1;
else // 大误差区间
Kp=Kp2, Ki=Ki2;
状态依赖Riccati方程(SDRE):
将LQR推广到非线性系统:
code复制A(x) = ∂f/∂x|x=x_current
实时求解Riccati方程
强化学习控制:
设计奖励函数:
code复制reward = -[10*x² + θ₁² + θ₂² + 0.1*u²]
使用DDPG等算法进行训练。
硬件在环测试:
通过RT-Xenomai实现实时控制,采样抖动<10μs。
PID调试技巧:
LQR设计经验:
仿真到实物的gap:
数据记录建议: