4. 力传感器与信号处理:六维力/力矩传感器选型、信号滤波与去噪、重力补偿与零偏校准

各位同学,大家好。今天我们聊一个在柔顺控制里非常关键的话题——力传感器与信号处理。说实话,很多做机器人控制的工程师,算法写得飞起,但一到实际装配就翻车,十有八九是传感器信号没处理好。

我个人习惯把力传感器比作机器人的“触觉神经”。你想想看,如果一个人的触觉神经是坏的,那他拿杯子肯定要么捏碎,要么拿不起来。机器人也是一样的道理。今天我们就从选型、滤波、补偿三个维度,把这个“触觉神经”彻底讲透。

核心观点:力传感器的信号质量,直接决定了柔顺控制的成败。信号里哪怕有1%的噪声,到了力位混合控制里,可能就会被放大成10%的位置误差。

4.1 六维力/力矩传感器选型:别只看参数表

选型这件事,我踩过不少坑。记得有一次项目,我们选了一款号称“高精度”的传感器,参数表漂亮得不行。结果一上机,机器人稍微一动,读数就飘得离谱。后来才发现,那款传感器的抗过载能力太差,机器人加减速时的惯性力就把传感器“打懵”了。

所以选型时,我建议你重点关注这几个维度:

  • 量程与过载能力:别只看额定负载。实际工况中,机器人急停、碰撞时的瞬时力可能是额定负载的3-5倍。我一般会选额定负载的1.5倍作为安全余量。
  • 分辨率与噪声:分辨率决定了你能感知多小的力。对于精密装配,0.1N的分辨率是底线。但要注意,分辨率高不代表信号干净,还要看信噪比。
  • 刚度与固有频率:这个很多人会忽略。传感器刚度不够,装在机器人末端就像加了个弹簧,整个系统的带宽会被拉低。我遇到过因为传感器刚度不足,导致力控震荡的案例。
  • 温度漂移:工业现场温度变化大,传感器零漂会跟着跑。选型时一定要看温漂系数,最好在0.05%FS/℃以内。
参数 推荐范围 我的经验值
额定负载 (Fx/Fy/Fz) 50-200N 100N (装配场景)
额定扭矩 (Mx/My/Mz) 5-20Nm 10Nm
分辨率 0.05-0.2N 0.1N
过载能力 300%-500% 500% (安全第一)
采样率 ≥1kHz 2kHz (力控必备)

小技巧:选型时,可以问供应商要一份“温漂实测曲线”。很多厂家只给典型值,但实际批次差异很大。我一般会要求抽检3-5个样品,自己跑一遍温箱测试。

4.2 信号滤波与去噪:别让噪声毁了你的控制

传感器信号进来,第一件事就是滤波。为什么?因为六维力传感器的原始信号里,混杂着各种噪声:机械振动噪声、电磁干扰、量化噪声……你不处理,控制器就会把这些噪声当成真实的力去响应,结果就是机器人抖得像筛糠。

我常用的滤波策略分三步走:

  1. 硬件低通滤波:在传感器内部或采集卡上,先做一级模拟低通滤波。截止频率一般设在100-200Hz。这一步能干掉大部分高频噪声。
  2. 软件均值滤波:对采样点做滑动窗口平均。窗口大小我一般取5-10个点。注意,窗口太大信号会滞后,太小滤波效果差。
  3. 自适应滤波:对于机器人运动产生的振动噪声,我会用自适应陷波滤波器。它能实时跟踪振动频率,把特定频段的噪声滤掉。

这里给一段我常用的均值滤波代码,简单但实用:

// 滑动均值滤波,窗口大小 N
#define FILTER_WINDOW 8
float buffer[FILTER_WINDOW] = {0};
int idx = 0;

float mean_filter(float raw_value) {
    float sum = 0;
    buffer[idx] = raw_value;
    idx = (idx + 1) % FILTER_WINDOW;
    
    for (int i = 0; i < FILTER_WINDOW; i++) {
        sum += buffer[i];
    }
    return sum / FILTER_WINDOW;
}

注意:滤波会引入相位延迟。对于力控来说,延迟超过5ms,控制稳定性就会明显下降。所以滤波器的阶数和窗口大小要权衡。我曾经为了追求滤波效果,把窗口设到20个点,结果力控响应慢得像老太太过马路。

4.3 重力补偿与零偏校准:消除“假力”

这是最容易被忽视,但也是最容易出问题的地方。你想想看,传感器装在机器人末端,它本身就有自重。机器人换个姿态,重力在传感器各轴上的分量就变了。如果不做补偿,传感器读到的力就是“真实接触力 + 重力分量”,这会导致控制完全乱套。

重力补偿的原理其实很简单:知道传感器当前姿态,把重力矢量投影到传感器坐标系上,然后减去。但实际做起来,有几个坑:

  • 质心位置要准:传感器本身、末端工具、夹爪,它们的质心位置必须精确测量。差1mm,补偿误差可能就有0.5N。
  • 姿态要实时:补偿用的姿态角必须来自机器人正解,不能有延迟。我见过有人用上一周期的姿态来补偿本周期的力,结果越补越乱。
  • 零偏要常校:传感器零偏会随温度和时间漂移。我建议每次上电后,让机器人做一个“零位校准动作”——在无接触状态下,采集一段数据取平均,作为零偏值。

下面是我常用的重力补偿流程:

// 重力补偿伪代码
// 输入:原始力 F_raw (6维向量)
// 输入:当前姿态 R (3x3旋转矩阵)
// 输出:补偿后的力 F_comp

// 1. 获取传感器坐标系下的重力矢量
Vector3d g_world = {0, 0, -9.81};  // 世界坐标系重力
Vector3d g_sensor = R.transpose() * g_world;  // 转到传感器坐标系

// 2. 计算重力产生的力和力矩
// m: 末端总质量, p: 质心在传感器坐标系下的位置
Vector3d F_gravity = m * g_sensor;
Vector3d M_gravity = p.cross(F_gravity);

// 3. 减去重力分量和零偏
F_comp = F_raw - [F_gravity; M_gravity] - zero_bias;

避坑指南:我曾经在一个项目中,重力补偿怎么调都不对。后来发现,是末端夹爪的质心位置标错了。那个夹爪结构不对称,质心不在几何中心。所以,标定质心时,一定要用“悬挂法”或“力矩平衡法”实测,别只看CAD模型。

4.4 本章知识体系

为了让你更直观地理解本章内容,我画了一张流程图,把力传感器信号处理的整个链路串起来:

力传感器信号处理链路 传感器选型 量程/分辨率/刚度 信号采集 采样率≥1kHz 信号滤波 低通+均值+自适应 重力补偿 质心+姿态+零偏 干净力信号 用于柔顺控制 零偏校准 上电自动校准 关键点:每一步都会影响最终力控精度,缺一不可 我的经验:信号处理占力控系统调试工作量的60%以上,别急着调控制参数,先把传感器信号搞干净

嗯,这张图基本把今天的内容串起来了。从选型开始,到采集、滤波、补偿,最后输出干净的力信号。每一步都有坑,但每一步也都有解法。

最后说一句,力传感器信号处理这件事,说白了就是“去伪存真”。把假的力(重力、噪声、零漂)去掉,留下真的力(接触力),你的柔顺控制才能稳如老狗。好了,今天就到这里,大家回去可以拿自己的传感器试试,看看滤波前后的信号差别有多大。

专注资料整理