将“SensorEvent.timestamp”与“System.nanoTime()”或“SystemClock.elapsedRealtimeNanos()”同步

Posted

技术标签:

【中文标题】将“SensorEvent.timestamp”与“System.nanoTime()”或“SystemClock.elapsedRealtimeNanos()”同步【英文标题】:Synchronizing "SensorEvent.timestamp" with "System.nanoTime()" or "SystemClock.elapsedRealtimeNanos()" 【发布时间】:2017-02-06 07:59:27 【问题描述】:

问题:

我需要将一些使用System.nanoTime() 时间戳的数据集与另一个使用SensorEvent.timestamp 时间戳的数据集同步。

说明:

我正在研究四轴飞行器的系统识别。数据采集​​是使用 android API 完成的。我的系统的输入是脉冲宽度调制 (PWM),它使用 System.nanoTime() 以 200 Hz 的频率进行时间戳。

系统的输出是 Androids 的传感器测量值,使用SensorEvent.timestamp 标记时间戳。

我检查了许多在线资源,但很遗憾没有帮助。我可以随时访问SensorEvent.timestamp,以便使用此时钟对输入进行时间戳记吗?

【问题讨论】:

【参考方案1】:

恐怕这个问题有点复杂。 SensorEvent.timestamp 在某个时候从 System.nanoTime() 切换到 SystemClock.elapsedRealtimeNanos(),但就设备和 API 级别而言,尚不清楚何时发生这种情况。事实上,它似乎完全依赖于制造商:https://code.google.com/p/android/issues/detail?id=56561

此外,这些时钟相对于不同的事件或时间点进行计数,nanoTime() 在深度睡眠模式下不一定会继续计数; Android: time intervals with deep sleep (System.nanoTime(), System.currentTimeMillis(), SystemClock.elapsedRealtimeNanos())

我们发现解决问题的唯一方法是尽可能原子地定期记录System.currentTimeMillis()System.nanoTime()SystemClock.elapsedRealtimeNanos(),并使用SensorEvent.timestampSystem.nanoTime()SystemClock.elapsedRealtimeNanos()之间的偏移量找出传感器正在使用哪一个。一旦你有了它,你就可以获得每个传感器事件的绝对时间戳,将你的SensorEvent.timestampSystem.nanoTime()SystemClock.elapsedRealtimeNanos() 之间的增量(分别)添加到你的System.currentTimeMillis()。它并不完美,可能会延迟几毫秒,但我们可以做到这一点。

希望有帮助!

【讨论】:

在 API 17 之后我们不需要在深度睡眠后重新计算时间差异的想法有多有效?

以上是关于将“SensorEvent.timestamp”与“System.nanoTime()”或“SystemClock.elapsedRealtimeNanos()”同步的主要内容,如果未能解决你的问题,请参考以下文章

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - 分享此功能

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - 分享此功能

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - 分享此功能

将 Apollo for iOS 与现有项目集成?