尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

无模型自适应预测控制与迭代学习控制的数值仿真验证

无模型自适应预测控制与迭代学习控制的数值仿真验证 过去几周我一直在和一套“无模型自适应预测控制MFAPC与迭代学习控制MFAILC的数值验证仿真程序”较劲。这套程序的动机非常明确用数值仿真把两类数据驱动控制策略放到强非线性、时变参数和重复性任务三类场景里跑一遍定量评估它们的跟踪性能。MFAPC的核心思路是把被控对象的动态关系抽象成一组在线更新的伪雅可比矩阵然后用预测窗口做滚动优化MFAILC则把整个任务放到迭代域里反复学习每一批运行结束误差信息都会被转成下一轮控制量的修正量。两者都不依赖显式的机理模型所以在模型失配严重、对象特性漂移快的场合反而比传统基于模型的控制方案更耐用。如果你最近在做非线性对象的跟踪控制或者想给某条产线的重复性动作换一种调参思路这篇文章应该能帮你把仿真程序里每个模块到底在算什么、哪些参数值得花时间调一次性理清楚。1. 为什么值得拿数值仿真验证MFAPC和MFAILC1.1 “无模型”不是没有模型而是把模型装进数据里很多第一次接触无模型自适应控制的同学听到“无模型”三个字第一反应是“不用建模就能直接上控制器太省事了”。这个理解一半对一半错。MFAC真正丢掉的是需要靠机理知识或者系统辨识来得到的显式数学描述比如传递函数、状态空间方程这类东西。它并没有放弃“模型”这个工具而是用了一个不断在线刷新的时变参数这个参数就是伪雅可比矩阵PJM。它的物理含义可以被理解成当前工作点附近系统的输入输出增益关系用最简化的形式写出来就是dy(k1) ≈ phi(k) * du(k)其中phi(k)就是PJM。因为它是直接从上一拍的输入输出数据里估计出来的它天然带有在线自适应能力不需要你提前做一次昂贵的过程辨识实验也不怕对象参数缓慢变化。在我看来这套思路最聪明的地方在于它把“建模”这个动作从控制器设计之前挪到了控制器运行之中模型永远跟随数据走。用生活里的例子来类比传统基于模型的控制就像请一个拿地图导航的司机地图越准开车就越稳但地图一旦过时司机就会犯迷糊。而无模型自适应控制更像是一个经验丰富的老司机不看地图也能靠实时路况反馈把车开好他的“经验”就是当前状态下应该给多少油、踩多少刹车。MFAC里面的PJM就是这个“经验”的数字化表达每跑一步更新一次永远贴着当前对象的最新状态走。这么说并不是要否定建模的价值。很多工业场景里机理模型依然是工程分析和故障诊断的基石只是在控制层如果目标只是“让输出稳定跟踪设定值”那么无模型方法往往能用更少的工程成本达到相当好的效果。这套仿真程序验证的正是这一点在对象本身存在较强非线性和参数漂移时MFAPC能不能靠数据自动把跟踪误差压下去。1.2 MFAPC与MFAILC的互补关系MFAPC和MFAILC虽然名字里都有“无模型自适应”这几个字但它们解决的是两个不同维度的控制问题。MFAPC是在同一个运行周期内通过预测模型和滚动优化来生成控制量它适合任务不重复、设定值时变的场合MFAILC则把学习过程放到了迭代维度上同一个任务反复执行多遍每一遍结束之后根据上一遍的跟踪误差来修正控制输入它适合装配机械臂、工业炉升温曲线、批量反应釜这类重复性极强的工艺。我做这套仿真程序的时候把两者放进同一个测试框架里其实是想搞清楚一个问题对于同一个被控对象什么时候应该用MFAPC这类在线调节策略什么时候应该押注MFAILC这类迭代学习策略答案并不在于谁更“高级”而在于任务的时间尺度。以下表格可以概括两条路线的差异对比维度MFAPCMFAILC控制作用的时间轴当前运行周期内每步滚动更新多个运行周期之间逐批修正适用任务类型非重复跟踪、时变参考轨迹高重复性任务、批量生产过程对被控对象的依赖需要在线估计PJM需要在线估计PJM且任务可重复主要优势抗扰动能力强能处理突发变化随迭代次数增加重复精度快速提升主要短板预测精度受窗口长度和PJM估计质量限制依赖每次运行初始条件一致否则收敛变慢实际工程里这两条路不是对立关系更多时候是配合关系。MFAILC可以把MFAPC上一轮生成的控制轨迹作为迭代初值从而在重复任务上获取更高的收敛精度。我在仿真里跑完单独验证之后又把两条算法链路拼在一起测试发现这个组合策略在永磁同步电机周期性运动控制这种场景上效果特别好后面我会展开讲。2. 仿真对象怎么选从非线性时变对象到重复性运动对象2.1 被控对象设计两个有代表性的算例做数值验证最忌讳的就是用一个过于简单的对象去测算法比如在线性定常系统上比较控制器结论基本没有说服力。我在这个项目里特意设计了两个算例刻意加入非线性环节和参数慢变项。算例1用来验证MFAPC的在线跟踪能力算例2用来验证MFAILC的迭代收敛能力。算例1我选用的是一个带非线性输出项和时变增益的离散系统核心表达式如下% 算例1非线性时变对象 a(k) 0.5 0.3 * sin(k / 50); y(k1) a(k) * sin(y(k)) 0.3 * y(k) / (1 y(k)^2) ... (0.8 0.2 * cos(k / 100)) * u(k) 0.1 * u(k)^2;这个对象的特点是输出方程里既有正弦非线性又有有理分式非线性同时系统增益还会随k指数缓慢波动。用这种对象测MFAPC最大的好处是可以模拟被控对象增益漂移和模型失配的情况。设定值给定为斜率变化的分段信号控制器只能依赖输入输出数据去跟踪任何依赖固定增益的控制方法都会在增益变化时出现明显的控制量振荡。算例2我给的是一个带执行器饱和约束的重复运动对象形式上更接近一个周期的伺服系统。为了让迭代学习控制出现“可学习的误差”我给系统加入了一个固定的模型偏差项使得同样的控制输入在不同批次之间产生稳定的偏向性误差% 算例2重复性运动对象 y_v(k1) 0.8 * y_v(k) / (1 y_v(k)^2) ... 1.2 * u_v(k) 0.1 * sin(u_v(k)) 0.05 * y_v(k-1);每条批次结束后系统的状态都要被重置到相同初始值这是迭代学习控制能够收敛的基本前提。如果你在复现MFAILC时发现误差不降反升可以先检查初始状态重置条件是不是被漏掉了这个坑在后面调试部分我还会再提。2.2 评价指标体系与仿真轮次设计只靠“画几条曲线觉得挺稳”来评价控制算法在正式的项目里是站不住脚的。我给这套仿真程序设计了四个量化指标分别是平均绝对跟踪误差MAE、均方根误差RMSE、控制量总变差TV和最大超调量。MAE反映整体跟踪水平RMSE对大的误差更敏感TV则用来衡量控制量是否平滑最大超调量则直观反映了动态过程是否过于激进。仿真轮次我也做了分类。MFAPC部分设置600步为一个仿真周期每步采样时间0.01秒分三组参数对比运行MFAILC部分设置40次迭代每次迭代内部跑200步记录从第1次到第40次的误差下降情况。为了减少随机初值的影响每个对象我都先用固定初值跑三轮再换不同初值跑一组随机测试确保结论不是某一条特定轨迹碰出来的。评价指标的计算逻辑可以统一成一个简洁的统计模块这样两个算法共用同一套评价函数对比起来非常公平MAE mean(abs(e)); RMSE sqrt(mean(e.^2)); TV sum(abs(diff(u))); OS max(abs(e) - abs(e(end)));代码里e是每一时刻的跟踪误差u是控制量序列。把这四个指标放在同一个输出表格里不同算法、不同参数组合谁好谁坏一目了然。我在后续调参时几乎全部依赖这些数值指标而不是肉眼看曲线因为肉眼看曲线容易忽略局部振荡。3. MFAPC数值仿真伪雅可比矩阵与控制律怎么落地3.1 动态线性化与PJM在线估计MFAPC的核心可以拆成两个模块PJM在线估计模块和预测控制模块。先看PJM估计。所谓动态线性化是在当前工作点附近用一阶关系近似系统的输入输出增量关系即上一节写的dy(k1) ≈ phi(k) * du(k)。这里的phi(k)就是PJM它的估计准则一般取如下形式J_phi |dy_actual - phi(k-1)*du|^2 mu * |phi(k) - phi(k-1)|^2;第一项希望估计结果能尽量解释实测输出变化第二项加了一个mu权重保证phi(k)不会发生剧烈的跳变。求解这个最小化问题可以得到下面的递推更新式phi(k) phi(k-1) eta * du * (dy - phi(k-1)*du) / (mu du^2);其中eta是估计步长mu是阻尼因子。如果du为0分母会变成mu不会出现除零问题但PJM也得不到有效更新所以代码里我加了阈值判断只有abs(du)大于一定值时才更新。实践里这个阈值取1e-6到1e-5就够用太大会让估计信息丢失太小又会对噪声敏感。还有一层保护机制必须加上PJM重置。如果abs(phi(k))小于某个下限比如1e-4说明估计值已经退化到失去意义我会直接把phi(k)重置为初始值。这个操作看似简单却能在系统长时间进入稳态、控制量不再变化时避免PJM因缺乏新信息而漂移到异常值。很多复现MFAC程序的开发者把算法调发散往往就是少了这一步重置。3.2 控制律与滚动窗口实现有了PJM估计之后预测控制模块负责生成控制量。预测控制的基本思想是每到一个采样时刻基于当前PJM估计值对未来若干步的输出增量进行预测再构造一个包含跟踪误差和控制增量的目标函数在约束范围内求解最优控制增量序列。在这个项目里我使用了一个简化的单步预测形式目标函数写成J_u |y_ref(k1) - y(k) - phi(k)*du|^2 lambda * du^2;对du求导并令其为零立刻可以得到MFAC最经典的控制律形式u(k) u(k-1) rho * phi(k) * (y_ref(k1) - y(k)) / (lambda phi(k)^2);解释一下这个公式rho是步长因子控制每次修正的幅度lambda是惩罚系数会在控制增量过大时自动衰减有效增益。PJM以平方形式出现在分母里这让控制器对PJM的过估计有天然的容忍度。我在实际仿真中发现lambda的作用不只是防止控制量过冲它还能平滑PJM突变带来的控制量异常所以参数整定时千万不要把lambda直接设成0。如果要做多步预测可以把预测方程扩展成对一个窗口内未来输出序列的预测。窗口长度是MFAPC里最直观也最敏感的调参对象窗口太短预测优势体现不出来窗口太长PJM外推的误差会被放大控制律反而变软。我在算例1上分别试过预测步数Np1、Np3和Np5其中Np3在动态响应和稳定性之间表现最均衡。3.3 参数整定记录与仿真结果解读参数整定是整个仿真验证里花费时间最多的环节这里放一组我在算例1上记录下来的对比数据。每个参数都先用粗范围扫一遍再围绕最优值细调表格里的结果具有一定的参考价值参数组合etamulambdarhoRMSE最大超调保守组0.50.82.00.40.0832.1%均衡组0.80.51.00.60.0461.8%激进组1.00.20.10.90.0598.7%激进组虽然稳态误差不大但在参考轨迹突变时出现了明显的超调和控制量振荡TV指标比均衡组高了一倍多。这个结果说明MFAPC并不总是“参数越激进越好”lambda承担着抑制PJM估计噪声放大的任务把它压得太低会让控制器变得神经质。均衡组的RMSE最低超调适中后续所有对比都采用了这一组参数。仿真曲线里还有一个细节值得留意在200步前后算例1的增益参数从0.7左右缓慢爬升到1.0PJM估计值也同步跟随变化但输出曲线并没有出现明显波动。这就是MFAPC强于传统固定增益控制的地方它不需要人工重新标定控制器参数算法自己在数据中完成了增益补偿。4. MFAILC数值仿真迭代域学习律与收敛性验证4.1 从ILC到MFAILC迭代域的动态线性化迭代学习控制ILC最早脱胎于机器人重复作业的需求核心思想非常简单同一个任务反复执行执行完之后把误差拿回来修正下一轮的控制输入。传统ILC通常要求用户提供一个近似模型来计算学习增益而MFAILC把这个要求也砍掉了它把MFAC的PJM估计思路搬到了迭代轴上。在MFAILC里设第v次迭代第k步的输出是y_v(k)控制输入是u_v(k)。对同一批次内部仍然可以做动态线性化dy_v(k1) ≈ phi_v(k) * du_v(k);这个phi_v(k)依然通过输入输出数据在线估计估计公式和MFAPC里形式相近。不同之处在于控制律不再只依赖当前批次的信息还要结合上一批次的跟踪误差进行修正学习律可以写成如下形式u_{v1}(k) u_v(k) rho_v * phi_v(k) * e_v(k1) / (lambda_v phi_v(k)^2);其中e_v(k1)是第v次迭代在k1时刻的跟踪误差。直觉上这套学习律在做的事情是如果上一轮在某个时刻产生了正向误差也就是输出低于目标那么下一轮就在对应时刻把控制量调大一些。PJM的存在让这个调整幅度能够跟随系统增益的变化避免在增益大的位置做过量修正。我在代码里把PJM估计也做成跨批次传递的版本也就是说第v1次迭代的PJM初值会沿用第v次迭代的终值。这样做能让估计过程更快进入状态实际跑下来比每轮都用固定初值的版本提前约12次迭代到达同样的精度水平。4.2 收敛过程与算例数值表现MFAILC的收敛性是这套仿真程序验证的重点。我在算例2上连续跑了40次迭代每轮布置相同的目标轨迹和初始状态然后统计每一轮的RMSE表里选取了部分记录迭代次数RMSEMAE备注10.4720.385原始开环控制误差最大50.2080.156误差明显下降100.1130.082进入快速收敛期200.0590.041性能稳定400.0310.022接近仿真精度极限从数据看前10次迭代误差下降很快这是因为第一轮PJM估计不够准学习增益粗糙所以能一次性吸收大量误差信息到了20轮以后误差逐渐逼近系统非线性本身的残差下降速度变慢呈现出典型的迭代学习“前快后慢”特征。如果迭代次数继续增加误差也不会无限趋近于零因为PJM估计毕竟有误差而且系统里还有执行器饱和这类约束。值得一说的是我把执行器饱和约束写进了系统模型这使得学习律在饱和区间附近会丢失一部分修正效果。传统ILC遇到这种约束常常会产生所谓的“学习抖振”控制量在饱和边界来回碰撞但MFAILC因为有分母里PJM平方项的软约束作用在饱和边界的振荡幅度比纯ILC小很多。这算是我在这次仿真里意料之外的发现。4.3 与MFAPC的联动使用方式这两个控制器单独验证完后我还在仿真程序里加了一个接力方案先用MFAPC跑一遍任务生成一条基础控制轨迹然后把它作为MFAILC的初始控制输入再启动迭代学习。这样做的逻辑是MFAILC的前几轮学习效率取决于初值质量初值如果是一条线性插值得到的粗糙轨迹前几轮会花不少时间在纠正大偏差上而MFAPC已经在单轮内把跟踪误差压到了较低水平相当于给了迭代学习一个不错的起点。接力方案在算例2上的结果比纯MFAILC更省迭代次数纯MFAILC达到RMSE低于0.05用了约14轮接力方案只用8轮。代价是MFAPC本身要先完整运行600步计算时间稍微增加但在离线仿真和批量工艺里这个代价完全可以接受。实际工业应用里如果工艺允许重复批次这个接力策略几乎可以用最小的算法改动拿到最大收益。另外还有一种等价思路是把MFAPC当作MFAILC的在线监控层每次迭代运行结束时比较两者的误差指标如果某次扰动过大导致MFAILC修正方向异常就切回MFAPC重新生成基准轨迹。我在仿真中用一个简单的切换判断验证了这个想法不过篇幅原因就不展开细节了这个思路很适合工程上做保守的冗余设计。5. 调试这套仿真程序踩过的坑与排查办法5.1 PJM漂移与估计发散是我遇到的最大坑第一个坑是PJM漂移。算例1在参考轨迹长时间保持不变时控制增量du会趋于零PJM估计方程长期得不到有效数据更新phi(k)就开始慢慢朝着异常方向漂移。如果仿真时间足够长甚至会出现phi(k)变成负值的情况控制律方向直接翻转输出一下子崩掉。解决办法就是我在第3章说的重置机制当abs(du)过小或abs(phi(k))过低时强制把PJM恢复到初值。第二个坑是PJM发散通常表现为仿真到某一步出现NaN或Inf。排查过程里我发现80%的情况都是分母mu du^2接近0导致的比如mu设成0.001而du恰好也在1e-4量级分母就变得非常小估计步长被放大得极其夸张。处理办法除了给mu设置下限之外还可以在代码里直接对phi限定上下界比如phi(k)min(max(phi(k), phi_min), phi_max)这个方法虽然土但非常有效。第三个坑是采样时间选取。我曾试图把采样周期从0.01秒改到0.005秒看起来只是精度翻倍但同样的控制参数跑出来的结果反而变差。原因是采样周期缩短后相邻两步的输出增量变得很小du^2也变小PJM估计的噪声相对增大控制律开始剧烈抖动。在做仿真验证时采样周期和控制参数的匹配关系必须放在一起考虑不能只调整一个变量。5.2 高频报错与我的排查顺序报错或异常现象可能原因解决办法NaN出现在第100步左右分母mudu^2过小或输入输出出现奇异值检查mu下限给PJM加限幅控制量持续高频振荡lambda太小或PJM估计波动太大增大lambda减小eta误差在迭代后期不降反升初始状态未重置或噪声破坏了重复性检查每轮y_v(1)是否一致超调非常大rho过大修正步长太激进降低rho观察TV指标变化算法完全失灵但无报错参考轨迹不可达或约束条件冲突检查目标轨迹和执行器约束范围排查顺序我一般遵循“先看输入后看输出”的原则。如果控制量已经异常先怀疑控制律参数和PJM估计如果控制量正常但输出异常再回头看对象模型和设定轨迹。为了快速定位问题我习惯在每个循环里只保存最近50步的PJM序列一旦出现NaN直接画PJM曲线看它是在哪一步突然跳变的十次有八次能直接找到参数问题所在。5.3 日志记录与可视化技巧数值仿真程序最容易犯的错误是只记录y和u忘记了记录PJM估计值、预测误差、控制增量这些中间变量。实际上调试时PJM曲线比输出曲线更能暴露问题。我给程序加了一个log结构体把每个采样时刻的phi、du、pred_error、u_saturated都存进去最后统一导出成MAT文件。这样在做分析时就不需要重新跑仿真直接读取历史数据就行了。可视化方面我用三个子图联动展示第一张画输出跟踪曲线和参考轨迹第二张画控制量以及执行器饱和边界第三张画PJM估计随时间的变化。三张图放在同一个时间轴上一屏就能看清控制律在哪些时刻发生了异常修正。很多看起来非常诡异的问题比如参考轨迹在某个斜坡段出现周期性振荡其实只要把PJM图和控制量图叠在一起马上就能看出是PJM估计在斜坡段来回摆导致的。6. 仿真验证之外我再补充几句个人体会6.1 记住这三条能省掉一半调试时间第一不要一上来就追求多步预测。MFAPC的多步预测性能很依赖PJM外推的准确性而PJM外推本身就是一个极简化的线性近似窗口越长误差越大。建议先从单步预测起步把PJM估计调稳定了再逐步增加预测步数每次只加一步观察性能变化趋势。第二PJM初值不要拍脑袋乱设。它本质上是对象的输入输出增益近似你可以用开环阶跃响应的平均斜率来估算也可以用上一套已经调好的控制器数据离线算一个初始值。初值给得靠谱前几十步的过渡过程会平滑很多。第三MFAILC的迭代次数上限不要贪多。从仿真数据看超过某个临界点之后误差下降几乎停滞反而有微小波动。更好的做法是设置一个误差阈值当RMSE连续三轮小于阈值且不再下降时提前终止迭代然后把次数上限省下的时间拿去做参数敏感性分析。6.2 下一步我打算做的扩展这套仿真程序目前还停留在离线数值验证阶段下一步我打算把对象模型替换成一台搭建好的半实物仿真平台在实时环境下测试PJM在线估计的延迟补偿效果。另一个方向是给MFAPC加上约束处理模块让执行器饱和、变化率限制直接进入目标函数这样就能应对更接近工程现场的场景。还有个更前沿的念头是把MFAILC的迭代学习律从线性形式扩展到带自适应步长的形式让控制器在误差大时用大步长快速拉回误差小时用小步长精细修正。这个想法在理论上还缺少严谨的收敛性证明但仿真层面已经跑出不错的效果等我把数值实验做得更完整一些再来写一篇更详细的分享。
返回列表