java - 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
解决方案
根据有关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
一些ms
或kotlin使用
delay
.runBlocking
推荐阅读
- ios - 适用于 iOS 7+ 的 swift 版本
- makefile - 为什么 make 命令在这里失败
- bokeh - Bokeh MultiLine p.add_tools(HoverTool(), renderers = [multiline]) 不工作
- angular - 如何在 Angular 6 中编辑材料日期选择器中的日期格式?
- javascript - lint 双逗号数组
- dialogflow-es - 当我的对话流培训页面充满 GOOGLE_ASSISTANT_WELCOME 时是否正常?
- mysql - 如何仅返回列的特定部分?
- python - macOS 中导入 PycURL 报错
- ibm-cloud-infrastructure - SoftLayer_Location/getDatacenters API 对不同数据中心的响应不一致
- java - Addon 中的 Hybris 组件未调用控制器