10

私はここ数日小さなコンパスアプリに取り組んでいて、コードを起動して実行していますが、コンパスの読み取りが正確ではないようです。両方の電話を調整した後、私がこれを見つけた最初のテストでは、電話を単に保持し、平らな面で読み取り値を見て、それを水平に裏返し、同じ平らな面(180 *回転)に置いたところ、値は180*を変更しないでください。240*に近かったです。

次に、読み取り値とコンパスをテストしました。読み取り値が近いように見えることもありましたが、他のポイントでは50*以上ずれていました。私は自分の電話とコンパスを床に置いて、コンパスを磁気干渉から遠ざけて同じ結果を得ようとしました(本の端に並べてコンパスと電話を同じ方向に保つことにも注意してください) 。

次に、サンプルアプリケーションを別の電話に配置しました(最初はネクサスS、2番目はモトローラドロイド1)。2つの電話の間の違いは、いくつかのポイントで等しいことから、ほとんどのポイントで50〜15度離れていることまでさまざまです。

私はドキュメントを調べ、また多くの異なるフォーラムの投稿を調べましたが、同じ結果が得られた人は誰もいません。コードに小さなエラーがあり、読み取り値が正しく表示されないか、文書化されたバグが表示されていない可能性があります。

任意の洞察や提案をいただければ幸いです!

これが私のSensorEventListenerクラスのセンサー変更コードです

public void onSensorChanged(SensorEvent event)
    {
        // If the sensor data is unreliable return
        if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        {
            Toast.makeText(main.this, "Sensor Status Unreliable",Toast.LENGTH_SHORT).show();
        }





        // Gets the value of the sensor that has been changed
        switch (event.sensor.getType())
        {
        case Sensor.TYPE_ACCELEROMETER:
            m_vfgravity = event.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            m_vfgeomag = event.values.clone();
            break;
        }

        if (m_vfgravity != null && m_vfgeomag != null)
        {
            if(SensorManager.getRotationMatrix(m_vfinR, m_vfI, m_vfgravity, m_vfgeomag))
            {
                SensorManager.getOrientation(m_vfinR, m_vforientVals);

                m_fCompBearing = (float) Math.round((Math.toDegrees(m_vforientVals[0])) *2)/2;

                //convert to 0-360 from -180-180
                if(m_fCompBearing < 0.0)
                {
                    m_fCompBearing = 360 + m_fCompBearing;
                }


                mCompHead.setText("" + (int)m_fCompBearing);
            }

            calcOffset();   
            rotateCmp();
        }
    }

そして、私のアクティビティの作成をコーディングします

    mSMngr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mSListener = new cSensorListener();

    mSMngr.registerListener(mSListener,
            mSMngr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
            SensorManager.SENSOR_DELAY_UI);
    mSMngr.registerListener(mSListener,
            mSMngr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_UI);

前もって感謝します!

編集:ドロイドXでも試してみましたが、これまでで最悪の結果になりました...電話を45度回転させると(コンピューターの座標系でz軸を中心に回転)、返されるコンパスの方位は180度以上変化する可能性があります。実際には方位の値です。同じ方向に回転すると、他の電話とは反対の方向に進みます。これは、設定で調整した後でもこの結果を生成する唯一の電話です。また、彼らは私がテストしたコンパスライブ壁紙であり、同じ問題はありません。だから私はこれを避けるためにソフトウェアで何かできることがあると思います。

4

3 に答える 3

34

著者は彼自身の質問に答えましたが、Android プラットフォームのあらゆる種類のコンパス機能がほとんど役に立たないことを強調するために、ここで声を上げなければなりません。

私は、Android コンパス アプリケーションに依存している人は誰でもトラブルを求めているという結論に達しました。どれも確実に動作せず、それは開発者のせいではありません。

Google と製造業者は、これらのデバイスから信頼できる精度を取得する方法を提供していません。また、精度が信頼できるかどうかを判断する方法さえ提供していません。神は彼らを助けます。

著者がおそらくより良い結果を得ていると考えている理由は、非推奨の方向センサーで非常に優れたノイズ フィルターを使用しているためです (新しい方法でこれを行うことができなかった理由は私には理解できません)。これは機能しているように見えますが、多くのデバイスを使用する現場では、ほとんどの場合、信頼性が常に問題であることがわかりました.

まず、磁気センサーと方向センサーから生成されるノイズがひどいです。これは適切な DSP 技術で克服できます。2.3 とジャイロ対応の携帯電話では全体的に改善されますが、Google と Mfg は開発者の時間を無駄にしていることを残念に思います。ハードウェアおよびソフトウェア出力の見掛け倒しの実装。

第 2 に、適切な DSP フィルタリングを使用して少なくとも 18 台の電話をテストしましたが、ノイズはクリーンアップされますが、同じモデルの電話でも出力が異なります (モデルによっては他のモデルよりも優れているように見えますが)。

第三に、センサーが較正されているかどうかを判断する方法はほとんどありません.8の字の動きをしても電話が較正される場合とされない場合があり、確認するコンパスがない限り、ユーザーはそれが機能しているかどうかを実際に知ることはできません.ポイントを打ち負かすようなものですね。

注: 磁気センサーを互いに乗算および合計し、その平方根 (x*x+y*y+z*z) を取得して、25 から 65 程度であることを確認できます。これは、1 つの指標です。異常なフィールドを検出するために使用できますが、完全に信頼できるわけではなく、何もないよりはましだと思います。

第 4 に、多くの携帯電話は完全に信頼性が低く、調整されているかどうかにかかわらず、モデルの種類に限定されませんが、製造側の QA が不十分である可能性があります。理由はよくわかりませんが、3 つの HTC ARIA が非常に異なる結果を生み出したと言えます ( 1 つは 30 度ずれており、もう 1 つは 50 度ずれており、3 つ目はほぼぴったりです) 信じられないほど、ネクサスなどと同じです。

私は 18 台の電話をテストしましたが、適切に調整できる場合、その多くはほぼ正確でした。ただし、それらの多くは 2 ~ 10 回の試行を要し (高精度のコンパスを使用して各調整を試行するたびに確認しました)、数回以上は単に調整できませんでした。まったく。

注:現在のGPS座標、高度、時刻などにアクセスできる場合は、AndroidのAPIで行うことができる真北オフセットの赤緯を考慮する必要があります。問題は赤緯ではなく、コンパスと比較しても、局所的な磁場の影響を受けるため、とにかく問題ではありません。

X、信じられないほど、Aria、Nexus、Thunderbolt を含むテストしたすべての電話で、コールド スタートには常に調整手順が必要です。言い換えると、センサーのリスニングを初めて開始するときは、95% の確率でキャリブレーション手順が必要になるため (壊れた時計でも 1 日に 2 回は正しく動作します)、この機能を追加することを主張する場合は、ユーザーに次の場所で行うように指示します。各リスナー イベントの開始。

センサーを実行したままにしておくと (バッテリーに悪い)、遭遇したフィールドに応じて再調整する必要がある場合と必要ない場合があります) 上記の方法はそのためにうまく機能します。

肝心なのは、それらが機能するときはクールに見えるということですが、現在、方位角の正確さを確信することは決してできないため、実際の作業にはかなり信頼性が低く、役に立たない.

個人的には、移動中に GPS 方位を使用し、可能であれば回転ベクトル法を使用します。これは完璧ではないかもしれませんが、現在の携帯電話の方位角用の実装よりもはるかに優れています。

長々とした返信で申し訳ありませんが、専門の DSP エンジニアの助けを借りてこれを機能させるためにほぼ 1 か月を無駄にしました。この点で Android プラットフォームが有用であるとかなり書いています。

私の意見では、「これが機能する場合もあれば、機能しない場合もあります。実際のコンパスを持っていない限り、確実にはわかりません」という免責事項をすべてのコンパス アプリケーションに含める必要があります。

于 2011-06-14T19:01:58.713 に答える
3

多くのテストとデバッグの後。私のドロイド 1 とネクサス S の違いは純粋にハードウェアの違いと磁気干渉であると述べた人もいましたが、そうであるという結論に達しました。

ただし、Droid X は別の問題でした。再マップ座標機能を追加しても、getRotationMatrix と getOrientation を使用して推奨される方法から正しい読み取り値を取得できませんでした。それで、成功しなかったいくつかのいじくり回した後、方向センサーの方法を試してみることにしました。

Google は、この方法は非推奨であり、私が最初に行った方法で行うことを推奨していますが、その方法であらゆる種類の組み合わせを試しましたが、成功しませんでした。だから私は先に進み、彼らの警告を無視し、方向センサーを使用しました...そしてそれはうまくいきました。なんで ?ドロイド x はドロイド 1 よりも新しい OS であるため、レガシー コードを使用する必要はありません。ただし、「推奨される方法」を実行しているアプリが機能していないときに、ターゲット 1.6 に書き込まれたコンパス アプリが機能する理由は理にかなっています。

誰かがこれを行うためのより良い方法を知っているか、または getRotationMatrix と getOrientation で機能させる方法を知っている場合は教えてください。

そうでなければ、私と同じようにこのレンガの壁に激しくぶつかる他の人のために、最終的に私のために働いたコードをここに示します。

私のオンセンサーが変わった

        switch (event.sensor.getType())
        {
        case Sensor.TYPE_ORIENTATION:
            m_vforientVals = event.values.clone();
            break;
        }

        if(m_vforientVals != null)
        {
            m_fCompBearing = m_vforientVals[0];             


            mCompHead.setText("" + (int)m_fCompBearing);

            calcOffset();   
            rotateCmp();
        }

センサーリスナーを初期化します

    mSMngr.registerListener(mSListener,mSMngr.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                            SensorManager.SENSOR_DELAY_NORMAL);
于 2011-06-08T18:37:40.977 に答える
2

あなたのコードは私には問題ないように見えます.コードにエラーがある場合、両方のデバイスがそれに苦しむことになると確信しています. 違いを引き起こしているのは、デバイスのハードウェアだと思います。電話を8の字に動かして、両方のコンパスを「調整」しましたか? symbian デバイスに付属の地図ソフトウェアを含め、多くのコンパス アプリがそれを示唆しています。それはうまくいくかもしれません

于 2011-06-06T19:59:33.830 に答える