摩擦模型:让关节听话的必修课

做机器人控制这些年,我踩过最大的坑,就是摩擦。你想想看,明明给电机发了个指令,结果关节纹丝不动,或者动起来一顿一顿的。嗯,这就是摩擦在捣鬼。今天咱们就把摩擦模型掰开揉碎讲清楚。

摩擦到底是个啥?

说白了,摩擦就是两个接触面之间阻碍相对运动的力。在机器人关节里,它无处不在——减速器齿轮之间、电机轴承里、甚至密封圈上都有。我刚开始做项目时,总觉得摩擦是个小问题,结果低速跟踪时误差大得离谱。

摩擦主要分这么几类:

  • 库仑摩擦:跟速度方向相反,大小恒定。就像你推一个箱子,推之前得克服一个固定的力。
  • 粘性摩擦:跟速度成正比。速度越快,阻力越大。好比在蜂蜜里搅动,越快越费劲。
  • Stribeck效应:低速时摩擦反而更大。这个最坑人,也是低速抖动的元凶。
  • 静摩擦:静止时需要的力,比动摩擦还大。

核心观点:摩擦不是简单的线性关系,尤其在低速区域,它表现出强烈的非线性。忽略这一点,你的控制器会很难受。

库仑摩擦 + 粘性摩擦:最基础的组合

这是工程上最常用的简化模型。公式长这样:

τ_f = τ_c * sign(ω) + b * ω

其中:

  • τ_f 是摩擦力矩
  • τ_c 是库仑摩擦系数
  • ω 是关节角速度
  • b 是粘性摩擦系数
  • sign(ω) 是符号函数,ω>0时取1,ω<0时取-1

这个模型简单好用,但有个致命问题——它假设速度为零时摩擦力为零。实际上呢?静止时摩擦力是τ_c的好几倍。我有个项目,用这个模型做前馈补偿,结果低速时关节一直在微振,后来才发现是静摩擦没处理好。

Stribeck效应:低速抖动的罪魁祸首

Stribeck效应描述的是这样一个现象:当关节从静止开始运动时,摩擦力先下降再上升。为什么会这样?因为低速时润滑油膜还没建立起来,金属直接接触,摩擦很大。速度上来后油膜形成,摩擦反而变小。

这个效应在精密定位中特别要命。我记得调试一个六轴机器人时,末端执行器在低速跟踪圆弧轨迹,结果走出来的轨迹像锯齿一样。查了半天,就是Stribeck效应在作怪。

Stribeck模型的数学表达:

τ_f(ω) = [τ_c + (τ_s - τ_c) * exp(-(ω/ω_s)^2)] * sign(ω) + b * ω

其中τ_s是静摩擦力,ω_s是Stribeck速度阈值。这个模型比库仑+粘性复杂一些,但能更真实地反映低速行为。

我的经验:Stribeck速度阈值ω_s通常很小,大概在0.01-0.1 rad/s之间。调试时可以先给一个斜坡速度指令,观察摩擦力变化曲线,就能大致估算出这个参数。

LuGre模型:动态摩擦的终极方案

前面说的都是静态模型,但实际摩擦是有记忆效应的。LuGre模型引入了鬃毛(bristle)的概念——想象两个接触面之间有很多微小鬃毛,它们像弹簧一样变形,产生摩擦力。

LuGre模型的状态方程:

dz/dt = ω - σ0 * |ω| * z / g(ω)
g(ω) = τ_c + (τ_s - τ_c) * exp(-(ω/ω_s)^2)
τ_f = σ0 * z + σ1 * dz/dt + b * ω

其中:

  • z 是鬃毛的平均变形量(内部状态)
  • σ0 是鬃毛刚度
  • σ1 是阻尼系数
  • g(ω) 描述Stribeck效应

这个模型能模拟出摩擦的滞后现象、预滑动位移等复杂行为。但代价是参数多,辨识起来比较麻烦。我个人习惯,只有在做高精度力控时才会用LuGre模型,一般场合用Stribeck模型就够了。

摩擦对低速控制的影响

低速控制是摩擦问题最集中的地方。我总结了几种典型现象:

现象 原因 后果
爬行现象 静摩擦大于驱动力,停→动→停循环 低速时关节一顿一顿
极限环振荡 摩擦导致系统出现自激振荡 定位精度差,末端抖动
稳态误差 摩擦消耗了部分驱动力 位置跟踪有静差

避坑指南:我曾经在一个精密装配项目中,直接用PID控制低速运动,结果死活达不到0.1mm的定位精度。后来加了摩擦前馈补偿,精度直接提升到0.02mm。记住:纯反馈控制对付摩擦很吃力,前馈才是正道。

摩擦参数辨识实战

说了这么多理论,咱们来点实际的。怎么辨识摩擦参数?我常用的方法是:

  1. 恒速实验:让关节以不同速度匀速运动,记录力矩和速度数据
  2. 数据拟合:用最小二乘法拟合Stribeck曲线
  3. 验证:用正弦轨迹验证辨识结果

下面是一个简单的Python代码示例,演示如何拟合Stribeck模型:

import numpy as np
from scipy.optimize import curve_fit

def stribeck_model(omega, tau_c, tau_s, omega_s, b):
    """Stribeck摩擦模型"""
    sign = np.sign(omega)
    return (tau_c + (tau_s - tau_c) * np.exp(-(omega/omega_s)**2)) * sign + b * omega

# 假设我们采集了速度和力矩数据
omega_data = np.array([0.01, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0])
tau_data = np.array([2.1, 1.8, 1.6, 1.7, 2.0, 2.5, 3.5])

# 参数初始猜测
p0 = [1.5, 2.5, 0.1, 0.5]

# 拟合
popt, pcov = curve_fit(stribeck_model, omega_data, tau_data, p0)

print(f"库仑摩擦: {popt[0]:.3f} Nm")
print(f"静摩擦: {popt[1]:.3f} Nm")
print(f"Stribeck速度: {popt[2]:.3f} rad/s")
print(f"粘性摩擦: {popt[3]:.3f} Nm·s/rad")

小技巧:做恒速实验时,速度点要覆盖低速区(0.01-0.5 rad/s)和高速区(1-10 rad/s)。低速区点要密一些,因为Stribeck效应主要发生在那里。

知识体系总览

下面这张图展示了本章的知识结构,帮你理清思路:

摩擦模型知识体系 摩擦模型 静态摩擦模型 库仑摩擦:τ_c·sign(ω) 粘性摩擦:b·ω Stribeck效应:指数衰减 动态摩擦模型 LuGre模型:鬃毛变形 预滑动位移 摩擦记忆效应 对控制的影响 低速爬行现象 极限环振荡 稳态误差 参数辨识:恒速实验 → 数据拟合 → 模型验证 选择合适的模型:精度要求高 → LuGre;一般应用 → Stribeck

这张图把摩擦模型的分类、影响和辨识方法串起来了。你可以看到,静态模型和动态模型是两条主线,而它们最终都指向同一个目标——让关节听话。

好了,关于摩擦模型就讲到这里。记住,摩擦是低速控制的头号敌人,但只要你理解了它的特性,就能找到应对方法。下次调试时遇到低速抖动,先别急着调PID参数,检查一下摩擦补偿是不是到位了。


可可精品资料库