Android磁力计采样率提高/抖动减少

时间:2012-09-24 16:11:03

标签: android android-ndk

我想就磁力计的采样率和抖动问一些帮助。 我正在与一些涉及高速磁场采样应用的人一起开展项目。尽管我们已经开发出一种算法来解决我们遇到的抖动和其他问题,但我们还是希望以某种方式提高采样率,同时尽可能地尝试减少采样抖动。提高采样率将使我们能够为我们的应用取得更好的结果。我们使用的是三星Nexus S,根据我们进行的测试,我们观察到采样率在15ms到20ms之间,有时高峰时间约为50ms(这是在连续事件之间)。

我们已经采用不同的方法来尝试开发这些问题的解决方案,但到目前为止没有取得任何成功。 首先,我们考虑修改当前的磁力计(AK8973)设备驱动程序,但我们很快意识到瓶颈不可能,因为设备驱动程序直接实现了正确的传感器操作模式,数据读取和尊重传感器硬件时序约束。 作为第二种选择,我们使用Android NDK开发了一个小代码来获取样本,以比较连续事件之间(即样本之间)获得的时间与Java级别开发的代码。可悲的是,结果几乎是一样的。 作为最后的替代方案,我们目前正在尝试理解API如何处理事件并将其传递给Java。也就是说,如果存在瓶颈,我们会尝试更改代码来解决问题。但是,我们不确定瓶颈是否在底层硬件或软件API中。

我们用于NDK的代码基于Android文档(NativeActivity)提供的示例以及我们通过Google搜索(google群组和其他文章)遇到的其他一些示例。我们发现的文章非常有趣(Native SamplingSensor Sampling Performance)。尽管据报道本机采样允许更好的性能,但在我们的情况下似乎没有发生。

我们想知道是否真的可以获得更高的采样率,或者是否有人已经开发出解决方案。是软件或硬件级别的瓶颈吗? 在上面引用的文章中,提到自定义库(FreeMotion)能够提供更好的性能结果,作为原始传感器库的替代,因为它直接与驱动程序一起使用。有没有人之前使用过这个图书馆,如果是的话,你可以向我们提供你的结果吗?

1 个答案:

答案 0 :(得分:1)

使用另一款智能手机Samsung Galaxy Nexus,我们决定收集更多磁力计数据样本,并进行一些统计分析,并比较三星Nexus S的结果。这次我们使用的是Android v4.1.2。我们再次观察到,使用两个智能手机比较NDK与SDK API时,我们能够收集数据的速率并没有显着提高,分别使用ASensor_getMinDelay()SENSOR_DELAY_FASTEST的值,从而获得最佳性能。然而,对于具有NDK API的智能手机而言,时间戳抖动减少非常重要,无论使用何种方法:轮询或基于回调。通常,轮询提供很少或没有更好的结果,并且应该更加CPU密集。

三星Galaxy Nexus传感器硬件非常优越,因此可以自然地将速率调整到所需的事件速率ASensor_getMinDelay()以上。然而,对于三星Nexus S来说,这是不可能的;对于较低的速率,不满足目标速率并且以甚至更慢的速率获取样本。激活多个传感器,整体抖动降低幅度大于仅使用一个传感器。