问题:
我需要将一些使用System.nanoTime()
时间戳的数据集与另一个使用SensorEvent.timestamp
时间戳的时间集同步。
描述:
我正在研究一架四旋翼飞机的系统识别。数据采集使用安卓API进行。我的系统的输入是脉宽调制(PWM(,它使用频率为200 Hz的System.nanoTime()
进行时间戳。
该系统的输出是Androids的传感器测量值,这些测量值使用SensorEvent.timestamp
进行时间标记。
我查看了许多在线资源,但遗憾的是没有帮助。我可以随时访问SensorEvent.timestamp
吗?这样我就可以用这个时钟给输入打时间戳了?
恐怕这个问题有点复杂。SensorEvent.timestamp
在某个时候从System.nanoTime()
切换到SystemClock.elapsedRealtimeNanos()
,但就设备和API级别而言,尚不清楚这是何时发生的。事实上,它似乎完全依赖于制造商:https://code.google.com/p/android/issues/detail?id=56561
此外,这些时钟相对于不同的事件或时间点计数,并且nanoTime()
不一定在深度睡眠模式中继续计数;Android:深度睡眠的时间间隔(System.nanoTime((,System.currentTimeMillis((,SystemClock.elapedRealtimeNanos(((
我们发现解决这个问题的唯一方法是尽可能原子化地定期记录System.currentTimeMillis()
、System.nanoTime()
和SystemClock.elapsedRealtimeNanos()
,并使用SensorEvent.timestamp
与System.nanoTime()
和SystemClock.elapsedRealtimeNanos()
之间的偏移量来确定传感器使用的是哪一个。一旦你有了它,你就可以获得每个传感器事件的绝对时间戳,将SensorEvent.timestamp
和System.nanoTime()
或SystemClock.elapsedRealtimeNanos()
之间的增量(分别(添加到System.currentTimeMillis()
中。它并不完美,可能会偏离几毫秒,但它已经和我们能得到的一样好了
希望能有所帮助!