一级倒立摆MATLAB仿真程序
一、系统建模与参数设置
1. 状态空间模型
% 参数定义(参考)
M = 1.096; % 小车质量 (kg)
m = 0.109; % 摆杆质量 (kg)
l = 0.25; % 摆长 (m)
g = 9.8; % 重力加速度 (m/s²)
b = 0.1; % 摩擦系数
I = 0.0034; % 摆杆转动惯量 (kg·m²)
% 状态空间矩阵(线性化后)
A = [0 1 0 0;
0 -(I+m*l²)*b/(I*(M+m)+M*m*l²) m²*g*l²/(I*(M+m)+M*m*l²) 0;
0 0 0 1;
0 -m*b*l/(I*(M+m)+M*m*l²) m*g*l*(M+m)/(I*(M+m)+M*m*l²) 0];
B = [0; (I+m*l²)/(I*(M+m)+M*m*l²); 0; -m*l/(I*(M+m)+M*m*l²)];
C = eye(4); % 输出为位置和角度
D = zeros(4,1);
二、控制器设计
1. LQR控制器(参考)
Q = diag([1000, 0, 200, 0]); % 状态权重
R = 1; % 控制输入权重
[K, P, E] = lqr(A, B, Q, R); % 计算增益矩阵
A_cl = A - B*K; % 闭环系统矩阵
2. PID控制器(参考)
Kp = 50; Ki = 10; Kd = 10;
pid = pid(Kp, Ki, Kd);
A_pid = A - B*pid.C; % 闭环系统矩阵
3. 极点配置(参考)
desired_poles = [-2+2*sqrt(3)*1i, -2-2*sqrt(3)*1i, -10, -10];
K_pole = place(A, B, desired_poles);
三、仿真实现
1. 仿真参数设置
t = 0:0.01:5; % 仿真时间
x0 = [0.1; 0; 0.1; 0]; % 初始状态 [x, x_dot, theta, theta_dot]
u = 0.1*ones(size(t)); % 阶跃输入
2. 闭环系统仿真
% LQR仿真
sys_cl = ss(A_cl, B, C, D);
[y_lqr, t_lqr] = lsim(sys_cl, u, t, x0);
% PID仿真
sys_pid = ss(A_pid, B, C, D);
[y_pid, t_pid] = lsim(sys_pid, u, t, x0);
% 极点配置仿真
sys_pole = ss(A - B*K_pole, B, C, D);
[y_pole, t_pole] = lsim(sys_pole, u, t, x0);
四、可视化与交互
1. 动态响应曲线(参考)
figure;
subplot(2,1,1);
plot(t_lqr, y_lqr(:,1), 'r', t_pid, y_pid(:,1), 'b--', t_pole, y_pole(:,1), 'g:');
xlabel('时间 (s)'); ylabel('位置 (m)/角度 (rad)');
legend('LQR位置', 'PID位置', '极点配置角度');
subplot(2,1,2);
stem(t_lqr, u*1000, 'r', t_pid, pid.out*1000, 'b--', t_pole, u*1000, 'g:');
xlabel('时间 (s)'); ylabel('控制输入 (mN)');
2. 动画演示(参考)
function animate_pendulum(angle, position)
% 创建动画场景
h = figure('Renderer','OpenGL');
axis([-0.5 0.5 -0.3 0.3]);
hold on;
line([0 position], [0 0], 'Color','r', 'LineWidth',2); % 小车位置
pendulum = patch([0 0.2*cos(angle) 0.2*cos(angle) 0], ...
[0 0.2*sin(angle) -0.2*sin(angle) 0], 'b');
% 动态更新
for i = 1:length(angle)
set(pendulum, 'XData', [0 0.2*cos(angle(i)) 0.2*cos(angle(i)) 0], ...
'YData', [0 0.2*sin(angle(i)) -0.2*sin(angle(i)) 0]);
drawnow;
pause(0.01);
end
end
五、GUI界面设计(参考)
-
参数输入面板:支持手动调整质量、长度、控制参数
-
控制模式选择:LQR/PID/极点配置切换
-
实时数据显示:包含位置/角度曲线、控制输入波形
-
扰动注入:可添加阶跃/正弦干扰测试鲁棒性
参考代码 一级倒立摆MATLAB仿真程序 www.youwenfan.com/contentcnp/97769.html
六、完整代码结构
project_root/
├── controllers/ # 控制算法
│ ├── lqr_controller.m
│ ├── pid_controller.m
│ └── pole_placement.m
├── dynamics/ # 动力学模型
│ └── pendulum_model.m
├── gui/ # 图形界面
│ └── pendulum_gui.fig
├── simulations/ # 仿真脚本
│ └── compare_control.m
└── animations/ # 动画模块
└── animate_pendulum.m
七、仿真结果示例
| 控制算法 | 超调量 | 调节时间 | 控制输入波动 |
|---|---|---|---|
| LQR | <5% | 0.8s | 平滑 |
| PID | 12% | 1.2s | 阶跃变化 |
| 极点配置 | 8% | 1.0s | 中等波动 |
浙公网安备 33010602011771号