Синхронизация "SensorEvent.timestamp" с "System.nanoTime()" или "SystemClock.elapsedRealtimeNanos()"
Эта проблема:
Мне нужно синхронизировать некоторые данные с отметкой времени, используя System.nanoTime()
с другой отметкой времени, используя SensorEvent.timestamp
,
Описание:
Я работаю над идентификацией системы квадрокоптера. Сбор данных осуществляется с помощью Android API. Входом в мою систему является широтно-импульсная модуляция (ШИМ), для которой ставятся метки времени с использованием System.nanoTime()
с частотой 200 Гц.
Выходные данные системы - это измерения датчиков Android, которые имеют временную отметку, используя SensorEvent.timestamp
,
Я проверил много интернет-ресурсов, но, к сожалению, не помогло. Могу ли я получить доступ SensorEvent.timestamp
когда бы я ни захотел, я ставлю отметки времени на входах, используя эти часы?
1 ответ
Боюсь, эта проблема немного сложна. SensorEvent.timestamp
переключился с того System.nanoTime()
в SystemClock.elapsedRealtimeNanos()
в какой-то момент, но неясно, когда это произошло с точки зрения устройств и уровней API. На самом деле, он полностью зависит от производителя: https://code.google.com/p/android/issues/detail?id=56561
Кроме того, эти часы считаются относительно различных событий или моментов времени, и nanoTime()
необязательно продолжать считать в режиме глубокого сна; Android: временные интервалы с глубоким сном (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()
, Это не идеально, и может быть отключено на целых несколько миллисекунд, но это настолько хорошо, насколько мы могли бы получить.
Надеюсь, это поможет!