基于MATLAB的倒立摆控制实现方案

基于MATLAB的倒立摆控制实现方案,包含PID控制与神经网络(DQN)控制的双重实现


一、系统建模与基础参数

%% 倒立摆动力学参数
m = 0.1;    % 摆杆质量 (kg)
M = 1.0;    % 小车质量 (kg)
l = 0.5;    % 摆杆长度 (m)
g = 9.81;   % 重力加速度 (m/s²)
J = m*l²/3; % 摆杆转动惯量

%% 状态空间模型
A = [0 1 0 0;
     0 (m+M)*g/(M*l) 0 -(m+M)*g/M;
     0 0 0 1;
     0 -m*g*l/(J+M*l²) 0 m*g*l/(J+M*l²)];
B = [0; 1/(M*l); 0; -1/(J+M*l²)];
C = eye(4);
sys = ss(A,B,C,0);

二、PID控制实现

1. 双闭环PID控制器设计

%% PID参数(经遗传算法优化)
Kp_angle = 45.12;   % 角度环比例增益
Ki_angle = 0.0;     % 角度环积分增益
Kd_angle = 215.2;   % 角度环微分增益

Kp_pos = 1.134;     % 位置环比例增益
Ki_pos = 0.0;       % 位置环积分增益
Kd_pos = 58.45;     % 位置环微分增益

%% 控制仿真
dt = 0.025;  % 采样时间
t_end = 10;  % 仿真时长
N = t_end/dt;

% 初始状态:小车位置1m,摆杆角度30°
x0 = [1; 0; deg2rad(30); 0];

% 存储轨迹
x_hist = zeros(4,N);
u_hist = zeros(1,N);

%% 控制循环
sys = ss(A,B,C,0);
for k = 1:N
    % 当前状态
    x = x_hist(:,k);
    
    % 位置环控制
    e_pos = 0 - x(1);
    u_pos = Kp_pos*e_pos + Kd_pos*(0 - x(2));
    
    % 角度环控制
    e_angle = 0 - x(3);
    u_angle = Kp_angle*e_angle + Kd_angle*(0 - x(4));
    
    % 总控制量
    u = u_pos + u_angle;
    u = max(min(u, 10), -10);  % 限幅
    
    % 系统响应
    [~,x_next] = lsim(sys, u, dt, x);
    
    % 存储数据
    x_hist(:,k+1) = x_next;
    u_hist(k) = u;
end

2. 结果可视化

figure;
subplot(2,1,1);
plot(0:dt:t_end, rad2deg(x_hist(3,:)), 'r', 'LineWidth',1.5);
hold on;
plot(0:dt:t_end, zeros(size(x_hist(3,:))), 'k--');
title('摆杆角度控制');
xlabel('时间(s)'); ylabel('角度(°)');
legend('实际角度', '目标角度');

subplot(2,1,2);
stem(0:dt:t_end, u_hist, 'b', 'LineWidth',1.5);
title('控制输入');
xlabel('时间(s)'); ylabel('力(N)');

三、神经网络控制(DQN)实现

1. 环境建模

%% 创建倒立摆环境
env = rlPredefinedEnv('CartPole-Discrete');

% 状态空间离散化
stateInfo = getObservationInfo(env);
actionInfo = getActionInfo(env);

% 神经网络结构
criticOpts = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1);
critic = rlQValueFunction([64 64], stateInfo, actionInfo, 'full', criticOpts);

2. DQN智能体构建

%% DQN代理配置
agentOpts = rlDQNAgentOptions(...
    'TargetUpdateMethod','soft',...
    'TargetUpdateRate',0.005,...
    'ExperienceBufferLength',1e6,...
    'DiscountFactor',0.99,...
    'SampleTime',env.Ts);

agent = rlDQNAgent(critic, agentOpts);

3. 训练过程

%% 训练参数
trainOpts = rlTrainingOptions(...
    'MaxEpisodes',5000,...
    'MaxStepsPerEpisode',500,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',480);

% 开始训练
trainingStats = train(agent, env, trainOpts);

4. 测试与仿真

%% 测试控制
simOpts = rlSimulationOptions('MaxSteps',500);
experience = sim(env, agent, simOpts);

% 绘制测试结果
plot(experience.Observation(:,1), 'r', 'LineWidth',1.5);
hold on;
plot(experience.Observation(:,3), 'b', 'LineWidth',1.5);
legend('小车位置','摆杆角度');

四、关键参数整定方法

1. PID参数整定(Ziegler-Nichols法)

% 步骤1:断开积分和微分项
Ku = 80;  % 临界增益
Tu = 0.5; % 临界周期

% 步骤2:计算参数
Kp = 0.6*Ku;
Ki = 1.2*Kp/Tu;
Kd = 0.075*Ku*Tu;

% 步骤3:仿真验证并微调

2. DQN超参数优化

参数 初始值 调整策略
学习率(lr) 1e-3 Adam优化器自动调整
折扣因子(γ) 0.99 0.95-0.99范围网格搜索
经验回放容量 1e6 根据内存限制调整
批量大小(Batch) 64 32-256范围性能测试

参考代码 倒立摆控制,包含了神经网络控制,PID控制的matlab代码 www.youwenfan.com/contentcnj/63857.html

五、扩展应用

1. 混合控制策略

% 前馈+反馈控制
u = Kp*e + Kd*de + Kff*ref;  % 前馈补偿
u = agent.chooseAction([x; u]);  % DQN修正

2. 多智能体协作

% 创建多个DQN代理
agents = rlDQNAgent(critic, agentOpts, 4);

% 协作训练
for i = 1:numAgents
    trainingStats(i) = train(agents(i), env, trainOpts);
end
posted @ 2025-10-17 11:54  晃悠人生  阅读(12)  评论(0)    收藏  举报