SensorManager.getRotationMatrix()
私がこれを見つける前に書かれた、以下に概説されていることをします。磁気と真北の違いを修正したい場合でも必要になるため、追加の説明は残しておきます。
大まかなアルゴリズムは、回転行列を取得し[0,0,-1]
、それをベクトルに乗算してから、これを座標系に合わせて調整することです。なんで?Androidドキュメントは、デバイスと世界の座標系を提供します


[0,0,-1]
Androidデバイスでは、画面から後方に垂直にポイントを調整することに注意してください。回転行列Rにこのベクトルを掛ける[0,0,-1]
と、デバイスがテーブル上にあるときに、必要に応じてワールド座標が得られます。北向きに直立すると、が表示されます。これは、Androidシステムに対してとが入れ替わって[0,-1,0]
いる座標系を選択したことを示しますが、これは単に規則の変更にすぎません。x
y
注は、否定されR * [0,0,-1]^T
たの3番目の列にすぎません。R
これから、擬似コードを取得します。
getRotationMatrix(R);
Let v = first three elements of third column of R.
swap v[0] and v[1]
これはあなたが望むものを手に入れるべきです。
何をしているのかに関する追加情報getRotationMatrix()
は次のとおりです。
「下」の方向を確立するための加速度計データと、「北」の方向を決定するための磁力計データの両方が必要です。加速度計が重力のみを感知していると想定する必要があります(デバイスは静止しているか、一定の速度で移動しています)。次に、磁力計のベクトルを重力ベクトルに垂直な平面に投影する必要があります(磁場は一般に地表に接していないため)。これにより、2つの軸が得られます。3番目は直交しているため、外積で計算できます。これにより、デバイスシステムの地球座標ベクトルが得られます。逆、つまり地球座標のデバイス座標が必要なようです。このためには、方向余弦と反転の行列を作成するだけです。
上記の説明では、磁力計のベクトルが北を向いていることを前提としています。(高校の科学から!)実際には磁気南に向かっていると思いますが、手元にデバイスがないため、試すことができません。もちろん、磁北/南は、地球上のどこにいるかによって、真とは0度から180度異なります。GPS座標を取得して、実際のオフセットを計算できます。
これらを行うために必要な数学に精通していない場合は、さらに説明できますが、後で説明する必要があります。