ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

重复控制实战:机械臂轨迹跟踪的周期误差抑制与参数整定

重复控制实战:机械臂轨迹跟踪的周期误差抑制与参数整定 重复控制这个坑我在做机械臂轨迹跟踪的时候踩了不止一次。第一次听到这个词是在啃机器人动力学与控制的相关资料当时满脑子都是控制器里塞一个延时环节就能消掉周期误差这玩意儿凭什么稳。后来在一条周期性往复运动的搬运机械臂上真刀真枪跑了一遍才明白它为什么在伺服控制圈子里一直有位置——尤其是那些每天重复同一条轨迹、同一个节拍的应用重复控制几乎是把稳态误差按在地上摩擦的存在。这篇笔记我会把重复控制从内模原理讲到离散实现从参数怎么算讲到实际调参踩的坑涉及机械臂关节伺服、PID控制外环、轨迹跟踪这些场景。不管你是刚啃完动力学方程、准备动手写控制器的学生还是已经在产线上和伺服驱动器较劲的工程师都能从里面抠出能直接抄的东西。1. 重复控制到底在解决什么问题1.1 从一段焊接轨迹说起假设有一条六轴机械臂任务是把焊枪沿着同一条焊缝来回走一个来回两秒一天干八小时。位置环用的是常规PID控制参数也是老老实实整定过的静态精度没问题但只要速度提上去末端就会在同一个位置出现同一种偏差——不是随机漂移是每次都一样像复读机。这就是周期误差最典型的特征误差和参考信号在时间上同步周期相同。这种误差的来源其实很好理解。机械臂的动力学里本来就有大量周期性成分比如减速器的齿槽、谐波减速器的传动误差、连杆重力的周期性变化、关节摩擦随位置变化的周期性起伏还有轨迹本身的正弦/往复特性。用PID控制去压这些误差本质上是用一个只有零频无穷增益的控制器去对付一堆非零频的扰动理论上就压不干净。你把比例增益拉大高频段相位滞后跟着变大振荡风险上来了加积分低频确实能压但中频段的周期扰动照旧。重复控制给的解法非常直接既然误差是周期性的那就让控制器在所有这些周期谐波频率上都有无穷大增益。你想象一下反馈回路在每个 k/T 频率处都放了一个积分器那这些频率上的稳态误差就会被强行拉到零。这就是它比普通PID更适合周期任务的根本原因也是它在转台、磁盘驱动器、逆变电源、机械臂这类场景反复被提起的原因。1.2 内模原理给出的答案要理解重复控制为什么成立绕不开内模原理。这个概念说起来简单如果一个参考信号或者扰动信号可以由某个线性自治系统的模型产生那么只要把这个模型原封不动地放进控制回路里系统就能在该信号作用下实现零稳态误差。换句话说控制器里得有产生这个信号的那台机器。PID为什么能消掉阶跃误差因为积分环节 1/s 就是阶跃信号的内模阶跃信号是 s·X(s)0 的解1/s 正好把这个极点搬进了回路。同理正弦信号的内模是 1/(s²ω²)你想让系统无静差跟踪一个固定频率的正弦就得在回路里塞进这一对虚轴极点。那周期信号呢一个周期为 T 的信号它的拉普拉斯变换在 s j·2πk/T 处有一堆极点k 取遍所有整数。对应的内模就是C_rc(s) 1 / (1 - e^(-sT))这个式子展开成级数就是 1 e^(-sT) e^(-2sT) ...说实话第一次看到的时候我觉得这不就是一个无穷长的延时累加器吗没错它在虚轴上有无穷多个极点位置正好落在 ω 2πk/T 上每个谐波频率处增益都是无穷大。这就是重复控制能做到周期误差全频段零稳态的数学依据。但这里有个必须点破的隐患这个内模本身是临界稳定的虚轴上的极点意味着它在开环状态下是一个等幅振荡器。所以重复控制从来不能单独用必须挂在已经稳定的反馈回路外面靠原有闭环的裕度兜住它这就是后面要讲的插入式结构的由来。1.3 它和迭代学习控制不是一回事很多笔记把重复控制和迭代学习控制混着讲我自己一开始也弄混过。两者的目标确实重叠——都是利用误差重复出现这一先验信息去改进跟踪精度内模原理也能统一解释。但落到工程上差别很大。迭代学习控制是批次式的。它要求每个周期或者叫每次试验、每个批次跑完拿到完整的一整段误差轨迹然后离线更新下一次的控制输入下一次再跑。它的前提是每次运行起点一致、可以重复试验比如数控机床反复加工同一个零件、机械臂反复抓取同一个工位。它的更新是周期与周期之间进行的实时性要求不高但要求你能拿到整段数据并且能重跑。重复控制是实时闭环的。延时环节在回路里一直挂着当前时刻的控制量里包含了上一周期同一相位点的误差信息边跑边修不需要重跑不需要批次概念。它更适合连续运行的场景比如一直在往复扫描的机械臂、一直旋转的转台。代价是它对周期的准确性非常敏感周期估错一点抑制效果就打折而ILC对时间对齐的容忍度相对好一些因为它是在周期末端做全局修正。我的选型经验很朴素能批次重跑、能拿到完整轨迹的优先考虑ILC连续运行、周期固定、不想打断流程的用重复控制。两者也可以叠着用后面第6节会说。2. 重复控制器的结构拆解与选型2.1 最朴素的延时正反馈结构最基本的离散重复控制器长这样C_rc(z) z^(-N) / (1 - z^(-N))其中 N 是一个周期内的采样点数N T / Ts。这个式子的物理含义非常清晰z^(-N) 是延时一个完整周期把它接在一个单位正反馈环里得到的就是把每个周期的信号沿时间轴叠加起来。误差在同一个相位点上反复累积累积到最后就形成了对这些频率的强抑制。你可以把它理解成一个按相位记账的账本每一次运行到轨迹的第 k 个采样点控制器就把历史上所有同一相位点的误差加起来算平均谁在这个点上反复偏差控制器就在这个点上反复加力。周期信号由于每个周期在同一相位点的值相同累积起来会越来越大直到误差被抵消而非周期成分因为相位对不上累积会相互抵消掉。这种朴素结构的问题也很明显。它有两个致命伤第一虚轴上的极点让系统处于临界稳定模型有一点偏差或者扰动就可能从等幅振荡变成发散第二它对高频噪声完全没有免疫力因为它在所有谐波上都有无穷增益包括那些系统根本没法响应的频段噪声会在这里被无限放大。所以工程上几乎没人直接用这个原版。2.2 加了Q滤波器之后拿精度换鲁棒改进型结构就是在延时支路上串一个低通滤波器 Q(z)C_rc(z) Q(z) · z^(-N) / (1 - Q(z) · z^(-N))Q(z) 的作用是在中低频段让它接近1保留重复控制的高增益在高频段让它快速衰减到0把那些系统响应不了的谐波关掉。这样一来回路的稳定性就由 Q(z) 的幅频特性决定——凡是 |Q(z)| 1 的频段重复控制器就自动退出不再对那里施加无穷增益。最常用的 Q(z) 有两种。一种最简单直接取一个略小于1的常数比如 0.95 或者 0.98。这种做法实现起来只有一行代码代价是所有频率上都被均匀衰减了一点高频的抑制精度会降一些但鲁棒性提升非常明显。另一种是低通滤波器常见的是二阶巴特沃斯截止频率取在系统闭环带宽的1/3到1/2之间。还有更省算力的用三点滑动平均 Q(z) (z 2 z^(-1)) / 4本质是一个零点在 z -1 的一阶低通在奈奎斯特频率处增益为零在原点是增益为1。我自己的习惯是先上常数Q跑通看清楚系统在哪个频段开始不稳定再换成低通滤波器把截止频率卡在那之前。这个顺序比一上来就精调滤波器参数要快得多。2.3 相位补偿与增益两个必须调的旋钮只有 Q(z) 还不够。原来的被控对象伺服回路在中高频段有明显的相位滞后而重复控制器本身几乎不提供相位超前误差信号经过一圈回环回来时相位已经偏了。相位一偏原本应该负反馈抵消的误差可能变成正反馈放大那就不是抑制而是自激了。解决方式是插入一个相位补偿环节形式通常是纯超前 e^(s·τ) 的离散近似或者一个零极点配置的补偿器。τ 的取值依据是让整个重复控制回路在目标频段内的相角接近零。实操中我不去算解析解而是把开环传函的频响扫出来看多少频率处相位下降到 -180° 附近然后取那个频率对应周期的一个小分数作为 τ。这个方法很土但很快大概扫两次频响就能定下 τ 的量级。另一个旋钮是重复控制增益 k_r直接乘在 C_rc 前面。它不影响稳态抑制能力只要稳定稳态还是零误差但直接影响收敛速度和稳定裕度。k_r 变大收敛快稳定裕度小k_r 变小稳健但需要更多周期才能把误差压下去。我一般在0.3到0.8之间调从不一上来就取1。2.4 插入式与并联式怎么嫁接到已有回路工程上重复控制几乎不会替换掉原有的PID而是以两种方式和它共存。第一种是插入式也叫串接式。原有回路有一个已经整定好的反馈控制器 K(z)闭环传函是稳定的。重复控制器被串在误差信号进入 K 之前的支路上结构上相当于给原有回路加了一条周期积分通路。这种接法的好处是当重复控制器的输出被 Q(z) 衰减到0时整条回路自动退化成原来那个稳定的PID回路最坏情况也只是失去了重复抑制不会把系统搞崩。这是我最推荐的接法调试的时候心里有底。第二种是并联式重复控制器和原控制器并列输出直接叠加到控制量上。这种接法对原回路的改动更小几乎不用动已经跑在生产上的PID参数但因为两条通路没有明确的退化关系稳定性分析要做额外的小增益判断。如果被控对象增益随位形变化很大比如机械臂伸展和收缩时惯量差好几倍并联式的风险会高一些。结构选型上我还想说一句如果你的硬件平台用的是库卡或者发那科这类封闭控制器一般拿不到误差通道去做插入式只能把重复控制器做在位置指令修正层即用重复控制器生成一个修正量加到指令上。这属于并联式的一种变体效果打折但可行。用ROS2自己做控制器的话插入式随便接自由度大得多。3. 参数设计从周期点数到滤波器截止3.1 先算清N、Ts和频率分辨率参数设计的第一件事不是调参是算 N。N 决定你能抑制哪些频率算错了后面全白搭。设轨迹周期为 T控制周期采样周期为 Ts则 N T / Ts。这个值必须是整数因为 z^(-N) 代表整数个采样点的延时。如果 T / Ts 不是整数就必须调整 Ts 或者对周期做微调比如把一个2.003秒的周期按2.000秒处理或者把采样率提到能整除的位置。我遇到过一台设备控制器中断周期是1ms固定死的轨迹周期2.5秒N 2500正好整除后来需求改成1.6秒周期N 1600也整除。要是碰上1.333秒这种N 1333误差只有百万分之三实际影响可以忽略。但如果 T/Ts 500.4 这种就必须处理否则重复控制器的账本会串相位。N 确定后重复控制能抑制的谐波频率是 f_k k / Tk 1, 2, 3, ...一直到奈奎斯特频率。基频是 1/T频率分辨率也是 1/T。举个例子T 2sTs 1msN 2000那么它能对准0.5Hz、1Hz、1.5Hz……一直到接近500Hz的所有谐波。反过来如果 T 变成 20s分辨率就降到0.05Hz两个相邻谐波靠得很近Q滤波器的过渡带设计就会变得很紧张。这里有个容易被忽略的约束N 越大内存占用和单周期计算量越大但对低阶谐波的覆盖并不增加。真正需要关注的是你想要抑制的最高谐波频率和系统带宽的交集。比如你的位置环带宽只有30Hz那抑制到60Hz以上就没意义了因为那些频率的扰动本来就被机械惯量滤掉了。这时候用 Q(z) 在40Hz附近截止就够了。3.2 Q滤波器的选择与截止频率Q(z) 的截止频率不是随便定的我用一个流程来判断。先测出原有闭环回路的幅频特性找到幅值从-3dB开始快速下降的拐点记这个频率为 ω_c。重复控制器的工作范围应该限制在 ω_c 的1/3到1/2以内原因是超过这个频率后被控对象自身增益太小重复控制器要输出很大的控制量才能产生影响容易饱和而且此时对象的相位已经滞后很多靠相位补偿拉不回来。如果选常数 Q就取0.95到0.99之间。这里有个经验公式Q 越小重复控制能获得的有效增益倍数越低收敛需要的周期数就越多。粗略地说误差衰减到初始值的1/e大约需要 1/(1-Q) 个周期。Q 0.95 对应约20个周期Q 0.99 对应约100个周期。如果一条轨迹周期2秒20个周期就是40秒才能收敛产线上可能等不了。这是我为什么说能取大就取大但要以稳定为前提。如果选低通滤波器我常用二阶巴特沃斯在 ω_c/2 处截止采样率是 Ts 时用双线性变换离散化然后检查它在奈奎斯特频率处的增益是否足够小一般要求低于-20dB。如果不够就把截止频率再往下压。有些同行喜欢直接在 z 域里用零极点配置手搓Q也不是不行但分析起来更麻烦我偏向用成熟滤波器设计工具生成系数。3.3 相位补偿量的估算方法相位补偿的目的是把重复控制回路在这些谐波频率处的总相角拉回到0附近。总相角包括被控对象在 k/T 频率处的相位、重复控制器本身的相位、Q滤波器和补偿器的相位。实操步骤如下。第一步把被控对象在各个 k/T 频率处的相位读出来记成 φ_p(k)。第二步看 Q 滤波器引入的相位滞后 φ_q(k)。第三步希望总相角满足 φ_p φ_q φ_comp 0模360于是 φ_comp(k) -φ_p(k) - φ_q(k)。第四步因为一个纯超前环节的相位是 ωτ所以对每个 k 都有一个 τ_k取这些 τ 的中位数作为最终补偿量。这个方法我在三个不同惯量的关节上都用过得到的 τ 基本在0.2到0.4个采样周期的量级取整到采样点的话经常是0或者1个点。如果算出来要补好几个采样点多半说明你的回路带宽和重复控制的工作频段不匹配先回头检查Q的截止频率。注意相位补偿的方向一定要确认清楚。如果你把超前做成了滞后系统会从稳定瞬间变成自激表现是误差在几秒内快速放大到饱和。第一次上机测试前务必把重复控制器增益设为0先空跑一遍确认原回路正常再一点点加上去。3.4 稳定性和收敛速度的取舍稳定判据用起来最简单的是小增益条件。在插入式结构中如果原闭环传函是稳定并且可逆的重复控制回路的收敛条件是| Q(e^(jω)) - k_r · Q(e^(jω)) · e^(-jωN) · P(e^(jω)) | 1对所有 ω其中 P 是原闭环系统的传递函数。这个条件在工程上很难精确验证因为它要求 P 的模型足够准。所以实际调试中我用的是更粗暴的办法先把 k_r 和 Q 都设得很保守k_r 0.1Q 0.9确认能稳定收敛后再逐步加大 k_r、把 Q 往1靠每改一次就跑一段实测数据看误差曲线是否单调下降一旦出现振荡就回退一档。收敛速度的量化指标可以用多少个周期后误差降到某个阈值。我的验收标准是在20个周期内周期误差的RMS值降到不加重复控制时的30%以下就算调通了。如果30个周期还降不下去基本是参数或者相位补偿有问题别硬等。3.5 关键参数与影响对照参数物理含义取值偏大取值偏小我的常用范围N一周期采样点数低频覆盖不变内存和计算量上升高次谐波相位对齐精度下降必须等于 T/TsQ 常数高频衰减程度收敛慢精度高鲁棒精度低0.95 - 0.99Q 滤波器截止有效工作频段抑制频段宽稳定风险高稳健中频抑制弱闭环带宽的 1/3 - 1/2k_r重复控制增益收敛快裕度小稳健收敛慢0.3 - 0.8τ相位超前补偿量高频相位过冲中频相位不足0.2 - 0.4 个采样周期这张表我是贴在调试电脑旁边的每次改参数前先看一眼能省很多来回试的时间。要强调一句这几个参数不是独立的k_r 调大了通常要配合把 Q 调小或者截止频率下压否则稳定裕度会被吃光。4. 在关节伺服上的落地实现4.1 硬件与软件平台选择我最近一次完整实现是用在一台六轴协作机械臂上控制器跑在ROS2上位置环和速度环在工控机上以1kHz运行通过EtherCAT把力矩/电流指令下发给伺服驱动器。任务是一条往复的取放轨迹单程1.5秒往返3秒所以 T 3sTs 1msN 3000。如果你用的是库卡或者发那科的整套系统通常控制器是封闭的改不了内环只能做指令修正。这种情况下的做法是把重复控制器输出的修正量叠加到轨迹规划器输出的位置指令上作为新的位置给定。这个方案我在发那科的机器上也试过效果比改内环差因为它受限于位置指令的更新率很多系统只有几百Hz周期信号的谐波对齐精度会打折但对基频和低次谐波的抑制还是很明显。如果你的平台是Arduino或者STM32驱动小舵机、伺服电机算力有限那就要把 N 控制小一点滤波器阶数降下来最好用定点数实现。我见过有人用STM32F103做单关节重复控制N 200控制周期5ms配合简单的常数Q跑简单的往复运动是够用的。4.2 环形缓冲区的离散实现重复控制器的实现核心是一个长度为 N 的环形缓冲区。每一步从缓冲区里取出 N 步之前存的误差值乘上 Q 和 k_r 之后再加上当前误差重新写回缓冲区。用C语言风格的伪代码写出来大概是这样#define RC_N 3000 #define RC_KR 0.6f #define RC_Q 0.97f static float err_buf[RC_N]; // 误差历史环形缓冲 static int rc_idx 0; /* 每 1ms 中断里调用一次 e_now: 当前周期误差参考位置 - 实际位置 返回值: 重复控制修正量叠加到位置指令上 */ float repeat_control_update(float e_now) { float e_old err_buf[rc_idx]; // 取 N 步之前的误差 float u_rc RC_KR * (e_now RC_Q * e_old); err_buf[rc_idx] u_rc; // 写回缓冲区 rc_idx (rc_idx 1) % RC_N; return u_rc; }这段代码看着简单但有几个必须注意的细节。第一缓冲区里存的是什么。有人存误差 e有人存控制量 u。存控制量的版本更常见因为这样递归关系是 u(k) k_r·e(k) Q·u(k-N)对应的是标准重复控制器结构。我上面写的这版就是把累加结果写回缓冲区等价于把整个重复控制器作为一个递推滤波器实现读出来的是上一周期同相位的累加值。第二初始化的处理。err_buf 必须全部清零而且在上电后的第一整个周期内重复控制器的输出是不完整的缓冲区里只有部分历史数据这段时间的修正量应该乘一个从0到1的渐入系数或者干脆在第一个周期内把 k_r 设成0。我吃过这个亏上电瞬间因为缓冲区里是随机数未初始化控制器直接输出一个巨大的修正量机械臂猛地抖了一下。第三索引和周期对齐。必须保证 rc_idx 和轨迹的相位严格对应。如果轨迹的起点在周期中间被重置了比如操作员手动暂停再启动rc_idx 也要同步复位否则相位就串了抑制效果直接消失。如果用Python做仿真验证结构完全一样只是把数组换成列表用双端队列会更方便from collections import deque N, kr, Q 3000, 0.6, 0.97 buf deque([0.0] * N, maxlenN) def rc_update(e_now): e_old buf[0] u_rc kr * (e_now Q * e_old) buf.append(u_rc) return u_rc仿真里我会先把 P(z) 的模型搭出来跑一遍看误差收敛曲线再上真机。模型可以粗糙一点二阶加延时就能反映很多特性主要看收敛趋势对不对别在模型上过度纠结。4.3 与PID、前馈、摩擦补偿的配合重复控制不是替代品它必须和原有控制手段协同。我在那台机械臂上的配置是三层叠加位置环PID负责基本跟踪速度前馈负责抵消惯量带来的相位滞后摩擦补偿负责压住低速段的爬行重复控制挂在最外层专门处理剩下的周期残差。这个顺序有讲究。摩擦补偿和重力补偿这些是已知模型的确定性补偿重复控制是数据驱动的残差补偿。如果你把重复控制放在前面去处理那些本该由模型补偿的误差重复控制器的负担会很重缓冲区里的数值会积累得很大一旦轨迹周期变了就会有一段很长的重新收敛期。先把能算的算掉让重复控制只处理那一小撮顽固的周期残差收敛快、幅值小、稳定裕度也好。还有一个实际问题是控制量饱和。重复控制器是累加型的理论上误差不消它就一直加。伺服驱动器的输入是有饱和限制的一旦饱和误差反而会积累得更多形成所谓的饱和—滞后恶性循环。我的做法是在重复控制输出后面加一个限幅幅值限制在额定控制量的15%以内同时监视缓冲区最大值如果长期贴在限幅上说明参数不对或者 Q 给得太大。4.4 实测效果与调试记录说说具体数据。不加重复控制时这条3秒周期轨迹的稳态跟踪误差RMS是0.42mm关节空间折算主要成分在基频0.33Hz和它的2、3次谐波上频谱一看就是周期性的。加上重复控制后经过约25个周期75秒误差RMS降到0.09mm降幅约78%。收敛过程不是线性的前5个周期降得最快之后变缓最后趋于一个平台。这个残留的0.09mm来自哪里我做了频谱分析主要能量集中在30Hz以上正好在Q滤波器截止频率之外说明这部分误差重复控制管不到。想再往下降要么把Q的截止频率往上推但那会牺牲稳定裕度要么去查30Hz以上是不是有机械共振或者编码器噪声。后来查出来是谐波减速器的一个共振峰用陷波器单独压掉了。调试过程中改过三版参数。第一版 k_r 1.0Q 1.0基本是原版结果跑到第8个周期开始发散误差在0.5秒内涨到饱和。第二版 k_r 0.6Q 0.95 常数稳定收敛但25个周期后误差只降到0.16mm。第三版把Q换成截止在40Hz的二阶巴特沃斯k_r 0.7得到上面那组数据。这个演进过程说明一件事原版重复控制在真实系统上几乎必然发散Q滤波器不是可选项而是必需品。5. 常见问题与排查速查表5.1 六个高频故障现象可能原因排查方法解决上电后误差快速发散到饱和缓冲区未初始化Q1且无相位补偿检查 err_buf 是否清零看控制量是否贴限幅加渐入Q降到0.98以下补相位误差不降反升但升到某个值后稳定相位补偿方向反了把相位补偿置零重跑对比方向反转补偿符号或减小补偿量误差缓慢下降但20个周期后仍无明显改善k_r太小或Q太小看缓冲区数值是否在缓慢增长逐步加大 k_rQ往1靠部分谐波被压下去部分仍然存在这些谐波在Q截止频率之外对误差做FFT看残留频率上推截止频率或单独用陷波器处理轨迹周期改了之后完全失效N未同步更新相位错位检查 N T/Ts 是否重新计算周期变更时同步复位缓冲区电机有明显啸叫和发热重复控制在高频注入了大量控制能量看控制量频谱在高频是否有异常抬升下调Q截止频率检查限幅这张表是我从三次翻车经历里总结出来的尤其是第一条和第六条属于不上机就想不到的问题。5.2 我自己踩过的坑第一个坑是周期对齐。我以为只要 N 对就行了忘了轨迹规划器每次启动时的时间戳不一定从零开始。有一次轨迹是从位置A到位置B再回来规划器每次启动的时间零点有几十毫秒的抖动导致重复控制器的相位在这个抖动范围内随机漂移效果时好时坏。后来我在控制器里加了一个轨迹相位检测用规划器输出的归一化相位去复位 rc_idx才彻底解决。第二个坑是把重复控制用在非周期任务上。有一次我想让它帮忙压一下随机扰动的残留误差结果不但没压下去反而因为重复控制器的相位累积把随机误差记忆成了周期性的模式反而变大了。这个教训很深刻重复控制的前提是误差本身周期重复如果任务本身就是非周期的用它只会帮倒忙。第三个坑是采样率和中断抖动。我一开始把一个低优先级任务里跑重复控制中断抖动有上百微秒N 的实际值和理论值对不上抑制效果时好时坏。后来挪到高优先级定时器中断里抖动降到几个微秒效果立刻稳定。周期 t 越短的系统对中断抖动越敏感——T 3s 时 100μs 抖动只占百万分之三十T 0.1s 时就是千分之三影响就大了。第四个坑是忽略了缓冲区内存。N 3000每个 float 4字节一个关节就是12KB六轴就是72KB。在工控机上完全不是问题但如果你要在STM32这种小内存MCU上跑六轴就得用定点数或者把 N 降下来。我见过有人用 int16 定点表示动态范围够用精度损失在可接受范围内。提示每次上机测试前先用仿真跑一遍收敛曲线再上真机时把 k_r 设为理论值的1/3稳定后逐步加。这个习惯帮我在三个项目里避免了机械臂甩臂的尴尬场面。6. 还能怎么扩展和ILC、陷波器、自适应搭着用6.1 与迭代学习控制的组合前面说过ILC和重复控制各有所长把它们组合起来是实践中很常见的一个思路用ILC处理需要批次收敛的大幅周期成分用重复控制处理连续运行中小幅的周期残差。具体做法是让ILC在每个批次结束时更新一个前馈补偿表重复控制器挂在反馈通道里实时修正剩余的周期误差。两者的频率分工也要错开一般让ILC负责低频基频和低次谐波重复控制负责它管不到的中高频残差。要注意的是两者共用同一个误差信号时会出现抢功现象ILC已经把某个谐波压下去了重复控制还在那里反复累加容易造成过补偿和振荡。我的处理方式是给重复控制的输入误差加一个高通滤波把已经被ILC处理干净的低频段切掉只让它看到中高频残差。这样分工明确互不打架。6.2 与陷波器、自适应律的配合重复控制解决的是周期问题陷波器解决的是固定频率共振问题。两者看起来重叠实际是互补的。共振峰如果恰好落在重复控制的工作频段内会因为局部增益过高引起振荡用一个窄带陷波器先把共振峰幅值压下去再上重复控制稳定裕度会好很多。我在第4节提到的那台机械臂就是先加了两个陷波器处理减速器共振重复控制才顺利推上去。自适应律的价值在于应对周期或对象参数的变化。如果你的机械臂负载会变、惯量会变原来整定好的 Q 和 k_r 可能就不合适了。一个思路是让 k_r 随误差幅值自适应误差大时增益小一些保稳定误差收敛后增益加大提精度另一个思路是让自适应滤波器在线估计周期 T解决周期轻微漂移的问题。这两种我在仿真里试过效果可以但真实系统上因为引入了额外的动态调试复杂度上一个台阶除非确实有必要我一般先用固定参数加保守裕度扛过去。最后一个实际建议重复控制永远不该是最后一道防线。如果误差里还有明显的非周期成分、随机噪声、或者低频漂移那应该先回去查机械装配、编码器信号质量、供电纹波而不是指望一个控制器把所有问题都盖住。我见过太多人包括我自己在参数上死磕最后发现问题出在一个松了的联轴器上。这套东西我从啃内模原理到能在真机上稳定跑通前后断断续续花了小半年。现在回头看最难的不是数学推导而是把 Q 滤波器和相位补偿这两个妥协产物理解透——重复控制的精髓不在于它在理论上有无穷增益而在于你清楚地知道该在哪些频率上把它关掉。
返回列表