0

問題:同步「SensorEvent.timestamp」與「System.nanoTime()」或「SystemClock.elapsedRealtimeNanos()」

我需要一些數據同步設置時間標記使用System.nanoTime()用另一個時間 - 使用SensorEvent.timestamp加蓋。

說明:

我工作的一個四軸飛行器的系統識別。數據採集​​使用Android API完成。我係統的輸入是脈衝寬度調製(PWM),使用System.nanoTime()進行時間標記,頻率爲200 Hz。

該系統的輸出是安卓系統的傳感器測量結果,使用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()以原子方式成爲可能,並使用和System.nanoTime()SystemClock.elapsedRealtimeNanos()偏移之間SensorEvent.timestamp既弄清楚傳感器是使用哪一個。一旦你有,你可以得到每個傳感器事件的絕對時間戳,將您的SensorEvent.timestampSystem.nanoTime()SystemClock.elapsedRealtimeNanos()(分別)之間的增量加到您的System.currentTimeMillis()。這不是完美的,可能會有幾毫秒的時間,但是我們可以得到它。

希望有幫助!