1. 项目概述:当深度强化学习遇上经典PID控制
去年实验室接手一个工业机械臂项目时,我遇到了一个棘手问题——传统PID控制在负载突变时频繁失稳。在尝试了各种参数整定方法后,我决定尝试将深度强化学习(DRL)与PID控制结合。这个基于Matlab的一级倒立摆控制项目,正是当时技术验证的产物。
一级倒立摆作为控制理论中的"Hello World",其非线性、不稳定特性使其成为验证控制算法的理想平台。本项目核心在于:利用DRL算法动态调整PID参数,实现从静止下垂状态到竖直平衡的全过程控制。相比固定参数的PID控制器,这种自适应方案能显著提升系统在不同工况下的鲁棒性。
2. 核心组件与工具链选型
2.1 硬件建模基础
倒立摆的动力学方程可表示为:
code复制(J + ml²)θ'' + mglsinθ = mlx''cosθ + u
其中J为摆杆转动惯量,m为质量,l为质心长度。在Matlab中我们通过Simulink搭建该模型,关键参数设置为:
- 小车质量 M = 0.5 kg
- 摆杆质量 m = 0.2 kg
- 摆杆长度 l = 0.3 m
- 摩擦系数 b = 0.1 N/m/s
2.2 软件工具栈
- Matlab R2022b:主开发环境
- Reinforcement Learning Toolbox:提供PPO算法实现
- Simulink:构建被控对象模型
- Control System Toolbox:PID控制器模块
- Deep Learning Toolbox:神经网络构建
注意:建议使用R2020b及以上版本,早期版本对DRL的支持不完善
3. 深度强化学习框架设计
3.1 状态空间定义
我们设计的观测空间包含:
matlab复制obsSpace = [
cartPosition % 小车位置 [-2.4,2.4]m
cartVelocity % 小车速度 [-inf,inf]
poleAngle % 摆杆角度 [-12,12]deg
poleAngularVel % 角速度 [-inf,inf]
];
3.2 动作空间设计
采用连续动作空间输出PID参数的调整量:
matlab复制actionSpace = [
delta_Kp % 比例系数调整量
delta_Ki % 积分系数调整量
delta_Kd % 微分系数调整量
];
初始PID参数设置为Kp=10, Ki=1, Kd=1,DRL代理将在±50%范围内调整。
3.3 奖励函数构建
多目标奖励函数设计:
matlab复制function reward = calculateReward(obs)
angleWeight = 1.0;
positionWeight = 0.1;
energyWeight = 0.01;
anglePenalty = min(12, abs(obs(3))) / 12;
positionPenalty = min(2.4, abs(obs(1))) / 2.4;
reward = 1 - (angleWeight*anglePenalty + ...
positionWeight*positionPenalty) - ...
energyWeight*abs(obs(4));
end
4. 神经网络架构与训练策略
4.1 Actor-Critic网络结构
matlab复制actorNetwork = [
featureInputLayer(4,'Name','obsInput')
fullyConnectedLayer(128,'Name','fc1')
reluLayer('Name','relu1')
fullyConnectedLayer(64,'Name','fc2')
reluLayer('Name','relu2')
fullyConnectedLayer(3,'Name','output')
tanhLayer('Name','tanh1')]; % 输出范围[-1,1]
criticNetwork = [
featureInputLayer(4,'Name','obsInput')
fullyConnectedLayer(128,'Name','fc1')
reluLayer('Name','relu1')
fullyConnectedLayer(64,'Name','fc2')
reluLayer('Name','relu2')
fullyConnectedLayer(1,'Name','output')];
4.2 训练参数配置
matlab复制options = rlPPOAgentOptions(...
'SampleTime', 0.02,...
'DiscountFactor', 0.99,...
'ExperienceHorizon', 1024,...
'MiniBatchSize', 64,...
'NumEpoch', 3,...
'AdvantageEstimateMethod', "gae",...
'GAEFactor', 0.95,...
'ClipFactor', 0.2,...
'EntropyLossWeight', 0.01);
5. 系统集成与Simulink实现
5.1 混合控制架构
![控制架构框图]
- 传感器数据输入DRL代理
- 代理输出PID参数调整量
- 更新后的PID控制器计算控制量
- 执行机构驱动倒立摆系统
5.2 Simulink关键模块配置
- PID Controller:设置为外部参数输入模式
- RL Agent:采样时间设为0.02秒
- Cart-Pole Plant:启用零阶保持器
实测发现将Simulink求解器设置为ode4(Runge-Kutta)固定步长0.001s可获得最佳稳定性
6. 训练过程与性能优化
6.1 分阶段训练策略
-
起摆阶段(前500回合):
- 重点优化大角度范围内的控制
- 增加角度误差的奖励权重
-
平衡阶段(后续训练):
- 提高位置保持的奖励系数
- 加入控制量平滑项
6.2 关键训练指标
| 指标 | 初始值 | 优化后 |
|---|---|---|
| 平均回合时长 | 2.1s | 28.7s |
| 最大平衡时间 | 5.3s | ∞ |
| 起摆成功率 | 32% | 98% |
7. 实际测试中的问题与解决
7.1 高频振荡问题
当Kp调整过大时出现的高频振荡:
matlab复制% 解决方案:在奖励函数中加入导数惩罚项
reward = reward - 0.001*abs(action(1))^2;
7.2 过冲现象处理
通过限制PID参数变化率:
matlab复制delta_Kp = min(max(delta_Kp, -0.5), 0.5);
7.3 训练不收敛排查
- 检查奖励函数设计是否合理
- 验证神经网络梯度是否正常更新
- 确认环境模型参数准确性
8. 进阶优化方向
8.1 迁移学习应用
将训练好的模型迁移到不同规格的倒立摆:
matlab复制agent = loadAgent('trainedAgent.mat');
agent.resetExperience();
agent.TrainingOptions.NumStepsToLookAhead = 200;
8.2 多目标优化
使用NSGA-II算法优化奖励函数权重:
matlab复制optOptions = optimoptions('gamultiobj',...
'PopulationSize', 50,...
'ParetoFraction', 0.35);
8.3 硬件在环测试
通过Arduino实现实时控制:
matlab复制a = arduino('COM3', 'Uno');
writePWMVoltage(a, 'D9', controlSignal);
这个项目最让我意外的是,传统PID经过DRL加持后,在应对突发扰动时展现出惊人的适应性。有次实验室空调突然开启导致气流扰动,自适应PID仅用0.3秒就恢复了平衡,而固定参数PID直接失控。这种混合架构既保留了PID的简洁性,又获得了智能算法的适应能力,在实际工程中具有很高的应用价值。
