11

私がアーカイブしたいのは、場所の一種の「磁気指紋」です。私は MAGNETIC_FIELD センサーを使用し、イベントでは (残念ながらこれ以上説明しません) X、Y、Z 軸の3 つの値を取得します。

問題は、デバイスを回転させると値が変化することです。そのため、3 軸はデバイスに対して相対的であると思います。デバイスの回転方法に関係なく、同じ 3 つの値が得られるように、デバイスの回転を補正する必要があります。

回転行列を掛けようとしたり(取得方法は知っています)、傾斜行列などを掛けようとしたりしましたが、何も機能しません。何を試しても、デバイスを回転させると値が変わります。

それで、誰もそれを正しく行う方法を知っていますか?できればコードを使用してください。「それでは、回転行列を使用してそれを補正する必要があります」などの多くのものを読んだが、具体的な動作例が1つも見つからなかったからです。

4

4 に答える 4

3

これを行う

private static final int TEST_GRAV = Sensor.TYPE_ACCELEROMETER;
private static final int TEST_MAG = Sensor.TYPE_MAGNETIC_FIELD;
private final float alpha = (float) 0.8;
private float gravity[] = new float[3];
private float magnetic[] = new float[3];

public void onSensorChanged(SensorEvent event) {
    Sensor sensor = event.sensor;
    if (sensor.getType() == TEST_GRAV) {
            // Isolate the force of gravity with the low-pass filter.
              gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
              gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
              gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
    } else if (sensor.getType() == TEST_MAG) {

            magnetic[0] = event.values[0];
            magnetic[1] = event.values[1];
            magnetic[2] = event.values[2];

            float[] R = new float[9];
            float[] I = new float[9];
            SensorManager.getRotationMatrix(R, I, gravity, magnetic);
            float [] A_D = event.values.clone();
            float [] A_W = new float[3];
            A_W[0] = R[0] * A_D[0] + R[1] * A_D[1] + R[2] * A_D[2];
            A_W[1] = R[3] * A_D[0] + R[4] * A_D[1] + R[5] * A_D[2];
            A_W[2] = R[6] * A_D[0] + R[7] * A_D[1] + R[8] * A_D[2];

            Log.d("Field","\nX :"+A_W[0]+"\nY :"+A_W[1]+"\nZ :"+A_W[2]);

        }
    }
于 2015-08-13T21:50:04.527 に答える
-1

磁場ベクトルの座標は、次の図のように、携帯電話を基準にして与えられます。

ここに画像の説明を入力してください

次の図の座標系で磁場ベクトルを取得するには:

ここに画像の説明を入力してください

磁気ベクトルに、 getRotationMatrix()から取得mした回転行列を掛ける必要があります。このベクトルは、地球を通って磁北極を指します。RR * m

また、傾きを掛けるとI、ベクトルはX軸を中心に回転し、完全にY軸上になります。

[0 m 0] = I * R *地磁気(m =地磁気の大きさ)

このベクトルは、地球上の各位置で一定である必要があります。ただし、デバイスを回転させるときにセンサーの位置を変更しないように十分に注意する必要があるため、携帯電話の結果にはわずかなずれが見られる場合があります。

于 2012-08-02T08:28:43.907 に答える