web-dev-qa-db-ja.com

android)で正確なコンパスを作成する方法

my 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);
        }
};

この方法は通常は機能しますが、北が間違っている場合があります。より正確な位置を取得するにはどうすればよいですか?

17
eladrich

私はあなたにいくつかの提案があります:

1)デバイスが調整されていない可能性があります。それを行うには、8の形で動かします( これを参照 )。デバイスがキャリブレーションされているかどうかを確認しない場合は、デバイスを既知の基点方向に向けてテストを行い、値を比較します。通常、デバイスがキャリブレーションされていない場合、小さな回転で方位角値に大きな変動が見られます。それが私が心配することです。

さて、センサーが真北ではなく磁北への方位を与えることを忘れないでください!この違いは磁場の赤緯として知られており、その値は場所ごとに、そして地球の磁場の変化によって時々変化します。 このアプリ 相対的な精度でいくつかの値を計算できます。赤緯は通常小さいのであまり心配しませんが、あなたは良い精度を探しているかもしれません(私が住んでいる場所では現在、偏角は3ºです)。

2)強い磁場を発生する金属物や物に近づかないでください。たとえば、コンピュータの近くに電話がある場合や物理的なキーボードがある場合は、テストを行わないでください。これは、コンパスジオロケーションをテストするための純粋な毒です。一部の apps は、磁場の強度を測定できます(デバイスがそれをサポートしている場合)。あなたが金属のものに近づくとき、あなたはより高い価値と方向の強い変化を経験するでしょう。おもしろいことに、いくつかの「 金属探知機 」もあります。このアプリは、磁場の変化を認識し、「金属物体」やデバイスに磁気的に干渉するものに近づくと振動します。

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

編集:コードに興味がある場合は、 Mixare をチェックしてください。 、Android向けGPL3に基づくオープンソースの拡張現実フレームワークです。向き、コンパスの地理位置情報、方位に関するコードをご覧ください。

PS:私は言及されたアプリケーションの作成者とは何の関係もありません。

37
MobileCushion