Java Android传感器使用连续模式每10毫秒捕获传感器数据
我试图以100hz的频率捕捉加速度、陀螺仪、磁力数据,这是每10毫秒一次的采样率,通常的采样率不适合这个模式,游戏是20ms,正常是200ms,然后你有最快的速度,是0ms 我可以看到Android引入了传感器直接通道和传感器连续报告模式,可以使用采样周期进行设置。然而,我在任何地方都看不到任何关于如何完全实现这一点的文档或示例。有经验的人请告诉我。目前,我使用的onChange回调不适合:Java Android传感器使用连续模式每10毫秒捕获传感器数据,java,android,android-sensors,Java,Android,Android Sensors,我试图以100hz的频率捕捉加速度、陀螺仪、磁力数据,这是每10毫秒一次的采样率,通常的采样率不适合这个模式,游戏是20ms,正常是200ms,然后你有最快的速度,是0ms 我可以看到Android引入了传感器直接通道和传感器连续报告模式,可以使用采样周期进行设置。然而,我在任何地方都看不到任何关于如何完全实现这一点的文档或示例。有经验的人请告诉我。目前,我使用的onChange回调不适合: private void registerListener() { Sensor
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毫秒时间内对结果进行了民意调查。谢谢。我在传感器直接通道上找不到足够的信息,也不相信它能解决我的问题。我听从了你的建议,以高价收集了样品