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 信号滤波与去噪:别让噪声毁了你的控制
传感器信号进来,第一件事就是滤波。为什么?因为六维力传感器的原始信号里,混杂着各种噪声:机械振动噪声、电磁干扰、量化噪声……你不处理,控制器就会把这些噪声当成真实的力去响应,结果就是机器人抖得像筛糠。
我常用的滤波策略分三步走:
- 硬件低通滤波:在传感器内部或采集卡上,先做一级模拟低通滤波。截止频率一般设在100-200Hz。这一步能干掉大部分高频噪声。
- 软件均值滤波:对采样点做滑动窗口平均。窗口大小我一般取5-10个点。注意,窗口太大信号会滞后,太小滤波效果差。
- 自适应滤波:对于机器人运动产生的振动噪声,我会用自适应陷波滤波器。它能实时跟踪振动频率,把特定频段的噪声滤掉。
这里给一段我常用的均值滤波代码,简单但实用:
// 滑动均值滤波,窗口大小 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 本章知识体系
为了让你更直观地理解本章内容,我画了一张流程图,把力传感器信号处理的整个链路串起来:
嗯,这张图基本把今天的内容串起来了。从选型开始,到采集、滤波、补偿,最后输出干净的力信号。每一步都有坑,但每一步也都有解法。
最后说一句,力传感器信号处理这件事,说白了就是“去伪存真”。把假的力(重力、噪声、零漂)去掉,留下真的力(接触力),你的柔顺控制才能稳如老狗。好了,今天就到这里,大家回去可以拿自己的传感器试试,看看滤波前后的信号差别有多大。