Как сделать точный компас на Андроид

мое приложение для 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);
        }
};

этот метод обычно работает, но иногда он просто получает неправильный север, что я должен сделать, чтобы получить более точное местоположение?

1 ответов


У меня есть несколько предложений для вас:

1) устройство не может быть откалиброван. Чтобы сделать это, переместите его в виде 8 (посмотреть этот). Если устройство откалибровано или не откалибровано, проведите некоторые тесты, указав устройство в известном направлении и сравнив значения. Как правило, если устройство не откалибровано, вы увидите большие изменения значения Азимута для небольших вращений. Вот что бы я сделал. будь осторожен.

теперь, не забывайте, что датчик дает вам направление на магнитный север, а не истинный Север! Эта разница известна как склонение магнитного поля, и его значение меняется от места к месту и время от времени из-за изменений магнитного поля Земли. приложение может вычислить некоторые из значений для вас с относительной точностью. Я бы не слишком беспокоился об этом, поскольку склонение обычно мало, но вы возможно, вы ищете хорошую точность (где я живу, склонение составляет 3º, в настоящее время).

2) держитесь подальше от металлических предметов или вещей, которые генерируют сильное магнитное поле. Например, не делать тесты, Если у вас есть телефон рядом с компьютером или любой физической клавиатуры! Это чистый яд для тестирования компаса-геолокации. Некоторые приложения может измерить интенсивность магнитного поля (если устройство поддерживает его). При приближении к металлической вещи вы испытайте более высокие ценности и сильные изменения в направлениях. Для удовольствия, есть также некоторые"металлоискатели": это приложение распознает изменения в магнитном поле и вибрирует, когда вы близки "металлический объект" или вещи, которые магнитно мешают устройству.

3) Не забудьте обновить подшипник при наклоне устройства в ландшафтный режим. (статья должна читать!) это потому, что значение азимута основан на вращение перпендикулярной оси к плоскости телефона. При повороте устройства в горизонтальное положение это значение изменяется на + / - 90º! Это не решается путем отключения ландшафтного режима применения! вам нужно будет определить его программно, проанализировав вращения вокруг двух других осей (шаг и крен). Это не тривиально, но где-то в сети есть несколько примеров.

edit: если вас интересует какой-то код, проверьте Mixare, это с открытым исходным кодом дополненной реальности рамки под GPL3 для Android. Взгляните на их код относительно ориентации, геолокации компаса и пеленга.

PS: у меня нет никакой связи с создателями упомянутых приложений.