OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 19403|回复: 11

有没有用过互补滤波的,滤波方法大汇集

[复制链接]

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-7-20
在线时间
0 小时
发表于 2013-8-2 14:24:47 | 显示全部楼层 |阅读模式
现在在做一个用九轴传感器的,传过来的数据比较乱,有没有一种办法可以让数据稳定,搜索了很多滤波方法,有最普通的十种滤波方法,互补滤波方法,卡尔曼滤波方法,还有没有更好的滤波方法,大家进来交流一下
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-2 17:40:36 | 显示全部楼层
是不是你读数有问题啊,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-7-17
在线时间
0 小时
发表于 2013-8-2 17:57:44 | 显示全部楼层
好像大多都用的卡尔曼滤波~但这方法不容易整明白
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-8-2 18:35:22 | 显示全部楼层
九轴要用数据融合。
把加速度计和陀螺仪的数据互相修正。
在进行数据融合前,最好对加速度数据进行窗口滤波。陀螺仪数据可以不用滤波。
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-8-2 18:36:06 | 显示全部楼层
不知道你说的数据比较乱,是指的啥数据
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-8-2 18:37:34 | 显示全部楼层
还有扩展卡尔曼、自适应、fir、iir之类的
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-3 22:44:21 | 显示全部楼层
回复【6楼】lsj9383:
---------------------------------
我们做的使用九轴传感器,采集三个轴的加速度,计算角度,和采集一个轴的角速度计算角度,需要用一阶互补滤波融合到一起,可是怎么用一阶互补滤波呢,求教啊
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-3 22:48:02 | 显示全部楼层
一阶互补 
// a=tau / (tau + loop time) 
 // newAngle = angle measured with atan2 using the accelerometer 
//加速度传感器输出值 
 // newRate = angle measured using the gyro 
// looptime = loop time in millis()   
float tau=0.075; 
float a=0.0;  
float Complementary(float newAngle, float newRate,int looptime) 
{  
float dtC = float(looptime)/1000.0; 
a=tau/(tau+dtC);
 x_angleC= a* (x_angleC + newRate * dtC) + (1-a) * (newAngle);
return x_angleC;
  }
这是在网上找到的最多的一阶互补滤波的程序,looptime怎么得到的,tau怎么选?


回复【6楼】lsj9383:
---------------------------------
一阶互补 
// a=tau / (tau + loop time) 
 // newAngle = angle measured with atan2 using the accelerometer 
//加速度传感器输出值 
 // newRate = angle measured using the gyro 
// looptime = loop time in millis()   
float tau=0.075; 
float a=0.0;  
float Complementary(float newAngle, float newRate,int looptime) 
{  
float dtC = float(looptime)/1000.0; 
a=tau/(tau+dtC);
 x_angleC= a* (x_angleC + newRate * dtC) + (1-a) * (newAngle);
return x_angleC;
  }
这是在网上找到的最多的一阶互补滤波的程序,looptime怎么得到的,tau怎么选?
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-8-4 09:24:30 | 显示全部楼层
回复【8楼】曹小旗:
---------------------------------
looptime应该是你代码里面的采样周期,单位s。
x_angleC= a* (x_angleC + newRate * dtC) + (1-a) * (newAngle); 
当前角度 = 比例系数a*(当前角度 + 陀螺仪角速度*采样时间T) + (1-比例系数a)*加速度计得到的角度

比例系数a(由tau得到),你有自己试,看tau取什么效果的时候比较好。
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-8-4 09:28:39 | 显示全部楼层
回复【8楼】曹小旗:
---------------------------------
这个方法不是特别好(自己感觉),因为没有办法完全抑制陀螺仪的零漂。

我用的数据融合方式是PI融合。

通过向量叉乘,算出3个角度差,再通过pi调节,调整陀螺仪的角速度。效果比较好,已经实际用过了。
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-7-20
在线时间
0 小时
 楼主| 发表于 2013-8-4 12:22:44 | 显示全部楼层
回复【10楼】lsj9383:
---------------------------------
发个程序看看,不是太懂。
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-8-4 13:25:59 | 显示全部楼层
回复【11楼】曹小旗:
---------------------------------
这个是姿态解算的一个前步环节,你可以去网上查查imu代码。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 21:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表