将“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.timestamp
与System.nanoTime()
和SystemClock.elapsedRealtimeNanos()
之间的偏移量找出传感器正在使用哪一个。一旦你有了它,你就可以获得每个传感器事件的绝对时间戳,将你的SensorEvent.timestamp
和System.nanoTime()
或SystemClock.elapsedRealtimeNanos()
之间的增量(分别)添加到你的System.currentTimeMillis()
。它并不完美,可能会延迟几毫秒,但我们可以做到这一点。
希望有帮助!
【讨论】:
在 API 17 之后我们不需要在深度睡眠后重新计算时间差异的想法有多有效?以上是关于将“SensorEvent.timestamp”与“System.nanoTime()”或“SystemClock.elapsedRealtimeNanos()”同步的主要内容,如果未能解决你的问题,请参考以下文章
php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy
php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy
php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - 分享此功能
php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - 分享此功能