4、摩擦力补偿进阶:Stribeck摩擦模型、库仑+粘滞摩擦模型、前馈补偿策略
各位工程师朋友,咱们今天聊点硬核的——摩擦力补偿。说实话,做拖动示教这么多年,我踩过最大的坑就是摩擦力。你想想看,明明编好的轨迹,机器人一跑起来就「卡顿」、「抖动」,十有八九是摩擦力没处理好。
我刚开始做协作机器人那会儿,总觉得摩擦力嘛,加个PID硬扛就行了。结果呢?低速时抖得像筛糠,高速时又过冲。后来才明白,摩擦力这东西,不是简单的「有」或「没有」,它是有「脾气」的。
4.1 摩擦力的「三副面孔」
先说说摩擦力的基本模型。咱们做拖动示教,关节里无非就三种摩擦:
- 库仑摩擦:跟速度方向相反,大小恒定。说白了就是「静摩擦」那部分,你推它才动,不推就不动。
- 粘滞摩擦:跟速度成正比。速度越快,阻力越大。就像在水里划船,划得越快越费劲。
- Stribeck效应:这个最坑。低速时摩擦力反而比中速时大。为什么?因为润滑膜还没建立起来。
我在项目中遇到过一台六轴机器人,低速拖动时手感特别「涩」。一开始以为是减速器问题,后来用示波器抓力矩曲线,才发现是Stribeck效应在作怪。
核心结论: 摩擦力不是线性的。低速区、中速区、高速区,表现完全不同。补偿策略必须「分段处理」。
4.2 Stribeck摩擦模型——低速区的「隐形杀手」
Stribeck模型长这样:
τ_f = τ_c + (τ_s - τ_c) * exp(-(v/v_s)^2) + b * v
其中:
- τ_c:库仑摩擦力矩
- τ_s:静摩擦力矩(启动瞬间)
- v_s:Stribeck速度(拐点速度)
- b:粘滞摩擦系数
你想想看,当速度v接近0时,exp项接近1,摩擦力接近τ_s(静摩擦)。当速度起来后,exp项衰减,摩擦力降到τ_c附近。这就是为什么低速拖动时感觉「粘粘的」——因为摩擦力在变化。
我的经验: 调Stribeck模型时,v_s这个参数最敏感。我一般先做一组「恒速拖动」实验,测出不同速度下的摩擦力,然后拟合出v_s。别靠猜,一定要实测。
4.3 库仑+粘滞摩擦模型——工程界的「万金油」
如果你觉得Stribeck模型太复杂,那库仑+粘滞模型就是你的首选。公式简单:
τ_f = τ_c * sign(v) + b * v
sign(v)是符号函数,v>0时取1,v<0时取-1。这个模型忽略低速区的Stribeck效应,但胜在稳定、好调。
我做过对比实验:在高速拖动(>10°/s)时,库仑+粘滞模型和Stribeck模型的补偿效果几乎一样。只有在低速区(<2°/s),Stribeck模型才明显占优。
| 速度区间 | 库仑+粘滞模型 | Stribeck模型 |
|---|---|---|
| 高速(>10°/s) | 优秀 | 优秀 |
| 中速(2-10°/s) | 良好 | 优秀 |
| 低速(<2°/s) | 一般(有抖动) | 优秀 |
注意: 库仑+粘滞模型在速度过零时,sign(v)会突变,导致力矩跳变。我建议加一个「平滑过渡区」,比如在±0.5°/s范围内用线性插值,避免抖动。
4.4 前馈补偿策略——让机器人「预判」你的动作
前馈补偿,说白了就是「提前算好摩擦力,直接加进去」。不像反馈控制那样等误差出来了再调整。
具体做法分三步:
- 离线辨识:让机器人以不同速度匀速运动,记录力矩数据,拟合出摩擦模型参数。
- 在线计算:根据当前速度,用模型算出摩擦力矩。
- 前馈注入:把算出的力矩加到电流环的给定值上。
代码实现大概这样:
// 前馈摩擦力补偿
float friction_compensation(float vel, float tau_c, float tau_s, float v_s, float b) {
float tau_f;
// Stribeck模型
tau_f = tau_c + (tau_s - tau_c) * exp(-(vel*vel)/(v_s*v_s)) + b * vel;
return tau_f;
}
// 主循环中调用
float tau_ff = friction_compensation(actual_vel, 0.5, 0.8, 2.0, 0.1);
current_ref += tau_ff; // 前馈注入
嗯,这里要注意:前馈补偿不能完全替代反馈。我习惯的做法是「前馈占70%,反馈占30%」。前馈负责「大头」,反馈负责「修边」。这样既响应快,又不会因为模型误差导致跑偏。
避坑指南: 我曾经在调试时,把前馈系数设得太大,结果机器人一启动就「窜」出去。后来才意识到,摩擦模型参数会随温度变化。建议加一个「在线自适应」模块,每隔几分钟重新辨识一次参数。
4.5 三种模型的选型建议
最后给个实用建议:
- 如果你做的是精密装配(低速、高精度):用Stribeck模型,别省事。
- 如果你做的是搬运码垛(中高速、精度要求一般):库仑+粘滞模型足够了。
- 如果你做的是人机协作(全速度范围、手感要求高):Stribeck模型+前馈补偿,这是标配。
我个人习惯在调试初期先用库仑+粘滞模型把系统跑起来,等基本功能稳定了,再换成Stribeck模型做精细调优。这样效率最高,也最不容易出问题。
好了,摩擦力补偿这块就聊到这儿。记住一句话:摩擦力不是敌人,摸清它的脾气,它就能为你所用。
公众号:蓝海资料掘金营,微信deep3321