4、计算力矩控制:基本原理、前馈+反馈结构、PD+前馈控制器设计

各位同学,今天我们来聊聊力矩模式下的轨迹跟踪。说实话,这个主题在机器人控制里算是「硬骨头」,但也是最能体现控制功底的地方。我个人习惯把计算力矩控制看作「给机器人装一个智能弹簧」——既要让它有力气,又要让它听话。

4.1 基本原理:从动力学说起

先问大家一个问题:为什么PID控制搞不定高速高精度的轨迹跟踪?

原因很简单——机器人是个强耦合、非线性的系统。你动一下肩关节,肘关节的受力就变了。传统的PID是「头痛医头,脚痛医脚」,它不知道关节之间的相互影响。

计算力矩控制的核心思想,就是利用机器人的动力学模型,把非线性系统「假装」成线性系统。说白了,就是先算出来「需要多大的力才能让机器人动」,然后把这个力作为前馈加上去。

动力学方程长这样:

M(q) * q̈ + C(q, q̇) * q̇ + G(q) + τ_friction = τ

其中:

  • M(q) —— 惯性矩阵,跟关节位置有关
  • C(q, q̇) —— 科里奥利力和离心力项
  • G(q) —— 重力项
  • τ_friction —— 摩擦力(这个最烦人)

我在项目中遇到过一个问题:明明动力学模型算得很准,但实际跑起来就是抖。后来发现是摩擦力模型没建好。嗯,这里要注意,摩擦力是「非线性中的非线性」,千万别小看它。

4.2 前馈+反馈结构:两条腿走路

计算力矩控制的结构,我习惯用一张图来说明:

期望轨迹 前馈控制器 反馈控制器 + 机器人 输出 反馈回路(实际轨迹) 前馈通道 反馈通道

你看,这个结构其实很直观:

  • 前馈通道(红色):根据期望轨迹提前算出力,让机器人「知道该往哪走」
  • 反馈通道(绿色):根据实际误差修正,让机器人「走得更准」

为什么要两条腿走路?我打个比方:前馈就像你开车时看路标提前打方向盘,反馈就像你发现车偏了再微调。光看路标不看路,你会撞;光看路不看路标,你永远在纠正。

我的经验:前馈能解决80%的跟踪误差,反馈解决剩下的20%。但千万别把反馈增益调太大,否则系统会抖。我曾经在一个六轴机器人上把PD增益调高了30%,结果末端抖得像筛糠一样。

4.3 PD+前馈控制器设计

好了,理论讲完了,咱们来点实际的。PD+前馈控制器,说白了就是:

τ = M(q) * (q̈_d + Kp * e + Kd * ė) + C(q, q̇) * q̇ + G(q)

其中:

  • q̈_d —— 期望加速度(前馈项)
  • e = q_d - q —— 位置误差
  • ė = q̇_d - q̇ —— 速度误差
  • Kp, Kd —— PD增益矩阵

你想想看,这个公式其实很聪明:前馈项让机器人「知道该用多大力」,PD项让机器人「知道该怎么修正」。

设计步骤

  1. 辨识动力学参数:M(q)、C(q,q̇)、G(q) 这些参数得先测出来。我一般用最小二乘法做离线辨识。
  2. 设计PD增益:先让Kp和Kd小一点,慢慢往上调。Kp决定响应速度,Kd决定阻尼。
  3. 加入前馈:把期望加速度项加进去,观察跟踪误差是否减小。
  4. 调试摩擦补偿:这是最磨人的一步。我建议用Stribeck模型,比简单的库仑+粘滞模型准得多。
关键参数调优建议:
参数 作用 调大后果 调小后果
Kp 位置刚度 响应快,但可能震荡 跟踪慢,误差大
Kd 阻尼 系统稳定,但响应变慢 容易震荡
前馈增益 模型补偿 过补偿导致超调 欠补偿,跟踪差

代码示例(伪代码)

// PD+前馈控制器的核心实现
void computeTorqueControl() {
    // 1. 获取当前状态
    q = getJointPosition();
    q_dot = getJointVelocity();
    
    // 2. 计算误差
    e = q_desired - q;
    e_dot = q_dot_desired - q_dot;
    
    // 3. 计算PD项
    tau_pd = Kp * e + Kd * e_dot;
    
    // 4. 计算前馈项(动力学模型)
    M = computeInertiaMatrix(q);
    C = computeCoriolisMatrix(q, q_dot);
    G = computeGravityVector(q);
    
    tau_ff = M * q_ddot_desired + C * q_dot + G;
    
    // 5. 总力矩 = 前馈 + 反馈
    tau = tau_ff + tau_pd;
    
    // 6. 限幅保护
    tau = saturate(tau, TAU_MIN, TAU_MAX);
    
    // 7. 输出到电机
    setMotorTorque(tau);
}
注意:千万不要在真实机器人上直接跑未经仿真的代码!我曾经有一次把动力学参数搞反了,结果机器人一启动就「飞」了出去,差点撞到人。先在仿真环境里跑三天,确认没问题再上真机。

4.4 避坑指南

做计算力矩控制,有几个坑我踩过,跟大家分享一下:

  • 模型不准怎么办?—— 别追求完美模型,用鲁棒控制的思想,让反馈去弥补模型误差。
  • 摩擦力怎么处理?—— 我建议用前馈补偿+反馈修正的组合。前馈补偿掉80%的摩擦力,剩下的让PD去处理。
  • 采样频率要多少?—— 至少1kHz,我习惯用2kHz。频率太低,前馈就失去了意义。
  • 关节柔性怎么办?—— 如果机器人有减速器(谐波减速器尤其明显),要考虑关节柔性。这时候需要加一个陷波滤波器。

说实话,计算力矩控制是个「越做越有意思」的领域。刚开始你可能觉得动力学模型好复杂,但当你看到机器人真的按照期望轨迹平滑运动时,那种成就感是PID给不了的。

好了,这一章的内容就到这里。记住:前馈让你走得快,反馈让你走得稳,两者缺一不可。

可可精品资料库