做精密伺服的这几年,我被同一类问题反复折腾过:低速让轴走,它不走;指令再加一点,猛地窜出去;画圆弧时每个象限过渡点都留一个明显的凸起;定位完成后编码器还在目标值附近小幅振荡。第一反应永远是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_s:Stribeck速度,决定曲线从静摩擦过渡到粘滞摩擦的特征速度
- 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, rcond=None) if best is None or residuals[0] < best[0]: best = (residuals[0], vs, params) # best[1]就是v_s,best[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曲线测出来的那一刻——原本“玄学”的爬行和振荡,突然变成了一条可以测量的物理曲线,问题从猜测变成了计算。每一个被低速爬行折磨的调试现场,我都建议先从这条曲线入手。