2011-10-24 4 views
17

mon application android montre la direction d'un endroit particulier dans le monde et donc dans les besoins d'obtenir le degré de la boussole.
Ceci est le code que je l'ai utilisé pour calculer les degrés:Comment faire une boussole précise sur 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); 
     } 
}; 

Cette méthode fonctionne habituellement, mais parfois, il devient juste le mauvais Nord, que dois-je faire pour obtenir un emplacement plus précis?

+0

Ce serait une bonne question à ajouter à la nouvelle proposition http://area51.stackexchange.com/proposals/102228/virtual-and-augmented-reality StackExchange. – SashaZd

Répondre

33

J'ai quelques suggestions pour vous:

1) Votre appareil ne peut pas être étalonnée. Pour ce faire, déplacez-le dans une forme de 8 (see this). Si vous ne le faites pas si votre appareil est calibré ou ne faites pas de tests en pointant l'appareil à une certaine direction cardinale connue et comparez les valeurs. Généralement, si un appareil n'est pas calibré, vous verrez de grandes variations dans la valeur d'azimut pour les petites rotations. C'est ce qui m'inquièterait.

Maintenant, n'oubliez pas que le capteur vous indique le nord magnétique, et non le nord géographique! Cette différence est connue sous le nom de déclinaison du champ magnétique et sa valeur varie d'un endroit à l'autre et de temps à autre en raison des changements dans le champ magnétique de la Terre. This app peut calculer certaines des valeurs pour vous avec une précision relative. Je ne serais pas trop inquiet à ce sujet car la déclinaison est généralement petite, mais vous pourriez être à la recherche d'une bonne précision (où je vis la déclinaison est 3º, actuellement). 2) Restez à l'écart des objets métalliques ou de tout autre matériau générant un fort champ magnétique.

Par exemple, ne faites pas de tests si vous avez votre téléphone à proximité de l'ordinateur ou de tout clavier physique! C'est un pur poison pour tester la géolocalisation de la boussole. Certains apps peuvent mesurer l'intensité du champ magnétique (si l'appareil le supporte). Quand vous vous rapprochez des objets en métal, vous verrez des valeurs plus élevées et de forts changements de direction. Pour le plaisir, il ya aussi quelques "metal detectors": cette application reconnaît les changements dans le champ magnétique et vibre lorsque vous êtes proche "objet métallique" ou des choses qui interfèrent magnétiquement avec l'appareil.

3) N'oubliez pas de mettre à jour le relèvement lorsque vous inclinez votre appareil en mode paysage. (article is a must read!) C'est parce que la valeur d'azimut est basée sur la rotation de l'axe perpendiculaire au plan du téléphone. Lorsque vous faites pivoter l'appareil en mode paysage, cette valeur est modifiée de +/- 90º! Ceci n'est pas résolu en désactivant le mode paysage de l'application! Vous devrez le déterminer par programmation en analysant les rotations autour des deux autres axes (tangage et roulis). Ce n'est pas trivial, mais il y a des exemples quelque part dans le net.

modifier: Si vous êtes intéressé par un code, consultez Mixare, il est un cadre de réalité augmentée open source sous la GPL3 pour Android. Jetez un oeil à leur code concernant l'orientation, la géolocalisation de la boussole et le relèvement. PS: Je n'ai aucun type de connexion avec les créateurs des applications mentionnées.

PS: Je n'ai aucun type de connexion avec les créateurs des applications mentionnées.

+1

1) Y a-t-il un moyen de dire à l'utilisateur que l'appareil n'est pas calibré?2) Y a-t-il un moyen de savoir quand il y a des interférences magnétiques? 3) J'ai désactivé le mode paysage, donc je ne m'inquiète pas, non? – eladrich

+0

J'ai mis à jour la réponse. J'espère avoir répondu à certaines de vos questions – MobileCushion

+0

@MobileCushion très belle réponse, merci beaucoup – RiadSaadi

Questions connexes