私は少し奇妙な状況にあります。私が現在抱えている状況は、通常は良い状況であり、ジャイロドリフトはまったくありませんが、なぜそうなるのかわかりません。どこでも報告されているように、ジャイロスコープが大きくドリフトすることを期待していました。したがって、この質問は、ドリフトが見られない理由を見つけるためのものです。
最終的に、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に設定されており、2つのリストは時間と測定値を追跡する必要があります。測定が終了すると(ボタンをクリック)、値がファイルに書き込まれます。
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度です。上記のスクリーンショットのようなものを取得するためにデバイスを移動すると、ドリフトはまったく観察されません...
私は何を間違っているのですか(または正しいですか?)??
アドバイスありがとうございます!