0

磁力計にアクセスしたいアプリがあります。アプリケーションから結果を取得しますが、g1 のコンパス アプリからのオリエンテーション結果と比較すると、コンパス アプリとは完全に異なる結果が得られます。例: 私のアプリは 250° で、コンパス アプリは 90° です! それはできません。これが私のコードです。より良い結果になるために何か違いはありますか?

public class MySensorListener implements SensorListener{
  int orientation;
  public MySensorListener(){
     orientation = 0;
  }
    public void onAccuracyChanged(int sensor, int accuracy) {
  // TODO Auto-generated method stub

 }

    public void onSensorChanged(int sensor, float[] values) {
        orientation = (int)values[0];
    }
}

次のように Sensormanager にアクセスします。

private MySensorListener doCompass(){
 MySensorListener cl;
 SensorManager cm;
 compassListener = new MySensorListener();

  cm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  cm.registerListener(
   cl, 
   SensorManager.SENSOR_ORIENTATION, 
   SensorManager.SENSOR_DELAY_UI); //updateRate
  return cl;
}

誰か助けてくれませんか?! :)

ありがとうございました

4

3 に答える 3

3

を使用する必要がありますMath.toDegrees。value[0] はラジアンを返すためです。

他の投稿で見た編集 、値[0]がラジアンを返すと言う人もいます。しかし、コード化しようとした後、値[0]がラジアンまたはグレード/ゴンを返すことがわかりません。度に変換すると、値が 360 より大きいため、グレードに変換しようとします。見た目も良く、問題はありません。コードはこのようなものです

Double azimuth = value[0];
azimuth = azimuth * 360 / 400;

下手な英語でごめんなさい:)

于 2014-07-08T07:36:15.613 に答える
1

方向センサーの値に対してカルマン フィルターが有効かどうかはわかりませんが、それが必要な場合があります。Android のカルマン フィルターの詳細については、こちらを参照してください。

カルマン フィルターの学習と実装の頭痛の種を経験したくない場合は、以下で行ったことを使用してください。:

private boolean isMagneticFieldFine(float[] fieldValues){
    double value = Math.sqrt(fieldValues[0]*fieldValues[0] + fieldValues[1]*fieldValues[1] + fieldValues[2]*fieldValues[2]);        
    return value < 65.0 && value > 25.0;
}

もう 1 つ、SensorListener は非推奨です。代わりに SensorEventListener を使用してみてください。

于 2010-12-06T17:40:00.817 に答える
0

他のセンサー データを使用してキャリブレーションを行ったり (ジャイロスコープや加速度計など)、統計モデルを使用したり (粒子フィルターやカルマン フィルターなど)、方向をキャリブレーションする方法は多数あります。このプレゼンテーションでは、動きセンサーを調整するために業界で使用されているいくつかの最新技術について説明しています: https://www.youtube.com/watch?v=C7JQ7Rpwn2k

于 2014-07-10T03:28:08.997 に答える