gpt4 book ai didi

Android:通过使用 NDK 和轮询提高传感器采样率

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:50 28 4
gpt4 key购买 nike

我想编写一个应用程序,从不同的传感器(GPS、加速度计、陀螺仪、罗盘)读取尽可能多的传感器值(每次)。所以我必须调查使用 NDK 是否有优势。

这是我的问题:

a) 从传感器读取传感器值时的瓶颈是什么?是传感器本身还是Java?我可以通过使用 NDK 来提高速率吗? (我认为 GPS 的瓶颈是传感器本身,但我读过,例如陀螺仪传感器非常快)我找到了 this thread瓶颈似乎是传感器。有人可以证实这一点吗?

b) 轮询而不是使用 EventListener 是否会提高速率?快速读取传感器值的最佳方式是什么?

c) NDK 的使用对应用程序的功耗有什么影响吗?我没有找到任何相关信息。

d) 我是 Android 新手。使用 NDK 而不是普通的 Java 是否更实惠?根据这个sample-code使用事件队列与传感器交互似乎很简单,但是编译代码并从应用程序中使用它的成本是多少?

提前致谢。

最佳答案

a) 从传感器读取传感器值时的瓶颈是什么?

(注意:这只是我的印象和推理。除了我开发应用程序“phyphox”的经验外,我没有这方面的资料来源,该应用程序记录了用于物理实验的传感器数据。)

我不确定这是否应该称为“瓶颈”,但似乎 SENSOR_DELAY_FASTEST 的速率是制造商的设计选择。 SENSOR_DELAY_FASTEST 通常会产生 100Hz 左右的速率,但某些设备(Nexus/Pixel、某些 Smasung 旗舰产品)在相同设置下可提供高达 500Hz 的速率。如果你读出传感器的制造商和型号,你通常可以找到实际设备的数据表,你会注意到,它们通常可以更快地驱动。我认为速率是快速速率和合理噪声之间的权衡。

此外,(也许更重要的是)如果制造商为 SENSOR_DELAY_FASTEST 设置了高速率,这可能会影响电池生命周期。不仅手机必须读取每个值(如果手机有专门的处理器,这个处理器需要有必要的带宽),许多应用程序使用 SENSOR_DELAY_FASTEST 设置没有太多考虑。每个值都会调用回调函数以获得新值,因此频率为 500 Hz 的手机必须以相同的速率调用此函数,并且可能会在应用程序中出现编码错误的例程,而该应用程序似乎在设备上运行顺畅提供 100 Hz。

b) 轮询而不是使用 EventListener 会提高速率吗?快速读取传感器值的最佳方法是什么?

我不知道直接轮询传感器的方法。在您链接的线程中,术语“轮询”用于“轮询”已被传感器填充的数据队列。如果有人可以在这里通过展示一种直接在 Android 上轮询传感器的方法来纠正我,我会很高兴...

c) 使用 NDK 对应用程序的功耗有什么影响吗?我没有找到任何相关信息。

如果您可以通过更高效的 native 例程来减少计算负载,则显然可以。如果您可以优化一些其他繁重的计算,我只希望产生明显的影响。

d) 我是 Android 新手。使用 NDK 而不是普通的 Java 是否更实惠?根据这个示例代码,使用事件队列与传感器交互似乎很简单,但是编译代码并从应用程序中使用它的成本是多少?

这是相当主观的,但设置和学习如何使用 NDK 及其界面花了我一段时间。一旦你让它运行起来,扩展你的代码并重新编译就可以在 Android Studio 中无缝地工作。

--

我不完全知道您打算如何处理传感器数据,但您应该考虑到 Java 可以轻松处理通常以 48 kHz 记录的音频数据。当然,音频样本是写入缓冲区的 16 位值,而不是传递给回调的 SensorEvent 对象,但您仍然可以使用 Java 实时迭代每个样本,因此除非您计划进行一些花哨的分析,否则 Java 的速度不应该是传感器问题。

您应该注意的另一件事是 SensorDirectChannel在 API 级别 26 中引入。我还没有尝试过,但是文档中提到了 RATE_VERY_FAST提供 440 赫兹至 1760 赫兹。如果你的手机支持这个...

关于Android:通过使用 NDK 和轮询提高传感器采样率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9250121/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com