基于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:numAgentstrainingStats(i) = train(agents(i), env, trainOpts);
end