2011-10-24 12 views
17

私のアンドロイドアプリケーションは、世界の特定の場所の方向を示しているため、コンパス度を取得する必要があります。
これは私が度を計算するために使用してきたコードです:正確なコンパスを作る方法android

public void getDirection() {   
    mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); 
    List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION); 
    if(mySensors.size() > 0){ 
     mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), SensorManager.SENSOR_DELAY_UI);   
    } 
    else{ 
     TextView alert = (TextView)findViewById(R.id.instruct); 
     alert.setText(getString(R.string.direction_not_found)); 
     myCompassView.setVisibility(myCompassView.INVISIBLE); 

    } 
} 
private SensorEventListener mySensorEventListener = new SensorEventListener(){ 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     // TODO Auto-generated method stub 
     compassBearing = (float)event.values[0]; 
     float bearing; 
     bearing = compassBearing - templeBearing; 
     if (bearing < 0) 
      bearing = 360 + bearing; 
     myCompassView.updateDirection(bearing); 
     } 
}; 

この方法は、通常動作しますが、時にはそれだけで間違って北を取得し、私はより正確な位置を取得するために何をすべきかを持っているのですか?

+0

これは、新しいhttp://area51.stackexchange.com/proposals/102228/virtual-and-augmented-reality StackExchangeの提案に追加するとよい質問です。 – SashaZd

答えて

33

私はあなたのためのカップルの提案を持っている:

1)お使いのデバイスを校正することはできません。これを行うには、8(see this)の形式で移動します。あなたのデバイスが較正されているかどうか、またはデバイスをある種の既知の基点方向を指すことによっていくつかのテストを行い、値を比較していない場合。通常、デバイスが較正されていない場合は、小さな回転の方位角値に大きな変化が見られます。それが私が心配することです。

センサは、真北部ではなく、磁気北部にベアリングを与えることを忘れないでください。!この違いは、磁場の偏りとその値の変化が、地磁気の変化に伴って時折、時折変化することが知られています。 This appは、いくつかの値を相対精度で計算できます。私はあまりにも多くのことを心配することはないでしょう。しかし、あなたは良い精度を探しているかもしれません。

2)強い磁場を発生する金属製の物や物から離してください。たとえば、お使いの携帯電話がコンピュータや物理キーボードの近くにある場合は、テストをしないでください。コンパス - ジオロケーションのテストのための純粋な毒です。 appsは磁場の強さを測定できます(デバイスがそれをサポートしている場合)。あなたが金属のものに近づくと、あなたはより高い価値と方向性の強い変化を経験します。楽しいために、いくつかの "metal detectors"もあります。このアプリは、磁場の変化を認識し、「金属物体」や装置に磁気的に干渉するものを閉じるときに振動します。

3)デバイスを横向きに傾けるときは、軸受を更新することを忘れないでください。 (article is a must read!)これは、方位角の値が携帯電話の平面に対する垂直軸の回転に基づいているためです。デバイスを横向きに回転させると、この値は+/-90º変化します! これはアプリケーションランドスケープモードを無効にしても解決されません。他の2軸(ピッチとロール)の周りの回転を解析することで、プログラムで決定する必要があります。これは自明ではありませんが、ネットのどこかにいくつかの例があります。

編集:あなたはいくつかのコードに興味がある場合は、Mixareをチェックアウト、それはAndroidのためのGPL3の下でオープンソースの拡張現実フレームワークです。オリエンテーション、コンパスのジオロケーションとベアリングに関するコードを見てください。

PS:私は、上記のアプリケーションの作成者との接続は一切ありません。

+1

1)デバイスにキャリブレーションが行われていないことをユーザーに伝える方法はありますか?2)磁気干渉があるときを知る方法はありますか? 3)私は風景モードを無効にしましたので、私はそれについて心配しないでしょうか? – eladrich

+0

私は答えを更新しました。あなたの質問のいくつかにお答えしたいと思っています – MobileCushion

+0

@MobileCushionとても素敵な答えです、ありがとうございます – RiadSaadi

関連する問題