在matlab上进行基于深度强化学习算法自适应调节PID参数的控制,实现一级倒立摆的起摆和平衡
在matlab上进行基于深度强化学习算法自适应调节PID参数的控制,实现一级倒立摆的起摆和平衡,可出单独pid控制的对比图,使用强化学习工具箱搭建
最近在实验室折腾倒立摆控制,传统PID调参调得我头秃。参数整定就像在黑暗里摸开关,好不容易摆起来了又容易翻车。听说深度强化学习能自适应调参,立马抄起Matlab开搞,顺手记录下踩坑过程。
先看传统PID的表现。倒立摆初始角度-60°,目标让它摆到0°并保持平衡。常规PID控制代码如下:
Kp = 10; Ki = 1; Kd = 5; sim('pendulum_PID.slx'); plot(time, angle);结果就像喝醉的鸭子(图1蓝线),虽然勉强能稳住,但超调量高达30%,调节时间超过5秒。更坑的是换个初始角度参数又得重新调,这谁顶得住啊!
上强化学习工具箱!核心思路是让AI自己学怎么调PID参数。环境搭建是关键,状态空间包含角度、角速度、位移、速度:
obsInfo = rlNumericSpec([4 1]); actInfo = rlNumericSpec([3 1],'LowerLimit',[0;0;0],'UpperLimit',[20;5;10]); env = rlSimulinkEnv('pendulum_RL','pendulum_RL/RL Agent',obsInfo,actInfo);奖励函数设计得像教熊孩子:摆起来给糖吃,乱晃就打手心。这里用角度平方反比做奖励:
function reward = myRewardFunction(theta, action) reward = -10*theta^2 - 0.1*sum(action.^2); endDDPG网络结构用了三层全连接,中间层加BatchNorm防止过拟合。注意输出层要用tanh激活限制参数范围:
actorNet = [ featureInputLayer(4,'Normalization','none') fullyConnectedLayer(64) batchNormalizationLayer reluLayer fullyConnectedLayer(32) reluLayer fullyConnectedLayer(3) tanhLayer];训练时发现智能体总想偷懒——直接把参数调零摆烂!后来在奖励函数里加了动作惩罚项才解决。训练曲线像坐过山车,200回合后突然开窍:
在matlab上进行基于深度强化学习算法自适应调节PID参数的控制,实现一级倒立摆的起摆和平衡,可出单独pid控制的对比图,使用强化学习工具箱搭建
!PID vs RL对比图
红线的RL控制器像个老司机,起摆过程行云流水,超调量压到5%以内。更骚的是把摆杆质量增加20%,不用重新训练照样稳如老狗。不过训练耗时是真肝,i7跑了一晚上才收敛,显卡风扇狂转像要起飞。
最后奉上核心训练代码,注意要开并行加速:
trainOpts = rlTrainingOptions('UseParallel',true,'StopTrainingCriteria','AverageSteps'); agent = rlDDPGAgent(actor,critic,trainOpts); trainStats = train(agent,env,trainOpts);这波操作下来,PID调参可以扔进历史垃圾桶了。不过要提醒萌新们:别拿实验室的真摆锤乱试,别问我是怎么知道的(看着地上的零件陷入沉思)...
