首页 / 资讯中心 / 文章详情

DDPG强化学习结合滑模控制:Simulink下实现SMC参数自适应整定

DDPG强化学习结合滑模控制:Simulink下实现SMC参数自适应整定 ★ FEATURED ARTICLE
开头最近在搭一套“DDPG强化学习 滑模控制SMC自适应调参”的Simulink仿真踩了不少坑也理清了不少思路。这个项目说白了就是用深度确定性策略梯度算法DDPG当“调参师傅”自动给滑模控制器在线调切换增益、趋近律系数这些参数让滑模控制在面对不同工况时不用手动反复试凑自己就能把参数调到合适的范围。整套东西在Simulink仿真环境里闭环跑通强化学习智能体跟被控对象、滑模控制器一起实时交互。这个思路之所以值得做是因为传统滑模控制的调参一直是个很“玄学”的事参数调小了跟踪性能差调大了抖振剧烈碰到负载扰动或者模型参数变化还得重新折腾。而DDPG刚好擅长在连续动作空间里学一个从状态到参数的映射训练好之后能在线输出合适的控制参数把“人工试凑”变成“策略自整定”。如果你正好在搞智能控制、自适应控制或者毕业论文要做“强化学习滑模控制”方向的仿真验证这篇内容应该能给你一套逻辑完整、可以直接落地的框架。下面我把整个项目的设计思路、算法原理、Simulink实现细节、调参经验和踩坑记录一次性讲透。1. 项目整体设计思路为什么偏偏是DDPG去调SMC参数1.1 传统滑模控制调参的核心痛点滑模控制Sliding Mode ControlSMC在非线性系统、欠驱动系统、电机控制、机械臂轨迹跟踪这些场景里非常受欢迎原因是它对模型不确定性和外部扰动有很强的鲁棒性。设计滑模控制器的经典套路是先定义一个滑模面比如 s c·e e_dotc为滑模面系数e为跟踪误差e_dot为误差变化率然后设计控制律让系统状态运动到滑模面上并沿着滑模面滑动到原点。但它最大的问题就藏在“参数”里。滑模控制器的参数——尤其切换增益和趋近律系数——往往需要根据控制目标反复试凑。切换增益取得太小系统可能无法到达滑模面抗扰动能力差取得太大控制量高频抖动引发抖振chattering对执行机构非常不友好甚至会激励起未建模动态。复杂工况下固定参数更难兼顾“快速性”和“平顺性”。我在实际仿真里遇到过非常典型的情况同一个滑模控制器在空载工况下调好的参数一加入负载扰动跟踪误差立刻变大重新调好参数之后空载时又抖得一塌糊涂。所以固定参数的滑模控制器本质上是在“折中”而不是在“最优”。这时候就需要一个自适应的机制让参数随工况和误差状态实时变化而不是永远绑死在一组定值上。1.2 DDPG在“连续参数调节”这个场景恰好好用强化学习的思路是把“调参”建模成一个序贯决策问题智能体感知当前系统状态误差、误差变化率、期望轨迹等根据策略选择一个动作就是一组控制参数然后获得奖励反馈通过不断试错优化策略。这个场景里动作空间是连续的——滑模控制器的参数本身就是连续变量所以需要在连续动作空间里求解策略。常见的强化学习算法里DQN擅长离散动作空间玩Atari游戏没问题但要输出一个连续的控制增益就比较别扭。DDPG深度确定性策略梯度算法是Actor-Critic架构Actor网络直接输出确定性动作Critic网络评估动作价值天然适配连续动作空间。它用确定性策略梯度训练Actor比随机策略类的算法比如PPO、SAC这类虽然SAC也能做连续控制但DDPG在结构上更直观、更贴合“输出参数”这种场景在实现和理解上更直接。另外DDPG有经验回放和目标网络机制训练稳定性相对有保障处理机电系统这类连续状态控制问题是很成熟的选择。1.3 这套仿真方案解决了什么、适合什么场景从工程角度说这个项目最终交付的是一套“基于Simulink的DDPG-SMC联合仿真系统”核心价值有三个层面第一把滑模控制从“固定参数”升级成“动态自适应参数”。训练好的DDPG智能体相当于一个智能调参器跟随系统状态实时输出滑模参数让控制器在工作点变化时仍然保持良好性能。第二用仿真代替实物试凑成本低、迭代快。直接在Simulink里建立被控对象模型、控制器、强化学习智能体的闭环环境不需要搭实验台架就能验证算法可行性。第三提供一个可迁移的算法框架。这个框架里的奖励函数设计、状态空间定义、神经网络结构、Simulink信号交互方式稍作修改就能迁移到其他控制算法比如自适应反步控制、模型预测控制的调参问题上。适合做这个方向的主要是自动化、控制工程专业的研究生做电机驱动、机器人控制相关项目的工程师以及想入门“强化学习控制”交叉方向的同学。下面我先把算法层面的核心细节拆开讲然后再给出Simulink层面的完整实现方案。2. DDPG算法核心原理拆解它到底怎么学“调参策略”2.1 Actor-Critic整体框架DDPG本质上是深度Q学习在连续动作空间的扩展它的核心是两组神经网络。Actor网络策略网络负责学一个确定性策略输入状态 s输出动作 a μ(s|θμ)。在这个项目里状态就是系统运行时的误差信息和控制信息动作就是滑模控制器的一组参数。Actor的训练方向是让Critic给出的Q值尽可能大也就是学一个能拿到高奖励的参数调节策略。Critic网络价值网络负责评估“在状态s下执行动作a之后长期回报的期望值”即Q(s,a|θQ)。它用TD目标来更新Q_target r γ·Q′(s′, a′)其中Q′是目标Critic网络a′是目标Actor网络输出的下一时刻动作r是即时奖励γ是折扣因子。工程实现上仿真中给被控对象一个阶跃目标信号Actor接收到误差信号后输出一组滑模参数比如切换增益k2.5滑模面系数c12Critic会对这组参数打个分——如果这组参数让跟踪误差收敛很快且抖振很小Q值就高Actor就会朝这个方向更新自己的参数输出。整个闭环就这么一环一环迭代下去。2.2 经验回放和目标网络让参数更新的稳定性有保障DDPG里有两个机制是保证训练不崩溃的关键我一开始偷懒没好好配结果训练曲线直接“起飞”了。经验回放Experience Replay智能体在仿真过程中把“状态、动作、奖励、下一状态”这个四元组 (s, a, r, s′) 存进一个经验池。训练更新时从池子里随机抽一批样本计算梯度。这样做的好处是打破样本之间的时间相关性——控制系统的连续状态本来就高度自相关如果按顺序训练网络会被一段段强相关的数据带偏表现为损失剧烈震荡随机抽样能把这些相关性打散让训练稳定很多。目标网络Target NetworkDDPG同时维护两个目标网络——目标Actor和目标Critic它们的参数不是随训练实时更新的而是通过软更新的方式缓慢跟踪主网络。这一点很关键因为如果用同一个Q网络既算目标值又算当前值每次更新都会让目标值跟着变整个学习过程就不稳定像追自己尾巴一样。目标值更新用软更新方式θ_target ← τ·θ_current (1-τ)·θ_target其中τ是软更新系数。仿真里我取τ0.005相当于让目标网络非常缓慢地追踪主网络给学习过程一个稳定的“靶子”。实际调试下来τ取0.01时学习速度稍快但曲线更毛糙0.001时太慢0.005是我的均衡点。2.3 探索策略连续动作空间怎么试探DDPG是确定性策略意味着训练初期如果完全不探索Actor会一直输出同一个参数组合系统永远学不到新东西。强化学习的精髓是“探索-利用平衡”所以DDPG在动作上加随机噪声。常用的是Ornstein-UhlenbeckOU噪声一种均值回归的随机过程特点是“有惯性”——上一时刻的噪声会影响到下一时刻让输出的参数曲线平滑地抖动而不是每一步都完全独立的白噪声。这很适合控制系统因为控制参数突变本身就不符合物理直觉。Simulink仿真环境里我在RL Agent模块的探索噪声设置里配置了OU噪声初始方差设了0.1衰减率设了0.995。训练前期参数抖动幅度大方便探索各种参数组合后期噪声逐渐衰减Agent越来越倾向于利用已经学到的策略。我在实做中还加了一条规定每个回合的前200步强制加探索噪声后面的步数让噪声衰减到更小——实战下来这个小技巧让收敛速度明显提升。需要注意OU噪声在Simulink的强化学习工具箱里可以通过rlDDPGAgentOptions里的ActionNoise选项配置直接指定一个扰动模型。如果不配噪声DDPG就退化成纯贪婪策略90%的概率训练完全不收敛。3. 滑模控制器建模与待调参数角色分析3.1 滑模面、趋近律与控制律的映射关系要让DDPG去调SMC参数首先得把SMC控制器完整建模出来。以最常见的二阶非线性系统为例系统状态方程为 x_ddot f(x, x_dot) g(x, x_dot)·u其中x是系统输出u是控制输入。定义跟踪误差 e x_d - xx_d为期望轨迹误差变化率 e_dot x_d_dot - x_dot。滑模面取 s c·e e_dotc必须大于0它决定了滑模面的斜率影响收敛速度。控制目标设计为设计控制量u让s经过有限时间到达0然后系统沿滑模面滑动到平衡点误差渐近收敛到0。趋近律是设计控制律的常用手段。以指数趋近律为例ṡ -k·sign(s) - q·s其中k是切换增益对抗模型不确定性和扰动的“力度”越大鲁棒性越强但抖振也越明显q是趋近系数决定系统状态趋向滑模面的快慢越大趋近越快但也会放大噪声结合系统模型推出控制律u (1/g)·[x_d_ddot - f c·e_dot k·sign(s) q·s]。注意这里要保证相对阶匹配实际推导时根据具体被控对象调整。这个控制律表达式中c、k、q就是DDPG要在线调节的三个参数。它们三个的作用交织在一起c影响误差收敛的平滑性k直接和鲁棒性挂钩q影响趋近阶段的快慢。三者的最优组合不是固定的而是随系统工作点变化而变化。3.2 参数间的权衡关系为什么“调参”本质上是个多目标优化问题我在仿真里反复验证了一个结论滑模参数之间的权衡关系非常微妙。c小的时候系统趋近过程平缓不容易激励高频未建模动态但误差收敛慢c大的时候响应快但容易对噪声敏感。q和k的组合也是k虽然主管鲁棒性但过大的k配合大q会让控制量频繁切换在实际仿真里表现就是控制曲线毛刺特别多。这个权衡关系正好给了DDPG发挥的空间。DDPG学到的策略不是找一组固定的最优参数而是学一个映射当误差较大时适当增大q加快趋近同时控制k不要过大以免抖动当系统进入稳态后减小k以抑制抖振同时适当调节c保证精度。这种“看工况下菜碟”的能力是固定参数SMC做不到的也正是“自适应调参”这个说法的核心。我在奖励函数设计里也把这个权衡关系显式地写进去了——只看跟踪误差不行还必须惩罚控制量变化率。这个下面详细讲。3.3 被控对象选型与模型不确定性模拟做仿真验证首先要选一个被控对象。我选用了一个典型的电机位置伺服系统模型结构是双惯量弹性系统电机侧转动惯量、负载侧转动惯量、连接轴的刚度系数和阻尼系数。这类模型在工业伺服里非常常见而且它有一个特点——连接轴的柔性会导致谐振峰让滑模控制的抖振问题更立体地暴露出来。模型不确定性方面我做了三件事参数摄动转动惯量在标称值基础上加了±20%的随机摄动每次仿真实例里会重新给一组值未建模动态在控制通道上加了一个高频未建模模态 (s2)/(s30)模拟实际系统中的高频谐振外部扰动在负载端加了一个方波扰动信号周期5秒幅值0.5牛米模拟工况突变这几样加完之后固定参数的滑模控制器和DDPG自适应参数控制器之间的差距就非常明显了固定参数在扰动到来时追踪误差明显增大而DDPG控制器会在扰动出现后几百毫秒内自动调整参数把误差重新压回去。4. Simulink仿真架构从状态定义到闭环连线4.1 状态空间、动作空间与奖励函数设计这是整个项目里最需要动脑子的部分直接决定训练的成败。我的设计如下。状态空间Observation取5个变量作为智能体观测——跟踪误差e、误差积分∫e、误差变化率e_dot、前一时刻的控制量u、期望轨迹的二阶导x_d_ddot。这里要特别说明一下为什么要包含误差积分和期望轨迹二阶导。误差积分能反映累计偏差防止系统出现静态误差期望轨迹二阶导给智能体一个“前馈”是的信号让它能预判轨迹变化趋势。实测下来缺了这两个变量的版本收敛明显变慢奖励曲线也容易卡在局部最优。动作空间Action三通道连续变量对应滑模控制器参数c、k、q。神经网络输出是[-1,1]范围内的归一化值然后通过缩放映射到实际参数范围c映射到[1, 30]k映射到[0.5, 15]q映射到[0.5, 10]。这里用归一化再加缩放的方式是为了让Actor网络的输出层用tanh激活函数时保持梯度稳定不用为每个参数单独设置输出范围。奖励函数Reward我设计的奖励函数是 r -(α·e² β·u_dot² λ·s²) 减去切换项惩罚。其中e是跟踪误差权重α取10u_dot是控制量变化率用于抑制抖振权重β取0.5s是滑模函数值权重λ取0.1另外每回合结束时如果跟踪误差在最后100步内始终小于0.01额外给10的bonus奖励引导智能体学习“保持稳态精度”的能力。这个bonus加得很值实际调试中发现没有它的话智能体往往学会了快速趋近但学不会稳态保持。4.2 Simulink模型整体布局与信号交互流Simulink模型的高层结构分为三块被控对象模型Plant、滑模控制器SMC Controller、强化学习智能体RL Agent。在Simulink里搭建时的具体做法被控对象模型Plant用S-Function或者Simulink基础模块搭电机双惯量模型。我用的是Level-2 MATLAB S-Function好处是可以很方便地加入参数摄动和未建模动态的代码逻辑不用拖一堆Simulink模块。滑模控制器SMC Controller用MATLAB Function模块实现输入是误差、误差变化率和DDPG输出的三个参数输出是控制量u。控制律就是前面推导的 u (1/g)·[x_d_dddot - f c·e_dot k·sign(s) q·s]。注意这里为了仿真数值稳定sign(s)用的连续化替代 sign(s) s/(|s|ε)ε取0.01避免控制器输出产生数值跳变。RL Agent模块直接用的强化学习工具箱里的RL Agent模块配置DDPG智能体。运行时智能体接收Observation信号输出三个动作——就是滑模参数。信号交互的时序关系是这样的在每个采样步长内Plant输出当前状态→计算误差和误差变化率→包装成Observation向量→送给RL Agent模块→RL Agent通过策略网络前向计算输出动作→经过缩放映射成实际参数→SMC控制器用这组参数计算控制量→作用到Plant。整个闭环以固定步长运行我把仿真采样时间设成了0.001秒每个训练回合时长2秒2000步。4.3 训练流程、超参数配置与仿真参数表训练流程我建议按下面的顺序走能减少很多无用功。第一步先用固定参数跑一遍开环仿真确认被控对象模型没有“发疯”输出发散、NaN之类。第二步将DDPG智能体接入但先跑一个回合看看信号维度、奖励计算有没有报错。我在这里走过一次弯路Observation向量的维度在Train block里配置的是5但实际Simulink信号线接的是6维直接报维度不匹配错误。第三步正式训练。超参数配置方面我整理了一张表都是调过之后表现稳定的一组参数项数值备注Actor网络结构输入5→256→256→输出3中间层ReLU输出层tanhCritic网络结构输入(53)→256→256→输出1中间层ReLU学习率Actor/Critic1e-4 / 1e-3Actor要更小心先用小学习率经验池容量1e6够大才能覆盖多种工况小批量大小256偏大一点梯度更稳折扣因子γ0.99标准配置软更新系数τ0.005前面说过的均衡点探索噪声OU噪声方差0.1衰减率0.995前200步强制探索训练回合设置总回合数500每个回合最大步数2000。我实际跑下来大约在第120个回合开始看到奖励函数明显上升第250个回合之后基本收敛但在不同随机种子下差异很大有的种子要300多个回合才稳下来。建议训练时多试几个随机种子选表现最好的模型参数保存下来。5. 常见问题与排查技巧实录5.1 训练不收敛或奖励值来回震荡怎么办这是RA玩家问得最多的问题我从实际经验里总结了三条排查路径。先看奖励曲线形状。如果奖励曲线一直徘徊在负值区域不上升大概率是奖励函数设计有问题——最常见是e的权重过大或者控制量变化率惩罚过小智能体学会了“为了让误差立刻降到零疯狂甩控制量”结果控制曲线跟锯齿一样奖励被惩罚项拉低。解决办法是把β调大实测从0.5调到2.0之后控制量平滑度明显改善。再看梯度是否爆炸。把Actor网络的梯度信息打出来如果梯度的范数超过1e2数量级说明网络结构或学习率有问题。这个项目里我把Actor学习率调低到1e-4之后梯度爆炸的情况基本不再出现。最后看探索噪声是否合适。如果噪声方差太大后期噪声衰减又不够智能体明明已经学到一个不错的策略又被噪声“抖散”了。我在后期把噪声衰减率调到0.998保证最后100个回合探索噪声已经衰减到初始值的20%以下奖励曲线才稳定下来。5.2 抖振压不下去奖励函数和趋近律的配合问题DDPG-SMC仿真里最让人头秃的问题就是训练已经收敛跟踪误差曲线也很漂亮但控制量曲线抖得跟锯齿一样整个控制量毛刺很多。一开始我试图单纯靠加大β惩罚项来压结果误差变大了奖励反而下降。后来我意识到问题出在趋近律本身。纯等速趋近律 ṡ -k·sign(s) 的bang-bang特性天然就是抖振的来源。我调整了SMC控制器结构把指数趋近律改成 ṡ -k·(s/(|s|ε)) - q·s其中第一项就是sign(s)的连续化版本。这样在滑模面附近控制切换是渐变的而不是突变的抖振大幅减弱。同时我在奖励函数里额外加了一项当 |u_dot| 超过设定的阈值时给予额外惩罚。这个阈值惩罚比连续惩罚更有效——它给智能体一个非常明确的信号“控制量变化率过大是绝对不允许的行为”智能体会躲着这个区域走。结合起来最终控制量曲线的毛刺数量减少了大概70%而跟踪精度只损失了不到5%。5.3 从仿真到实物部署必须注意的隐藏坑虽然这次做的是Simulink仿真但很多读者最终是想把这个算法部署到实际控制器上的。这里分享几个仿真里经常被忽略、但实物部署时会暴雷的点。仿真步长和真实控制周期之间要匹配。我在仿真里用了0.001秒的采样时间但很多真实控制器的控制周期是0.0005秒甚至更短。如果策略网络的前向推理时间超过控制周期整个系统就崩溃了。所以实物部署前一定要测一下模型推理延迟可以考虑把网络结构压缩256改成128或64或者做网络剪枝。奖励函数里的微分项在实物中要小心。我在状态空间里用了误差变化率e_dot仿真里可以通过差分直接算出来但实物中传感器噪声会让e_dot变成一个超高频噪声源。我实测过同样控制策略仿真里表现很好一接实际传感器的差分信号控制量直接饱和。解决办法是加滤波器或者把e_dot的权重调低。最后从仿真到实物一定把DDPG的策略先用“参数范围锁死”的方式保护起来。我在Simulink仿真里就做了个动作限幅模块c、k、q三个参数的输出被限幅在训练时设定的映射范围内这样即使智能体在没见过的新工况下输出了一个极端动作也不至于损坏执行机构。6. 扩展方向这套框架不只能调SMC这个项目的框架有一个很大的优势状态空间、动作空间和奖励函数的设计方式可以平移到很多控制器的自适应调参问题上。我自己做下来觉得至少有三个方向可以直接复用这套代码。第一个方向是滑模控制器的改进型。如果你把滑模面从线性滑模面换成非奇异终端滑模面终端滑模让系统在有限时间内收敛还是用DDPG去调那三个参数会发现奖励函数的收敛曲线有明显变化因为终端滑模的快速收敛特性会让误差项更快归零。这个扩展对我的启发很大不需要改动整体框架只要替换控制器函数和调整奖励权重就行。第二个方向是PMSM电机控制里的参数自整定。把被控对象换成电机模型滑模控制器换成PI控制器DDPG的动作空间就变成一个2维向量Kp和Ki状态空间里加入电流反馈和速度反馈。这个方向上我已经看到不少文献在做而我的经验是PI参数自动整定比SMC参数整定更容易收敛因为PI控制器的参数空间更平滑但奖励函数里要对电流波动加惩罚否则学出来的参数会让电流毛刺很严重。第三个方向是多智能体协同调参。如果你手头的项目是多电机同步控制可以把DDPG的状态空间扩大加入相邻电机的跟踪误差让一个智能体同时输出多个控制器的参数。这个我还没完全跑通但按照现在的架构扩展是最自然的。总体而言DDPG调参框架的精髓在于把“参数整定”这种经验活变成了一个可以在仿真环境里反复试错学习的“优化任务”。只要奖励函数设计合理、神经网络结构不夸张、训练超参数不过分出格它学出来的调参策略通常会比人工试凑的参数在非标称工况下表现更好。这套Simulink仿真做完之后我自己最大的体会是在调试过程中最容易翻车的其实不是强化学习本身而是你跟被控对象模型之间的“默契”够不够——模型哪里会抖、哪里会饱和、哪里对参数敏感这些感觉有了再去配DDPG就顺很多。如果你正在搭类似的仿真希望这份总结能帮你少走几段弯路。
阅读完成 · 觉得有帮助?
咨询建站