基于DDPG强化学习的滑模控制器参数在线整定与Simulink仿真

发布时间:2026/10/20 4:31:55
基于DDPG强化学习的滑模控制器参数在线整定与Simulink仿真 做控制仿真的人十有八九被滑模控制的参数整定折磨过。滑模面系数c、切换增益k、边界层厚度φ这几个参数怎么取教科书上只告诉你满足不等式条件可真正落到某个具体对象上到处都是靠试、靠调的经验。我这次做的项目方向就是用一个深度确定性策略梯度算法DDPG强化学习智能体在Simulink中在线整定滑模控制器SMC的参数把人工反复试参数的过程变成智能体自己探索学习的过程。整套仿真做完效果比较有意思所以把搭建思路和踩坑过程整理出来。如果你正在做机器人轨迹跟踪、机电伺服系统鲁棒控制或者想把手里的强化学习从倒立摆这类演示环境搬到实际控制回路里这篇内容会很对胃口。它不要求你改造SMC的结构只需要把增益参数开放成端口让DDPG去接管。整个思路可以复用到绝大多数带参数整定需求的控制任务中。1. 为什么要把DDPG强化学习和滑模控制结合起来1.1 滑模控制的一大痛点滑模控制SMC的优点大家都知道对模型不确定性和外部扰动有很强的鲁棒性。代价呢就是那个符号函数或者饱和函数里的增益k理论上要大于扰动上界才能保证滑模面可达并且系统状态不脱离滑模面。实际系统里扰动上界往往是猜的k取小了系统抵抗不住扰动误差在滑模面附近来回穿k取大了鲁棒是够强但控制量高频抖振执行器受不了激励出的未建模动态反而让系统变差。这就是经典矛盾。也就是说固定参数SMC里面的k和φ到底折中在哪不是一个定值能解决的。系统运动到滑模面附近时理想情况希望边界层厚度小一点以减少稳态误差但面对大幅扰动时又希望切换增益足够大。不同阶段、不同工况需要的参数方向不一样。我最初的做法是分别测了几组参数在不同工况下各取一个折中值结果总是不尽如人意——这促使我想到用强化学习把参数时变化。1.2 DDPG能补上哪块短板DDPG是深度确定性策略梯度算法它最擅长的就是在连续动作空间里学一个确定性的策略。滑模控制的增益恰好就是连续值比如k∈[0.5, 30]φ∈[0.01, 0.5]DDPG输出的动作可以直接映射到这个区间不需要把动作离散化。相比DQN那样的离散动作输出DDPG的连续输出天然匹配参数整定任务。另一层原因是DDPG属于离策略算法有经验回放缓冲池训练中学到的历史样本可以反复使用这对Simulink仿真特别重要。每个仿真回合虽然只有几秒钟但采样频率高样本量巨大离线复用能大幅提升学习效率。而且Actor-Critic结构里Actor输出动作、Critic评估动作价值两者交替优化比单纯的策略梯度算法稳定得多。1.3 这套方案适合谁用如果你需要处理带不确定性和扰动的连续控制问题又不希望用固定参数牺牲某一方面的性能这个方案很值得试一试。它不要求你具备多深的强化学习理论背景更看重对控制回路的理解和对Simulink建模的熟练度。DDPG在这里扮演的角色是“参数调度器”SMC仍然是主控制器这种主从结构让系统始终有一个鲁棒控制器兜底不会因为强化学习探索期的乱来就彻底失控。2. 先把两个算法的核心机制捋清楚在动手搭Simulink之前得先把算法本身吃透。否则你连输出的动作是什么意思、奖励信号为什么这么设都说不清后面调参只能全靠瞎猜。2.1 滑模控制的误差收敛逻辑考虑一个二阶对象定义跟踪误差e x - xd滑模面s c·e ė其中c 0。如果s能收敛到0则ė -c·e误差按指数衰减收敛快慢取决于c。这是滑模控制最核心的想法先设计一个滑模面让系统状态收敛到这条流形上然后维持在这个流形上。控制量的典型构成为u u_eq u_sw。以对象ẍ u d(t)为例等效控制u_eq -c·ė ẍd用来保持s 0切换控制u_sw -k·sat(s/φ)用来克服扰动并驱动状态到滑模面。为降低抖振我用饱和函数sat(s/φ)替代sign(s)φ越大抖振越小但稳态精度变差k越大鲁棒性越好但控制量摆动越大。这里值得解释一下为什么三个参数里我主要让DDPG去调k和φ。c决定滑模面上的误差收敛速度它通常由系统的期望动态决定给定一个值不需要频繁变化而k和φ是一对矛盾量它们需要根据扰动大小、误差位置动态调整这正是自适应调参发挥价值的地方。参数太多也会增加动作维度训练难度明显上升。2.2 DDPG的试错学习逻辑DDPG的核心由四个网络组成在线Actor、目标Actor、在线Critic、目标Critic。每个控制周期智能体观察系统状态Actor输出动作环境反馈下一状态和奖励存入经验池。训练时从经验池随机采样一批样本Critic网络更新价值函数Actor网络则朝着“让Critic打分更高”的方向更新参数。DDPG用确定性策略而不是随机策略好处是控制输出平稳更加贴合执行器输入要求。同时为了探索训练时给动作叠加噪声让智能体尝试不同参数组合并在学习过程中逐渐降低噪声强度。这个探索噪声设计非常关键后面我会具体说。如果你用过PPO这类在线策略算法再对比DDPG就会发现DDPG对历史样本的复用效率高很多这在仿真耗时较长的控制任务里是实打实的优势。2.3 两者的接口匹配点在哪里SMC和DDPG的接口就在于“参数整定”这个动作。DDPG读取的系统状态相当于控制工程师平时看监视器的那几个量DDPG输出的动作直接连到SMC的增益端口。整体闭环结构为被控对象产生状态误差误差信息和滑模量进入DDPG智能体智能体输出SMC增益SMC计算控制信号驱动对象。这样整个控制回路仍然保持SMC的鲁棒结构DDPG并不直接输出控制量它只调节控制器参数。所以任何能保证SMC稳定运行的对象都可以加装这个自适应层哪怕DDPG在训练初期探索出不好的参数SMC本身的鲁棒性也会限制控制性能的下限系统不至于失控。这个思路对工程实践很友好也是我在这个项目里坚持采用主从结构的原因。3. Simulink仿真环境搭建与DDPG Agent设计下面进入实操环节。我用的是二阶位置伺服模型ẍ u d(t)d(t) 0.5·sin(2πt) 噪声。参考轨迹xd 0.5·sin(πt)。仿真步长0.01s单回合10s。这个设定简单但足以体现参数自适应的价值。3.1 系统总体架构与信号流模型从上到下分为三块参考信号与对象模块、SMC控制律模块、DDPG Agent模块。对象用两个积分器串联搭建加速度输入速度输出位置输出。误差信号通过减法器产生误差导数由速度与参考速度相减得到。滑模面由误差和误差导数加权求和得到。你得把需要观测的信号汇总到一个向量里作为DDPG的观测输入。DDPG模块放在SMC模块旁边动作端口输出是一个2×1向量分别接在切换增益k和边界层厚度φ的常数模块上。这里要注意Simulink里不能直接把动作信号当作参数对话框里的数值用需要通过乘法器或者可变增益模块把信号引进去。我在搭建时把k和φ都做成外部输入端口这样动作信号直接乘以一个缩放系数就能用。最开始我就是忽略了这一点在S-Function里把动作值写进参数列表结果每次更新都要重建模型后来改成外部输入才彻底解决。3.2 滑模控制器模块搭建滑模控制律u -c·ė ẍd - k·sat(s/φ)其中c固定为5。ẍd是参考轨迹的二阶导直接对0.5·sin(πt)做两次导数解析式计算出来。控制器模块用加法器和乘法器搭就行这里有一个值得注意的细节饱和函数sat(s/φ)可以用Saturation模块实现把s先除以φ再经过限幅[-1, 1]的Saturation模块得到的结果就是sat(s/φ)。我看到很多人直接用sign函数或者近似符号函数抖振会明显更严重。这一步建议先让k和φ用固定常数把SMC回路跑通。我在实际测试中先给k8φ0.05观察跟踪曲线和控制量确认对象稳定跟踪正弦信号后再接入DDPG。先验证SMC再叠加RL这条顺序千万别反过来否则出问题时不知道是控制器问题还是学习算法问题。另外提醒一句Simulink模型里所有信号名字都要用英文字母中文变量名万一碰到编码问题排查起来非常痛苦。3.3 DDPG智能体的状态、动作与奖励设定观测向量我选4个分量e、ė、s、以及参考信号的导数。前三个反映当前跟踪状态第四个帮助智能体判断轨迹变化趋势。也许有人会问为什么不加入跟踪的积分项我试过加积分项效果接近但维度增加收敛速度略慢所以最后取了这4个。动作是2维连续向量a (k, φ)。k用tanh输出映射到[0.5, 30]φ映射到[0.01, 0.5]范围。tanh输出在[-1, 1]需要手动缩放给每个动作维度乘以缩放系数并加上偏置换算到有效范围。这里要注意边界处理DDPG的tanh输出天生有界不会超出动作区间所以比直接输出原始数值更安全。奖励函数是我调得最久的模块。最终用的是r -0.01·s² - 0.001·u² - 0.005·(u_t - u_{t-1})²第一项驱动滑模面收敛第二项限制控制能量第三项抑制控制量突变也就是抖振。三个权重对应的量级差异很大需要根据仿真中实际数值调整。这里有个通用经验先记录固定SMC下s、u、Δu的典型数值让每个惩罚项贡献量大致同数量级否则量级大的项压过其他项学出来的策略会偏心。我把做法写成一个可复用的流程先跑一次固定参数SMC仿真把各项指标的平均值记下来然后反推权重让三个惩罚项在典型工况下各占约三分之一比重。3.4 Agent网络与超参配置DDPG的Actor网络我用两层全连接隐藏层神经元400和300激活函数ReLU输出层用tanh。Critic网络输入是观测向量拼接动作向量同样两层全连接最后输出一个Q值。这里我推荐Critic先拼接状态和动作再放进网络而不是让动作单独走一路前者在低维连续控制问题中更稳定也更容易训练。超参数配置我整理成一张表方便对照参考。参数推荐值说明Actor学习率1×10⁻³网络更新步长大了容易发散小了收敛慢Critic学习率1×10⁻³可以与Actor相同但很多场景建议略小折扣因子γ0.99越接近1越看重长期收益这里取常规值批量大小256每次采样训练的样本数内存不够可降到128经验池容量1×10⁶存储历史样本越大越稳定但占用内存目标网络软更新系数τ0.005目标网络参数平滑更新的比例每回合步数1000单回合时长10s按0.01s步长折算如果平台性能一般建议把批量降到128经验池降到5×10⁵训练速度会快不少。网络层数也并非越深越好我试过三层隐藏层训练时间明显变长收敛后的性能提升却可以忽略不计。对于这个任务两层网络完全够用。4. 完整训练流程与实战操作这一节把从零到训练完成的完整操作整理成步骤照做基本能复现。我会针对关键步骤补充必要的说明。4.1 先跑通固定参数的SMC基线在模型里把k和φ设为固定常数模块比如k8、φ0.05。运行仿真观察位置跟踪曲线是否贴合参考轨迹控制量是否在合理范围记录s的波形和抖振程度。这个基线有两个作用第一验证被控对象和SMC模块搭建无误第二为后面的奖励权重提供参照。我测试的基线结果是正弦跟踪误差稳态在0.02附近但控制量存在明显的高频振荡尤其在参考信号过零变化时抖振幅度很大。这就是固定参数SMC的老毛病——为了抗干扰把k设得偏高遇到大扰动时有用但扰动平缓时抖振又过于明显。用这个结果的数值去定奖励权重s相关项权重给了0.01控制能量项和突变项分别是0.001和0.005。有人觉得“固定参数跑基线”是多此一举直接接上RL Agent开训就行。我不建议这么做。没有基线的训练如果模型本身搭建有误你根本分不清是对象模型的问题还是DDPG训练的问题。先跑通基线相当于把底层的坑全部排掉后面接入DDPG时注意力可以完全集中在算法上。4.2 接入RL Agent和训练环境在Simulink中用RL Agent模块替换掉固定参数模块把观测向量通过Mux组合后接到RL Agent的观测端口动作输出通过Demux拆成两路分别接到SMC的k和φ端口。记住端口名要和MATLAB环境定义保持一致。在MATLAB命令行里定义环境对象env rlSimulinkEnv(smc_model,smc_model/RL Agent, obsInfo, actInfo);obsInfo和actInfo分别用rlNumericSpec创建并设置动作的上下界。还要指定模型的观测端口和动作端口名称。初次接入时系统会提示观测信号维数不一致这时去检查Mux输入是否与rlNumericSpec指定的一致即可。这里最容易出问题是Simulink模型名和RL Agent模块路径名写错或者端口名用了中文导致环境对象创建失败。创建Agent的时候我在rlDDPGAgentOptions里指定网络初始化函数、噪声选项和优化器参数。有一个小坑值得提醒rlDDPGAgent默认的OU噪声参数是按典型场景定的我调成θ0.15、σ0.1后探索的随机性比较适中如果数值取得太大训练初期Agent完全像瞎试收集的样本质量差后面无论怎么调权重都不容易救回来。4.3 训练过程监控与结果评价用train命令跑的时候打开训练监视器看每回合总奖励曲线。DDPG训练的典型情况是前50回合奖励快速上升中间可能出现一两次下降那是经验池中引入了一些不稳定样本不必太紧张。如果奖励曲线稳定走高说明网络正在学出有效策略。训练到大概200回合以后我观察到奖励不再大幅变化此时可以每隔几个回合用当前策略做一次确定性仿真看k和φ实时变化是否合理。我记录到的规律符合预期跟踪误差大时k往大调误差小时k自动回小参考轨迹斜率大时φ稍微放大进入平缓段后φ又收小。这说明智能体学到的不只是固定最优值而是一个能根据状态变化的调度策略。判读这个规律是否有意义有一个有效方法把一组测试中k的曲线和误差曲线放到同一张图里看两者的变化方向是否互补。如果互补说明智能体确实学出了逻辑而不是简单地记忆奖励。4.4 训练后的部署与验证训练结束后把Agent切到评估模式去掉探索噪声做完整回合仿真。与固定参数SMC对比我这边看到的改善集中在两点一是跟踪误差峰值明显下降二是控制量的高频抖动幅度减弱。原因是智能体会在扰动大、误差大的阶段主动提高切换增益在误差收敛后主动降低增益并适当放宽边界层从而避免了固定高增益带来的持续抖振。部署时要注意一点Simulink模型里的RL Agent模块如果保留训练模式仍然会叠加探索噪声测试结果会偏抖。要把训练选项里的探索噪声参数关掉或者直接用evaluatePolicy这类评估函数跑确定性动作。我用的是后一种方式生成的策略评估结果比在线训练时的每回合曲线好看得多也更接近真实应用表现。5. 常见问题、踩坑记录与排查方法仿真过程不会一帆风顺这部分是我反复调试后总结的实战经验先收藏再看。5.1 训练发散不收敛的排查顺序如果训练曲线暴跌或者一直不涨我会按顺序检查这些项第一奖励权重是否合适。惩罚项里有数值很大的指导信号就被这个项主导策略不敢输出有效动作。解决方法是回到基线数据把权重缩放到同一量级。第二观测向量是否归一化。原始误差、速度等信号量纲不同直接输入网络会让部分维度支配更新。误差是0.02量级速度导数是0.5量级s又可能是几的量级不归一化的话网络几乎只盯着s看。我用简单的缩放把每个观测分量都处理到大致[-1, 1]区间训练稳定度提升明显。第三网络结构是否过深。低维控制问题用两三层的网络足够堆太多层只是增加训练负担不会有精度收益。还有一个常被忽略的点经验回放池里训练之前的早期探索样本占比太多。早期样本大多对应很差的参数Critic会被这些数据带偏。解决办法是训练前先用固定参数跑若干回合把正常的样本预填充到经验池里再开始DDPG训练。这招我在实践中屡试不爽能让训练初期的奖励曲线明显更稳。5.2 抖振越调越严重的背后原因有人反馈说训练完成后抖振比固定SMC还明显。绝大多数原因是奖励中缺少控制量变化率的惩罚项。滑模控制本身就容易抖振如果DDPG只被要求减小误差它就会通过反复切换增益或把增益逼到上限来压低误差抖振当然越来越重。给奖励加上(Δu)²惩罚后智能体会主动选择平滑的增益序列。另一个容易忽略的问题是DDPG动作更新频率和控制周期不一致。如果动作每个仿真步长都变化k和φ的抖动会直接耦合进控制量建议用一个零阶保持器把DDPG输出保持若干个控制周期或者对动作输出做低通滤波。调低动作更新频率之后抖振问题能缓解不少。我实际采用的方案是让DDPG每隔5个控制步长更新一次动作中间保持不变效果比单纯加低通滤波更干净。5.3 训练效率低下的几个优化技巧如果你的机器跑500回合要很久优先检查两步每回合步数和批量大小。这个仿真里每步是0.01s单回合10s就是1000步改到5s并相应缩短参考信号周期经验池照样能收集到足够样本。批量大小从256降到128训练速度提升明显但稳定性略有下降在可接受范围。还可以调整环境对象的重置函数让每个回合的初始位置和参考轨迹参数在一定范围内随机化这样智能体见过的工况更多泛化性更好即使训练回合数不多也能学到较稳健的策略。我最终用的初始误差范围是[-0.1, 0.1]参考轨迹幅值在[0.4, 0.6]之间随机选。这样处理之后把训练完成的策略用在一组新的参考轨迹上依然有不错的跟踪效果说明策略没有过拟合到某一条特定曲线。如果条件允许可以用并行训练。多个Simulink环境同时跑每个环境独立采样再汇总到同一个经验池训练回合数能大幅减少。我后来在另一个衍生的项目里试过并行训练4个环境并行时相同训练时间内策略性能大约提升了近一倍代价是CPU和内存占用成倍上涨。6. 关于这个方案我对你的一点建议整个项目做下来我个人体会最深的地方是把强化学习和经典控制结合时核心不是把控制权完全交给强化学习而是明确分工。SMC负责兜底DDPG负责优化两者各司其职稳定性和自适应性才能兼顾。这也是这类“智能算法经典控制”组合能够落地的关键前提。如果你准备把这个方案用到自己的课题里建议先从被控对象的物理模型入手哪怕先做一个简化模型只要能把输入输出关系跑通后面的强化学习部分就能复用到绝大多数场景。最后再分享一个小技巧训练完成后别把Agent内部逻辑当黑盒看完就完事。可以把Actor在关键时间点的输入输出导出来和SMC的k、φ变化曲线放到一张图里对照分析你会发现智能体学出来的调参规律和人的直观经验往往惊人地一致。把这一步分析写进报告或论文里比贴一堆训练曲线要更有说服力。