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%。
所以,我们需要做重力矩标定实验。说白了,就是让机器人摆出各种姿态,测量实际需要的力矩,然后反推出真实的运动学参数。
实验步骤:
- 准备阶段:让机器人处于空载状态,确保关节摩擦力已经单独标定过(否则摩擦力会污染重力矩数据)。
- 数据采集:让机器人缓慢运动,遍历工作空间中的多个姿态。我建议至少采集50-100个点,覆盖各个关节的极限位置。
- 记录数据:每个姿态下,记录关节角度 q 和关节力矩 τ(从电流传感器读取)。
- 参数辨识:用最小二乘法拟合,得到实际的质量和质心参数。
这里有个关键点:摩擦力怎么处理?
我曾经踩过这个坑。一开始我直接拿力矩传感器读数去拟合,结果发现参数怎么都对不上。后来才意识到,低速运动时摩擦力占比很大。我的解决办法是:
- 在多个不同速度下采集数据
- 用库仑+粘滞摩擦模型把摩擦力分离出来
- 只保留"纯重力"部分用于标定
注意:标定实验时,机器人运动速度一定要慢。我一般控制在 5°/s 以下。速度太快,惯性力和科里奥利力会混进来,把重力矩数据搞脏。你想想看,如果数据里混了惯性成分,那标定出来的参数能准吗?
4.4 标定结果怎么用?
标定完成后,你会得到一组修正后的运动学参数。把这些参数代入重力矩计算公式,补偿效果会有明显提升。我通常用两个指标来评估:
| 指标 | 标定前 | 标定后 |
|---|---|---|
| 静态力矩误差 | ±0.5 Nm | ±0.05 Nm |
| 位置保持精度 | ±0.3 mm | ±0.02 mm |
| 电流纹波 | ±10% | ±2% |
你看,效果还是很明显的。力矩误差降了一个数量级,位置精度也跟着上来了。
4.5 知识体系总览
下面这张图,是我自己整理的重力矩补偿知识框架。你可以把它当作一个检查清单,看看自己哪块还没搞透。
这张图把整个流程串起来了。从运动学建模开始,到重力矩计算,再到标定实验验证,最后回到控制应用。每一步都环环相扣,缺一不可。
一个小建议:如果你刚开始做重力矩补偿,别一上来就搞全动力学模型。先只做重力矩补偿,把这一块吃透了,再考虑加惯性力、科里奥利力。我见过太多人一上来就想搞"完美动力学控制",结果哪个都没做好。步子迈大了,容易扯着。
好了,关于重力矩补偿的原理和标定实验,我就讲这么多。核心就三件事:算对模型、做对实验、用对参数。你回去可以拿自己的机器人试试,先做个简单的单关节重力矩补偿,感受一下效果。嗯,动手做一遍,比看十遍文章都管用。
可可精品资料库