1. 项目背景与核心价值
倒立摆控制一直是控制理论中的经典问题,它模拟了机器人平衡、火箭姿态控制等现实场景中的不稳定系统控制需求。传统PID控制虽然能实现基本稳定,但在非线性、时变系统中表现有限。这正是强化学习大显身手的地方——通过与环境交互自主学习最优控制策略,无需精确数学模型。
我在工业控制领域摸爬滚打多年,见证了从传统控制到智能算法的演进。这次用MATLAB实现DQN和PPO双算法对比,不仅因为MATLAB强大的仿真生态(特别是Simulink与控制工具箱的无缝衔接),更因为其清晰的代码结构特别适合教学演示。下面分享的代码和技巧,都是我在给工程师培训时反复验证过的实战方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与建模要点
2.1 MATLAB强化学习工具箱配置
首先确保安装:
matlab复制ver('rl') % 检查强化学习工具箱
若未安装,通过Add-Ons搜索"Reinforcement Learning Toolbox"安装。推荐2021b及以上版本,其对PPO算法的实现更稳定。
注意:安装后建议执行
rehash toolboxcache更新工具箱路径,避免出现"未定义函数"错误
2.2 倒立摆动力学建模
在Simulink中搭建模型时,关键参数设置:
matlab复制pendulumLength = 1.0; % 摆杆长度(m)
cartMass = 1.0; % 小车质量(kg)
pendulumMass = 0.1; % 摆杆质量(kg)
gravity = 9.8; % 重力加速度
运动方程采用欧拉-拉格朗日法推导,离散化时建议采样时间≤0.02秒:
matlab复制Ts = 0.01; % 离散化采样时间
我在实际测试中发现,当采样时间>0.05秒时,PPO算法会出现明显的振荡现象。
3. DQN算法实现细节
3.1 网络架构设计
matlab复制dqnOptions = rlDQNAgentOptions(...
'UseDoubleDQN', true, ...
'TargetUpdateMethod', 'smoothing', ...
'TargetSmoothFactor', 1e-3);
dqnNetwork = [
featureInputLayer(4,'Name','state')
fullyConnectedLayer(64,'Name','fc1')
reluLayer('Name','relu1')
fullyConnectedLayer(64,'Name','fc2')
reluLayer('Name','relu2')
fullyConnectedLayer(2,'Name','output')
];
关键技巧:
- 输入层维度必须与观测空间一致(4个状态量:位置、速度、角度、角速度)
- 最后一层神经元数量等于动作空间维度(本例为2:向左/向右施力)
3.2 超参数调优经验
通过网格搜索验证的最佳参数组合:
| 参数 | 推荐值 | 影响分析 |
|---|---|---|
| 学习率 | 1e-4 | >1e-3易发散,<1e-5收敛慢 |
| 折扣因子 | 0.99 | 低于0.95会导致短视 |
| 经验池大小 | 1e6 | 太小易过拟合 |
| 批大小 | 128 | 32-256之间效果差异不大 |
踩坑记录:曾将经验池设为1e4导致训练不稳定,增大后明显改善
4. PPO算法实现进阶
4.1 策略网络设计
matlab复制actorNetwork = [
featureInputLayer(4,'Name','state')
fullyConnectedLayer(128,'Name','fc1')
reluLayer('Name','relu1')
fullyConnectedLayer(64,'Name','fc2')
tanhLayer('Name','tanh1')
fullyConnectedLayer(1,'Name','output')
];
与DQN不同,PPO需要:
- 策略网络输出连续动作(本例为力的大小)
- 值函数网络单独构建
- 添加动作标准差参数
4.2 关键参数解析
matlab复制ppoOptions = rlPPOAgentOptions(...
'ClipFactor', 0.2, ... % 重要性采样截断阈值
'EntropyLossWeight', 0.01, ... % 探索激励系数
'MiniBatchSize', 64);
实验发现ClipFactor在0.1-0.3之间效果最佳,超出此范围要么更新太保守,要么策略震荡。
5. 双算法对比实测
5.1 训练效率对比
在RTX 3060显卡上测试:
| 指标 | DQN | PPO |
|---|---|---|
| 收敛步数 | ~8k | ~3k |
| 稳态误差 | ±0.15rad | ±0.08rad |
| 抗干扰性 | 较差 | 优秀 |
5.2 代码结构差异
DQN需要手动实现:
- 经验回放
- 目标网络
- ε-greedy策略
而PPO在MATLAB中已封装:
- 自动并行采样
- 优势估计
- 策略裁剪
6. 常见问题排查指南
6.1 训练不收敛
可能原因:
- 奖励函数设计不合理(建议角度误差权重>位置误差)
- 观测未归一化(导致梯度爆炸)
- 学习率过高
6.2 Simulink报错处理
遇到"代数环"错误时:
- 检查是否有直接馈通
- 在Simulink配置中勾选"代数环诊断"
- 添加单位延迟模块
7. 工程实践建议
- 硬件部署时,建议先用PPO训练,再蒸馏为轻量DQN网络
- 实时控制时,将MATLAB模型导出为ONNX格式,用TensorRT加速
- 工业场景中,建议结合MPC做安全约束
这个项目最让我惊喜的是PPO在抗干扰性上的表现——即使给摆杆施加瞬时冲击,它也能在0.5秒内恢复平衡,这远超过传统控制方法的鲁棒性。后续我准备尝试结合LSTM处理传感器噪声,有兴趣的读者可以关注我的GitHub更新。
