第三章:关节空间力矩控制——PD控制、重力补偿、前馈控制与摩擦补偿

各位同学,欢迎来到力矩控制实战的核心章节。说实话,关节空间的力矩控制,是机器人从“位置跟随”走向“力觉交互”的必经之路。我个人习惯把这一章叫做“驯服关节的肌肉记忆”——你不仅要让它动,还要让它知道用多大的力气动。

今天我们要啃下四个硬骨头:PD控制、重力补偿、前馈控制,以及摩擦补偿模型(库仑+粘滞)。别怕,我会用项目里踩过的坑,帮你把这些概念串起来。

关节空间力矩控制知识体系 力矩控制指令 τ_d PD控制 τ = Kp·e + Kd·ė 重力补偿 τ_g = G(q) 前馈控制 τ_ff = M(q)q̈_d + C(q, q̇)q̇_d 摩擦补偿 τ_f = f_c·sign(q̇) + f_v·q̇ τ = τ_pd + τ_g + τ_ff + τ_f

3.1 PD控制:力矩控制的“地基”

PD控制,说白了就是比例-微分控制。在关节空间里,我们控制的是力矩,而不是位置。但目标位置还是要给的,对吧?

公式很简单:

τ_pd = Kp * (q_d - q) + Kd * (q̇_d - q̇)

这里 q_d 是期望关节角度,q 是实际角度。Kp 是刚度,Kd 是阻尼。

我个人的经验是:调Kp和Kd,就像调弹簧和阻尼器。Kp太大,关节会抖得像筛糠;Kd太大,关节又像泡在蜂蜜里,反应迟钝。

💡 调参小技巧: 先让Kp从0慢慢往上加,直到关节出现轻微震荡。然后加Kd,直到震荡消失。这个临界点,就是你的“黄金参数”。

我在项目里遇到过一个问题:空载时PD参数调得挺好,一装上负载,关节就开始尖叫。后来发现,是Kp太大,负载惯量变化后系统失稳了。嗯,这时候就需要重力补偿来帮忙。

3.2 重力补偿:让机器人“感觉不到”自重

你想想看,一个六轴机械臂,光自重就有几十公斤。如果不做重力补偿,关节电机要一直出力托着胳膊,别说控制精度了,电机先烧了。

重力补偿的核心,就是根据当前关节角度,计算出重力产生的力矩,然后把它加到指令里:

τ_g = G(q)

这里的 G(q) 是从机器人动力学模型里算出来的。通常我们使用牛顿-欧拉法或者拉格朗日法推导。

⚠️ 重要提醒: 重力补偿的精度,直接取决于你的动力学模型准不准。连杆质量、质心位置,哪怕差个5%,补偿效果都会大打折扣。

我曾经在一个协作机器人项目上,因为质心参数标定偏差,导致重力补偿后关节还有0.5Nm的残余力矩。结果就是,机器人“飘”在那里,轻轻一碰就晃。后来重新做了参数辨识,才搞定。

3.3 前馈控制:让机器人“预判”你的动作

PD控制有个毛病——它总是“事后诸葛亮”。误差出来了,它才去纠正。对于高速运动,这会导致明显的跟踪滞后。

前馈控制就是来解决这个问题的。它根据期望的加速度和速度,提前计算出需要的力矩:

τ_ff = M(q) * q̈_d + C(q, q̇) * q̇_d

其中 M(q) 是惯量矩阵,C(q, q̇) 是科里奥利力和离心力项。

说白了,前馈就是“我知道你要加速,我先给你把力加上”。这样PD控制器只需要处理模型误差和扰动,负担小很多。

🚨 避坑指南: 前馈控制依赖模型精度。如果你的动力学模型不准,前馈反而会引入干扰。我曾经见过一个案例,前馈力矩算出来比实际需要大了一倍,结果机器人运动时像喝醉了酒一样左右摇摆。

我的建议是:先只加PD和重力补偿,跑顺了再逐步加入前馈。前馈系数可以从0.5倍开始,慢慢往上调。

3.4 摩擦补偿:对付“死区”和“粘滞”

摩擦,是力矩控制里最让人头疼的非线性因素。你给一个很小的力矩,关节可能纹丝不动——这就是静摩擦(库仑摩擦)在作怪。动起来之后,又会有粘滞摩擦拖后腿。

经典的摩擦模型长这样:

τ_f = f_c * sign(q̇) + f_v * q̇
  • f_c:库仑摩擦系数,与速度方向有关,与大小无关
  • f_v:粘滞摩擦系数,与速度大小成正比
  • sign(q̇):速度的符号函数

实际代码实现时,为了避免 sign() 在零速附近抖动,我通常会加一个死区:

if abs(q̇) < threshold:
    τ_f = 0
else:
    τ_f = f_c * sign(q̇) + f_v * q̇
🔧 工程经验: 摩擦参数怎么测?让关节以不同速度匀速运动,记录稳态力矩,然后做线性拟合。斜率就是f_v,截距就是f_c。我一般会测正反两个方向,取平均值。

记得有一次,我在调试一个精密装配任务。机器人每次接近目标位置时都会“卡”一下,然后突然冲过头。查了半天,发现是摩擦补偿没做好——低速时库仑摩擦补偿过大,导致力矩跳变。后来把死区阈值从0.01 rad/s调到0.005 rad/s,问题就解决了。

3.5 把它们合在一起:完整的力矩控制律

好了,现在我们把四个部分拼起来:

τ_d = τ_pd + τ_g + τ_ff + τ_f

也就是:

τ_d = Kp*(q_d - q) + Kd*(q̇_d - q̇) + G(q) + M(q)*q̈_d + C(q,q̇)*q̇_d + f_c*sign(q̇) + f_v*q̇

看着挺长,但每个部分各司其职:

组成部分 作用 依赖
PD控制 提供刚度和阻尼,保证稳定性 位置/速度反馈
重力补偿 抵消自重,减少稳态误差 动力学模型
前馈控制 提高动态跟踪精度 动力学模型 + 期望轨迹
摩擦补偿 克服非线性摩擦,改善低速性能 摩擦参数辨识
🎯 核心要点: 力矩控制的精髓在于“补偿”。PD处理误差,重力补偿处理静态负载,前馈处理动态负载,摩擦补偿处理非线性。四者缺一不可,但也要注意不要过度补偿。

最后说一句心里话:力矩控制调参,没有银弹。每个关节、每个负载、每个工况,都需要你亲手去试。但只要你理解了这四个模块的原理和相互作用,调试起来就有方向了。

好了,这一章的内容就到这里。记住,纸上得来终觉浅,绝知此事要躬行。去你的机器人上试试吧。


可可精品资料库