4. 控制架构:三环结构与力控的几种玩法
聊到力反馈控制,绕不开的就是控制架构。我这些年调试过的系统,从工业机器人到手术机器人,核心架构其实就那几套。今天我把它们掰开揉碎了讲给你听。
4.1 位置环/速度环/力环:三环结构的底层逻辑
先说说最经典的三环结构。说白了,就是三个PID环套在一起。从内到外分别是:电流环、速度环、位置环。但在力控场景下,最外层往往换成力环。
我习惯这么理解:
- 内环(电流环):响应最快,负责让电机输出你想要的力矩。一般用PI控制就够了。
- 中环(速度环):控制运动速度,抑制扰动。带宽比电流环低一个数量级。
- 外环(力环或位置环):最慢,但决定了最终的控制精度。
为什么要分层?你想想看,如果只有一个大环,所有延迟和非线性都混在一起,调参能把你调哭。分层之后,每一层只关心自己的事,调试起来清晰多了。
核心原则:内环带宽要远大于外环。一般建议内环比外环快5-10倍。否则系统容易震荡。
我在项目中遇到过一个问题:力环带宽设得太高,结果系统高频抖动。后来把力环带宽降到20Hz,速度环设到100Hz,电流环跑到500Hz,问题就解决了。嗯,这里要注意,带宽不是越高越好。
4.2 前馈与反馈结合:让系统跑得更快
纯反馈控制有个毛病——它总是等误差出现了才去纠正。说白了就是「事后诸葛亮」。前馈就不一样了,它提前把补偿量加进去。
我举个例子。你用手推一个箱子,如果知道箱子有多重,你会提前用多大的力?这就是前馈。如果不知道重量,只能推一下感觉阻力再调整,这就是反馈。
实际代码里长这样:
// 前馈+反馈的力控伪代码
float force_command = 0;
// 反馈项:根据力误差调整
float force_error = force_desired - force_measured;
force_command += Kp_force * force_error;
// 前馈项:根据期望力直接计算
force_command += feedforward_gain * force_desired;
// 别忘了速度前馈
force_command += velocity_feedforward * velocity_desired;
我建议前馈系数先设成0.8倍的理论值,剩下的靠反馈去补。这样既快又稳。
小技巧:前馈可以大幅降低稳态误差,但前提是你的模型要准。模型不准,前馈反而添乱。
4.3 阻抗控制 vs 导纳控制:一对孪生兄弟
这两个概念经常被搞混。我简单说清楚:
| 特性 | 阻抗控制 | 导纳控制 |
|---|---|---|
| 输入 | 位置偏差 | 力/力矩 |
| 输出 | 力/力矩 | 位置修正 |
| 适用场景 | 刚性环境(如金属加工) | 柔性环境(如人机交互) |
| 实现难度 | 较难(需要力传感器) | 较易(位置控制成熟) |
说白了,阻抗控制是「你给我位置偏差,我还你力」。导纳控制是「你给我力,我还你位置修正」。
我曾经在一个协作机器人项目里,两种都试过。最后发现:如果机器人末端刚度大,用阻抗控制更直接;如果末端有柔性关节,导纳控制更稳。
避坑指南:阻抗控制中,阻尼系数设太小会导致震荡,设太大又太「肉」。我一般从临界阻尼开始调,再根据实际手感微调。
4.4 力位混合控制:同时管两件事
有些场景下,你既需要控制力,又需要控制位置。比如打磨一个曲面:沿着曲面法线方向要控力,沿着切线方向要控位置。
力位混合控制的核心思想是:把任务空间分解成两个正交的子空间。一个子空间用力控,另一个用位控。
实现上有个关键点:
- 选择矩阵 S:决定哪些自由度用力控,哪些用位控
- 互补矩阵 I-S:剩下的自由度用另一种控制
我见过不少工程师在这里翻车。他们忘了:力控和位控的带宽要匹配。力控环慢,位控环快,结果两个环互相打架。
我的经验:力位混合控制中,力控方向的增益要设得比位控方向低30%-50%。这样系统才不会「左右互搏」。
4.5 一张图看懂控制架构
下面这张SVG图,把三环结构和几种控制模式的关系画清楚了。我花了不少心思,你仔细看看:
这张图把今天讲的内容串起来了。你从内环往外看,再从左到右看控制模式,整个架构就清晰了。
最后说一句:没有最好的架构,只有最合适的。我见过用纯位置环加前馈就搞定力控的,也见过三环加力位混合还调不好的。关键是你对系统的理解有多深。