一级倒立摆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界面设计(参考)

  1. 参数输入面板:支持手动调整质量、长度、控制参数

  2. 控制模式选择:LQR/PID/极点配置切换

  3. 实时数据显示:包含位置/角度曲线、控制输入波形

  4. 扰动注入:可添加阶跃/正弦干扰测试鲁棒性

参考代码 一级倒立摆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 中等波动
posted @ 2026-01-16 15:32  别说我的眼泪有点咸  阅读(7)  评论(0)    收藏  举报