Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

У меня есть несколько советов для вас:

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

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

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

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

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

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