磁力計∞形のキャリブレーション


15

3軸電子コンパスを使用する携帯電話およびその他のデバイスでは、∞/ 8 / S形の動きを使用して、これらのビデオに示すように磁力計を較正します。

なぜこの動きが実行されるのか、理論は何なのか、それを実装するためのCコードの例を挙げることができますか?

あなたは、より多くの情報を含む私の別の同様の質問を通過しなければなりません。


この特定の質問に関する追加情報:プラットフォームは、AVR Studio 5を使用した8ビットAtMega32です。

今まで試してみました:形状を作る磁力計のベクトル値の2平均を除算してみました。考えることはオフセットの計算に役立つかもしれません。形状の2つの同一の部分/側面が、地球の磁場を相殺し、オフセット値を与える方法を考えています。私は間違っているかもしれません。しかし、特に形状ベースのキャリブレーションでは、これが私が現在いる場所です。キャリブレーションはこのように機能すると思います。アイデアは、それがこのようにうまくいくかどうかを調べることです?


オフセットを計算し、後でそれらをRaw磁気3Dベクトルから単純に差し引くことができるコードを確認します。私は完全に間違っている可能性があり、それがどのように機能するのか説明がありません。ビデオと球体上にプロットされたデータを見て、どういうわけか私の思考が加速し、方程式の形でその思考を使用しました。B)

コード:

Read_accl();およびRead_magnato(1);機能は、センサデータを読んでいます。コードが自明であることを願っています。賢明なPPLがこれをはるかに良い方法で使用することを願っています。:\

void InfinityShapedCallibration()
{
    unsigned char ProcessStarted = 0;
    unsigned long cnt = 0; 

    while (1)
    {

            Read_accl();

            // Keep reading Acc data
            // Detect Horizontal position
            // Detect Upside down position
            // Then detect the Horizontal position again.
            // Meanwhile an infinity shaped movement will be created.
            // Sum up all the data, divide by the count, divide by 2 .
            // !We've offsets.          

                if (ProcessStarted!=3)
                {
                //
                    //USART_Transmit_String("\r");
                    //rprintfFloat(4, g_structAccelerometerData.accx_RAW);
                    //USART_Transmit_String(",");
                    //rprintfFloat(4, g_structAccelerometerData.accy_RAW);
                    //USART_Transmit_String(",");
                    //rprintfFloat(4, g_structAccelerometerData.accz_RAW);

                }


            if (
             abs( g_structAccelerometerData.accx_RAW) < 100 
            && abs(g_structAccelerometerData.accy_RAW) < 100 
            && g_structAccelerometerData.accz_RAW < -350 
            && ProcessStarted != 2 && ProcessStarted != 3 && ProcessStarted != 1 )
            {
                ProcessStarted = 1; 
            }   

            if (ProcessStarted==1)
            { 

            Read_magnato(1);

                structMagnetometerOffsetDataToEEPROM.Off_X += g_structMegnetometerData.magx_RAW;
                structMagnetometerOffsetDataToEEPROM.Off_Y += g_structMegnetometerData.magy_RAW;
                structMagnetometerOffsetDataToEEPROM.Off_Z += g_structMegnetometerData.magz_RAW;

                cnt++;

            }               
                if ( g_structAccelerometerData.accz_RAW > 350 
                && ProcessStarted==1)
                {
                    ProcessStarted = 2; 
                }

                if ( g_structAccelerometerData.accz_RAW < -350 
                && ProcessStarted == 2 )
                {
                    ProcessStarted=3; 
                    structMagnetometerOffsetDataToEEPROM.Off_X /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_X /= 2;

                    structMagnetometerOffsetDataToEEPROM.Off_Y /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_Y /= 2;

                    structMagnetometerOffsetDataToEEPROM.Off_Z /= cnt;
                    structMagnetometerOffsetDataToEEPROM.Off_Z /= 2;  

                    UpdateOFFSETDATAinEEPROM();  

                    break;

                } 
    }   
} 

これらのオフセットを取得した後、次のように使用しました。

void main()
{
...

Read_magnato(1);
        g_structMegnetometerData.magx_RAW -= structMagnetometerOffsetDataToEEPROM.Off_X ;
        g_structMegnetometerData.magy_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Y ;
        g_structMegnetometerData.magz_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Z ;
...
}

私が示したように。


2
この質問には多くの助けが必要です。プログラミングの支援が必要ですか?磁力計に関する理論?どのプラットフォームですか?何を試してみましたか?
ケレンイブ

図8は単にキャリブレーションを開始するためのジェスチャーではありませんか?
geometrikal

1
pplがロボットのように振る舞う理由がわかりません。同じ仕事へのリンクを提供しました。私はそれについて多くのことをしましたが、知らないうちに投票してください。私の質問が不明確であるために私の投票が下票されたとき、私はそれを嫌います。投票する直前に必要なものを尋ねてください。私は本当に出力を取得したいので、投票する前に考えさえしません。それは気分が悪く、正しい方向で働くことから私をそらそうとします。どうか、どちらの側にも投票しないでください。
リック2047年

1
@Kellenjb:シンプルな8ビットatmega32を使用してIMUで作業しています。私はそれに取り組み、32ビットuCは針の代わりに剣を使うようなものだと結論付けました。(私のなぞなぞごめんなさい:))磁力計のすべてのRAW値を足し合わせて形を作ってみました。次に、入力数で除算します。オフセットを計算するのに役立つかもしれません。形状の2つの同一の部分/側面が、地球の磁場を相殺し、オフセット値を与える方法であると思います。私は間違っているかもしれません。しかし、特に形状ベースのキャリブレーションでは、これが現在の私です。私は...と思う
Rick2047

1
問題は質問にあるのではなく、このサイトで質問された内容を十分に理解していないために質問に投票する人の数にありました。わからない場合は、そのままにしてください!
クリスストラットン

回答:


21

8 / S形状のパターンは、携帯電話やその他のデバイスの磁力計の較正に使用されます。

バックグラウンド

典型的な携帯電話時代の磁力計は、次のような3つの直交軸に沿って磁場強度を測定します。

m=mバツ^+myȷ^+mzk^

によって与えられる場の大きさで、

m=mバツ2+my2+mz2

および各軸からの回転角

θk=cos1mkm どこ k[バツyz]

較正

地球の形成場は比較的一定であるため、磁力計で測定される磁場の大きさも、センサーの向きに関係なく一定である必要があります。すなわち、センサーを回転させて3Dでm y、およびm zをプロットする場合、パスは一定の半径の球の表面をプロットする必要があります。mバツmymz

理想的には次のように見えるはずです:

球

ただし、硬い鉄と柔らかい鉄の効果およびその他の歪みのため、変形した球のように見えます。

変形した

これは、センサーで測定される磁場の大きさが向きによって変化するためです。結果は、上記の式に従って計算されたときの磁場の方向が真の方向と異なることです。

方向に関係なく大きさが一定になるように、3つの軸の各読み取り値を調整するために、キャリブレーションを実行する必要があります。LSM303のアプリケーションノートでは、これを実行する方法の詳細な手順がたくさんあります。

それでは、図8のパターンはどうでしょう!?

図8のパターンを実行すると、上の変形した球体の一部が「トレース」されます。得られた座標から、球体の変形を推定し、較正係数を取得できます。良いパターンとは、最大範囲の方向をトレースするため、真の一定の大きさからの最大偏差を推定するパターンです。

変形した球体の形状を推定するには、最小二乗楕​​円近似を使用できます。LSM303アプリケーションノートにもこれに関する情報があります。

基本的なキャリブレーションの簡単な方法

アプリノートによると、ソフトアイアンの歪みがないと仮定した場合、変形した球体は傾斜しません。したがって、基本的なキャリブレーションの簡単な方法が可能です。

  • 各軸の最大値と最小値を見つけ、1/2の範囲とゼロ点を取得します

rk=12最大mkmk

zk=最大mkrk

  • 各軸測定のシフトとスケーリング

mk=mkzkrk

  • を使用することを除いて、以前と同様に値を計算しますmk

これは、ここにあるコードに基づいています

最小二乗法を使用して解く

最小二乗法を使用して解くためのMATLABコードを以下に示します。コードはmag、列がxyz値である変数を想定しています。

H = [mag(:,1), mag(:,2), mag(:,3), - mag(:,2).^2, - mag(:,3).^2, ones(size(mag(:,1)))];
w = mag(:,1).^2;
X = (H'*H)\H'*w;
offX = X(1)/2;
offY = X(2)/(2*X(4));
offZ = X(3)/(2*X(5));
temp = X(6) + offX^2 + X(4)*offY^2 + X(5)*offZ^2;
scaleX = sqrt(temp);
scaleY = sqrt(temp / X(4));
scaleZ= sqrt(temp / X(5));

図8の動的なキャリブレーションを行うには、新しい読み取りごとに最小二乗ルーチンを実行し、オフセット係数とスケール係数が安定したら終了します。

地球の磁場

通常、地球の磁場は地表と平行ではなく、大きな下向き成分が存在する場合があります。


こんにちは、これは図8のパターンの問題を解決するために行ったかなりの努力です。これで、以前の作業の一部を現在の作業に接続することができます。質問のみ; 8つの形状を作成した後、出力データを使用してNEWSが正しく表示され、すべてのベクトルの平均の半分が得られます。驚くべきことに、水平計画(フルークによる)で動作します。 8形状のアルゴリズムの作業を開始した場所です。「最小二乗」の後に戻りますが、吸虫を理解することはできません。
リック2047年

...私の場合、球体もZ軸上で変形しているようです。プロットされた3D球体に対するハードアイアン効果とソフトアイアン効果を認識していることを知ってください。もう一度3Dにプロットしてみます。見てみましょう。
リック2047年

@ Rahul2047まあ、それが正しいことを願っていますが、私には理にかなっています。作成中の機器に対して同様のキャリブレーションを行う必要がありますが、コードの実装はまだ完了していません。
geometrikal

通常、水平面内の方向にのみ関心がある携帯電話の場合、必要なすべてのポイントを簡単なジェスチャーでカバーできますか。matlabを使用していますか?そこにフィットするのは簡単です。最小二乗は誤差測定方法を指します。
geometrikal

1
この記事の画像リンクの一部が破損しました-画像を再度追加できますか?SEには、将来の破損を防ぐために、画像をアップロードしてローカルに保存する機能があります。ありがとう!
ニューアレクサンドリア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.