第三章:关节空间力矩控制——PD控制、重力补偿、前馈控制与摩擦补偿
各位同学,欢迎来到力矩控制实战的核心章节。说实话,关节空间的力矩控制,是机器人从“位置跟随”走向“力觉交互”的必经之路。我个人习惯把这一章叫做“驯服关节的肌肉记忆”——你不仅要让它动,还要让它知道用多大的力气动。
今天我们要啃下四个硬骨头:PD控制、重力补偿、前馈控制,以及摩擦补偿模型(库仑+粘滞)。别怕,我会用项目里踩过的坑,帮你把这些概念串起来。
3.1 PD控制:力矩控制的“地基”
PD控制,说白了就是比例-微分控制。在关节空间里,我们控制的是力矩,而不是位置。但目标位置还是要给的,对吧?
公式很简单:
τ_pd = Kp * (q_d - q) + Kd * (q̇_d - q̇)
这里 q_d 是期望关节角度,q 是实际角度。Kp 是刚度,Kd 是阻尼。
我个人的经验是:调Kp和Kd,就像调弹簧和阻尼器。Kp太大,关节会抖得像筛糠;Kd太大,关节又像泡在蜂蜜里,反应迟钝。
我在项目里遇到过一个问题:空载时PD参数调得挺好,一装上负载,关节就开始尖叫。后来发现,是Kp太大,负载惯量变化后系统失稳了。嗯,这时候就需要重力补偿来帮忙。
3.2 重力补偿:让机器人“感觉不到”自重
你想想看,一个六轴机械臂,光自重就有几十公斤。如果不做重力补偿,关节电机要一直出力托着胳膊,别说控制精度了,电机先烧了。
重力补偿的核心,就是根据当前关节角度,计算出重力产生的力矩,然后把它加到指令里:
τ_g = G(q)
这里的 G(q) 是从机器人动力学模型里算出来的。通常我们使用牛顿-欧拉法或者拉格朗日法推导。
我曾经在一个协作机器人项目上,因为质心参数标定偏差,导致重力补偿后关节还有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̇
记得有一次,我在调试一个精密装配任务。机器人每次接近目标位置时都会“卡”一下,然后突然冲过头。查了半天,发现是摩擦补偿没做好——低速时库仑摩擦补偿过大,导致力矩跳变。后来把死区阈值从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控制 | 提供刚度和阻尼,保证稳定性 | 位置/速度反馈 |
| 重力补偿 | 抵消自重,减少稳态误差 | 动力学模型 |
| 前馈控制 | 提高动态跟踪精度 | 动力学模型 + 期望轨迹 |
| 摩擦补偿 | 克服非线性摩擦,改善低速性能 | 摩擦参数辨识 |
最后说一句心里话:力矩控制调参,没有银弹。每个关节、每个负载、每个工况,都需要你亲手去试。但只要你理解了这四个模块的原理和相互作用,调试起来就有方向了。
好了,这一章的内容就到这里。记住,纸上得来终觉浅,绝知此事要躬行。去你的机器人上试试吧。
可可精品资料库