3、关节空间力矩控制:PD控制、PID控制、重力补偿、前馈控制

聊到关节空间的力矩控制,我得先跟你交个底——这玩意儿是机器人底层控制里最「硬核」的部分之一。说白了,我们不是在控制位置,而是在控制力。你想想看,一个机械臂要跟人协作,或者要打磨一个曲面,光靠位置控制是远远不够的。力矩控制才是真正让机器人「有手感」的关键。

我个人习惯把关节空间力矩控制分成四个层次:PD控制是基础,PID控制是进阶,重力补偿是必备,前馈控制是优化。咱们一个一个来拆解。

3.1 PD控制:最简单的力矩控制器

PD控制,比例-微分控制,公式很简单:

τ = Kp * (q_d - q) + Kd * (dq_d - dq)

其中τ是输出力矩,q_d是目标位置,q是当前位置,Kp和Kd分别是比例和微分增益。

我在项目中遇到过一件事:有个六轴机器人,空载时PD控制跑得挺好,一夹持工件就开始抖。后来发现是Kp调得太高,系统刚度太大,反而引发了谐振。嗯,这里要注意——PD控制本质上是一个弹簧-阻尼系统。Kp是弹簧刚度,Kd是阻尼系数。弹簧太硬,一碰就弹;阻尼太小,晃个不停。

我的调参经验:先让Kp从0慢慢往上加,直到系统出现轻微振荡,然后加Kd把振荡压下去。反复两三次,基本就能找到合适的值。

3.2 PID控制:消除稳态误差

PD控制有个硬伤——稳态误差。比如你让关节停在某个角度,如果存在重力或者摩擦力,它永远到不了精确位置。这时候就需要引入积分项I。

τ = Kp * e + Kd * de/dt + Ki * ∫e dt

其中e = q_d - q,是位置误差。

积分项的作用是「累积误差」,误差存在时间越长,补偿力矩越大。但这里有个坑——积分饱和。我曾经在一个焊接机器人项目上吃过这个亏:启动时误差很大,积分项疯狂累积,等误差归零时积分值已经大到离谱,导致系统严重超调。

避坑指南:一定要加积分限幅!我一般把积分项限制在最大输出力矩的20%以内。另外,可以考虑「条件积分」——只有当误差小于某个阈值时才启用积分项。

3.3 重力补偿:让机器人「感觉不到」自重

说实话,没有重力补偿的力矩控制,就像让一个举重运动员一直举着杠铃说话——累不累?

重力补偿的原理很简单:根据当前关节角度,计算出每个关节需要承受的重力矩,然后直接补偿掉。

τ_gravity = G(q)

其中G(q)是重力矩向量,是关节角度的函数。

我建议你把重力补偿做成一个独立模块。为什么?因为重力矩只跟关节角度有关,跟速度、加速度无关。你可以离线算好一个查找表,或者用解析公式实时计算。

补偿方式 优点 缺点
离线查表 计算快,实时性好 占用内存,精度受限于表分辨率
解析公式 精度高,无存储开销 计算量大,需要精确的动力学参数
自适应估计 无需精确模型 收敛慢,可能不稳定

我个人偏爱解析公式法。虽然前期要花时间标定连杆质量和质心位置,但一旦标定好,效果非常稳定。

3.4 前馈控制:让响应「快人一步」

PD和PID都是反馈控制——等误差出现了才去补偿。前馈控制不一样,它提前预测需要的力矩,直接给出去。

τ = τ_feedforward + τ_feedback

前馈项通常包含:

  • 惯性前馈:M(q) * q_d_ddot,补偿加速所需的力矩
  • 科里奥利/离心前馈:C(q, dq) * dq,补偿高速运动时的耦合力矩
  • 重力前馈:G(q),前面已经讲过了
  • 摩擦力前馈:F(dq),补偿关节摩擦力

你想想看,如果反馈控制是「事后诸葛亮」,前馈控制就是「事前诸葛亮」。两者结合,效果最好。

核心逻辑:前馈控制处理已知的、可预测的动力学,反馈控制处理未知的扰动和模型误差。两者分工明确,互不干扰。

我记得有一次调试一个高速码垛机器人,纯PD控制时轨迹跟踪误差有5度,加上重力补偿后降到2度,再补上惯性前馈和科里奥利前馈,误差直接压到0.3度以内。效果就是这么明显。

3.5 四种方法的对比与选择

说了这么多,到底该用哪种?我画了一张图帮你理清思路:

关节空间力矩控制方法选择逻辑 力矩控制需求 精度要求高吗? PD控制 简单、稳定、响应快 有稳态误差要求? PD + 重力补偿 消除重力影响 需要快速响应? PID + 重力补偿 消除稳态误差 PID + 重力补偿 + 前馈 最优性能,但最复杂 图例 低精度场景 中等精度场景 高精度低速场景 高精度高速场景

从这张图你可以看出,选择哪种方法取决于你的实际需求。我个人建议:

  • 简单搬运、码垛:PD + 重力补偿就够了,别搞复杂了
  • 精密装配、打磨:上PID + 重力补偿 + 前馈,一步到位
  • 高速运动(如分拣):前馈控制必不可少,否则轨迹跟踪误差会让你头疼
最后说一句:力矩控制不是「越复杂越好」。我见过太多工程师一上来就上全套PID+前馈,结果参数调得焦头烂额。从最简单的PD开始,一步步加功能,边调边理解,这才是正道。

好了,关节空间力矩控制的四种方法就聊到这里。记住,控制器的设计永远是为任务服务的。搞清楚你的机器人要干什么,再去选合适的方法,事半功倍。

一个小技巧:如果你用的是商业机器人(如KUKA、ABB),它们的力矩控制接口通常已经内置了重力补偿。你只需要调PD/PID参数和前馈项。但如果你是自己搭控制器,重力补偿一定要自己实现,否则力矩控制根本没法用。

可可精品资料库