第三节:摩擦模型与辨识
各位做机器人控制的朋友,今天我们来聊聊摩擦。说实话,摩擦这东西,我刚开始做关节控制时根本没当回事。觉得不就是个摩擦力嘛,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 恒速法
这个方法最简单。让关节以不同速度匀速运动,记录力矩值。每个速度点取平均,就能得到摩擦力-速度曲线。
具体步骤:
- 让关节以恒定速度 ω_i 运动
- 记录稳态力矩 τ_i(去掉重力项)
- 改变速度,重复步骤1-2
- 得到一组 (ω_i, τ_i) 数据
- 用最小二乘法拟合模型参数
# 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 知识体系总览
说了这么多,我画张图帮你理清思路:
这张图把整个流程串起来了。从模型选择,到参数辨识,再到补偿实现,每一步都有对应的工程方法。
最后说一句:摩擦辨识不是一劳永逸的事。温度、磨损、润滑状态都会改变摩擦特性。我建议每隔一段时间重新标定一次,或者在控制系统中加入在线监测机制。这样你的力矩控制精度才能一直保持在较高水平。
可可精品资料库