Я в немного странной ситуации. Ситуация, с которой я сталкиваюсь в настоящее время, как правило, хороша - никакого дрейфа гироскопа - но я понятия не имею, почему это так. Я ожидал, что гироскоп будет сильно дрейфовать, как везде сообщалось. Поэтому этот вопрос, чтобы найти причину, почему я не вижу никакого дрейфа.
Я использую Galaxy Nexus (Android 4.0.3) и его гироскоп, чтобы в конце концов обнаружить изменение ориентации. Во-первых, я просто хотел записать показания датчика и ожидал увидеть большие значения дрейфа, например, здесь. Также на других веб-сайтах я читал о дрейфе около 1 градуса в секунду или подобных измерениях.
Мой код для регистрации данных датчика очень прост:
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
LogSensorEventListener listener = new LogSensorEventListener(
SensorLoggerActivity.this, Sensor.TYPE_GYROSCOPE);
sm.registerListener(listener, sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
SensorManager.SENSOR_DELAY_FASTEST);
LogSensorEventListener также является очень простой реализацией SensorEventListenerInterface:
@Override
public void onSensorChanged(SensorEvent event) {
final float dT = (event.timestamp - mTimestamp) / 1000000000.f;
if (dT < 1) { // just a fix for the first step
mRelZ += event.values[2] * dT;
list.add(mRelZ);
list2.add(event.timestamp);
}
mTimestamp = event.timestamp;
mRelZ изначально установлен на 0, и два списка должны отслеживать время и измеренное значение. Если я закончил с моим измерением (нажав кнопку), значения записываются в файл:
try {
for (int i = 0; i < list.size(); i++) {
long time = list2.get(i);
if (mStartTime < 0) {
mStartTime = time;
time = 0;
} else {
time = time - mStartTime;
}
float timef = time / 1000000000.0f;
sb.append(timef);
sb.append(";");
sb.append(Math.toDegrees(list.get(i)));
sb.append("\n");
}
mOutFileStream.write(sb.toString().getBytes());
mOutFileStream.flush();
mOutFileStream.close();
} catch (IOException e) {
}
Все работает нормально, но единственное отклонение, которое я вижу (например, когда устройство лежит на столе и регистрирует значения, скажем, в течение 60 секунд), составляет около 0,2 градуса. Если я перемещаю устройство, чтобы получить что-то вроде скриншота выше, дрейфа вообще не наблюдается...
Что я делаю не так (или правильно?)??
Спасибо за любой совет!