阻抗控制原理:质量-弹簧-阻尼模型、目标阻抗参数设计、内环与外环控制架构

聊到阻抗控制,我得先说说自己的体会。刚入行那会儿,我总觉得机器人控制就是「给个位置,让它过去」这么简单。直到有一次做精密装配,机器人硬生生把零件怼坏了——嗯,那时候我才真正理解,力控和位置控,缺一不可。

阻抗控制,说白了就是让机器人学会「柔顺」。不是软绵绵,而是有弹性地应对环境。你想想看,人抓鸡蛋为什么不会捏碎?因为你的手有阻抗特性——遇到阻力会自然退让。机器人要学的,就是这个。

质量-弹簧-阻尼模型

阻抗控制的核心,是一个二阶动力学模型:

M * (ẍ_d - ẍ) + B * (ẋ_d - ẋ) + K * (x_d - x) = F_ext

这里:

  • M — 惯性系数(质量),决定加速度响应
  • B — 阻尼系数,决定速度响应
  • K — 刚度系数,决定位置偏差与力的关系
  • x_d — 期望位置,ẋ_d 期望速度,ẍ_d 期望加速度
  • F_ext — 外部施加的力

这个模型怎么理解?我习惯把它想象成「弹簧连着个铁块,泡在油里」。你推铁块,弹簧压缩,油液产生阻力。推得越快,阻力越大。这就是阻抗的本质——机器人对外力的响应特性。

关键点:阻抗控制不是直接控制力,而是控制「位置偏差与力之间的关系」。你设定好M、B、K三个参数,机器人就自动表现出你想要的柔顺特性。

我在做打磨机器人项目时遇到过一个问题:机器人碰到工件表面时,如果刚度K设得太大,接触瞬间会产生冲击力,把工件表面划伤。后来我把K调小,同时把B调大,效果就好多了。说白了,这就是在调「软硬程度」和「缓冲效果」。

目标阻抗参数设计

参数怎么选?我给大家一个实用的思路。

先看刚度K

  • K越大,机器人越「硬」,位置跟踪精度高,但力控效果差
  • K越小,机器人越「软」,力控柔顺性好,但位置偏差大
  • 我建议:装配任务K取小(100-500 N/m),搬运任务K取大(1000-5000 N/m)

再看阻尼B

  • B决定系统的震荡特性。B太小,机器人会「抖」;B太大,响应太慢
  • 临界阻尼比 ζ = B / (2√(MK)),一般取0.7-1.0比较舒服
  • 我踩过坑:有一次B设得太小,机器人夹取零件时一直在震荡,像得了帕金森一样…后来把B调大了一倍,稳了

最后是惯性M

  • M影响加速度响应。M越大,机器人越「迟钝」
  • 实际中M通常取机器人本身惯量的0.5-2倍
  • 注意:M不能设得太小,否则系统容易不稳定
参数 增大效果 减小效果 典型范围
K(刚度) 位置精度高,力控差 柔顺性好,位置偏差大 100-5000 N/m
B(阻尼) 响应慢,无震荡 响应快,易震荡 10-500 N·s/m
M(惯性) 加速度响应慢 加速度响应快,易不稳定 0.5-2倍实际惯量

我的经验:参数设计别一次到位。先设一个保守值(K偏大、B偏大),然后逐步调小K、调优B。每次只改一个参数,观察机器人响应。这样不容易翻车。

内环与外环控制架构

阻抗控制怎么落地?实际工程中,我们通常用两层控制架构。

先看一张我画的架构图:

阻抗控制器 外环 M, B, K 参数 位置/速度控制器 内环 PID 或 前馈控制 机器人 + 环境 力传感器 位置修正量 控制指令 实际力 力反馈 F_ext 期望位置 x_d 图:阻抗控制内环-外环架构

这张图怎么理解?我拆开来讲。

外环:阻抗控制器

外环接收两个输入:期望位置 x_d 和力传感器反馈的 F_ext。它根据阻抗模型计算出位置修正量 Δx,然后传给内环。说白了,外环就是「根据力的大小,决定位置该偏多少」。

我在项目中遇到过一个问题:力传感器噪声太大,导致外环输出的位置修正量一直在抖动。后来加了低通滤波,把截止频率设在20Hz,效果立竿见影。

内环:位置/速度控制器

内环接收外环给出的修正后位置指令,然后驱动电机去跟踪这个位置。内环通常用PID控制,响应速度要快——一般要求带宽是外环的5-10倍。

为什么内环要快?你想想看,外环算好了「该退让多少」,结果内环半天追不上,那力控效果肯定打折扣。我一般把内环控制周期设在1ms,外环设在5-10ms。

注意:内环和外环的采样频率要匹配。我曾经把外环跑在100Hz,内环跑在1000Hz,结果外环输出的修正量变化太快,内环根本来不及响应,系统直接震荡了。后来把外环降到200Hz,问题解决。

两种实现方式:

  • 基于位置的阻抗控制:外环输出位置修正量,内环跟踪位置。适合大多数工业场景,实现简单
  • 基于速度的阻抗控制:外环输出速度修正量,内环跟踪速度。适合需要连续力控的场景,比如打磨、抛光

我个人更常用基于位置的方式。为什么?因为大多数工业机器人本身就提供位置控制接口,改造成本低。你只需要在机器人控制器外面加一个阻抗计算模块就行。

避坑指南:我曾经在一个装配项目里,把阻抗参数设得太「软」,结果机器人碰到工件后一直在震荡,就是找不到稳定位置。后来发现是阻尼B设得太小,系统处于欠阻尼状态。把B从50调到200,世界安静了。

最后说一句:阻抗控制不是万能药。它适合接触力不大的场景,比如装配、打磨、人机协作。如果你要做重载力控(比如几百牛的力),建议考虑力位混合控制。不过那是另一个话题了。


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