第三节:摩擦模型与辨识

各位做机器人控制的朋友,今天我们来聊聊摩擦。说实话,摩擦这东西,我刚开始做关节控制时根本没当回事。觉得不就是个摩擦力嘛,PID一调不就完了?结果呢?低速爬行、零点漂移、稳态误差……一个个问题打得我措手不及。

后来我才明白:摩擦是力矩控制精度的头号敌人。你想想看,一个谐波减速器里的摩擦力矩,有时候能占到额定力矩的20%以上。不把它搞清楚,你的力矩控制精度就是空谈。

3.1 摩擦的四种面孔

摩擦模型有很多种,但实际工程中最常用的就这四种。我一个个说。

3.1.1 库仑摩擦

这是最基础的摩擦模型。说白了就是:只要在动,摩擦力就是恒定值。方向永远和运动方向相反。

数学表达式很简单:

τ_f = τ_c * sign(ω)

其中 τ_c 是库仑摩擦力矩,ω 是关节角速度。

嗯,这里要注意:sign(0) 怎么处理?实际工程中,速度为零时摩擦力在 [-τ_c, τ_c] 之间,取决于外力。我早期做力控时没处理好这个,结果在速度过零时控制量来回跳,电机嗡嗡响。

3.1.2 粘性摩擦

粘性摩擦和速度成正比。速度越快,摩擦力越大。就像搅动蜂蜜一样。

τ_f = B * ω

B 是粘性摩擦系数。这个模型在高速时比较准,但低速时就不行了。

我个人习惯把库仑摩擦和粘性摩擦合在一起用:

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

这个组合模型简单实用,很多商用驱动器里用的就是它。

3.1.3 Stribeck效应

这里有个有意思的现象。你注意观察:物体从静止开始运动的那一刻,摩擦力反而比低速运动时小。这就是Stribeck效应。

为什么会这样?因为静止时接触面是"粘死"的,一旦开始滑动,润滑膜形成,摩擦力反而下降。等速度再提高,粘性摩擦又开始占主导。

Stribeck模型的数学形式:

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

其中 τ_s 是静摩擦力矩,ω_s 是Stribeck速度。

我在做精密装配项目时遇到过这个问题。一个六轴机器人末端夹持零件,要贴着另一个零件表面滑动。速度很慢,结果摩擦力忽大忽小,力控根本稳不住。后来加了Stribeck补偿,效果立竿见影。

3.1.4 LuGre模型

LuGre模型是目前工程界用得最多的动态摩擦模型。它把摩擦看成是"鬃毛"的变形过程。

想象一下:两个接触面之间有无数的微小鬃毛。当外力施加时,鬃毛像弹簧一样被拉伸。拉伸到一定程度,鬃毛断裂,开始滑动。

LuGre模型的状态方程:

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

其中 z 是鬃毛的平均变形量,σ0 是鬃毛刚度,σ1 是阻尼系数。

关键点:LuGre模型能描述摩擦的"预滑动"现象——在真正滑动之前,摩擦力随位移线性增加。这对低速高精度控制至关重要。

3.2 摩擦辨识方法

模型有了,参数怎么来?总不能靠猜吧。我分享一套我自己常用的辨识流程。

3.2.1 恒速法

这个方法最简单。让关节以不同速度匀速运动,记录力矩值。每个速度点取平均,就能得到摩擦力-速度曲线。

具体步骤:

  1. 让关节以恒定速度 ω_i 运动
  2. 记录稳态力矩 τ_i(去掉重力项)
  3. 改变速度,重复步骤1-2
  4. 得到一组 (ω_i, τ_i) 数据
  5. 用最小二乘法拟合模型参数
# Python示例:恒速法拟合
import numpy as np

# 假设采集到的数据
omega = np.array([0.01, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0])
tau_f = np.array([0.85, 0.72, 0.75, 0.82, 0.95, 1.20, 1.65])

# 拟合库仑+粘性模型
A = np.column_stack([np.sign(omega), omega])
params, _ = np.linalg.lstsq(A, tau_f, rcond=None)
tau_c, B = params
print(f"库仑摩擦: {tau_c:.3f} Nm, 粘性系数: {B:.3f} Nm·s/rad")

小技巧:恒速法对低速数据要格外小心。速度低于0.01 rad/s时,摩擦力波动很大。我一般会多采几组数据取中位数,而不是平均值。

3.2.2 正弦激励法

恒速法只能得到稳态摩擦特性。要辨识LuGre模型的动态参数,需要用正弦激励。

让关节做正弦运动:

θ(t) = A * sin(2πft)

记录力矩和速度,然后用非线性优化算法拟合LuGre参数。

这里有个坑:正弦频率不能太高。频率太高,惯性力占主导,摩擦信息被淹没。我一般用0.1-1 Hz,幅值根据关节行程来定。

3.2.3 参数辨识的注意事项

参数 辨识方法 注意事项
τ_c (库仑摩擦) 恒速法,取低速段 速度要足够低,但不要低于0.005 rad/s
B (粘性系数) 恒速法,取高速段 速度范围要覆盖工作区间
τ_s (静摩擦) 斜坡力法 缓慢增加力矩,记录开始滑动的临界值
σ0, σ1 (LuGre参数) 正弦激励+优化 需要多组不同频率的数据

3.3 摩擦补偿实战

模型辨识完了,怎么用?我直接说工程做法。

3.3.1 前馈补偿

最直接的方法:根据当前速度,查摩擦模型,把摩擦力矩加到控制量里。

τ_cmd = τ_pid + τ_friction(ω)

这样做的好处是响应快,不依赖反馈。但缺点也很明显:模型不准时,补偿反而添乱。

我曾经踩过的坑:有一次在低温环境下测试,摩擦参数变了30%以上。前馈补偿不但没效果,反而让系统震荡。后来我加了在线参数自适应,才解决问题。

3.3.2 基于观测器的补偿

更稳健的做法是用摩擦观测器。把摩擦当成一个未知扰动,用状态观测器实时估计。

常用的有:

  • 扩展状态观测器(ESO):把摩擦作为扩展状态,用观测器估计
  • 卡尔曼滤波器:适合有噪声的场景
  • 自适应律:在线更新摩擦参数

我个人比较推荐ESO。实现简单,鲁棒性好。只要调好观测器带宽,效果就很稳定。

3.4 知识体系总览

说了这么多,我画张图帮你理清思路:

摩擦模型与辨识知识体系 摩擦模型分类 库仑摩擦 τ_f = τ_c·sign(ω) 粘性摩擦 τ_f = B·ω Stribeck效应 含静摩擦项 LuGre模型 动态鬃毛模型 辨识方法 恒速法 多速度点稳态力矩 → 拟合参数 正弦激励法 动态响应 → 非线性优化 补偿策略 前馈补偿 观测器补偿 (ESO/卡尔曼/自适应)

这张图把整个流程串起来了。从模型选择,到参数辨识,再到补偿实现,每一步都有对应的工程方法。

最后说一句:摩擦辨识不是一劳永逸的事。温度、磨损、润滑状态都会改变摩擦特性。我建议每隔一段时间重新标定一次,或者在控制系统中加入在线监测机制。这样你的力矩控制精度才能一直保持在较高水平。

可可精品资料库