第三章 摩擦与重力补偿:让机器人学会“轻装上阵”
各位工程师朋友,大家好。今天我们来聊聊力矩控制里最让人头疼,但也最绕不开的两个家伙——摩擦和重力。
说实话,我刚入行那会儿,觉得力矩控制嘛,给个期望力矩,电机转就完了。结果第一次在真实机械臂上跑,那叫一个惨不忍睹。末端抖得像帕金森,静止时还往下坠。后来才明白,不搞定摩擦和重力补偿,你的力矩控制就是个“睁眼瞎”。
这一章,我们就来彻底扒一扒它们的底裤。
3.1 摩擦模型:那些“拧巴”的力
摩擦这东西,你想想看,它无处不在,但又很难精确描述。在机器人关节里,摩擦主要来自减速器、轴承和电机本身。我习惯把摩擦模型分成三类来理解。
3.1.1 库仑摩擦模型
这是最基础的模型。说白了,就是摩擦力的大小只和正压力有关,和速度无关。方向永远和运动方向相反。
数学表达式很简单:
τ_f = τ_c * sign(ω)
其中 τ_c 是库仑摩擦系数,ω 是关节角速度。
我在项目中遇到过一个问题:用这个模型做低速补偿时,效果很差。因为 sign 函数在零速附近会剧烈跳变,导致控制输出抖得厉害。嗯,这里要注意,库仑模型只适合做粗略估计。
3.1.2 粘滞摩擦模型
这个就好理解多了。它认为摩擦力与速度成正比,就像在蜂蜜里搅动一样。速度越快,阻力越大。
τ_f = B * ω
B 是粘滞摩擦系数。
实际中,我通常把库仑和粘滞模型合在一起用:
τ_f = τ_c * sign(ω) + B * ω
这个组合模型,在中等速度范围内表现还不错。但到了低速区,还是不够用。
3.1.3 Stribeck效应
为什么低速区会出问题?因为存在 Stribeck 效应。
简单说就是:从静止到开始运动的瞬间,摩擦力会先下降,然后再随速度上升。这个“先降后升”的曲线,就是 Stribeck 曲线。
完整的摩擦模型长这样:
τ_f = [τ_c + (τ_s - τ_c) * exp(-|ω/ω_s|^δ)] * sign(ω) + B * ω
其中 τ_s 是静摩擦力,ω_s 是 Stribeck 速度,δ 是经验系数(通常取 0.5~2)。
核心要点:Stribeck 效应是导致低速抖动和爬行现象的根本原因。如果你做精密装配或力控打磨,这个模型必须考虑。
3.2 重力补偿:别让机器人“累趴下”
重力补偿,说白了就是让控制器知道:机器人现在是什么姿势,每个关节需要额外出多少力才能对抗重力。
我见过不少新手,直接给一个恒定力矩做重力补偿。结果机械臂水平伸出去时往下掉,举到头顶时又往上窜。这就是没做动态补偿。
3.2.1 离线补偿方法
离线补偿,就是事先算好重力矩,存成表格或多项式,运行时查表。
步骤很简单:
- 建立机器人运动学模型,获取各连杆质心位置
- 根据关节角度,计算重力矩 τ_g(q)
- 将 τ_g(q) 存入查找表,或拟合成多项式
举个例子,对于一个二连杆机械臂,重力矩计算如下:
τ_g1 = (m1*lc1 + m2*l1) * g * cos(q1) + m2*lc2 * g * cos(q1+q2)
τ_g2 = m2*lc2 * g * cos(q1+q2)
离线补偿的优点是计算量小,实时性好。缺点嘛,一旦负载变了,或者质心参数不准,补偿就不准了。
我的习惯:离线补偿适合固定负载的场景,比如码垛机器人。如果负载经常变化,建议用在线补偿。
3.2.2 在线补偿方法
在线补偿,就是实时辨识重力参数。常用的方法有:
- 递推最小二乘法(RLS):在机器人运动过程中,不断更新质心位置和质量估计
- 自适应控制:将重力参数作为状态变量,用观测器实时估计
我曾在协作机器人项目里用过 RLS 做在线重力补偿。效果不错,但要注意激励问题——如果机器人长时间不动,参数估计会发散。
避坑指南:我曾经在调试时发现,在线补偿的参数收敛速度太慢,导致机器人启动时会有明显的“下坠感”。后来加了遗忘因子,才解决了这个问题。遗忘因子一般取 0.95~0.99。
3.3 摩擦参数辨识实验设计
理论说完了,咱们来点实战的。怎么把摩擦参数辨识出来?
我推荐一个经典方法——恒速扫描法。
实验步骤
- 让机器人关节以恒定速度运动,记录力矩和速度
- 改变速度,重复步骤1,覆盖从低速到高速的整个范围
- 对采集到的 (ω, τ) 数据,用最小二乘法拟合摩擦模型
数据采集时要注意:
- 每个速度点至少采集 5 秒以上的稳态数据
- 剔除加减速阶段的瞬态数据
- 正反方向都要采集,因为摩擦可能有方向不对称性
拟合示例
假设我们采集了以下数据:
| 速度 (rad/s) | 正向力矩 (Nm) | 反向力矩 (Nm) |
|---|---|---|
| 0.01 | 1.52 | -1.48 |
| 0.05 | 1.38 | -1.35 |
| 0.10 | 1.45 | -1.42 |
| 0.50 | 1.85 | -1.82 |
| 1.00 | 2.30 | -2.28 |
用 Python 做拟合的代码片段:
import numpy as np
from scipy.optimize import curve_fit
def stribeck_model(w, tau_c, tau_s, ws, B):
return tau_c + (tau_s - tau_c) * np.exp(-np.abs(w/ws)**0.5) + B * np.abs(w)
# 正向数据
w = np.array([0.01, 0.05, 0.10, 0.50, 1.00])
tau = np.array([1.52, 1.38, 1.45, 1.85, 2.30])
popt, _ = curve_fit(stribeck_model, w, tau, p0=[1.0, 1.5, 0.05, 0.5])
print(f"tau_c={popt[0]:.3f}, tau_s={popt[1]:.3f}, ws={popt[2]:.3f}, B={popt[3]:.3f}")
经验之谈:拟合时如果数据点太少,或者速度范围没覆盖 Stribeck 区域,参数会很不稳定。我建议至少采集 10 个速度点,低速区(0.01~0.1 rad/s)加密采样。
3.4 知识体系总览
为了让大家更直观地理解本章的知识结构,我画了一张图:
这张图把本章的核心内容串起来了。左边是摩擦补偿的三个模型,右边是重力补偿的两种方法,底部是实验设计。你想想看,实际调试时,就是从左到右、从上到下走一遍流程。
好了,这一章的内容就到这里。摩擦和重力补偿是力矩控制的“基本功”,看似简单,但想做好真不容易。我当年也是踩了不少坑才摸出门道。希望各位在实际项目中,能把这些方法用起来,少走弯路。
可可精品资料库