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

资讯详情

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

精密伺服低速爬行与过象限误差的Stribeck摩擦补偿实战

精密伺服低速爬行与过象限误差的Stribeck摩擦补偿实战 做精密伺服的这几年我被同一类问题反复折腾过低速让轴走它不走指令再加一点猛地窜出去画圆弧时每个象限过渡点都留一个明显的凸起定位完成后编码器还在目标值附近小幅振荡。第一反应永远是PID参数没调好但来回调了很久总是顾此失彼。直到有一次系统地用Stribeck摩擦模型去分析才发现这些看似无关的现象其实都源于同一条摩擦特性曲线。Stribeck摩擦模型描述的是摩擦力随速度变化的非线性关系在精密伺服控制里低速爬行、换向过象限误差、极限环振荡这三大经典问题本质上都是这条曲线在特定工况下的外在表现。这篇文章把我从现象诊断、模型原理、参数辨识到补偿落地、工程避坑的完整过程写出来希望能给正在做运动控制、伺服调试或者研究精密运动平台的工程师一些参考。1. 精密伺服里最磨人的几个摩擦现象诊断1.1 低速爬行轴走起来一顿一顿现场最常见的抱怨就是“低速走不匀”。比如要求以0.5 mm/min的速度慢速进给理论上应该匀速移动但实际位置反馈却是一会儿停一会儿动像虫子爬行一样完全没有平滑可言。这个现象背后的机制不复杂。把传动链看成一根有弹性的杆连着负载电机旋转时先压缩这根“弹性杆”力逐渐累积。在没有超过最大静摩擦之前负载纹丝不动一旦力超过静摩擦阈值负载突然开始滑动摩擦力又从静摩擦降到库仑摩擦同样大小的驱动力瞬间就显得“过大”负载加速往前窜。这一窜把弹性形变释放掉速度掉下来摩擦力重新回到静摩擦状态于是又卡住。如此循环就是爬行。判断方法很简单给一个很低的恒定速度指令看实际位置曲线。如果位置反馈呈现明显的台阶状而不是平滑上升基本可以断定在爬行。爬行的严重程度取决于静摩擦和库仑摩擦的差值、传动链刚度以及系统阻尼。这也是为什么气浮导轨平台很少出现爬行而滚珠丝杠导轨在润滑不良时特别容易犯这个毛病——静动摩擦差值大弹性环节明显。1.2 换向时的象限突起画圆不再圆另一个高频问题出现在圆弧插补或者圆形轨迹加工中。正常走圆时X轴和Y轴的指令速度是连续变化的但每到一个象限切换点某一轴的指令速度要过零换向。速度过零那一刻摩擦力方向瞬间反转从“阻碍运动”变成“推动运动”。从伺服环路的角度看这就相当于给系统注入了一个阶跃扰动。位置环为了对抗这个扰动会产生跟随误差突变跟随误差又直接影响轮廓精度反映在轨迹上就是过象限处鼓出来一个包。摩擦越大、换向越频繁这个凸起就越明显。很多人第一反应是加大位置环增益确实能把凸起压小一点但代价是增益一高编码器噪声被放大系统可能开始振荡。反复调Kp、Ki、Kv折腾几个小时往往只是在两个糟糕的结果之间选一个不那么糟糕的。根本问题在于摩擦是离散跳变的非线性扰动线性控制器天生不擅长处理这种东西。1.3 定位后的极限环轴停不下来的微抖还有一种情况同样让人头疼定位完成后位置误差已经进入允许范围但编码器反馈在目标值附近持续小幅振荡几赫兹到十几赫兹手摸上去能明显感觉到微振。这个现象的理解稍微绕一点。Stribeck曲线在极低速区有一个负斜率段——速度越低摩擦力反而越大速度稍微升高摩擦力变小。从能量角度看这个负斜率区域相当于负阻尼也就是系统自身在往振荡里注入能量。如果伺服环路和机械结构本身的正阻尼不够大压不住这个负阻尼就会形成持续的小幅振荡也就是极限环。这个现象的实际危害不只是定位精度还会加速机械磨损而且极难通过调参消除。因为增益调大了会放大噪声增益调小了更压不住负阻尼。我见过有工程师在这里耗了整整两天最后换了更高分辨率的编码器微振才压下去——其实那是间接改变了系统阻尼比例。1.4 一个被忽视的共性这些都是摩擦造成的把三个现象放在一起看会发现它们的共性是摩擦的强非线性低速时静摩擦主导微动时负斜率引入负阻尼换向时摩擦跳变引入扰动。线性PID只能针对某一个平衡点做优化没法同时处理三个不同区域的非线性问题。这就是为什么需要从模型层面去理解摩擦用模型来指导补偿。2. Stribeck曲线的物理逻辑与数学表达2.1 一条先降后升的曲线四个润滑阶段Stribeck这个名字来自德国学者Richard Stribeck他在研究轴承润滑特性时发现摩擦系数并不是随着速度单调变化而是在低速区先下降、再上升呈现一个“V”字形反转。这个经典曲线把滑动速度分成四个区域第一个区域是静摩擦区速度为零需要克服最大静摩擦力才能开始运动。第二个区域是边界润滑区速度很低润滑油膜还没有完全建立两个金属表面仍然存在微观凸峰的直接接触摩擦力略高于库仑摩擦。第三个区域是部分流体润滑区速度继续升高润滑油被不断带入接触面油膜逐渐把两个表面隔开实际接触面积减少摩擦力随速度升高而下降这就是Stribeck效应的核心。第四个区域是全流体润滑区油膜完全建立摩擦副被油膜彻底隔开摩擦特性变成流体内部剪切摩擦力随速度线性上升也就是粘性摩擦主导。生活里有个很贴切的类比在湿玻璃上推一块橡皮擦刚开始觉得特别涩一旦推快了反而顺滑了。这个过程很短但确实存在——低速时是“划破水膜接触玻璃”速度上来之后是“浮在水膜上滑行”。2.2 数学表达式的经典形式与参数含义工程上最常用的Stribeck摩擦力表达式是T_f(v) T_c (T_s - T_c) * exp(-(v / v_s)^2) B * v其中四个参数的含义分别是T_s最大静摩擦力矩速度为零时系统需要克服的极限摩擦力T_c库仑摩擦力矩速度足够高、Stribeck效应消失后的基础摩擦力v_sStribeck速度决定曲线从静摩擦过渡到粘滞摩擦的特征速度B粘性摩擦系数描述全流体润滑区的线性增长斜率这个公式的妙处在于边界行为非常清晰速度为零时指数项等于1整个公式退化为T_s即最大静摩擦速度趋向无穷时指数项趋于0公式退化为T_c B*v即库仑摩擦加粘滞摩擦。中间的低速段指数项提供一个“从静摩擦到库仑摩擦的衰减过渡”正好描述第三个润滑区域的负斜率。实际项目里还有几个变体值得了解。有的文献用exp(-|v|/v_s)代替平方指数项衰减更慢、曲线过渡更缓有的用有理式T_c (T_s - T_c)/(1 (v/v_s)^2) B*v数学性质更平滑。平方指数和单指数的主要差别在于过渡带的宽度平方指数下降更陡峭。选择哪种形式取决于实验数据里观察到的负斜率段有多宽。2.3 建模时一个容易被忽略的关键速度过零怎么办数学上sign(v)在零点的跳跃很干净但在实际控制器里这个跳变就是问题本身。速度从0.001变到-0.001符号项从1跳到-1补偿量瞬间变化2*T_s这会直接激励机械谐振产生“咔哒”声和跳动。工程上的标准解法是连续化处理用v/(|v| ε)代替sign(v)或者用tanh(v/ε)。ε的取值需要依据实际速度噪声水平来定一般在0.005到0.02之间。ε选得太大补偿在低速区会失真选得太小跳变依然存在。调试时先给一个中等值观察电流指令和声音再逐步调整。2.4 简化的边界什么时候不需要完整Stribeck模型如果设备的运行速度一直远高于Stribeck速度很少进入低速区用T_f T_c * sign(v) B * v就够了如果从不换向甚至连库仑项都可以简化成恒定阻力。反过来当设备的低速均匀性和换向精度是核心指标时完整Stribeck模型几乎是必须的。做控制方案选型时可以先问一句设备的典型工况落在哪一段这个问题想清楚了模型复杂度自然就有答案。3. 把摩擦模型“掏”出来参数辨识的完整链路3.1 实验第一步采一条速度-力矩曲线模型再漂亮参数不对等于零。摩擦参数的辨识方法很多恒速跟踪法是在现场最容易实施、也最容易理解的一种。操作流程并不复杂。把伺服驱动器切到速度模式关闭位置环只保留速度环。然后给一系列恒定的速度指令从极低速往高速逐个跑每个速度点稳定运行两三秒记录速度稳定段的平均力矩指令。力矩指令可以从驱动器的电流环输出乘以力矩常数Kt获得大部分驱动器支持直接读取。速度点的选取要遵循“低速密、高速疏”的原则。Stribeck的弯曲区集中在低速段低速点多采一些才能把曲线形状拟合出来。一组典型的实验序列可以是0.05、0.1、0.2、0.5、1、2、5、10、20、50 mm/s单位换算成m/s后参与拟合。每个速度点匀速段取后一秒钟数据的平均值可以滤掉速度环的周期性波动。正反两个方向都要测导轨摩擦往往存在不对称性。垂直轴尤其要注意重力偏载会混进数据里要么加配重要么在数据处理时先扣除重力前馈。3.2 最小二乘拟合先固定v_s再线性求解拿到一组(v_i, T_i)数据后目标是把T_s、T_c、v_s、B四个参数拟合出来。直接对原始公式做非线性最小二乘当然可以但初值敏感迭代容易跑飞。工程上有个更稳的间接方法固定v_s剩下的参数对模型是线性的。具体的做法是在合理范围内比如0.0005到0.05 m/s遍历候选v_s值对每个v_s构造回归矩阵A [1-exp(-(v_i/v_s)^2), exp(-(v_i/v_s)^2), v_i]对应的三个待求参数是T_c、(T_s - T_c)、B。用最小二乘解出这三个值再算出拟合残差。遍历完所有候选v_s后取残差最小的一组作为最终参数。import numpy as np v np.array([0.00005, 0.0001, 0.0002, 0.0005, 0.001, 0.002, 0.005, 0.01, 0.02, 0.05]) # m/s T_meas np.array([...]) # 实测稳态力矩单位N·m best None for vs in np.logspace(-3.5, -1, 50): A np.column_stack([ 1 - np.exp(-(v / vs) ** 2), np.exp(-(v / vs) ** 2), v ]) params, residuals, _, _ np.linalg.lstsq(A, T_meas, rcondNone) if best is None or residuals[0] best[0]: best (residuals[0], vs, params) # best[1]就是v_sbest[2]依次为Tc、Ts-Tc、B有个细节容易忽略直接做最小二乘时高速段的数据由于力矩数值大会主导整个拟合导致低速段的Stribeck特征被淹没。解决办法是加权最小二乘给低速点更高的权重例如权重取1/v_i让每个数据点在对数尺度上具有近似的贡献。3.3 辨识过程中的三个数据坑第一个坑是惯性项污染。恒速段的驱动力矩等于摩擦力矩加重力项加粘滞项但在加减速瞬间力矩里还包括惯性项必须等速度稳定后再取数据。如果目标速度突变的瞬间产生的力矩尖峰被错误纳入平均值拟合出来的T_s会明显偏大。第二个坑是测速噪声。增量式编码器在低速时采用M法测速测量窗口内脉冲数太少速度反馈噪声非常大。噪声会让实际速度在指令值附近波动这种波动传递到力矩数据上就是低速点极其散乱。对策是提高编码器分辨率或者对力矩数据做多点平均。第三个坑是温度漂移。辨识实验如果跑太久丝杠和导轨温度升高润滑脂黏度下降摩擦参数会慢慢变小。一组完整的数据采集尽量控制在几分钟内而且冷机和热机状态下辨识出的参数差异很大做对比实验时必须保证热机状态一致。3.4 验证辨识结果模型和实测必须互相印证拟合结束不等于工作结束。把辨识出的参数代回模型画出模型曲线和实测散点判断低速段是否贴合、过渡区是否平滑。更严格的做法是预留几个速度点不参与拟合单独用来交叉验证。如果模型预测值和预留点实测值偏差在10%以内这个模型就可以放心用于前馈补偿。4. 从模型到补偿几种落地的实现方案4.1 前馈补偿最直接、也最容易翻车有了模型参数和实时速度最简单的补偿方式就是在电流指令上叠加模型计算出的摩擦补偿力矩T_cmd f_hat(v_ref)这里有个重要的工程细节前馈速度应该用参考速度指令v_ref而不是实测速度v_fb。原因有二一是实测速度有噪声直接用实测速度会把测速噪声注入电流指令电机发出“嘶嘶”的高频声二是前馈补偿本来就是“预测性”的用参考速度可以让补偿力矩提前到位而不是等实际速度已经因为摩擦掉下来了再去追。最容易翻车的地方在于速度过零点的处理。直接用sign(v_ref)计算库仑摩擦项在换向瞬间补偿量从T_s跳到-T_s相当于给电流指令叠加一个幅度为2T_s的阶跃。这个阶跃会激励传动链的机械谐振发出“咔哒”一声甚至引起振荡。这就是为什么前面说的连续化处理如此重要。实际应用中我一般用tanh(v_ref / epsilon)epsilon取0.01左右既能保留低速区的补偿效果又不会在过零时产生剧烈跳变。另一个常见问题是补偿过量。模型参数辨识不准时前馈补偿量可能比实际摩擦力大相当于系统被“过驱动”在高速段表现为电机持续发热。调试时需要看电流指令是否比加补偿前明显增大。如果高速段的电流均值显著上升说明粘滞系数B偏大要往下调。4.2 摩擦观测器给前馈“查漏补缺”静态前馈的短板是显而易见的模型参数一旦和实际不匹配补偿效果就打折扣。环境温度变化、导轨润滑状态改变、负载力矩变化都会让模型失准。这时候前馈补偿需要一个“帮手”——扰动观测器。扰动观测器的思想是把系统模型之外的未建模干扰包括模型偏差、负载突变、摩擦力变化等统一看作一个等效扰动通过实际输出和标称模型的偏差把这个扰动估计出来再反向补偿回去。在伺服系统里通常在速度环之外加DOB输出补偿电流。DOB有一个天然的矛盾带宽越高对扰动的抑制能力越强但同时也更容易放大测速噪声和激励机械谐振。如果只用DOB去补偿摩擦换向时的摩擦突变是阶跃性的DOB至少需要几十赫兹的带宽才能在几毫秒内跟上这个带宽在很多机械系统上已经要触碰到谐振点了。工程上最稳妥的组合是“Stribeck前馈 DOB”前馈负责把已知的、大块的摩擦补偿掉让DOB只需要处理残余的小扰动。这样DOB的负担大幅降低带宽可以取得保守一些系统稳定性更好。我在一个精度定位平台上用过这个组合单纯前馈能把过象限误差从0.15mm降到0.04mm加上DOB之后进一步压到0.015mm。4.3 在线参数自适应让模型跟着工况走摩擦参数最大的麻烦是时变性。同一台设备冷机启动时润滑脂黏度大T_s可能比热机时高30%连续跑一段时间后参数又在慢慢变化。如果只做固定参数的静态前馈很难保证全天候的补偿效果。在线自适应的基本思路是在运行过程中根据跟踪误差或速度误差持续小步长地修正模型参数。最简单的做法是递推最小二乘以速度跟踪误差为目标函数对T_s、T_c、v_s做在线更新。但这套方案在工程现场并不是无脑上需要注意几个问题。系统只在“激励充分”的时候才值得更新参数。如果轴静止不动摩擦力矩信号弱参数更新就是纯噪声驱动反而把好参数带偏。一个实用门槛是速度指令的变化幅度大于某个阈值时才启动参数更新速度恒定或静止时冻结参数。遗忘因子λ取0.98到0.995之间比较合适λ太大则自适应太慢λ太小则参数跳动剧烈。另一个更简单、更稳的工程做法是分段修正当跟踪误差超过阈值时用误差的符号和大小修正T_s的值在稳态定位阶段修正T_c的值。这样实现起来工作量小稳定性却很好特别适合现场调试——本质上是把工程师调参的经验固化成了一段自动逻辑。4.4 与其他控制方法的配合Stribeck前馈不是一个孤立的补丁它可以嵌进各种主流控制框架。在滑模控制里模型已知的摩擦项放进等效控制部分能显著减小切换增益从源头降低抖振在自抗扰控制里摩擦力本来就属于“总扰动”的一部分由扩张状态观测器去估计但如果先做Stribeck前馈ESO要估计的扰动量变小了观测器带宽可以降低相位裕度就会更好。多数实际项目并不会去上复杂控制算法而是把Stribeck前馈叠加在成熟的PID结构上。这里的关键好处是摩擦补偿先把非线性大头干掉了剩下的受控对象近似是线性的原来的PID参数几乎不用大改就能获得更好的表现整定过程会顺很多。5. 工程落地时那些教材不写的坑5.1 冷机和热机是两个完全不同的系统我在好几个项目上吃过同样的亏冷机状态下参数辨识、调好补偿参数看着曲线很漂亮设备运行半小时后性能反而变差了。原因不复杂温度升高后润滑脂黏度下降摩擦参数整体往下漂移原来的固定前馈量变成了“过补偿”。解决这个问题的思路有两条。第一条是调整测试流程和管理预期设备做摩擦辨识之前先跑一段预热程序保证在热机稳定状态下进行参数整定这样参数更接近长时间运行的工况。第二条是在软件层面做温度补偿加一个温度传感器把常温下的辨识参数按温度系数线性插值冷机和热机之间取不同参数。我在实际项目中倾向于一种更省心的做法——在设备启动时自动执行一段短时间预热运动比如低速往复运行30秒然后再启用前馈补偿。这比写一套复杂的温度自适应逻辑要稳定得多现场工程师也容易理解。5.2 速度估计噪声会毁掉一整套补偿这个坑埋得很深。前馈刚开始工作似乎很正常但仔细听电机会有一点点高频噪声摸电流波形能看到明显的毛刺。排查到最后问题出在速度反馈上。增量式编码器低速测速用M法时测量窗口内的脉冲数可能只有几个速度值的量化噪声非常可观。这些噪声一旦通过摩擦模型放大会以电流指令毛刺的形式注入电机。补偿一个非线性扰动结果引入了新的高频激励得不偿失。几个成熟的应对手段前馈完全用参考速度指令这是最有效的一招如果某些场景必须用实测速度例如DOB那就先对速度做低通滤波但滤波延迟会限制扰动抑制带宽需要权衡从根上解决问题换更高分辨率的编码器比如从0.5μm光栅尺换成0.1μm测速噪声立竿见影用跟踪微分器从位置信号提取速度比直接差分平滑得多这个技巧在实践里效果很好。5.3 前馈突变更容易撞出机械谐振摩擦补偿加上去系统反而振荡了这是比较尴尬的局面。常见原因有两个一是速度过零时补偿量跳变没有处理干净阶跃激励了机械系统的高频模态二是前馈力矩被加进电流指令后驱动了丝杠或联轴器的谐振峰值。对于前一个原因前面提到的连续化处理、斜坡限幅都能缓解。对于后一个原因可以在补偿量后面加一个低通滤波器限制补偿力矩的变化率或者对补偿量做饱和限幅不允许它超过某个安全值。如果系统装有陷波滤波器把机械谐振峰压下去再启用前馈效果会好很多。这里有一条经验法则补偿量永远不应该大到引发新的振动。如果发现补偿量在上限附近说明模型参数或者系统匹配本身有问题要在参数辨识上找原因而不是继续放大补偿量。5.4 别为了“先进”而上Stribeck适用边界要想清楚最后说点反方向的建议。不是所有精密伺服都需要上Stribeck模型。气浮平台、磁浮平台摩擦本身就极小用不上始终高速运行、很少低速或换向的设备库仑摩擦加粘滞摩擦就完全够用系统摩擦本来就不大、定位精度要求也普通的场合一个整定良好的PID完全能交付指标。更实际的问题是投入产出比。Stribeck模型的参数辨识、连续化处理、在线自适应每一步都需要调试时间和验证成本。判断要不要上它的标准很简单先做实验看看低速爬行、换向象限突起、定位极限环这三个现象是否存在。如果都不存在说明摩擦非线性对你的系统不明显不用为“先进”而增加复杂度。如果存在那说明线性控制器已经触到了天花板Stribeck模型值得引入。以我个人的经验这套流程里收获最大的时刻往往不是摩擦补偿最终把误差压到多少而是把Stribeck曲线测出来的那一刻——原本“玄学”的爬行和振荡突然变成了一条可以测量的物理曲线问题从猜测变成了计算。每一个被低速爬行折磨的调试现场我都建议先从这条曲线入手。
返回列表