首页 > 解决方案 > Android Sensors 使用连续模式每 10 毫秒捕获一次 Sensor 数据

问题描述

我正在尝试以 100hz 捕获 Accel、Gyro、Mag 数据,这是每 10 毫秒的采样率,通常的速率不适合这种模式 GAME 是 20ms,NORMAL 是 200ms,那么你有 FASTEST,即 0ms。

我可以看到Android引入了传感器直接通道和传感器报告模式连续,可以使用sampling_period_ns进行设置。但是,我在任何地方都看不到有关如何完全实现这一点的任何文档或示例。哪位有经验的可以告诉我一下。目前我使用的 onChange 回调不适合:

    private void registerListener() {
        SensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
        SensorManager.registerListener(this, gyroscope, SensorManager.SENSOR_DELAY_GAME);
        SensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_GAME);
        SensorManager.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_GAME);
    }

然后我处理 onSensorChanged 中的事件,但是这是 20 毫秒而不是所需的 10

标签: javaandroidandroid-sensors

解决方案


根据有关registerListener方法的文档,您可以在中指定费率ms。对于第三个参数samplingPeriodUs,文档状态

int:速率传感器事件的发送时间。这只是对系统的提示。事件的接收速度可能比指定的速率快或慢。通常会更快地接收到事件。该值必须是 SENSOR_DELAY_NORMAL、SENSOR_DELAY_UI、SENSOR_DELAY_GAME 或 SENSOR_DELAY_FASTEST 之一,或者是所需的事件之间的延迟(以微秒为单位)。以微秒为单位指定延迟仅适用于 Android 2.3(API 级别 9)以后。对于早期版本,您必须使用 SENSOR_DELAY_* 常量之一

因此,您可以尝试 10 的采样周期ms。如果速度较慢,则您无能为力。但如果更快,那么您可以尝试Thread.sleep一些mskotlin使用 delay.runBlocking


推荐阅读