ARTICLE DETAIL

资讯详情

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

速度前馈原理与实战:消除跟随误差,提升运动控制精度

速度前馈原理与实战:消除跟随误差,提升运动控制精度 我第一次真正意识到速度前馈的威力是在调试一台高速H型龙门机床的时候。当时那台设备跑800mm/s的空程方形轮廓被切成菱形四个角全部“吃进去”一块。我把位置环增益从20拉到40床身开始嗡嗡作响最后只能改回去。后来在伺服驱动参数里看到一个叫“速度前馈增益”的旋钮从0%调到100%轮廓误差几乎肉眼不可见。当时只有一个感觉这东西比我想象中的重要得多。后来这些年我陆续在3D打印机、CNC数控系统、机器人关节模组上跟速度前馈打交道越调越能体会它跟PID反馈之间的微妙配合。很多人一遇到跟踪精度差第一反应就是加高PID增益结果往往是把系统推向振荡边缘噪音变大、电机发热精度也没好到哪去。而速度前馈是从另一个角度解决问题它不是“等误差出现了再去纠正”而是“预判目标运动提前把控制量给上去”。这篇就来把速度前馈的原理、实现、调参和踩坑完整拆一遍内容兼顾伺服系统和开源3D打印固件Klipper、Marlin、RepRap系无论你是调3D打印机的玩家还是做工业设备的工程师应该都能找到能直接用的东西。1. 跟随误差的根源为什么反馈控制总在“追”1.1 反馈控制的天然滞后要理解速度前馈先得看明白一个基础概念反馈控制本质上是“有误差才有输出”。位置环里指令位置和实际位置之间产生了偏差控制器才会输出速度指令。这个“偏差驱动输出”的逻辑决定了它天生就是慢半拍的。举个例子一台直线电机平台要匀速走100mm/s。在没有前馈、只有纯比例控制的情况下位置环输出速度指令的计算是v_ref Kp * e。那么要让平台以100mm/s的速度匀速移动位置误差必须有100/Kp这么大才能撑起这个速度指令。Kp如果是20误差就是5mm。5mm的跟随误差在龙门机床这种场景里意味着你加工出来的直角永远都是带斜边的。这就是所谓的“跟随误差”也叫轮廓误差的来源之一。它不是随机扰动造成的是控制系统在跟踪一个恒速目标时的系统性静态误差。只要速度不为零这个误差就存在速度越快误差越大。1.2 匀速段和加减速段的误差各不相同跟随误差其实分两种工况看。第一种是匀速段这时误差是比较稳定的一个值。上面说的公式e v / Kp描述的就是这个稳态误差。误差和速度成正比和位置环增益成反比。第二种是加减速段就是运动方向或速度发生变化的瞬间。这时候除了位置误差还有速度误差、加速度误差误差的峰值会比匀速段大好几倍。尤其在做圆弧插补、拐角过渡这类动作时加减速段的跟随误差直接决定了轮廓精度。我记得调一台点胶机时测过数据点位运动300mm/s恒定段跟随误差大概0.8mm但减速到底再加速的换向瞬间误差能冲到2.3mm。这个动态误差光靠位置环增益是压不住的因为本质上它是“加速度×惯量”带来的力的需求反馈控制必须先看到位置偏差才能输出对应的力动态过程永远跟不上。1.3 增益的代价为什么不开大Kp硬扛反馈控制最诱人的一条路就是无限加高Kp把误差压下去。但从工程角度这是条死路原因有几层。首先是稳定裕度。真实机械系统不是纯刚体联轴器有弹性丝杠有扭转变形床身有结构模态。位置环的增益加高之后这些原本不明显的谐振点会被激发系统产生高频振荡甚至发出尖锐的啸叫。我调过一台中小型CNCKp从30加到45空运行就开始“嗡嗡嗡”用振动传感器一测是300Hz左右的床身模态被激励起来了。其次是执行机构饱和。位置环增益Kp再大最终输出电压、电流也要受驱动器母线电压和电机额定电流限制。Kp高到一定程度控制器输出的速度指令早就超过驱动器的物理能力这时候误差还是会攒下来但电机已经开始发热、过载报警了。这些限制决定了单靠反馈跟踪精度和稳定性的矛盾没法调和。所以要在控制结构上找新的路子——直接把目标运动的信息提前送到输出端这就是前馈控制的基本思想。2. 速度前馈的数学模型与实现细节2.1 控制框图里多出一条“抄近路”的通道典型三环伺服控制从外到内是位置环、速度环、电流环。速度前馈加在位置环这个级别上原来位置环控制器输出的是速度指令v_ref Kp * e现在加一项v_ref Kp * e Kff * v_cmd这里v_cmd是运动规划器给出的目标速度Kff就是速度前馈增益也叫前馈系数。如果用伪代码表示数字控制器里的计算大致是这个样子这是我在STM32和FPGA上都实现过的逻辑// 每1ms中断执行一次 float pos_cmd trajectory_get_position(); // 规划器目标位置 float vel_cmd trajectory_get_velocity(); // 规划器目标速度 float pos_fb encoder_get_position(); // 编码器反馈位置 float err pos_cmd - pos_fb; // 位置环输出PID 速度前馈 float v_ref kp * err kd * (err - err_prev) / dt kff * vel_cmd; err_prev err; // v_ref再交给速度环处理这条前馈通道相当于给控制器开了一条“近路”不用等位置误差攒出来直接根据目标速度把速度指令灌进速度环。讲白了反馈控制是“看见坑再刹车”前馈是“看到前面有坑提前已经减速了”。2.2 稳态误差推导为什么Kff1是最理想值要理解前馈系数取多少可以做一步简单的推导。假设速度环带宽足够高v_actual ≈ v_ref那么匀速阶段实际速度等于目标速度v_cmd。代入上面的控制律v_cmd Kp * e Kff * v_cmd移项解出稳态误差e (1 - Kff) * v_cmd / Kp当Kff 1时误差为零这就是理想补偿。当Kff 0时退化成纯比例控制误差变成v_cmd / Kp跟前面说的一样。从这个公式还能看到关键的一点如果Kff超过1误差会变成负的这时候系统会“冲过头”实际位置跑到指令前面去后续的插补路径就会出现过冲。这也是为什么伺服驱动器里速度前馈通常限制在0%到200%之间而且绝大多数情况下100%是默认推荐值。当然实际系统里速度环不是完美的单位增益它有自己的带宽限制和相位滞后所以Kff1只是一个出发点具体多少最优要看现场的跟随误差曲线。这个我在第4章会详细写。2.3 别把速度前馈和加速度前馈搞混很多初学者会把速度前馈和加速度前馈混为一谈其实它们补的是两种不同的东西。速度前馈补偿的主要是匀速段的跟随误差——也就是黏性摩擦阻尼、反电动势这类跟速度成正比的因素。加速度前馈补偿的是加减速段的动态误差——也就是惯性力带来的误差。它的控制律是v_ref Kp * e Kff * v_cmd Kaff * a_cmd加速度前馈的数字实现需要从目标加速度信号取一个值乘以加速度前馈增益再叠加到速度指令上。在一个典型的运动过程中加速段惯性力最大这时加速度前馈起的作用就特别明显。实际调机时顺序上是先调速度前馈让匀速段误差归零然后再调加速度前馈压加减速段的动态偏差。这两个配合好位置环几乎可以不靠积分项就把跟踪精度做到非常好。而对3D打印机这种步进开环控制的场景加速度前馈的思路也体现为Pressure Advance——它要补偿的正是挤出机加减速时熔融材料的压力变化。2.4 数字实现里的离散化和滤波问题速度前馈在实际代码里还有一个容易被忽略的问题——目标速度从哪来。在一些老式数控系统里速度信号是从指令位移差分算出来的。差分对噪声特别敏感位置指令如果带一点抖动差分出来的速度信号就会被放大得极其毛糙。我曾经在一个项目里看到前馈引入之后电机出现高频振动查了半天才发现是速度信号噪声太大前馈通道把噪声直接灌进了电流环。解决办法有几种用运动规划器直接输出的速度值而不是位置差分。成熟的轨迹规划器内部有各轴的速度曲线直接把规划速度拿来做前馈信号质量是最好的。如果只能从位置差分那就必须做低通滤波或者滑动平均代价是引入相位滞后前馈效果会打折扣。对速度信号再做一个一阶低通截止频率通常取速度环带宽的2~5倍既去噪又不至于滞后太多。还有一个容易出问题的地方单位换算。前馈系数Kff乘的v_cmd和位置环误差e乘的Kp最终都要统一到同一个输出单位上。比如位置环输出是mm/s驱动器需要的速度指令也是mm/s那Kff无量纲直接取0~1即可。但如果是脉冲单位这里就得把脉冲频率和mm/s之间的换算关系带进去不然调出来的Kff会非常难解释。3. 三种典型场景里的速度前馈实践3.1 3D打印机Klipper与Marlin里的前馈思路3D打印机的运动控制跟工业伺服有个很大区别绝大多数民用级设备用的是步进电机开环控制根本没有编码器反馈位置误差是完全不可见的。这种结构下讨论“位置环速度前馈”没意义因为压根没有闭环修正这一步。但前馈的思想在3D打印里一点都不少而且恰恰是决定打印质量的关键。最典型的就是挤出机的压力补偿前馈——Klipper里叫Pressure AdvanceMarlin里叫LIN_ADVANCE。这个机制解决的是这样一个问题挤出机挤熔融塑料时喷头内部有一定压力。加速挤出的瞬间压力和流速有滞后导致挤出量不足减速时压力又没泄掉导致多挤一坨料。表现的后果就是打印方框角上积料、拐角起瘤、薄壁拉丝。Pressure Advance的做法是根据目标速度提前调整挤出量加速前先少挤一点减速前先多挤一点。本质上就是一个基于速度/加速度的前馈补偿不需要等挤出流量偏差出现再去修正。Klipper里配置它非常方便直接在挤出机配置段加两行[extruder] pressure_advance: 0.05 pressure_advance_smooth_time: 0.040第一个参数是补偿强度常用范围0.02~0.3之间跟材料、流量、喉管结构都有关系第二个是平滑时间用来过滤补偿量突变带来的冲击。Marlin那边启用LIN_ADVANCE之后用M900 K0.15类似的命令设置K值。好多人调K值靠感觉打印一个校准方块反复试。其实有个相对系统的方法我在第4章会细写。这里先提个个人观点Pressure Advance和输入整形Input Shaper是Klipper的两大神器但它们的定位完全不同——Pressure Advance是挤出方向的前馈补偿Input Shaper是结构振动的前馈抑制一个是补偿材料流动滞后一个是抑制机械振铃调参的时候别用错了模型。顺便说一句RepRap系固件的运动控制最大的优势就是源码和参数完全开放社区工具链成熟。你可以实时修改前馈参数甚至自己改算法重新编译固件这在商业闭源系统上想都不要想。就算不搞二次开发只看运动控制参数的可调性Marlin、Klipper这类的方案也比很多商业3D打印机强出一大截。3.2 CNC伺服系统驱动器参数里的前馈增益在CNC机床上速度前馈是正经写在伺服驱动器参数表里的功能。主流伺服驱动器日系的松下、安川国产的汇川、台达都有类似“速度前馈增益”或者“VFF”的参数。区别在于CNC位置环通常跑在数控系统上位控制器里伺服驱动器内部只跑速度环。这时候速度前馈又分为两层一是上位控制器在位置环做的速度前馈把前馈量加进速度指令里发给驱动器二是驱动器内部在速度环也有一层前馈有的叫“速度前馈”或者“转矩前馈”其实是针对速度环响应滞后的补偿。我在调一台加工铝件的轻型龙门铣时用到的是数控系统层的前馈功能。系统里参数是“速度前馈增益”按百分比设置。试切的时候看轮廓仪的数据前馈从0%调到80%直线段的轮廓误差从0.12mm降到0.01mm升到100%之后角上出现过切迹象最后定在90%让控制器留一点余量。这里一个很重要的经验前馈补偿的是“指令跟踪”它不能帮你抑制“外部扰动”。比如切削力变化引起的让刀前馈一点忙都帮不上那得靠增大速度环增益、加负载观测器来解决。这句话我反复说给现场的售后工程师听因为他们总以为前馈能包治百病。3.3 工业机器人多关节动态跟踪工业机器人的速度前馈比单轴系统复杂在“耦合”上。机器人末端要沿一条路径走比如画个圆形轨迹实际是六个关节协同转动的结果。每个关节的速度、加速度不仅要跟上规划值还要抵消其他关节运动的动力学耦合影响。这种情况下光有速度前馈还不够工程上通常是速度前馈、加速度前馈、重力前馈一起上。重力前馈特别有意思——机器人摆出一个大臂水平的姿态时重力对关节产生的力矩非常大如果不做重力前馈位置环必须靠跟随误差撑起这个力矩静态误差就会很大。加一项重力前馈直接把重力矩预计算出来补偿掉位置误差立刻就能降下来。我在实验室调过一台六轴协作臂空载走正弦轨迹只开速度前馈时跟踪误差的RMS大概是0.8mm左右把加速度前馈加上去RMS降到0.25mm再把重力前馈打开静态点的漂移几乎归零。这个组合拳的效果是调再高的反馈增益都换不来的。4. 速度前馈参数整定从理论初值到现场调试4.1 初值估计别靠蒙先算一版前馈增益虽然最后还是得现场试但初值完全可以先算出来节省大量盲目试凑的时间。对于位置环速度前馈理想值Kff 1也就是100%。对于驱动器内部的速度前馈初值取100%同样是比较合理的出发点然后根据实际跟踪曲线微调。对加速度前馈初值需要根据电机额定转矩、负载惯量来估。加速度前馈的实质是把“需要额外施加的力”提前折算成电流指令所以初值可以这样估算测出系统从0到额定转速的最短加速时间算出这个加速度对应的占空比或电流变化量两者相除得到近似的加速度前馈系数。4.2 用跟随误差曲线指导调参现场整定速度前馈核心观察对象就是“跟随误差曲线”。有示波器或者调试软件能看这个曲线整定就从“玄学”变成“科学”了。具体操作分三步第一步让系统跑一个典型的梯形速度运动——恒加速、匀速、恒减速。先把速度前馈设为0观察误差曲线形状匀速段误差是一个正的恒定值加减速段误差有大的凸起。第二步逐步加大速度前馈匀速段误差会逐渐缩小。每加一次跑一遍运动观察匀速段的误差值。理想的目标是让匀速段误差接近零。如果误差变负了说明前馈过大往回退一点。第三步匀速段调平之后再加加速度前馈处理加减速段的凸起。加的前提是驱动器和机械系统还有余量电机电流没到限幅。这里有个经验加速度前馈调到头加减速段误差仍然有个小凸起不用强求完全抹平因为过度补偿往往会在拐点引入更强的冲击。4.3 3D打印机场景的实操流程3D打印机没有编码器没法直接看跟随误差曲线但调Pressure Advance的思路是类似的只是把“跟随误差”换成了“挤出痕迹”。我的实操流程是这样的一个一个校准块打出来对比准备一个只有单层壁厚的薄壁方块打印速度固定比如80mm/s。把Pressure Advance值从0开始一档一档往上加每次加0.01~0.02各打一个方块。观察方块角上的堆积、圆角、欠挤出痕迹找“角上没有多余料、也不缺料”的那个值。实测中发现很多人容易把Pressure Advance调得过大结果是运动过程中喷嘴流量跟不上规划流量出现层间拉丝和表面粗糙。一个判断经验是PA值调好之后转角应该干净利索但直线段不能出现明显的挤出不足痕迹。如果直线段开始缺料说明K值偏大了退回去一档。Klipper社区有个调PA的带速度梯度的校准模型一部分用40mm/s、另一部分用80mm/s还有个测压力提前的打印测试图案比单纯打方块效率高不少。那个模型我也常用打印一次就能覆盖好几个速度点。4.4 整定中的典型陷阱前馈增益的整定有几个陷阱都是我在现场踩过或者看别人踩过的。第一个陷阱是把前馈当万能旋钮。前馈调不好迹象是位置误差表现为“转速越快误差越大”——这种情况速度前馈确实能解。但如果是低速爬行时有抖动、有爬坡时的“黏滑”那是摩擦补偿问题或者静差导致的位置振荡速度前馈完全不适用甚至会把抖动的激励信号放得更大。第二个陷阱是前馈和反馈打架。位置环Kp和Kff是相互影响的Kff越大同样的误差产生的速度指令里“前馈部分”占比越高反馈部分起的修正作用被摊薄了。如果Kff设100%、Kp又拉得很高一旦有外部扰动系统容易因为反馈过猛加上前馈直通而振荡。这也是为什么很多伺服推荐的调参顺序是“先调好反馈增益再加前馈”而不是反着来。第三个陷阱是高速工况下前馈信号的相位滞后。前面说过如果速度信号是差分加滤波来的滞后远一点还好超过一个控制周期前馈就变成“错相位补偿”不但不消差还引入新的误差。这时候你会发现Kff越大误差越小但过了一个值之后误差不降反升呈现一个“V”字形曲线。遇到这种表现先怀疑速度信号的质量而不是怀疑前馈原理。5. 让前馈失效的隐藏因素与进阶优化思路5.1 机械谐振前馈可能“好心办坏事”前馈的本职是“提前把控制量送出去”但如果目标速度信号本身包含高频分量这些分量也会被前馈直接放大送进机械系统里面去激励结构模态。举个例子运动规划器如果采用“梯形速度限波”的方式加减速切换点实际存在加速度突变这个突变映射到速度曲线上就是拐点处的斜率不连续。速度前馈会把这种不连续放大激发出机械系统的固有频率振荡。3D打印机打印大尺寸零件时那种高频振铃很多时候就是这么来的。处理办法有几条路控制指令层面的指令成型Command Shaping也就是Klipper里Input Shaper做的事通过整形规划好的运动轨迹来抑制特定频率的振荡。它不是前馈但和前馈配合相得益彰。伺服系统里加陷波滤波器把机械谐振频率附近的增益压下去。这一招对前馈高频激励非常有效但对机械模态在工作时漂移的情况效果有限。在速度前馈通道上加低通滤波衰减高频信号代价是牺牲一点前馈补偿的快速性。5.2 非线性摩擦速度前馈的“盲区”速度前馈的数学基础是线性系统、黏性阻尼模型。但真实导轨、丝杠上摩擦力的特性是非线性的低速时静摩擦占比很大速度上来以后进入流体润滑区摩擦才近似线性。这种非线性摩擦带来的结果就是在很低的速度段速度前馈几乎补不动因为静摩擦需要的驱动力是突变的和速度没有线性关系。典型的低速爬行、微动跟随误差大就是这么来的。工程上有针对性的补偿方法常见的是摩擦力矩前馈——用摩擦模型比如Stribeck曲线实时查表把摩擦力矩前馈到电流环。有的设备简单粗暴直接加一个固定偏置的摩擦力前馈效果也不错。我调过一台精密运动平台速度前馈、加速度前馈都开满了低速0.1mm/s正弦扫描时跟踪误差RMS还是0.02mm。后来把Stribeck模型加进去做摩擦前馈误差直接降了一个数量级。这告诉我们一点前馈不是孤军奋战模型越准补偿效果越好。5.3 前馈管跟踪反馈管抗扰控制界有个说法叫“内模”思想你想让系统精确跟踪某个特定信号最好的办法就是在这个信号的生成模型上做前馈。但把这套思想落到实物上最实用的一条分工原则就是——前馈解决跟踪问题反馈解决抗扰问题。速度前馈真正提升的是“跟踪性能”它让系统在跟踪外部规划轨迹时不再依赖反馈误差来产生输出。但对于外部随机扰动切削力波动、摩擦突变、线缆拖拽扰动系统只能靠反馈环路去抑制。前馈做得再好也不可能替反馈去对抗扰动。这带来一个重要的工程设计启示调系统精度先评估一下误差里“跟踪误差”和“扰动误差”各占多少。如果以跟踪误差为主比如高速插补、连续轨迹运动那就重点调前馈如果以扰动误差为主比如重切削加工那就得把钱花在机械刚性和速度环带宽上前馈帮不上大忙。5.4 变负载工况下的前馈增益自适应前馈增益一旦标定好一般是个固定值。但很多应用场景负载是变的机器人换了抓手、CNC换了加工材料、龙门架上台面放了不同重量的工件。负载变了系统的增益特性就变了原先标定的前馈增益不再匹配跟踪精度又会掉回去。处理这种工况有几个思路根据不同的负载工况预置多组前馈参数PLC或者上位机根据工况自动切换。这是最工程化的做法简单可靠。做自适应前馈比如实时辨识系统增益动态调整前馈系数。工业上用得不多计算量大且稳定证明复杂。迭代学习控制ILC适合执行重复轨迹的工艺比如点胶路径、焊接轨迹。ILC会记录上一轮运行的误差修正下一轮的前馈指令几轮循环之后精度极高。3D打印这种重复性很强的加工其实特别适合类似方案但目前开源固件里还没有成熟的ILC实现算是个憋着的潜力方向。我能给的最实在的建议是如果你的设备负载变化大先把多组参数的自动切换做了收益立竿见影再有余力再去研究ILC这类高阶方案。最后聊几句题外话调了这么多年前馈有一点体会特别深任何控制手段都有它的适用边界。速度前馈解决的是“线性跟踪误差”的那一部分它能让你在100%前馈时把匀速段误差压到零但前提是速度环足够快、机械系统足够干净、信号质量足够好。这三条缺一条件前馈都不会按理论剧本走。我在现场处理得最多的问题其实不是前馈原理不懂而是信号噪声、机械谐振、驱动器饱和这些外围问题盖过了前馈的收益。所以如果你调前馈调了很久没效果先别死磕那个系数回头看看你的速度指令干不干净、丝杠背隙调了没、电机电流够不够。把这些基础打好速度前馈的效果才出得来。另外别小看开源社区的积累。Klipper、Marlin、RepRap这一系的固件把很多以前只在工业伺服教材里出现的思想直接做成了随手可调的参数和工具。很多人用这些固件只是换了套参数让打印效果好一点但如果你愿意把Pressure Advance、Input Shaper背后的控制原理啃下来你会发现自己对运动控制的理解完全上了一个台阶回去看工业设备那些参数曲线全都是相通的。这篇文章写到的经验一部分来自工业设备调试现场一部分来自开源固件的折腾希望对正在跟跟随误差、轮廓变形较劲的朋友有点帮助。
返回列表