私はしばらくの間、Androidの方向センサーの周りを頭を抱えようとしてきました。 私はそれを理解していると思った。それから、私は気付かなかった。今私は(希望)私は再びそれのために良い感じがあると思うが、私はまだ100%ではない。私はそれについての不気味な理解を説明しようとしてくれるでしょう。もし私が間違っていたり、空白を記入したら、人々は私を正すことができます。コンパスを含むAndroidの携帯電話の向きの概要
私は経度0度(緯度経度)と緯度0度(赤道)に立っていると想像します。この場所は実際にはアフリカの海岸の海にありますが、私には耐えられます。私は電話の底が私の足を指すように私の顔の前に私の電話を保持する;私はノース(グリニッジを目指している)に向かっているので、電話の右側は東をアフリカに向ける。この姿勢(下の図を参照)では、私はX軸がEastを指しており、Z軸がSouthを指しており、Y軸が空を指しています。
今電話上のセンサは、このような状況では、デバイスの向き(ない場所)をうまくすることができます。この部分は私がいつも混乱してきました。なぜなら、私はそれがちょうどうまくいったと受け入れる前に、何かがどう働いたのか理解したかったからですそれは、2つの異なる技術の組み合わせを使用して、電話機がその向きを整えているようです。
私がそれを得る前に、上記の方向に立っている0度の緯度と経度で、想像上の地面に立っていると想像してください。あなたが目隠しされ、あなたの靴が遊び場のロータリーに固定されていると想像してください。誰かがあなたを背中に押しつけると、(北に向かって)前方に倒れ、両手を倒して倒れます。同様に誰かがあなたの肩を左に押した場合、あなたの右手に転がってしまいます。あなたの内耳には「重力センサー」(youtube clip)があります。これは、あなたが前進/後退しているか、左/右に落ちているのか、下降しているのか(または上に!)検出できます。したがって、人間は、電話機と同じX軸およびZ軸の周りの整列および回転を検出することができます。
今、誰かがロータリーであなたを90度回転させて、今は東向きになっているとします。あなたはY軸を中心に回転しています。この軸は生物学的にそれを検出できないために異なっている。私たちはある程度の角度を持っていることは分かっていますが、惑星の北極磁場に関連する方向はわかりません。 代わりに、外部ツール、つまり磁気コンパスを使用する必要があります。これにより、我々はどの方向を向いているかを確かめることができます。私たちの電話でも同じことが言えます。
携帯電話にも3軸加速度計が搭載されています。私はいいえアイデアが実際にどのように動作するかを私が視覚化する方法は、空から落ちる一定で均一な「雨」としての重力を想像し、雨の量を検出できるチューブとして上の図の軸を想像することですスルー。電話機が直立状態になると、すべての雨がY字管を通って流れます。電話機が徐々に回転して画面が空に向かうと、Yを流れる雨量はゼロに減少しますが、Zを通る音量は最大雨量が流れるまで徐々に増加します。同様に、電話機の側面に先端を置くと、Xチューブは最終的に最大の雨量を集めます。したがって、3つのチューブを流れる雨量を測定することによって、携帯電話の向きに応じて、向きを計算することができます。
携帯電話には、通常のコンパスのように動作する電子コンパスもあります。その「仮想針」は磁北を指します。(磁北のコンパス方位東)
値[1] - 方位:ピッチ、周りの回転TYPE_ORIENTATION
のSensorEvent
が生成されるたびにvalues[3]
アレイは
値[0]を有するようにAndroidのは、これら二つのセンサからの情報をマージx軸(電話が前後に傾いている)
値[2]:ロール、y軸周りの回転(電話がその左側または右側にオーバー傾いている)
だから私は(つまり、Iドンと思いますAndroidが3番目の加速度計を読み込むのではなく、方位角(方位角の方位)を与える理由はわかりません。なぜ彼らはこのタイプのセンサーを非難したのか分かりません。SensorEvent
のタイプTYPE_MAGNETIC_FIELD
のシステムにリスナーを登録する必要があるようです。イベントのvalue[]
配列をSensorManger.getRotationMatrix(..)
メソッドに渡して、回転行列(下記参照)を取得し、SensorManager.getOrientation(..)
メソッドに渡す必要があります。 AndroidチームがSensor.TYPE_ORIENTATION
を非推奨にした理由を知っている人はいますか?それは効率的なものですか?これは、コメントの1つに同様のquestionが含まれていますが、development/samples/Compass/src/com/example/android/compass/CompassActivity.javaの例では別のタイプのリスナーを登録する必要があります。
私は今、回転行列についてお話したいと思います。 (これは私が最も不確かなところです) 上記のAndroidドキュメントの3つの数字は、A、B、Cとなります。
A = SensorManger.getRotationMatrix世界座標系
B = Coordinate system used by the SensorEvent API.
C = SensorManager.getOrientation(..)メソッドフィギュア
だから私の理解では、Aは、私が道を指し推定する「世界座標系」を表していることです惑星上の位置は(緯度、経度)結合として与えられますe(オプション)(高度)。 Xは"easting"の座標であり、Yは"northing"の座標である。 Zは空を指し、高度を表します。
図Bに示す電話機の座標系は固定です。 Y軸は常に上を指します。回転行列は電話によって絶えず計算されており、2つの間のマッピングが可能です。では、回転行列がBの座標系をCに変換すると思うのは正しいですか?したがって、SensorManager.getOrientation(..)
メソッドを呼び出すと、図Cに対応する値を持つvalues[]
配列が使用されます。 電話機が空を指しているとき、回転行列は単位行列(行列の数学的に1に相当)です。デバイスは世界の座標系に合わせられます。
私は今すぐ中止する方がいいと思う。私は私が台無しや人々を助けてきたところの人が私に教えてくれるを期待する前に私が言ったように
私は本当にこの質問が好きです。私はそれに答えることはできませんが、私はそれが好きです。 –
ティム、あなたは答えを得たことがありますか?私は同じように私の頭を掻いてきました。これは私が今までに見た中でもっともよく書かれていないAPIの1つです。 –
本当に私は恐れています。私は上に移動しなければならなかった。いつか私はこの問題に戻るでしょう。 – Tim