第三章 摩擦与重力补偿:让机器人学会“轻装上阵”

各位工程师朋友,大家好。今天我们来聊聊力矩控制里最让人头疼,但也最绕不开的两个家伙——摩擦和重力。

说实话,我刚入行那会儿,觉得力矩控制嘛,给个期望力矩,电机转就完了。结果第一次在真实机械臂上跑,那叫一个惨不忍睹。末端抖得像帕金森,静止时还往下坠。后来才明白,不搞定摩擦和重力补偿,你的力矩控制就是个“睁眼瞎”。

这一章,我们就来彻底扒一扒它们的底裤。

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 离线补偿方法

离线补偿,就是事先算好重力矩,存成表格或多项式,运行时查表。

步骤很简单:

  1. 建立机器人运动学模型,获取各连杆质心位置
  2. 根据关节角度,计算重力矩 τ_g(q)
  3. 将 τ_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. 让机器人关节以恒定速度运动,记录力矩和速度
  2. 改变速度,重复步骤1,覆盖从低速到高速的整个范围
  3. 对采集到的 (ω, τ) 数据,用最小二乘法拟合摩擦模型

数据采集时要注意:

  • 每个速度点至少采集 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 知识体系总览

为了让大家更直观地理解本章的知识结构,我画了一张图:

摩擦与重力补偿知识体系 摩擦补偿 重力补偿 库仑摩擦模型 粘滞摩擦模型 Stribeck效应 离线补偿 在线补偿 摩擦参数辨识实验设计 恒速扫描法 最小二乘拟合 核心目标:精确补偿摩擦与重力,实现高精度力矩控制

这张图把本章的核心内容串起来了。左边是摩擦补偿的三个模型,右边是重力补偿的两种方法,底部是实验设计。你想想看,实际调试时,就是从左到右、从上到下走一遍流程。

好了,这一章的内容就到这里。摩擦和重力补偿是力矩控制的“基本功”,看似简单,但想做好真不容易。我当年也是踩了不少坑才摸出门道。希望各位在实际项目中,能把这些方法用起来,少走弯路。

可可精品资料库