Синхронизация "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(), Это не идеально, и может быть отключено на целых несколько миллисекунд, но это настолько хорошо, насколько мы могли бы получить.

Надеюсь, это поможет!