質問

私はしばらくの間、Androidオリエンテーションセンサーの周りに頭を巻き込もうとしてきました。私はそれを理解したと思いました。それから私はそうしなかったことに気付きました。今、私は(希望)私は再びそれに対してより良い気持ちを持っていると思いますが、私はまだ100%ではありません。私はそれについての私の斑状の理解を説明しようとします、そして、私が部分的に間違っているか、あらゆる空白を埋めるならば、人々が私を修正できることを願っています。

私は経度0度(プライム子午線)と0度緯度(赤道)で立っていると思います。この場所は実際にはアフリカ沖の海にありますが、私と一緒にいます。電話の底が足を指すように、携帯電話を顔の前に持っています。私は北に向かっている(グリニッジに向かっている)ので、電話の右側がアフリカに向かっている。この方向(下の図を参照)では、x軸が東を指していることがあり、z軸は南に向かっており、y軸は空を指しています。

これで、電話のセンサーを使用すると、この状況でデバイスの方向(場所ではなく)を解決できます。この部分はいつも私を混乱させてきました。おそらく、それがうまくいくことを受け入れる前に何かがどのように機能したかを理解したかったからでしょう。電話は、2つの異なるテクニックの組み合わせを使用してオリエンテーションを実行するようです。

私がそれに到達する前に、緯度0度でその想像上の土地に立って、上記の方向に立っていることを想像してください。また、あなたが目隠しされており、あなたの靴が遊び場のラウンドアバウトに固定されていると想像してください。誰かがあなたを後ろに押し込むと、あなたは(北に向かって)前に落ち、両手を出して転倒を壊します。同様に、誰かがあなたを左肩を押し込んだ場合、あなたはあなたの右手に倒れます。あなたの内耳には「重力センサー」があります (YouTubeクリップ) これにより、前方/後ろに落ちているか、左/右に落ちたり、落ちたりするか(または上に落ちるかを検出できます。したがって、人間は、電話と同じx軸とz軸の周りのアライメントと回転を検出できます。

今、誰かがラウンドアバウトで90度を回転させていることを想像してください。あなたはY軸の周りで回転しています。この軸は、生物学的に検出できないため、異なります。私たちは一定の量だけ角度を付けていることを知っていますが、惑星の磁気北極に関連する方向がわかりません。代わりに、外部ツール...磁気コンパスを使用する必要があります。これにより、どの方向に直面しているかを確認できます。私たちの電話にも同じことが言えます。

これで、電話には3軸の加速度計もあります。私は持っている いいえ 彼らが実際にどのように機能するかをアイデアしますが、私がそれを視覚化する方法は、重力と均一な「雨」が空から落ちると想像し、上の図の軸を流れる雨の量を検出できるチューブとして想像することです。電話が直立したとき、すべての雨がY 'チューブを通って流れます。携帯電話が徐々に回転しているため、画面が空に向いている場合、Yを流れる雨の量はゼロになりますが、Zを通る容積は最大雨が流れるまで着実に増加します。同様に、携帯電話をその側に傾けると、Xチューブが最終的に最大量の雨を収集します。したがって、3つのチューブを流れる雨の量を測定することにより、電話の向きに応じて、方向を計算できます。

電話には、通常のコンパスのように振る舞う電子コンパスもあります。その「仮想針」は磁気北を指します。 Androidは、これら2つのセンサーからの情報をマージします。 SensorEventTYPE_ORIENTATION 生成されます values[3] 配列にあります
値[0]:azimuth-(磁気北の東にあるコンパス)
値[1]:ピッチ、X軸の周りの回転(前または後ろに傾く電話)
値[2]:ロール、Y軸の周りの回転(左側または右側に携帯電話が傾いている)

ですから、Androidが3番目の加速度計の読み物ではなく、Androidが方位角(コンパスベアリング)を与える理由は、コンパスベアリングがより有用であることだと思います。なぜ彼らがこのタイプのセンサーを非難したのかわかりません。 SensorEventタイプのs TYPE_MAGNETIC_FIELD. 。そのイベント value[] アレイは生まれる必要があります SensorManger.getRotationMatrix(..) 回転マトリックスを取得する方法(以下を参照)。 SensorManager.getOrientation(..) 方法。 Androidチームが廃止された理由を誰かが知っていますか? Sensor.TYPE_ORIENTATION?それは効率性ですか?それは、同様のコメントの1つで暗示されていることです 質問 しかし、あなたはまだ異なるタイプのリスナーを登録する必要があります 開発/サンプル/コンパス/SRC/com/example/android/compass/compassactivity.java 例。

ローテーションマトリックスについてお話したいと思います。 (これは私が最も確信がない場所です)ので、上にAndroidドキュメントの3つの数字があります。A、B、Cと呼びます。

a = sensormanger.getRotationMatrix(..)メソッド図と世界の座標系を表す

b = Sensorevent APIで使用される座標系。

c = sensormanager.getorientation(..)メソッド図

したがって、私の理解は、aは「世界の座標系」を表しているということです。これは、惑星の位置がオプション(高度)を持つ(緯度、経度)カップルとして与えられる方法を指します。 xは 「イースト」 調整、yは 「ノーシング」 座標。 zは空を指し、高度を表します。

電話の座標系は図Bに示されています。そのy軸は常に上部を指しています。回転マトリックスは電話で常に計算されており、2つの間のマッピングを可能にします。それで、回転マトリックスがBの座標系をCに変換すると考えるのは正しいですか?だからあなたが電話するとき SensorManager.getOrientation(..) 使用する方法 values[] 図Cに対応する値を持つ配列。携帯電話が空を指している場合、回転マトリックスはアイデンティティマトリックス(マトリックス数学的相当1に相当)です。

Ok。私は今やめたほうがいいと思います。私が言ったように、私は人々が私がどこで台無しにしたか、または人々を助けた場所を教えてくれることを願っています(またはさらに混乱した人々)

役に立ちましたか?

解決

あなたはチェックアウトしたいかもしれません ある画面ターンは別の画面に値します 論文。回転マトリックスが必要な理由を説明しています。

一言で言えば、携帯電話のセンサーは、デバイスが回転している場合でも、常に同じ座標系を使用します。

単一の方向にロックされていないアプリケーションでは、デバイスを回転させると画面座標系が変わります。したがって、デバイスがデフォルトのビューモードから回転すると、センサー座標系は画面座標系と同じではなくなります。この場合の回転マトリックスは、AをCに変換するために使用されます(Bは常に固定されたままです)。

これがどのように使用できるかを示すコードスニペットです。

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

// Register this class as a listener for the accelerometer sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
// ...and the orientation sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                    SensorManager.SENSOR_DELAY_NORMAL);

//...
// The following code inside a class implementing a SensorEventListener
// ...

float[] inR = new float[16];
float[] I = new float[16];
float[] gravity = new float[3];
float[] geomag = new float[3];
float[] orientVals = new float[3];

double azimuth = 0;
double pitch = 0;
double roll = 0;

public void onSensorChanged(SensorEvent sensorEvent) {
    // If the sensor data is unreliable return
    if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        return;

    // Gets the value of the sensor that has been changed
    switch (sensorEvent.sensor.getType()) {  
        case Sensor.TYPE_ACCELEROMETER:
            gravity = sensorEvent.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            geomag = sensorEvent.values.clone();
            break;
    }

    // If gravity and geomag have values then find rotation matrix
    if (gravity != null && geomag != null) {

        // checks that the rotation matrix is found
        boolean success = SensorManager.getRotationMatrix(inR, I,
                                                          gravity, geomag);
        if (success) {
            SensorManager.getOrientation(inR, orientVals);
            azimuth = Math.toDegrees(orientVals[0]);
            pitch = Math.toDegrees(orientVals[1]);
            roll = Math.toDegrees(orientVals[2]);
        }
    }
}

他のヒント

ロールは重力の関数であり、90度のロールはすべての重力をXレジスタに入れます。

ピッチは同じで、90度のピッチアップが重力のすべてのコンポーネントをYレジスタに入れます。

ヨー /見出し /方位角は重力に影響を与えません。それは常に重力に対して直角にあります。したがって、あなたがどのように重力に直面しているかに関係なく、どのようになりますか。

これが、評価するためにコンパスが必要な理由です。

これを見てください: stackoverflow.com:Q.5202147

3つの図A、B、cまで、あなたはほとんど正しいようです。その後、あなたは自分自身を混乱させました。

私はこの問題を抱えていたので、さまざまな方向に何が起こるかをマッピングしました。デバイスが景観の方法で取り付けられている場合、たとえば、車ではコンパスから「程度」が269(西と北の間)を超える0-275(時計回り)に走るように見えます。 0から269のフォワード。270は-90になります

まだ風景にありますが、デバイスが背中に横たわっているため、センサーは0-360になります。そして、ポートレートモードでは、0-360が背中に横たわっているとポートレートで立ち上がっています。

それが誰かを助けることを願っています

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top