2026/10/16 9:14:10

基于DDPG强化学习的滑模控制自适应调参优化与Simulink仿真

基于DDPG强化学习的滑模控制自适应调参优化与Simulink仿真 做滑模控制那段时间我几乎每天都在跟三组参数较劲。切换增益调大了系统高频抖振明显调小了来一个阶跃扰动就出好几度超调。边界层厚度也是同样尴尬太厚稳态误差变大太薄又跟没加边界层差不多。后来我把注意力转到自适应调参这个方向尝试了不少方案落地效果最好的一组是基于深度确定性策略梯度算法DDPG强化学习的滑模控制SMC自适应调参优化算法整套方案在Simulink环境里搭建和验证。这篇文章就是我对整个项目从理论设计、仿真建模到训练调试的一次完整复盘。如果硬要我总结这套方案的核心价值一句话把滑模控制里“靠经验定死”的控制器参数变成由强化学习智能体根据实时误差和动态响应在线微调。高频抖振被抑制了突变扰动下也能自动把增益提起来整个过程不再需要人盯着调参。无论你是刚接触强化学习控制的入门者还是在SMC上已经踩过很多坑的老手这套基于Simulink的DDPG-SMC联合仿真流程都可以拿去做参考。1. 为什么让强化学习介入滑模调参三个直接痛点决定技术路线滑模控制的控制器结构本身并不复杂真正麻烦的是参数。拿最常见的二阶机械系统来说滑模面通常选为 s e_dot c*e控制律由等效控制项 u_eq 和切换控制项 u_sw 组成。等效控制项把系统状态约束到滑模面上切换项负责克服不确定性和外部扰动边界层厚度 delta 则决定符号函数在滑模面附近的连续化近似程度。很多人以为切换增益 k、滑模面系数 c、边界层厚度 delta 各有一个标准值事实是它们互相制衡c 决定滑模面附近的动态响应速度k 决定抗扰动能力delta 决定抖振抑制程度。三组参数放在一起没有一个一劳永逸的组合能覆盖全部工况。如果被控对象工作点相对固定扰动幅度有限固定参数的SMC确实能压制住问题。可工程上的难点在于被控对象不会一直待在实验室的假设里。负载变化、摩擦系数漂移、执行器饱和、噪声水平波动任何一种情况出现都意味着当前参数已经不是最优的。固定参数SMC在这种变工况下的表现要么以高增益硬扛导致控制量长期饱和要么为了照顾某些极端工况把参数调得很保守正常工况下跟踪精度又不够。说得直白一点传统SMC的鲁棒性本质是“用保守参数对抗不确定性”而不是“跟随不确定性调整自己”。传统上自适应滑模控制方向主要靠扰动观测器或者等效扰动估计把扰动补偿项加到滑模控制律里。这类方法逻辑清晰但扰动观测器的带宽和模型误差直接影响补偿效果尤其在扰动突变或模型结构不确定时补偿项容易出现过冲甚至激发未建模动态。相比这种基于模型的自适应策略强化学习完全换了一个思路不显式估计扰动而是通过试错直接学出一条“参数调节策略”让控制器参数本身具备在线调整能力。那为什么选DDPG而不是其他强化学习算法因为在线调参本质上是一个连续动作空间问题。Q-learning、DQN处理动作空间时需要对动作离散化参数区间的分辨率完全靠离散粒度和枚举数量堆出来连续微调很难做到。PPO不是不能做连续控制但它是on-policy算法训练样本利用率较低在仿真环境里每个episode的时长又受控制响应时间约束整体收敛效率不如DDPG来得直接。DDPG属于确定性策略配合经验回放机制可以把探索过程中积累的历史样本反复利用对控制器参数这类低维但连续的动作输出非常合适。而且DDPG对模型误差的依赖很低不需要被控对象的精确数学模型这一点在工程上非常实用。2. DDPG自适应调参模型的设计关键观察量、动作量、奖励三者缺一不可强化学习智能体要在控制回路里做出合理的参数修正决策首先必须把当前控制状态映射成一个向量。这个向量既要包含控制性能的实时反馈又要包含动态趋势信息否则智能体看不到“参数调整之后到底产生了什么效果”。很多第一次做这个方向的人上来就堆观察量把能测的全塞进去结果训练收敛速度慢得离谱。观察量设计的目标不是越多越好而是“最小充分”加“动态趋势”。我在这个项目里选择的观察量是四组跟踪误差 e、误差变化率 e_dot、滑模函数 s、上一时刻的控制输入 u。跟踪误差和误差变化率是控制性能最直接的指标滑模函数 s 则把误差和误差变化率压缩成一个综合量直接反映系统当前离滑模面的“距离”和“方向”智能体据此判断该加强切换增益还是放宽边界层。控制输入 u 的反馈非常关键因为参数调整最终要体现在控制量变化上没有这个反馈智能体很难建立“动作-结果”的正确关联。如果你的对象有可测的扰动前馈信息比如负载力矩传感器也可以把扰动观测值加进观察量里但这是加分项而不是必需项。动作空间设计是另一个容易踩坑的地方。一开始我很自然地想到让智能体直接输出最终的控制器参数也就是 k、c、delta 三个绝对值。这个方案看似简单实际训练中问题很大训练初期策略完全随机智能体可能直接把 k 从 15 拉到接近 0或者把 delta 从 0.05 改成 5控制系统瞬间失稳。状态轨迹一旦发散后面所有经验都失去了参考价值梯度更新自然崩溃。后来我改成增量式参数调节设计动作向量定义为 a [Δk, Δc, Δdelta]当前时刻的参数等于上一时刻参数加上动作值同时给每个参数设置合理的上下限范围。为了让动作输出在训练初期也能保持安全需要在 Actor 网络的输出层后面接一个数值裁剪环节把三个增量分别限制在小范围里比如每一个决策周期内 Δk 限制在 ±0.5 以内Δc 限制在 ±1.0 以内Δdelta 限制在 ±0.01 以内。这样不管智能体怎么试错控制回路都不会因为参数突变而整体发散。这相当于给探索过程加了一个安全边界属于实际工程里非常必要的处理。奖励函数是影响收敛质量最关键的一环。我初版只用了跟踪误差的平方作为惩罚训练结果出现了一种“聪明但偷懒”的策略智能体为了让误差尽快降到零把边界层厚度压得很小导致控制量剧烈抖动滑模面频繁穿越。出现这个问题的根源在于目标函数里没有对抖振行为做任何约束。后来我把奖励函数调整为分段加权形式r -w1 * e² - w2 * s² - w3 * Δu²w1、w2、w3 分别对应跟踪精度、滑模趋近质量、控制平滑度的权重Δu 表示相邻控制步之间控制量和参数变化量的组合量。这个设计把抖振惩罚和控制量平滑惩罚同时塞进去智能体必须在抗扰能力、收敛速度和稳态平滑之间做权衡而不是单一指标的最优解。权重设置上我试下来 w1 取 5、w2 取 1、w3 取 0.1 的效果比较均衡。需要注意的是这个权重组合比较依赖具体被控对象换一个系统必须重新试没有万能参数建议从误差项主导开始逐步加平滑惩罚。我把第 2 节里的关键设计参数整理成了一个表方便对照上手设计项我的选择设计意图观察量e、e_dot、s、u覆盖性能反馈、动态趋势、动作结果闭环动作量Δk、Δc、Δdelta增量式避免策略随机期参数突变导致系统发散参数上下限k∈[2,20]c∈[5,15]delta∈[0.01,0.2]约束参数落在合理工程区间奖励权重w15w21w30.1精度优先兼顾平滑防止抖振3. Simulink联合仿真架构把DDPG嵌入SMC控制回路的完整实现搭建联合仿真的第一步是划分模型边界。整个Simulink模型可以分成五个部分参考输入、被控对象模型、滑模面计算模块、SMC控制器子系统、DDPG智能体子系统。控制对象我选的是带有参数不确定性的二阶机电模型模型输出是位移输入是力同时注入随机扰动信号模拟负载波动。这个对象虽然简化但涵盖了SMC最典型的应用场景非线性摩擦、参数摄动和外部扰动。滑模面计算模块从跟踪误差和误差变化率计算得到 sSMC控制器子系统根据 s 计算等效控制项和切换控制项DDPG智能体子系统接受观察量并输出三个参数修正量。值得注意的是在这套架构里 SMC 控制器是主回路DDPG 是参数调节回路两者是并行关系DDPG 并不会替代主控制器。强化学习在这个场景里的角色更像是一个“在线调参工程师”根据控制表现微调控制器参数而不是直接输出最终控制量。SMC控制器子系统在Simulink里的实现我最常用的是 MATLAB Function 模块。控制律写成function u smc_controller(e, edot, c, k, delta) s edot c * e; u_eq nominal_model(e, edot); % 等效控制项 u_sw -k * tanh(s / delta); % 切换控制项 u u_eq u_sw; end这里有两个细节值得注意。一是纯符号函数 sign 在数值仿真里会引起高频振颤换成 tanh 或者饱和函数 sat 可以把高频切换近似处理掉tanh 的好处是光滑可导不会在每一步产生控制量阶跃跳变这个近似效果实际上就是边界层厚度 delta 的作用。二是 u_eq 必须基于名义模型参数计算不要引入不确定项否则会把模型误差带进控制律影响滑模面的保持性能。DDPG智能体在Simulink里的接入方式有两种常见选择。第一种是用强化学习工具箱的 RL Agent 模块第二种是手动把 Actor 网络写成一个 MATLAB Function训练时再接上训练器。第一次做联合仿真我建议直接用 RL Agent 模块它能省掉大量接口层面的麻烦。模块输入是观察量向量输出是动作向量需要提前在 MATLAB 脚本里定义好观测规范obsInfo和动作规范actInfo把每个维度的取值范围写清楚。训练配置里Actor 网络结构我用了两层全连接每层 128 个神经元中间激活函数用 ReLU输出层用 tanh 激活后乘以动作上限。Critic 网络构建上我同样用两层全连接输入是观察量和动作拼接后的向量输出是 Q 值估计。DDPG的探索噪声选择了 OU 噪声衰减系数设为 0.995这样训练中后期探索幅度会自然下降策略趋于稳定。下面是训练相关的完整配置参考配置项取值控制器采样周期0.001sRL决策周期0.01sActor网络两层全连接每层128神经元Critic网络两层全连接每层128神经元Actor学习率1e-4Critic学习率1e-3经验池容量1e6批量大小128折扣因子0.99扰动噪声OU噪声衰减系数0.9954. 训练收敛与结果对比固定参数SMC与DDPG自适应SMC的差异整个训练过程大约跑了 1200 个episode。前 200 个episode里累积奖励基本贴着最低值来回波动这是DDPG探索阶段的特点动作里噪声占主导控制器参数经常被试探性推到边界。如果没有参数上下限和增量限幅这个阶段很容易直接把仿真打爆。200到600个episode之间平均奖励开始出现明显上升趋势但单episode曲线波动仍然很大。600个episode以后策略基本稳定参数修正量逐渐变成小幅度微调。这里提醒一句不要看到单个episode的奖励上涨就急着停止训练要看滑动平均曲线否则很容易被偶然波动误导。测试阶段我分别跑固定参数SMC和DDPG自适应SMC注入完全相同的扰动信号组合包括周期性正弦扰动和脉冲型突变扰动。固定参数SMC的跟踪误差基本在 ±0.3 附近跳动控制量伴随明显的高频抖动尤其在脉冲扰动出现的瞬间恢复时间大约要 0.8 秒。DDPG自适应版本在扰动阶段会临时增大切换增益把误差压制到 ±0.1 以内等扰动消失后又主动降低增益控制量曲线明显平滑。滑模函数 s 的轨迹也比固定参数版本更快收敛到零邻域说明智能体在训练中确实学到了“扰动到来时加强切换项扰动消退后减小切换项”这一符合直觉的策略。更有意思的是把DDPG决策周期内的参数变化量完整记录下来之后能直接看到智能体学到的东西。它倾向于在误差较大时同时增大 c 和 k提高响应速度和抗扰能力在稳态阶段把 delta 稍微放宽换取更小的抖振。这个行为几乎就是工程师手动调参的“不调皮版”。它证明了一件事强化学习在这个场景里没有玄学它只是在奖励函数引导下找到了一条符合目标偏好的调节路径。反过来也提醒我们奖励函数里如果没给抖振惩罚它学出来的就是纯高增益策略因为最小化误差的目标导向决定了它会追求极致收敛速度。对比参数选择上固定参数SMC我是参考常规经验值设定 k8、c10、delta0.05在这个参数下固定参数的性能已经算不错了仍然被自适应版本全面压制。这说明参数在线调整带来的收益不是微小的补丁式提升而是整个控制性能包线的一次扩展。5. 仿真过程中的坑与心得训练不收敛时的排查步骤和配置建议第一个必须强调的是RL决策周期和控制周期的关系。DDPG智能体不需要在每个微小仿真步长都更新参数这一点我在第 3 节里虽然没有展开但它对训练稳定性影响非常大。建议把智能体的决策周期设置成控制周期的整数倍比如控制周期 0.001s、RL决策周期 0.01s。原因很简单控制系统的动态响应需要一个过程动作改变后需要若干个控制周期才能体现效果。如果智能体每个控制周期都修改参数经验池里的“状态-动作-奖励”相关性会非常差训练曲线基本没法收敛。把决策周期放长之后训练稳定性提升非常明显这是我在这个项目里感触最深的一个调整。第二个坑是奖励数值的量级控制。训练不收敛很多时候不是算法的问题而是奖励数值太大或者太小。DDPG的Critic网络要拟合Q值如果奖励绝对值长期处在1e4这个量级梯度更新很容易出现振荡甚至把之前学好的网络参数直接覆盖掉。建议把单步奖励的量级控制在个位数误差项先做归一化再乘权重。比如用 e/(|e_max| epsilon) 代替直接平方这样后期Q值的量级不会崩训练曲线也不会出现忽高忽低的剧烈波动。第三个坑是训练初期的安全防护。训练最开始那几十个episode智能体完全是在盲试如果没有参数上下限和变化率限幅系统很容易在某个组合下发散。我给Actor输出加了参数限幅之后即使在最差情况下被控对象也只是跟踪偏差偏大而不会直接发散保证了训练可以持续进行。另外一个非常实用的做法是训练的前100个episode 用较小的OU噪声方差先把基础策略探索出来之后再逐步加大噪声幅度寻找更精细的策略。这种探索退火策略在参数化控制问题里比固定噪声更稳。如果你只是刚开始尝试DDPG-SMC联合仿真我最后再补一条建议不要一上来就挑战高维系统和高复杂度工况。先把对象模型选成简单的二阶确定性模型固定两个维度的参数只让智能体调一个参数比如先只调边界层厚度 delta验证整个通道能跑通、能收敛、能看到效果再逐步放开参数维度。我最初就是在模型里同时加入扰动和参数不确定性结果训练时间翻了好几倍问题还没排查清楚。后来老老实实从单参数调节起步逐步增加复杂度反而顺利得多。控制算法和强化学习的组合项目最忌讳的就是一步到位渐进式搭建才是工程上最稳妥的路径。