Android: компас слишком неточный? - PullRequest
0 голосов
/ 06 декабря 2010

У меня есть приложение, в котором я хочу получить доступ к магнитометру. Я получаю результаты из своего приложения, но по сравнению с результатами ориентации из приложения компаса g1 я получаю совершенно другие результаты в своем приложении, чем приложение компаса. Например: мое приложение имеет угол 250 °, а приложение компаса - 90 °! Этого просто не может быть, вот мой код. Есть ли разница, чтобы стать лучше?

public class MySensorListener implements SensorListener{
  int orientation;
  public MySensorListener(){
     orientation = 0;
  }
    public void onAccuracyChanged(int sensor, int accuracy) {
  // TODO Auto-generated method stub

 }

    public void onSensorChanged(int sensor, float[] values) {
        orientation = (int)values[0];
    }
}

Я работаю с Sensormanager следующим образом:

private MySensorListener doCompass(){
 MySensorListener cl;
 SensorManager cm;
 compassListener = new MySensorListener();

  cm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

  cm.registerListener(
   cl, 
   SensorManager.SENSOR_ORIENTATION, 
   SensorManager.SENSOR_DELAY_UI); //updateRate
  return cl;
}

Кто-нибудь может помочь, пожалуйста? :)

Спасибо

Ответы [ 3 ]

3 голосов
/ 08 июля 2014

вы должны использовать Math.toDegrees.поскольку значение [0] возвращает радиан.

edit я вижу в другом посте, некоторые люди говорят, что значение [0] возвращает радиан.но после того, как я попытаюсь его закодировать, я не знаю, значение [0] возвращает радиан или класс / гон.потому что, когда я конвертирую в степень .. значение больше 360. поэтому я пытаюсь конвертировать его в оценку.и это выглядит хорошо и не имеет проблем.код такой:

Double azimuth = value[0];
azimuth = azimuth * 360 / 400;

извините за плохой английский:)

1 голос
/ 06 декабря 2010

Я не уверен, что фильтры Калмана действительны для значений датчика ориентации, но это то, что вам может понадобиться. Подробнее о фильтрах Калмана для Android упоминается здесь

Если вы не хотите испытывать головную боль при изучении и внедрении фильтра Калмана, используйте то, что я сделал ниже. Для меня это работало достаточно хорошо. :

private boolean isMagneticFieldFine(float[] fieldValues){
    double value = Math.sqrt(fieldValues[0]*fieldValues[0] + fieldValues[1]*fieldValues[1] + fieldValues[2]*fieldValues[2]);        
    return value < 65.0 && value > 25.0;
}

Другое дело, SensorListener устарел, попробуйте вместо этого использовать SensorEventListener!

0 голосов
/ 10 июля 2014

Существует много способов калибровки направлений, таких как использование данных других датчиков для калибровки (например, гироскоп и акселерометр) или использование статистических моделей (например, фильтр частиц и фильтр Калмана). В этой презентации рассказывается о некоторых новейших технологиях, используемых в промышленности для калибровки датчиков движения: https://www.youtube.com/watch?v=C7JQ7Rpwn2k

...