4

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

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

将电话安装在自行车上时,情况一点都不好。我希望得到一点噪音,但我希望大时间窗口内的大量样本能够消除振动效应和一般的自行车运动。不幸的是,这不起作用,加速度矢量的幅度并没有真正保持在 9.8 左右,而是下降得更低,这对我来说表明某处有问题。

这是来自部分试驾的数据图。 在此处输入图像描述

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

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

有没有人见过这样的事情?有没有人对问题的原因有任何想法?
有什么方法可以改变我没有找到的敏感度吗?

附加信息。

好的,我在过滤之前记录了原始传感器数据。这里展示了一个非常小 原始数据的小样本 的部分 主轴是绿色的,并且在我相信这应该没有振动的情况下它应该是大约 8.5 的平面上。数据没有明显的限制,但我得到的低于 8.5 的值多于高于 8.5 的值。即使传感器设置为最灵敏的 2g 范围,它看起来振动应该没问题 我这里的最大值刚刚超过 15 并且最小值为 -10 以及 +- 20 ragnge 只是没有正确居中在8.5应该是。

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

4

2 回答 2

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 看起来不可信。

于 2015-01-01T00:46:42.033 回答
1

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

解决方案是将加速度计支架垫多一点,泡沫橡胶,蹦极绳,无论如何,可能将其安装在更重的舞台上以更多地过滤振动。

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

于 2012-05-22T14:30:44.400 回答