Androidアプリケーションの場合、グローバル(世界)座標系の軸全体の磁場測定値を取得する必要があります。これが私がこれを実装する方法(推測)です。必要に応じて訂正してください。また、質問はタスクのアルゴリズム部分に関するものであり、センサー用のAndroidAPIに関するものではないことに注意してください。私は後者の経験があります。
最初のステップは、TYPE_MAGNETIC_FIELD
センサーデータ(M
)とTYPE_ACCELEROMETER
センサーデータ( )を取得することG
です。2つ目は、Androidのドキュメントによると使用されることになっていますが、加速度計は純粋な重力を提供していないように見えるため、TYPE_GRAVITY
代わりに使用すべきかどうかはわかりません(これも)。G
次のステップは、を介して回転行列を取得することです。getRotationMatrix(R, I, G, M)
ここで、R
とI
はそれに対応する回転行列と傾斜行列です。
そして今、最も疑わしい部分に行きます:M
ベクトルを世界の座標系に変換するために、私は乗算すると思います[R * I] * M
。
これが磁場の読み取り値を別の基準に変換するための正しい方法かどうかはわかりません。また、上記のものに加えremapCoordinateSystem
て使用するのか、それとも代替品として使用するのかわかりません。
すでにこのことを行うソースコードが存在する場合は、リンクを投稿していただければ幸いですが、この特定のタスクに大きな汎用ライブラリ(拡張現実サポートなど)を使用したくないのは、できるだけシンプルに保つのが好きです。
PS
わかりやすくするために、元の投稿にいくつかの情報を追加することにしました。
デバイスがテーブルの上に置かれ、その磁気センサーからデータを継続的に読み取ると仮定します。各測定値には3つの値が含まれ、デバイスのローカル座標系である軸X、Y、Zの磁場を示します。私は、環境フィールドの変動(ローパスフィルターによって平滑化される)を無視できると考えているので、この3つの値は、デバイスが所定の位置にある間はほぼ同じままである必要があります。デバイスを任意の軸を中心に回転させると、ローカル座標系が変更されるため、値が変更されます。ただし、フィールド自体は実際には変更されません。したがって、ローカルのX、Y、Zフィールド測定値をそのようなX'、Y'、Z'に変換して、デバイスがその場所から移動されない(回転するだけである)場合、デバイスの回転に関係なくそれぞれの値を保持するようにします。
上記のアルゴリズムを実装し、提案された変換によって取得された値X'、Y'、Z'に定期的で目立つ変化があったため、何か問題があります。
PPS
時折、SOで私の質問の正確な複製を見つけました-デバイスの回転とは関係なく、磁場ベクトルを取得するにはどうすればよいですか?-しかし残念ながら、答えには私の提案が含まれており、その質問のOPはそれらが機能しないことを確認しています。