4. 摩擦参数模型:库仑摩擦、粘滞摩擦、Stribeck效应,如何建模?

各位工程师朋友,咱们今天聊聊摩擦建模。说实话,摩擦是动力学里最让人头疼的东西之一。我刚开始做六轴机械臂整定时,总觉得动力学模型算得挺准,一上实际设备就发现——关节一动,误差就出来了。后来才明白,摩擦这个"隐形杀手"没处理好。

摩擦模型,说白了就是描述关节运动时阻力怎么变化的数学表达式。你想想看,电机转动要克服摩擦力,减速器里的齿轮啮合也有摩擦,这些力如果不建模,你的前馈补偿就是瞎蒙。好,咱们一步步拆解。

4.1 库仑摩擦:最基础的干摩擦模型

库仑摩擦是最简单的模型。它假设摩擦力大小恒定,只与运动方向有关,与速度大小无关。数学表达式长这样:

τ_f = τ_c * sign(ẋ)

其中 τ_c 是库仑摩擦系数,sign(ẋ) 是速度方向符号。正转和反转的摩擦力大小一样,方向相反。

我在项目中遇到过一个问题:用这个模型做前馈补偿,低速时效果还行,速度一上去就偏差很大。为什么?因为库仑摩擦忽略了速度对摩擦力的影响。说白了,它只适合做粗略估计。

关键点:库仑摩擦模型只有两个参数——正转库仑摩擦系数和反转库仑摩擦系数。实际标定时,通常让关节匀速运动,测出不同速度下的力矩,然后取低速段的平均值。

4.2 粘滞摩擦:速度越大,阻力越大

粘滞摩擦描述的是润滑油膜产生的阻力。速度越快,油膜剪切力越大,摩擦力也就越大。模型很简单:

τ_f = τ_v * ẋ

τ_v 是粘滞摩擦系数,ẋ 是关节速度。这是个线性关系,好理解也好标定。

嗯,这里要注意:实际机械臂的粘滞摩擦并不完全是线性的。尤其是高速段,油膜温度升高,粘度下降,摩擦力反而会偏离线性。我习惯在标定时多取几个速度点,看看线性度好不好。如果偏差大,就得考虑分段线性或者多项式拟合。

摩擦类型 数学表达式 参数数量 适用场景
库仑摩擦 τ_c * sign(ẋ) 2(正/反各一个) 低速、干摩擦
粘滞摩擦 τ_v * ẋ 1 中高速、润滑良好
库仑+粘滞 τ_c * sign(ẋ) + τ_v * ẋ 3 通用场景

4.3 Stribeck效应:低速区的"反常"现象

Stribeck效应是个有意思的现象。你想想看,当关节从静止开始运动时,摩擦力不是直接降到库仑摩擦水平,而是先下降再上升。为什么会这样?

我解释一下:静止时,润滑油被挤出去,金属表面直接接触,摩擦力很大(静摩擦)。一旦开始运动,润滑油被带入接触面,形成油膜,摩擦力迅速下降。随着速度继续增加,油膜变厚,粘滞阻力开始占主导,摩擦力又慢慢上升。这个"下降再上升"的曲线,就是Stribeck效应。

数学上常用这个模型:

τ_f = [τ_c + (τ_s - τ_c) * exp(-|ẋ/ẋ_s|^δ)] * sign(ẋ) + τ_v * ẋ

其中 τ_s 是静摩擦力,ẋ_s 是Stribeck速度(拐点速度),δ 是形状参数(通常取0.5~2)。这个模型有5个参数,标定起来稍微麻烦点。

我的经验:Stribeck模型虽然精确,但参数多,标定耗时。如果只是做常规轨迹跟踪,库仑+粘滞模型就够了。只有在低速高精度场景(比如力控、装配)才需要Stribeck模型。我曾经在一个精密装配项目里,因为没考虑Stribeck效应,低速时力控震荡得厉害,加上之后立马稳了。

4.4 摩擦模型的工程实现

讲完理论,咱们看看怎么在实际代码里用。我一般把摩擦模型封装成一个函数,输入速度和模型参数,输出摩擦力矩:

def friction_model(vel, params):
    """
    摩擦模型计算
    params: [tau_c_pos, tau_c_neg, tau_v, tau_s, vel_s, delta]
    """
    tau_c_pos, tau_c_neg, tau_v, tau_s, vel_s, delta = params
    
    # 判断方向
    if vel > 0:
        tau_c = tau_c_pos
    elif vel < 0:
        tau_c = tau_c_neg
    else:
        return 0  # 静止时摩擦力不确定,通常返回0
    
    # 库仑+粘滞
    tau_f = tau_c * sign(vel) + tau_v * vel
    
    # 如果启用Stribeck
    if tau_s > 0 and vel_s > 0:
        stribeck = (tau_s - tau_c) * exp(-abs(vel/vel_s)**delta)
        tau_f += stribeck * sign(vel)
    
    return tau_f

标定方法我简单说一下:让关节以不同恒定速度运动,记录力矩传感器数据。然后做最小二乘拟合,把参数估计出来。注意,正反转要分开标,因为库仑摩擦系数可能不一样。

避坑指南:我曾经犯过一个错误——直接用电机电流估算摩擦力矩,没考虑惯性力和重力项。结果标出来的摩擦参数完全不对。正确做法是:先补偿掉惯性力和重力,剩下的残差才是摩擦力。另外,温度对摩擦影响很大,最好在恒温环境下标定,或者加温度补偿。

4.5 知识体系总览

为了让你更直观地理解摩擦模型的整体结构,我画了一张图:

摩擦参数模型知识体系 摩擦参数模型 库仑摩擦模型 粘滞摩擦模型 Stribeck效应模型 τ_f = τ_c · sign(ẋ) 参数:τ_c(正/反) τ_f = τ_v · ẋ 参数:τ_v τ_f = [τ_c + (τ_s-τ_c)· exp(-|ẋ/ẋ_s|^δ)]·sign(ẋ)+τ_v·ẋ 参数:τ_c, τ_v, τ_s, ẋ_s, δ 工程实现:代码封装 → 参数标定 → 前馈补偿 标定方法:匀速运动 → 力矩采集 → 最小二乘拟合 选择建议:常规轨迹用库仑+粘滞,低速高精度场景加Stribeck

这张图把三种摩擦模型的关系和参数数量都理清楚了。你实际用的时候,根据精度需求和标定成本来选。我个人建议:先上库仑+粘滞,跑一遍看看效果。如果低速段误差大,再考虑加Stribeck。别一上来就搞复杂模型,标定工作量翻倍不说,参数多了反而容易过拟合。

好,摩擦模型就讲到这里。记住一句话:摩擦是动力学整定的"最后一公里",处理好了,前馈补偿的精度能提升一个量级。


公众号:蓝海资料掘金营,微信deep3321