2010-12-06 5 views
0

J'ai une application où je veux accéder au magnétomètre. Je reçois des résultats hors de mon application, mais par rapport aux résultats d'orientation de l'application boussole de g1, je reçois des résultats complètement différents avec mon application que l'application boussole. Par exemple: mon application saisira 250 ° et l'application boussole 90 °! Cela ne peut tout simplement pas être, voici mon code. Y at-il une différence pour devenir de meilleurs résultats?Android: Boussole trop imprécise?

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]; 
    } 
} 

J'Acess le Sensormanager comme ceci:

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

peut-elle aider quelqu'un, Pleeease ?! :)

Merci

Répondre

1

Je ne sais pas si les filtres de Kalman est valide pour les valeurs de capteur d'orientation, mais c'est ce que vous pourriez avoir besoin. Plus sur les filtres de Kalman pour android est mentionné here

Si vous ne voulez pas passer par le mal de tête de l'étude et la mise en œuvre du filtre de Kalman, utilisez ce que j'ai fait ci-dessous.Il a travaillé raisonnablement bien pour moi. :

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

Une autre chose, SensorListener est dépréciée, essayez d'utiliser à la place SensorEventListener!

3

vous devez utiliser Math.toDegrees. parce que la valeur [0] renvoie radian.

éditer Je vois sur d'autres post, certaines personnes disent que la valeur [0] renvoie radian. mais, après avoir essayé de le coder, je ne connais pas la valeur [0] return radian ou grade/gon. parce que quand je convertis en degré .. la valeur est plus grande que 360. donc j'essaie de le convertir en grade. et ça a l'air bien et n'a pas de problème. le code est comme ce

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

désolé pour le mauvais anglais :)

0

Il y a plusieurs façons de calibrer les directions, telles que l'utilisation d'autres données de capteurs pour calibrer (par exemple, gyroscope et accéléromètre), ou utiliser des modèles statistiques (par exemple un filtre à particules et un filtre de Kalman). Cette présentation traite des dernières technologies utilisées dans l'industrie pour calibrer les capteurs de mouvement: https://www.youtube.com/watch?v=C7JQ7Rpwn2k