4

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

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

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

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

4

1 回答 1

1

使用另一款智能手机三星 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,这是不可能的。对于较低的速率,不满足目标速率,并且以更慢的速率获取样本。激活多个传感器,总体抖动减少大于仅使用单个传感器。

于 2013-01-22T17:26:09.240 回答