Java Android传感器使用连续模式每10毫秒捕获传感器数据

Java Android传感器使用连续模式每10毫秒捕获传感器数据,java,android,android-sensors,Java,Android,Android Sensors,我试图以100hz的频率捕捉加速度、陀螺仪、磁力数据,这是每10毫秒一次的采样率,通常的采样率不适合这个模式,游戏是20ms,正常是200ms,然后你有最快的速度,是0ms 我可以看到Android引入了传感器直接通道和传感器连续报告模式,可以使用采样周期进行设置。然而,我在任何地方都看不到任何关于如何完全实现这一点的文档或示例。有经验的人请告诉我。目前,我使用的onChange回调不适合: private void registerListener() { Sensor

我试图以100hz的频率捕捉加速度、陀螺仪、磁力数据,这是每10毫秒一次的采样率,通常的采样率不适合这个模式,游戏是20ms,正常是200ms,然后你有最快的速度,是0ms

我可以看到Android引入了传感器直接通道和传感器连续报告模式,可以使用采样周期进行设置。然而,我在任何地方都看不到任何关于如何完全实现这一点的文档或示例。有经验的人请告诉我。目前,我使用的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中处理事件,但是这不是所需的10

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

int:速率传感器事件在以下位置传递。这只是对系统的一个提示。接收事件的速度可能快于或慢于指定的速率。通常事件接收速度更快。该值必须是SENSOR_DELAY_NORMAL、SENSOR_DELAY_UI、SENSOR_DELAY_GAME或SENSOR_DELAY_faster中的一个,或者是事件之间所需的以微秒为单位的延迟。以微秒为单位指定延迟仅适用于Android 2.3(API级别9)以后的版本。对于早期版本,必须使用传感器延迟常数之一

因此,您可以尝试10毫秒的采样周期。如果速度较慢,那么你对此无能为力。但是如果速度更快,您可以尝试使用
Thread.sleep
进行几次
ms
kotlin使用
delay
使用
runBlocking

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

int:速率传感器事件在以下位置传递。这只是对系统的一个提示。接收事件的速度可能快于或慢于指定的速率。通常事件接收速度更快。该值必须是SENSOR_DELAY_NORMAL、SENSOR_DELAY_UI、SENSOR_DELAY_GAME或SENSOR_DELAY_faster中的一个,或者是事件之间所需的以微秒为单位的延迟。以微秒为单位指定延迟仅适用于Android 2.3(API级别9)以后的版本。对于早期版本,必须使用传感器延迟常数之一

因此,您可以尝试10毫秒的采样周期。如果速度较慢,那么你对此无能为力。但是如果速度更快,您可以尝试使用
Thread.sleep
进行几次
ms
kotlin使用
延迟
使用
运行阻塞

您不能。虽然您可以向系统提示所需的采集速率,但它仍可能选择不同的速率,甚至偏离所选择的速率(特别是当传感器同时用于其他任务时)。此外,由于它只是将数据交给您的听众,因此您无法延迟采集

我自己还没有尝试过SensorDirectChannel,但它似乎无法解决您的问题。此处显示了所有可选择频率预设的状态

实际利率预计在名义利率的55%至220%之间

您最好的选择是简单地请求一个足以满足您需求的速率(或者可能是
传感器\ u延迟\ u最快的
),并丢弃过早到达的事件。根据您的用例,只需丢弃在10毫秒之前到达的任何内容(只需与最后一个未丢弃的时间戳进行比较)或在值之间进行实际插值,即可获得与所需时间戳完全匹配的内容


还要注意,您列出的传感器通常具有非常不同的最大采样率。虽然加速度计和陀螺仪几乎总是至少达到100赫兹(即10毫秒周期),但有许多磁强计不会超过50赫兹。您可以查看数千名用户的统计数据,这些用户以最快的速度运行传感器以及单个设备。

您不能。虽然您可以向系统提示所需的采集速率,但它仍可能选择不同的速率,甚至偏离所选择的速率(特别是当传感器同时用于其他任务时)。此外,由于它只是将数据交给您的听众,因此您无法延迟采集

我自己还没有尝试过SensorDirectChannel,但它似乎无法解决您的问题。此处显示了所有可选择频率预设的状态

实际利率预计在名义利率的55%至220%之间

您最好的选择是简单地请求一个足以满足您需求的速率(或者可能是
传感器\ u延迟\ u最快的
),并丢弃过早到达的事件。根据您的用例,只需丢弃在10毫秒之前到达的任何内容(只需与最后一个未丢弃的时间戳进行比较)或在值之间进行实际插值,即可获得与所需时间戳完全匹配的内容


还要注意,您列出的传感器通常具有非常不同的最大采样率。虽然加速度计和陀螺仪几乎总是至少达到100赫兹(即10毫秒周期),但有许多磁强计不会超过50赫兹。您可以查看数千名用户在
SENSOR\u DELAY\u faster
以及单个设备上运行传感器的统计数据。

相关:相关:谢谢。我在传感器直接通道上找不到足够的信息,也不相信它能解决我的问题。我听从了你的建议,以更高的速度采集样本,并在我需要的10毫秒时间内对结果进行了民意调查。谢谢。我在传感器直接通道上找不到足够的信息,也不相信它能解决我的问题。我听从了你的建议,以高价收集了样品