第二章:控制理论基础回顾

各位同学,在正式开始力位混合控制编程之前,咱们得先把地基打牢。说实话,我见过太多人一上来就调参数,结果连位置环和力环的区别都没搞明白——那肯定是要翻车的。这一章,我用最直白的方式,把几个核心概念给你讲透。

2.1 位置控制原理

位置控制,说白了就是让机器人末端走到你指定的位置。你给它一个目标坐标,它就得老老实实过去。

最基本的实现方式,是PID控制。我刚开始做项目时,用的就是最简单的比例控制:

// 位置PID控制伪代码
float error = target_position - current_position;
float output = Kp * error + Ki * integral + Kd * derivative;
motor_drive(output);

这里有个坑,我当年踩过。位置控制里,积分项不能太大。为什么?因为位置误差一旦消除,积分项还在累积,就会产生超调。我曾经在一个焊接机器人项目里,就因为Ki设大了0.1,结果每次定位都多冲出去2毫米——焊枪差点把工件戳穿。

⚠️ 注意:位置控制适用于刚性接触场景。如果机器人末端要接触柔软物体,或者要跟人协作,纯位置控制就会出问题——它会死顶着目标位置不放,哪怕已经撞到东西了。

2.2 力控制原理

力控制就反过来了。你不是要它走到哪,而是要它施加多大的力。比如打磨、装配、抛光这些场景,位置控制搞不定,得用力控。

力控制的核心思路是:把力误差转换成位置修正量。你想想看,传感器测到当前力,跟目标力一比较,差值用来调整位置——力大了就往后退一点,力小了就往前压一点。

// 力控制伪代码
float force_error = target_force - current_force;
float position_adjust = Kf * force_error;
target_position = original_position + position_adjust;

嗯,这里要注意。力控制的带宽通常比位置控制低。我做过一个抛光实验,力控频率设到200Hz,结果系统抖得跟筛子似的。后来降到50Hz,反而稳了。为什么?因为力传感器本身有噪声,频率太高会把噪声放大。

💡 经验之谈:力控的采样频率,建议设在力传感器截止频率的1/3到1/2之间。这是我调了十几个项目总结出来的经验值。

2.3 阻抗控制简介

阻抗控制,你可以把它理解成位置控制和力控制的中间态。它不直接控制位置,也不直接控制力,而是控制机器人的「刚度」和「阻尼」。

想象一下:你用手推一个弹簧。弹簧越硬,你推它需要的力越大;弹簧越软,轻轻一推就动了。阻抗控制就是让你能调节这个「软硬程度」。

数学上,阻抗控制描述的是力与位置偏差之间的关系:

F = M * d²x/dt² + B * dx/dt + K * (x - x0)

其中:

  • M — 惯性系数(质量),影响响应速度
  • B — 阻尼系数,影响震荡抑制
  • K — 刚度系数,影响位置跟踪精度
  • x - x0 — 位置偏差

我在做医疗机器人时,就用了阻抗控制。病人手臂会动,你不能硬顶着,也不能完全跟着跑。把刚度设到中间值,阻尼稍微大一点——这样既不会伤到人,又能完成操作任务。

🔑 核心理解:阻抗控制本质上是「让机器人表现出弹簧-阻尼-质量系统的特性」。你调的不是位置或力,而是这个虚拟系统的参数。

2.4 导纳控制简介

导纳控制跟阻抗控制正好是「对偶」关系。很多人搞混这两个概念,我简单说清楚:

  • 阻抗控制:输入位置偏差,输出力。适合位置源驱动的系统。
  • 导纳控制:输入力,输出位置修正。适合力源驱动的系统。

说白了,阻抗控制是「你推它,它给你反作用力」;导纳控制是「你推它,它让开」。实际应用中,导纳控制更常见,因为大多数工业机器人都是位置控制内环,你只需要在位置指令上叠加一个力修正量就行。

// 导纳控制实现示例
void admittance_control(float force_sensor_value) {
    float force_error = desired_force - force_sensor_value;
    
    // 二阶系统求解位置修正量
    float acc = (force_error - B * vel - K * pos_delta) / M;
    vel += acc * dt;
    pos_delta += vel * dt;
    
    // 修正后的目标位置
    float final_target = original_target + pos_delta;
    position_control(final_target);
}

我曾经在一个装配项目里,用导纳控制做轴孔装配。一开始刚度设得太高,零件死活插不进去。后来把K值降到原来的1/5,阻尼B调大两倍——嗯,一次成功。你想想看,装配本身就需要一定的「顺从性」,导纳控制正好干这个。

💡 选型建议:
  • 如果你的机器人是力矩控制模式,用阻抗控制
  • 如果你的机器人是位置控制模式,用导纳控制
  • 大多数商用机器人(如UR、KUKA)都支持位置模式,所以导纳控制更实用

2.5 四种控制方式对比

控制方式 输入 输出 适用场景 典型应用
位置控制 目标位置 驱动力矩 刚性接触、轨迹跟踪 码垛、焊接
力控制 目标力 位置修正 恒力接触 打磨、抛光
阻抗控制 位置偏差 柔顺接触、人机协作 医疗机器人
导纳控制 位置修正 位置内环、装配 轴孔装配

2.6 知识体系总览

下面这张图,把四种控制方式的关系画清楚了。我建议你多看几遍,理解它们之间的转换逻辑。

机器人控制理论基础 — 知识体系 位置控制 输入:目标位置 输出:驱动力矩 力控制 输入:目标力 输出:位置修正 阻抗控制 输入:位置偏差 输出:力 导纳控制 输入:力 输出:位置修正 刚度降低 柔顺增强 对偶关系 对偶关系 核心思想 力与位置之间的动态关系 通过调节刚度/阻尼实现柔顺

这张图里,你注意看上下两层的对应关系。位置控制和阻抗控制都在左侧,力控制和导纳控制在右侧。为什么这么排?因为位置控制和阻抗控制都是「位置驱动」的思路,而力控制和导纳控制都是「力驱动」的思路。

实际项目中,我经常把导纳控制和位置控制嵌套使用。位置控制做内环保证精度,导纳控制做外环提供柔顺性。这种组合方式,在工业机器人上实现起来最方便,也是后面几章我们要重点讲的内容。

📌 本章要点:
  • 位置控制适合刚性场景,力控制适合恒力场景
  • 阻抗控制和导纳控制是「对偶」关系,一个输入位置输出力,一个输入力输出位置
  • 实际工程中,导纳控制+位置内环是最常用的组合
  • 参数调节时,刚度K决定「软硬」,阻尼B决定「震荡」,惯性M决定「响应速度」

好了,这一章的内容就到这里。这些概念你理解了,后面讲力位混合控制的时候,就不会觉得晕了。记住一句话:控制理论不是数学题,是工程直觉。多动手调参,比死磕公式管用得多。


公众号:蓝海资料掘金营,微信deep3321