4、力传感器与信号处理:六维力/力矩传感器选型、标定方法、滤波与去噪

各位同学,今天我们来聊聊力传感器。说实话,在柔顺控制这个领域,力传感器就是我们的「触觉」。没有它,机器人就是个瞎子,只能靠位置硬怼。我最早接触六维力传感器是在做精密装配项目的时候,那会儿踩过的坑,现在想想都心疼。好,咱们直接进入正题。

4.1 六维力/力矩传感器选型

选型这事儿,说白了就是匹配你的应用场景。不是越贵越好,也不是精度越高越好。我见过有人花大价钱买了高精度传感器,结果装在打磨头上,没两天就过载烧了。为什么?因为没考虑冲击载荷。

选型时,我建议你重点关注这几个参数:

  • 量程:Fx、Fy、Fz 和 Mx、My、Mz 六个通道的满量程值。注意,动态冲击可能达到静态载荷的 3-5 倍。
  • 精度:通常用满量程的百分比表示,比如 0.5% FS。但实际应用中,我更关注「串扰」——就是 X 方向的力会不会在 Y 方向产生读数。
  • 采样率:一般 100Hz 够用,但做高速力控时建议 1kHz 以上。
  • 过载能力:这个容易被忽略。我建议至少选 200% 过载的,不然一个意外撞击就报废了。
  • 通信接口:EtherCAT、CAN、模拟量都有。我个人偏爱 EtherCAT,实时性好,接线也简单。

核心建议:选型时,把实际工况的最大力乘以 1.5 的安全系数,再对照传感器量程。别卡着边界选,给自己留点余量。

市面上常见的品牌有 ATI、OnRobot、坤维科技等。ATI 的精度确实好,但价格也感人。坤维的性价比不错,我在几个国产项目中用过,稳定性可以接受。

4.2 标定方法

传感器买回来,第一件事不是直接用,而是标定。你想想看,出厂时的标定是在标准环境下做的,到了你的机器人上,安装面不平、温度变化、线缆拉扯,都会引入误差。

标定说白了就是建立「原始信号 → 真实力值」的映射关系。六维力传感器的核心模型是:

F = C * V

其中 F 是六维力向量 [Fx, Fy, Fz, Mx, My, Mz]ᵀ,V 是原始电压/数字信号向量,C 是 6×6 的标定矩阵。

标定步骤我总结为三步:

  1. 零点标定:传感器空载,采集一组数据,减去零偏。注意,每次上电后零偏可能不同,所以建议每次开机都做一次。
  2. 加载标定:用已知砝码或力源,在六个方向上分别加载。记录每个通道的响应。
  3. 解耦计算:通过最小二乘法求解标定矩阵 C。这一步可以用 MATLAB 或 Python 的 numpy 轻松搞定。

我的小技巧:标定时,每个方向加载 3-5 个不同大小的力,然后做线性拟合。这样能发现传感器是否存在非线性问题。我曾经遇到过一个传感器,小力时线性度很好,大力时就开始飘——幸亏标定时发现了。

这里给出一段简单的 Python 标定代码示例:

import numpy as np

# 假设我们有 6 组加载数据,每组包含 6 个通道的原始信号
# V 是 6x6 的矩阵,每行对应一个加载方向的信号
V = np.array([
    [100, 2, 1, 0, 0, 0],   # 只加 Fx
    [3, 98, 1, 0, 0, 0],    # 只加 Fy
    [2, 1, 102, 0, 0, 0],   # 只加 Fz
    [0, 0, 0, 95, 2, 1],    # 只加 Mx
    [0, 0, 0, 1, 97, 2],    # 只加 My
    [0, 0, 0, 2, 1, 99]     # 只加 Mz
])

# F 是已知的加载力值矩阵,对角线元素是加载的力/力矩大小
F = np.diag([10.0, 10.0, 10.0, 1.0, 1.0, 1.0])

# 求解标定矩阵 C = F * inv(V)
C = F @ np.linalg.inv(V)

print("标定矩阵 C:")
print(C)

实际项目中,你还需要考虑温度补偿。温度变化会导致传感器内部应变片的电阻值漂移。我习惯在标定时记录环境温度,然后做一个温度补偿表。如果温度变化超过 ±5°C,就自动查表修正。

注意:标定矩阵不是一成不变的。传感器使用一段时间后,机械结构可能发生微小变形,建议每半年重新标定一次。尤其是做过过载冲击之后,必须重新标定。

4.3 滤波与去噪

原始信号里全是噪声。电机振动、机器人本体共振、电磁干扰……这些噪声如果不处理,你的力控系统会抖得像筛子一样。我刚开始做力控时,没加滤波,结果机器人一启动,力反馈信号直接爆表,吓得我赶紧按了急停。

常用的滤波方法有这几种:

  • 低通滤波:最简单,也最常用。截止频率一般设在 10-50Hz。但要注意,截止频率太低会引入相位延迟,影响力控的响应速度。
  • 均值滤波:取 N 个采样点的平均值。适合去除随机噪声,但同样有延迟问题。
  • 卡尔曼滤波:适合动态系统,能同时估计力和噪声。但调参比较麻烦,需要懂一点状态空间模型。
  • 陷波滤波器:专门针对特定频率的噪声,比如 50Hz 工频干扰或机器人的共振频率。

我个人在实际项目中最常用的是「二阶巴特沃斯低通滤波器」。为什么?因为它通带平坦,相位响应相对线性,对力控系统的影响最小。代码实现如下:

import scipy.signal as signal
import numpy as np

# 设计一个二阶巴特沃斯低通滤波器
fs = 1000.0       # 采样率 1kHz
fc = 20.0         # 截止频率 20Hz
order = 2

b, a = signal.butter(order, fc / (fs / 2), btype='low')

# 对力信号进行滤波
force_raw = np.array([...])  # 原始力数据
force_filtered = signal.filtfilt(b, a, force_raw)  # 零相位滤波

避坑指南:我曾经用普通低通滤波,结果发现力控响应慢了 100ms,导致装配时零件撞坏了。后来改用 filtfilt(零相位滤波),延迟问题解决了。但注意,filtfilt 是非因果的,只能在离线或准实时场景使用。实时系统中,我建议用常规的 lfilter,然后通过前馈补偿延迟。

还有一个容易被忽视的问题:线缆噪声。传感器线缆如果和电机线缆走同一个线槽,电磁干扰会直接耦合进信号。我的经验是:力传感器线缆必须单独走线,而且要用屏蔽双绞线。如果条件允许,加一个磁环效果更好。

最后,我画了一张图,帮你梳理本章的知识体系:

六维力传感器与信号处理知识体系 选型 标定 滤波与去噪 量程 精度 采样率 过载能力 零点标定 加载标定 解耦计算 温度补偿 低通滤波 均值滤波 卡尔曼滤波 陷波滤波 核心目标:获取准确、实时、稳定的力/力矩信号 选型定边界 → 标定去误差 → 滤波提质量

嗯,以上就是力传感器与信号处理的全部内容。选型、标定、滤波,这三步走扎实了,你的力控系统就有了可靠的「触觉」。记住,传感器是基础,基础不牢,地动山摇。


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