4、重力矩补偿原理:基于运动学参数的重力矩计算、重力矩标定实验设计

各位同学,咱们今天聊点实在的。力矩控制做得好不好,很大程度上取决于重力矩补偿做得干不干净。说白了,机器人关节上那点事儿,一大半都是跟重力在较劲。我当年调试第一个六轴协作臂的时候,就被这玩意儿折腾得够呛——空载的时候好好的,一夹持负载就抖得像筛糠。后来才明白,重力矩没算对,啥高级算法都白搭。

4.1 重力矩从哪来?

先想一个问题:为什么关节电机要额外出力?

因为机器人本身有重量。每个连杆、每个关节、甚至每个螺丝,都在受重力影响。当机器人保持某个姿态时,重力会在各个关节上产生一个力矩分量。这个分量如果不补偿,电机就得硬扛着,结果就是:

  • 静态误差大——位置精度上不去
  • 动态响应慢——电机一直在跟重力较劲
  • 发热严重——电流里掺了太多"冤枉成分"

所以,重力矩补偿的核心思路就一句话:把重力产生的力矩算出来,然后从控制指令里减掉它。这样电机只需要负责"运动"本身,不用再背着重力这个包袱。

核心公式(简化版):

τgravity = f(q, m, L, g)

其中 q 是关节角度,m 是连杆质量,L 是质心位置,g 是重力加速度。

说白了,重力矩就是关节角度的函数。角度一变,力矩就变。

4.2 基于运动学参数的重力矩计算

好,那具体怎么算?我习惯分三步走。

第一步:建立运动学模型

你得知道每个连杆的质心在哪。这个信息通常来自CAD模型,或者通过辨识实验得到。对于n轴机器人,我们需要知道每个连杆的:

  • 质量 mi
  • 质心位置(在连杆坐标系下)ri
  • 惯性张量(这个对重力矩影响不大,但做动力学控制时有用)

第二步:计算每个连杆的重力在关节空间中的映射

这里要用到雅可比矩阵。每个连杆的质心速度可以通过雅可比矩阵映射到关节速度上。重力做的虚功,就等于重力乘以虚位移。通过虚功原理,我们可以得到:

τ_gravity = Σ (J_i^T * m_i * g)

其中 J_i 是第 i 个连杆质心的雅可比矩阵。g 是重力向量,通常取 [0, 0, -9.81]。

第三步:写成可执行代码

嗯,这里我贴一段我常用的伪代码,实际项目中我一般用C++写,但原理是一样的:

// 输入:关节角度 q[6]
// 输出:重力补偿力矩 tau_gravity[6]

void computeGravityTorque(float* q, float* tau_gravity) {
    // 1. 正运动学计算,得到每个连杆的位姿
    Matrix4 T[7]; // 从基座到每个连杆的变换矩阵
    forwardKinematics(q, T);
    
    // 2. 计算每个连杆质心的位置和雅可比
    for (int i = 1; i <= 6; i++) {
        Vector3 p_com = T[i] * r_com[i]; // 质心在世界坐标系下的位置
        Matrix J_com = computeJacobian(q, i, p_com); // 质心雅可比
        
        // 3. 重力向量
        Vector3 g_world = {0, 0, -9.81};
        
        // 4. 累加重力矩
        Vector3 force = m[i] * g_world;
        Vector3 torque = J_com.transpose() * force;
        
        for (int j = 0; j < 6; j++) {
            tau_gravity[j] += torque[j];
        }
    }
}

我的经验:实际写代码时,别一次性算6个关节。先算前三个大臂关节,它们占了重力矩的80%以上。小臂和腕部的重力矩通常很小,可以先用近似值,等精度要求高了再细化。我曾经在一个项目里这么干,调试时间直接缩短了一半。

4.3 重力矩标定实验设计

理论算得再漂亮,也得用实验来验证。为什么?因为CAD模型里的质量、质心位置,跟实际装配出来的总有偏差。我见过最离谱的一次,一个连杆的质心偏差了5毫米,结果重力矩补偿误差达到了15%。

所以,我们需要做重力矩标定实验。说白了,就是让机器人摆出各种姿态,测量实际需要的力矩,然后反推出真实的运动学参数。

实验步骤:

  1. 准备阶段:让机器人处于空载状态,确保关节摩擦力已经单独标定过(否则摩擦力会污染重力矩数据)。
  2. 数据采集:让机器人缓慢运动,遍历工作空间中的多个姿态。我建议至少采集50-100个点,覆盖各个关节的极限位置。
  3. 记录数据:每个姿态下,记录关节角度 q 和关节力矩 τ(从电流传感器读取)。
  4. 参数辨识:用最小二乘法拟合,得到实际的质量和质心参数。

这里有个关键点:摩擦力怎么处理?

我曾经踩过这个坑。一开始我直接拿力矩传感器读数去拟合,结果发现参数怎么都对不上。后来才意识到,低速运动时摩擦力占比很大。我的解决办法是:

  • 在多个不同速度下采集数据
  • 用库仑+粘滞摩擦模型把摩擦力分离出来
  • 只保留"纯重力"部分用于标定

注意:标定实验时,机器人运动速度一定要慢。我一般控制在 5°/s 以下。速度太快,惯性力和科里奥利力会混进来,把重力矩数据搞脏。你想想看,如果数据里混了惯性成分,那标定出来的参数能准吗?

4.4 标定结果怎么用?

标定完成后,你会得到一组修正后的运动学参数。把这些参数代入重力矩计算公式,补偿效果会有明显提升。我通常用两个指标来评估:

指标 标定前 标定后
静态力矩误差 ±0.5 Nm ±0.05 Nm
位置保持精度 ±0.3 mm ±0.02 mm
电流纹波 ±10% ±2%

你看,效果还是很明显的。力矩误差降了一个数量级,位置精度也跟着上来了。

4.5 知识体系总览

下面这张图,是我自己整理的重力矩补偿知识框架。你可以把它当作一个检查清单,看看自己哪块还没搞透。

重力矩补偿知识体系 运动学建模 重力矩计算 标定实验 DH参数 / 质心位置 质量 / 惯性张量 雅可比矩阵映射 虚功原理 / 力矩合成 数据采集 / 摩擦力分离 最小二乘参数辨识 输出:修正后的运动学参数 应用:高精度力矩控制

这张图把整个流程串起来了。从运动学建模开始,到重力矩计算,再到标定实验验证,最后回到控制应用。每一步都环环相扣,缺一不可。

一个小建议:如果你刚开始做重力矩补偿,别一上来就搞全动力学模型。先只做重力矩补偿,把这一块吃透了,再考虑加惯性力、科里奥利力。我见过太多人一上来就想搞"完美动力学控制",结果哪个都没做好。步子迈大了,容易扯着。

好了,关于重力矩补偿的原理和标定实验,我就讲这么多。核心就三件事:算对模型、做对实验、用对参数。你回去可以拿自己的机器人试试,先做个简单的单关节重力矩补偿,感受一下效果。嗯,动手做一遍,比看十遍文章都管用。

可可精品资料库