带振动的加速度计数据不好

时间:2012-05-22 14:17:58

标签: android accelerometer

我正在做一个自行车电脑应用程序。我希望用加速度计计算斜坡的倾斜度,但事情并不顺利。

我已经输入了测试代码来获取传感器数据,我只是在UI速率下,并保持移动平均值超过128个样本值,大约6秒。有了手机,数据很好,我可以计算出与我的校准平面矢量相比较好的角度。

手机安装在自行车上的东西一点也不好。我希望得到一些噪音,但我希望在大时间窗口上的大量样品可以消除振动效应和一般的自行车运动。不幸的是,这只是不起作用,加速度矢量的幅度并没有真正保持在9.8左右但正在下降,这表明某些事情在某个地方是不对的。

以下是测试骑行部分数据的图表。 enter image description here

正如你可以看到在开始时静止时,幅度是可以的但是一旦我开始它就会下降。我很确定这个问题与振动有关,我最初下降,然后振动很大,然后振动,振动较小,震级回到9.8然后我在一条糟糕的道路上迅速下降,震级最终小于3

这是使用SonyErricson Xperia Active,它使用BMA250 sensor数据传感器看起来像传感器应该有能力。我对问题原因的唯一理论是,范围设置为2g范围,振动导致数据超出范围,这导致了我的问题。

有没有人见过这样的东西? 有没有人对问题的原因有任何想法?
有没有办法改变我没有找到的灵敏度?

其他信息。

确定我在过滤之前记录了原始传感器数据。这里介绍的很小一部分 Small sample of raw data 主轴是绿色和平面,我相信这应该是没有振动应该是大约8.5。对数据没有明显的限制,但是我得到的值低于8.5值而不是8.5以上。即使传感器设置为最敏感的2g范围,看起来振动也可以。我这里的最大值刚好超过15而且最小的-10井ib a + - 20 ragnge只是没有正确地居中于8.5它应该是。

我会挖出我的另一部手机,看起来有一个稍微不同的传感器BMA150并尝试使用它,但除非它是完美的,我想我将不得不放弃这个想法。

2 个答案:

答案 0 :(得分:1)

我怀疑加速度计在如此大的G范围内不是线性的。如果是这样,如果有任何不对称,它会做你所看到的。

解决方案是将加速度计安装座稍微垫一下,泡沫橡胶,笨笨的绳索,无论如何,可能将其安装在较重的舞台上以更多地过滤振动。

或(不是一个好的解决方案)尝试对错误进行建模并对其进行补偿。

答案 1 :(得分:1)

我使用相同的手机,并且几年前一个应用程序的相同平均间隔为6秒,我不记得在图中看到了这种行为。

我想知道这个问题是否与6秒平均值的累积方式有关。我遇到的一个问题是采样间隔不是恒定的,而是取决于处理器的繁忙程度。在指定时间内获取样本,但事件处理程序的调用取决于调度程序。当处理器卸载时,采样以恒定频率发生,但随着处理器工作更加努力,采样频率变得更慢且更不稳定。您可以编写应用程序以在采样时保持较低的处理器负载。我们做了6秒的样本,什么都不做,然后停止采样并处理最后一个样本集,但这只是部分成功,因为您无法控制同时运行的其他应用程序,并且调度程序正在共享处理器资源所有。在Xperia Active上我发现它偶尔会在样本之间出现几秒钟,这些样本归因于其中一个JVM中的垃圾收集。我们的解决方案是为每个样品加盖时间戳,然后对样品组进行一些质量检查,并丢弃那些未通过质量检查的样品。这是一个糟糕的解决方案,因为定义什么是好的是不精确的,当用户运行另一个使用大量资源的应用程序时,大多数样本集都可以被丢弃,因此应用程序需要额外的逻辑来处理它。

Xperia Active上不可用的当前Android API应该已经消除了这一点,因为样本可以按https://source.android.com/devices/sensors/hal-interface.html#batch_sensor_flags_sampling_period_maximum_report_latency所述进行批处理。

如果算法假设了特定数量的样本而不是计算它们并且处理器在自行车变速时更加努力,虽然我不确定它为什么会这样,但它会产生类似于第一个图形的东西,因为当自行车是下山的幅度下降,当上山时,它上升。那里有很多猜测,但是根据我对这种传感器的经验,6秒的平均值给出的震级小于3 m / s ^ 2看起来令人难以置信。