私はしばらくの間、Androidの方位センサーに頭を悩ませてきました。理解できたと思いました。その後、私はそうではないことに気づきました。今、私は(希望)私はそれについて再び良い気持ちを持っていると思いますが、私はまだ100%ではありません。私はそれについて私のパッチの理解を試みて説明します、そしてうまくいけば、私が部分で間違っているか、どんな空白を埋めても、人々は私を訂正することができるでしょう。
経度0度(本初子午線)と緯度0度(赤道)に立っていると思います。この場所は、実際にはアフリカの沖合の海にありますが、我慢してください。スマートフォンの底面が私の足を指すように、スマートフォンを顔の前で持ちます。私は北を向いているので(グリニッジの方を向いています)、電話の右側は東をアフリカに向けています。この方向で(下の図を参照して)、X軸は東を指し、Z軸は南を指し、Y軸は空を指します。
これで、電話のセンサーを使用して、この状況でデバイスの向き(場所ではなく)を計算できます。この部分はいつも私を混乱させました、おそらくそれがうまくいくことを受け入れる前に何かがどのように働いたか理解したかったからでしょう。電話は2つの異なる技術の組み合わせを使用してその方向を解決しているようです。
その前に、上記の方向に立っている、緯度と経度0度の架空の土地に戻って立っているところを想像してみてください。また、目隠しをされていて、靴が遊び場のラウンドアバウトに固定されているとします。誰かがあなたを後ろに突き刺した場合、あなたは前に(北に向かって)倒れ、あなたの落下を壊すために両手を外に出します。同様に、誰かがあなたに左肩を突きつけた場合、あなたは右手に倒れます。内耳には「重力センサー」(youtubeクリップ)があり、前方/後方に落下したり、左/右に落下したり、倒れたり(または上に倒れたり)したかどうかを検出できます。したがって、人間は電話と同じX軸とZ軸を中心とした位置合わせと回転を検出できます。
今、誰かが今あなたを東に向くようにラウンドアバウトで90度回転させたと想像してください。Y軸を中心に回転しています。生物学的には検出できないため、この軸は異なります。ある程度の角度がついていることはわかっていますが、惑星の北磁極との関係で方向はわかりません。代わりに、外部ツール...磁気コンパスを使用する必要があります。これにより、どの方向を向いているかを確認できます。同じことが私たちの電話にも当てはまります。
今、携帯電話にも3軸の加速度計があります。私が持っているNOをそれらが実際にどのように機能するかを考えますが、私がそれを視覚化する方法は、重力が空から落ちる一定で均一な「雨」であると想像し、上図の軸が流れる雨の量を検出できるチューブであると想像することです。電話が直立していると、すべての雨がY字型の「チューブ」を通って流れます。携帯電話を徐々に回転させて画面を上に向けると、Yを流れる雨の量はゼロに減少し、Zを通る量は最大の雨が流れるまで着実に増加します。同様に、電話を横向きに傾けると、Xチューブは最終的に最大量の雨を収集します。したがって、3つのチューブを流れる雨の量を測定することにより、電話の向きに応じて、向きを計算できます。
携帯電話には、通常のコンパスのように動作する電子コンパスもあります。その「仮想針」は磁北を指します。アンドロイドマージたびように、これらの二つのセンサからの情報SensorEvent
のがTYPE_ORIENTATION
生成されvalues[3]
、配列が持つ
値[0]:方位- (磁北のコンパス方位東)
値[1]:ピッチ、x軸周りの回転が(電話です前方または後方に傾く)
値[2]:ロール、y軸を中心とした回転(電話が左側または右側に傾いている)
したがって、Androidが3番目の加速度計の読み取りではなく方位角(方位角方位)を与える理由(つまり、私にはわかりません)は、方位角方位計の方がより有用であると考えています。彼らがこのタイプのセンサーを非推奨にした理由はわかりません。現在SensorEvent
、タイプののシステムにリスナーを登録する必要があるようですTYPE_MAGNETIC_FIELD
。イベントのvalue[]
配列はSensorManger.getRotationMatrix(..)
、SensorManager.getOrientation(..)
メソッドに渡される回転行列(以下を参照)を取得するためにメソッドに渡される必要があります。Androidチームが廃止された理由を誰かが知っていSensor.TYPE_ORIENTATION
ますか?効率的なことですか?これは、同様の質問へのコメントの1つに示されていますが、別のタイプのリスナーをdevelopment / samples / Compass / src / com / example / android / compass / CompassActivity.javaの例。
回転行列についてお話ししたいと思います。(これが私が最もよくわからないところです)したがって、上記のAndroidドキュメントの3つの図は、A、B、Cと呼びます。
A = SensorManger.getRotationMatrix(..)メソッドの図で、世界の座標系を表します
C = SensorManager.getOrientation(..)メソッド図
つまり、私の理解では、Aは「世界の座標系」を表していると私は考えています。これは、惑星上の位置が(緯度、経度)カップルとオプションの(高度)として与えられる方法を指していると思います。Xは「東座標」、Yは「北座標」です。Zは空を指し、高度を表します。
図Bに示す電話の座標系は固定されています。Y軸は常に上を指します。回転行列は常に電話によって計算され、2つの間のマッピングを可能にします。それで、回転行列がBの座標系をCに変換すると私は考えるのは正しいですか したがって、SensorManager.getOrientation(..)
メソッドを呼び出すvalues[]
ときは、図Cに対応する値を持つ配列を使用します。電話が空を指している場合、回転行列は単位行列(1と数学的に同等の行列)です。これは、デバイスが整列しているため、マッピングが不要であることを意味します世界の座標系で。
OK。もうやめた方がいいと思います。前に言ったように、私が人を台無しにしたり、人を助けたりした場所(またはさらに混乱した人!)