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()。这不是完美的,可能会有几毫秒的时间,但是我们可以得到它。

希望有帮助!