我想从“便宜”的陀螺仪(60 $)中过滤角速度数据。这些值在四轴飞行器应用中用作非线性控制器的输入。我不希望消除读数的偏差。

编辑:
我正在使用通过i2c与Arduino uno连接的
l2g4200d陀螺仪。以下样品是用arduino采集的,通过串行发送并使用matlab进行绘制。

当传感器稳定时,该图会显示一些不希望的尖峰。 >
如何过滤这些尖峰?

第一种方法:尖峰已衰减但仍然存在...

让我们考虑以下示例,其中有两个快速旋转。假设“快速运动”的频率分量是我将在最终应用程序中处理的频率分量。



下面,信号的离散傅立叶变换



使用此滤波器可以保留信号的主要成分。



尽管不希望的尖峰衰减了三倍,但该图显示出轻微的相移...



并且尖峰仍然存在。如何改善此结果?
。谢谢。

编辑2:

1./2。我正在使用Sparkfun的分线板。您可以在这篇文章中找到使用Arduino和陀螺仪的电路:您可以使用L3G4200D陀螺仪,Arduino和Matlab滚动吗?
我在电路中增加了上拉电阻。我将排除此选项,因为其他传感器通过i2c接口连接,并且它们工作正常。
在陀螺仪的集成电路附近没有安装任何去耦电容器。我正在使用的分线板有(0.1 uF)。请检查下面原理图的左侧,也许我错了。



电动机具有单独的电路,我已将所有组件焊接在原型板上。 br />这很有趣。测试中使用的采样频率为200Hz。将更新频率从200Hz增加到400Hz,使故障增加了一倍。打开页面底部的注释,然后按Ctrl-F virtual1

评论

您使用的是什么芯片,电路是什么,使用的通信协议是什么,如何测试呢?我可以推测出峰值的原因,但它们都是黑暗中的镜头,没有更多信息。

请看我的编辑

这是个有趣的问题。您是否有任何独立的速度验证,即可以用来计算加速度的编码器,还是可以借以用于剖析的更高分辨率的加速度计?

您是否尝试过简单的中值滤波器?您仍然会得到一些滞后效应。

另一个选择是根据与先前样本的差异忽略那些样本(假设那些尖峰是一个点,没有上下波动)。

#1 楼

您是否尝试过中值滤波?

这种非线性技术适用于抵消尖峰的存在,同时保留输入信号的高频内容。

#2 楼

您提供了部件号和协议,但是


您可以提供电路图中如何安装的示意图吗?
您在使用模块还是单个芯片?
是全部焊接在一起还是连接在面包板上?
这是放在桌子上还是类似的东西上,或者实际上是在四轴飞行器机身上?四轴飞行器电动机正在运行吗?
您使用的采样率是多少?

我问,因为尖峰看起来太大了,以至于“只是”噪声。然后,我对故障排除的想法将是解决尖峰的根本原因,而不是尝试从输出中将其过滤掉。我能想到的潜在问题与我要问的问题有关,所以对于我问的每个问题,我都认为可能是:


可能是电源问题或通讯线路问题。原理图上需要注意的事情:(A)检查电源电压是否确实在2.4-3.6V的允许输入范围内(第11页); (B)检查去耦电容器是否已安装并连接到合适的电压; (C)检查是否安装了I2C上拉电阻; (D)检查电路中还安装了什么其他大型设备(阅读:电动机),并检查电源是否能够提供峰值电流。
再次,检查电容器是否去耦,以及是否正确焊接;在模块上,所有东西都可以正确焊接,但不包括上拉电阻。同样,面包板连接意味着系统可能无法牢固地连接到任何东西。
虽然不太可能,但松动的芯片/模块可能会受到某些振动的影响(可能来自附近的扬声器),这可以解释峰值。如果电动机正在运行,则可能性更大。另外,电动机可能会使您的电源消耗掉,从而给陀螺仪造成问题。
这主要是一个好奇心问题,但是更高的通信速率往往会导致/加剧问题。

我想这可能是电源电压问题,无论是直接给芯片还是在通信线路上,但同样,它们都是黑暗中的镜头,没有更多信息。

:编辑:

在发布的链接OP中,有此注释/答案:


所做的工作是在设置它读取A8和28寄存器,然后进行比较。如果它们不同,请再次阅读!似乎已经解决了我100%的故障。现在,我可以进行和平校准了。


,再加上其他有类似问题的用户,我会认为这是有缺陷的芯片设计。如果您评估数据,并且当出现此故障时最低有效字节实际上始终为255,那么您始终可以仅检查该条件并忽略该样本,或者将先前的读数替换为当前读数,或者执行以下操作由其他网站上的“ virtual1”建议。我会避免将其设置为零,因为如果在实际数据有效的情况下得到尖峰,这可能会导致“反向毛刺”。

评论


$ \ begingroup $
请参阅EDIT2。我感谢您的帮助!
$ \ endgroup $
– UserK
15-10-23在14:16

$ \ begingroup $
好的,这似乎是解决问题的唯一方法。忽略@Brian Lynch建议的不需要的数据。最后一个问题。是否存在基于频率的方法来仅选择尖峰,因为它们始终具有相同的特性?
$ \ endgroup $
– UserK
2015年10月23日在17:50



$ \ begingroup $
非常感谢Chuck。我会接受您的回答,但首先我需要“实施”解决方案。
$ \ endgroup $
– UserK
15-10-23在17:58

$ \ begingroup $
@UserK-我不确定您所说的“基于频率的方法”是什么意思,但是尖峰不会按我可以告诉的规则间隔或规律发生,所以我认为最好的选择是看一下通过仅评估255的最低有效字节或通过比较外部建议的A8和28寄存器为virtual1来确定是否出现尖峰信号。
$ \ endgroup $
–卡盘
15-10-23在18:09

$ \ begingroup $
我认为virtual1的建议更“防弹”,因为它通过比较寄存器并重新轮询设备来检测已验证的错误。如果输出为3个字节长,则忽略LSB中255的每个结果意味着您最多忽略2 ^(8 + 8)= 65,536个可能有效的输出。如果您要做的只是在LSB为255的情况下重新轮询设备,并且该值有效,则可以连续不断地重新轮询设备。
$ \ endgroup $
–卡盘
15-10-23在18:10



#3 楼

一种选择是利用指数移动平均线。下图显示了平均值为零,方差为0.4的高斯噪声破坏的数据,以及滤波器如何出色地去除尖峰噪声数据。



x = -pi:0.01:2*pi;
perfectY = cos(x); % generate data 
noisyY = perfectY + .4 * randn(1, length(perfectY)); % corrupt data by noise 

a = 0.13; % tuning parameter 
preSmoothY = cos(-pi); % arbitrary initial value 


for i = 1:length(noisyY)
    Smooth = (1-a)*preSmoothY + a*noisyY(i);
    preSmoothY = Smooth;
    expY(i) = Smooth;
end

plot( x,noisyY,'g', x, expY,'r', 'LineWidth', 2)
hold on
plot(x, perfectY, 'b','LineWidth', 2)
grid on
legend('noisy  data', 'filtered  data', 'data')


另一个选择是使用卡尔曼滤波器。如果您满足要求,它是一个最佳的滤波器,这意味着没有一个滤波器可以比Kalman更好地运行。不幸的是,滤波器对信号施加了一些约束,例如线性和高斯性。此外,必须精确描述系统。