0

getOrientation() メソッドを使用して見出しの値を取得しようとしています。

boolean success = SensorManager.getRotationMatrix(rot, incl, accel, magnet);
if (success) {
    // Compute orientation
    float orientation[] = new float[3];
    SensorManager.getOrientation(rot, orientation);

}

これらの値は、電話を安定させて安定した位置で歩いても、大きく異なります。

次に、加速度値の参照を電話からワールド軸に変更しようとしました。

        // Compute world acceleration
        float wAccel[] = new float[4];
        float newAccel[] = new float[]{accel[0],accel[1],accel[2], 0};
        android.opengl.Matrix.multiplyMV(wAccel, 0, rot, 0, newAccel, 0);
        magnetLine += "W" + LOGSEPARATOR +
                tsString + LOGSEPARATOR +
                wAccel[0] + LOGSEPARATOR +
                wAccel[1] + LOGSEPARATOR +
                wAccel[2] + "\n";
    }

次に、atan2 関数で X 軸と Y 軸の値を使用して、ベクトルの角度を決定しました。異なる方法で変化する場合でも、これらの値は依然として奇妙な動作を示します (値が一定の場合もあれば、足跡をたどるかのように周期的な動作を示す場合もあります)。

これに似た状況で remapCoordinate システムを呼び出す人々の例をいくつか見てきました。これは私が見逃しているものですか?

4

1 に答える 1

1

できることは次のとおりです。

  1. まず、古いバージョンの Android API を使用している場合を除き、Sensor.TYPE_GRAVITY代わりに を使用しSensor.TYPE_ACCELEROMETERます。 Sensor.TYPE_GRAVITY動きをフィルタリングして除外し、重力ベクトルだけを残すことを目的としています。
  2. onAccuracyChanged(Sensor sensor, int accuracy)インターフェイスのメソッドを使用して、センサーの精度を監視しSensorEventListenerます。私は同じ問題を抱えていましSensor.TYPE_MAGNETIC_FIELDSensorManager.SENSOR_STATUS_UNRELIABLE
これremapCoordinateSystem()は、座標系で 90 度の回転を行うことです。たとえば、x 軸を z 軸と交換するなどです。たとえば、真北の方向を表示するコンパスを作成する場合は、それを考慮する必要があります。デバイスが縦向きモードか横向きモードかなど。ただし、センサーからの測定値は縦向き/横向きに依存しないため、大きく変化している場合、問題は別の場所にあります。

また、 Android コンパスは信頼性が低いように見えることに注意してください。一部の人々は、Android デバイスのコンパスがあまり良くないことを発見しました。ただし、その投稿は約 2 年前のものなので、今は状況が改善されていることを願っています :-)。

于 2013-04-18T18:42:50.950 に答える