Как сделать точный компас на андроид - PullRequest
17 голосов
/ 24 октября 2011

мое приложение для 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 Ответ

37 голосов
/ 24 октября 2011

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

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

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

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

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

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

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

...