Home
github代码见: https://github.com/ssht428/force-torque-sensor-filter.git
最近做一个医疗机器人,上面安装了力矩传感器,为了防止机器人撞到其他设备或者人。客户要求力矩响应在50N以上就要机器人停止运动,所以传感器本身的输出波动要小于15N,否则很容易误触发。
由于这个项目控制器是采用的其他家的,他们在力矩传感器调试这边就简单导入了厂商的xml,读取传感器实时数据,然后使用卡尔曼kalman滤波,对当前负载进行重力补偿一下就输出了。
前面调试了2个星期,即使空载,在只是大范围转动C角时,输出始终有个别数据超出15,所以反复调试各种修正系数,但是没有多大效果。

所以就想着加些滤波及对重力补偿重新建模,但是由于控制器供应商那边的技术人员比较忙,好多功能没有增加,只是让我这边反复调整kalman filter的Q、R值,以及修正算法中的各个系数。调试了一两天,只能勉强满足无负载和小负载情况下慢速运动机器人,但是不能满足客户验收标准的速度。
所以自己就吃饱了准备做个简单的“Qt界面+各种filter+重力补偿”程序,主要验证一下力矩传感器最优滤波算法(卡尔曼、FIR、IIR...),以及重力补偿中具体各参数关联性。
下面是宇立传感器自带的软件iDAS RD.exe界面,注意,这个界面是固定大小,在小分辨率的电脑上是无法显示完全的,至少要1577*1200以上。

用厂商软件连接RS232采取的数据,9:50前采样频率是400Hz,之后是200Hz:
iDASRD Channel Data 2022-03-04_09-42-06.txt
iDASRD Channel Data Speed50 2022-03-04_10-21-27.txt
iDASRD Channel Data 2022-03-04_09-59-18.txt
所有数据打包.zip
更新@20220316: 先用matlab进行分析一下^.^ 然后再自己写滤波算法。。。
开始以为采集的数据含有高频杂波,所以想用FFT分析一下杂波频率,然后用个低通滤波器消除。

但是对原始数据FFT之后,频率根本没有明显的规律,后来想了下,现在机器人/上位机端采集数据是200Hz,而力矩传感器这种东西放在机器人上,只要机器人不动,其数据只能在固定值上下波动和缓慢漂移。而所谓高频信号已经在厂家自己的转换器中处理过了。
下图是原始数据的FFT图:

既然没有高频杂波,只能考虑常规的滤波方法了,比如平均滤波、中值滤波等等,kalman滤波是机器人控制器厂商做的,我就不测试了。下面是我用滑动平均滤波测试结果:

设置滑动窗口大小,发现可以明显降低滤波率。 注意,初值最好设成“去皮值”,这样可以补偿平均滤波导致的相位偏移。
更新@20220320
比较一下 “均值”、“低通”、“一阶卡尔曼” 对力矩传感器采集数据的处理,如下图所示:

可见,要想更平滑一些,还是选取均值比较好,当然也有可能是此处均值窗口=100,比较大导致平滑好。