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

问题:

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

说明:

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

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

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

【问题讨论】:

    标签: android android-sensors data-synchronization android-api-levels system-identification


    【解决方案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 之后我们不需要在深度睡眠后重新计算时间差异的想法有多有效?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多