1

デバイスの磁気 XYZ 値をセンサー マネージャーから取得しました。

ただし、これらはデバイスの視点の XYZ 値です。

デバイスの視点

問題は、これらの座標 (磁石値の 3d ベクトル) を北に向かって回転させたいことです。デバイスを回して保持すると、同じ XYZ値が表示されます。

使用時

SensorManager.getRotationMatrix(R, I, accel, m);
SensorManager.getOrientation(R, v);

ベクトル v[] でデバイスの向きの XYZ を取得します。

元のベクトルを回転させて北に合わせるにはどうすればよいですか?

これは私が探している最終結果です:

ご覧のとおり、デバイスのどの向きでも同じ xyz 値を取得します

ご覧のとおり、デバイスのどの向きでも同じ xyz 値を取得します

編集:

私はこれを追加しようとしました:

Location l=null;
GeomagneticField field = new GeomagneticField((float) l.getLatitude(),(float) l.getLongitude(),(float) l.getAltitude(),l.getTime());

そして、field.getX()から取得したデータは有効ではありません(おそらくnullの場所を使用しているためです...?)。私を助けるためのサンプルコードを見つけることができる場所はありますか?

ありがとう、ウォプス

4

2 に答える 2

0

わかった!ようやくベクトルを回すことができました。

私はマイクのアドバイスを使用し、回転行列を試しました..

ポイントは、 SensorManager から現在の回転行列を取り出し、それを磁気値の xyz ベクトル (デバイスの向きに依存) で乗算することです。

ここに画像の説明を入力

A は回転行列で、xyz は磁気値ベクトルです。

これはあなたがコードでそれを書く方法です

SensorManager.getRotationMatrix(R, I, accel, m);
m[0]=Math.round(m[0]);//X
m[1]=Math.round(m[1]);//Y
m[2]=Math.round(m[2]);//Z
v[0]=Math.round((m[0]*R[0] )+(m[1]*R[1])+(m[2]*R[2]));
v[1]=Math.round((m[0]*R[3] )+(m[1]*R[4])+(m[2]*R[5]));
v[2]=Math.round((m[0]*R[6] )+(m[1]*R[7])+(m[2]*R[8]));

ここで、「m」はセンサーから受信した磁気の値です。

public void onSensorChanged(SensorEvent event) {
    switch(event.sensor.getType()) {
        case Sensor.TYPE_MAGNETIC_FIELD:
             System.arraycopy(event.values, 0, m, 0, 3);
             break;
    }
}
于 2013-01-08T13:03:01.957 に答える
0

それ以外の

SensorManager.getOrientation(R, v);

これにより、デバイスの向きがわかります。

GeomagneticField::getX();
GeomagneticField::getY();
GeomagneticField::getZ();

これらは、デバイスの向きに関係なく、磁場の成分を提供します。

于 2013-01-07T21:07:39.480 に答える