1

Androidアプリケーションの場合、グローバル(世界)座標系の軸全体の磁場測定値を取得する必要があります。これが私がこれを実装する方法(推測)です。必要に応じて訂正してください。また、質問はタスクのアルゴリズム部分に関するものであり、センサー用のAndroidAPIに関するものではないことに注意してください。私は後者の経験があります。

最初のステップは、TYPE_MAGNETIC_FIELDセンサーデータ(M)とTYPE_ACCELEROMETERセンサーデータ( )を取得することGです。2つ目は、Androidのドキュメントによると使用されることになっていますが、加速度計は純粋な重力を提供していないように見えるため、TYPE_GRAVITY代わりに使用すべきかどうかはわかりません(これも)。G

次のステップは、を介して回転行列を取得することです。getRotationMatrix(R, I, G, M)ここで、RIはそれに対応する回転行列と傾斜行列です。

そして今、最も疑わしい部分に行きます:Mベクトルを世界の座標系に変換するために、私は乗算すると思います[R * I] * M

これが磁場の読み取り値を別の基準に変換するための正しい方法かどうかはわかりません。また、上記のものに加えremapCoordinateSystemて使用するのか、それとも代替品として使用するのかわかりません。

すでにこのことを行うソースコードが存在する場合は、リンクを投稿していただければ幸いですが、この特定のタスクに大きな汎用ライブラリ(拡張現実サポートなど)を使用したくないのは、できるだけシンプルに保つのが好きです。

PS

わかりやすくするために、元の投稿にいくつかの情報を追加することにしました。

デバイスがテーブルの上に置かれ、その磁気センサーからデータを継続的に読み取ると仮定します。各測定値には3つの値が含まれ、デバイスのローカル座標系である軸X、Y、Zの磁場を示します。私は、環境フィールドの変動(ローパスフィルターによって平滑化される)を無視できると考えているので、この3つの値は、デバイスが所定の位置にある間はほぼ同じままである必要があります。デバイスを任意の軸を中心に回転させると、ローカル座標系が変更されるため、値が変更されます。ただし、フィールド自体は実際には変更されません。したがって、ローカルのX、Y、Zフィールド測定値をそのようなX'、Y'、Z'に変換して、デバイスがその場所から移動されない(回転するだけである)場合、デバイスの回転に関係なくそれぞれの値を保持するようにします。

上記のアルゴリズムを実装し、提案された変換によって取得された値X'、Y'、Z'に定期的で目立つ変化があったため、何か問題があります。

PPS

時折、SOで私の質問の正確な複製を見つけました-デバイスの回転とは関係なく、磁場ベクトルを取得するにはどうすればよいですか?-しかし残念ながら、答えには私の提案が含まれており、その質問のOPはそれらが機能しないことを確認しています。

4

2 に答える 2

1

単語座標に対するMの座標は、単なる乗算R*Mです。

回転行列Rは、数学的には、デバイス座標からワード座標への基底行列の変化です。X 、YZをデバイスの座標基底、W_1W_2W_3単語の座標基底とし、M = m_1 X + m_2 Y +m_3 およびM =c_1 W_1 + c_2 W_2 + c_3 W_3 ここで、R *(m_1、 m_2、m_3)=(c_1、c_2、c_3)転置。



ローパスフィルターは、XY方向の加速度をフィルターで除去するためにのみ使用されます。RemapCoordinateSystemは、基底の順序を変更するために使用されます。つまり、W_1、W_2、W_3からW_1、W_3、W_2に変更します。

于 2012-11-14T05:50:14.567 に答える
0

デバイスの磁力計センサーは、デバイス座標で3つのベクトルを返します。getRotationMatrix()を使用して、そのデバイス座標ベクトルを世界座標に変換するために使用できる行列を取得できます。クォータニオンについて学び、TYPE_ROTATION_VECTORを直接使用することもできます。ただし、AndroidにはQuaternionライブラリ(私が知っている)はありません。これは、この質問の範囲を超えた議論です。

ただし、デバイスの向きの情報は磁力計からの値に部分的に基づいているため、これはどれも役に立ちません。言い換えれば、デバイスは常に磁気ベクトルが正確に北を向いていることを通知します。

今、あなたができることは伏角を取得することです。これはgetRotationMatrix()からの出力の1つですが、有用であるためには行列を角度に変換する必要があります。それも、この質問の範囲を超えています。

最後に、最後のオプションは、水平で、真北を指す矢印が付いたテーブルを作成することです。(夜などに星のそばに揃える必要があります。)次に、デバイスの上部を北に向けて、デバイスをテーブルの上に平らに置きます。この場合、デバイスの座標はワールド座標と同じになり、磁力計センサーが必要な値を生成します。

あなたのコメントは、あなたが地元のバリエーションに興味があることを示しています。Androidデバイスだけで真北に到達する方法はありません。理論的には、私が説明したようにテーブルを作成し、参照用にテーブルを監視しながら、以前とまったく同じ向きでデバイスを持って歩き回ることができます。しかし、あなたがそれをやってのけることができるとは思えません。

アプリでジャイロを使用して、デバイスの向きを常にまったく同じに保つことができますが、使用するAndroidデバイスのジャイロは、ドリフトが大きすぎて機能しない可能性があります。

あるいは、あなたが何をしようとしているのかまだ理解していないのかもしれません。ただし、結論としては、Androidデバイスだけではグローバル座標系を取得することはできません。取得するものはすべて、その正確な場所で常にローカル磁場に位置合わせされます。

于 2012-11-13T21:53:27.160 に答える