2011-10-24 946 views
17

mi aplicación de Android muestra la dirección de un lugar en particular en el mundo y por lo tanto en la necesidad de obtener el grado de brújula.
Este es el código que he estado utilizando para calcular los grados:Cómo hacer una brújula precisa en 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); 
     } 
}; 

Este método funciona normalmente pero a veces simplemente se pone el norte equivocado, ¿qué tengo que hacer para conseguir una localización más precisa?

+0

Esta sería una buena pregunta para agregar a la nueva http://area51.stackexchange.com/proposals/102228/virtual-and-augmented-reality propuesta de StackExchange. – SashaZd

Respuesta

33

Tengo un par de sugerencias para usted:

1) El dispositivo no esté calibrado. Para hacerlo, muévelo en forma de 8 (see this). Si no lo hace, si su dispositivo está calibrado o no, realice algunas pruebas apuntando el dispositivo hacia algún punto cardinal conocido y compare los valores. Normalmente, si un dispositivo no está calibrado, verá grandes variaciones en el valor de azimut para rotaciones pequeñas. Eso es lo que me preocuparía.

Ahora, no olvide que el sensor le da el rodamiento a Norte magnético, y no True North! Esta diferencia se conoce como declinación del campo magnético y su valor cambia de un lugar a otro y de vez en cuando debido a cambios en el campo magnético de la Tierra. This app puede calcular algunos de los valores para usted con relativa precisión. No estaría demasiado preocupado por esto ya que la declinación suele ser pequeña, pero es posible que esté buscando una buena precisión (donde vivo la declinación es 3º, actualmente).

2) Manténgase alejado de objetos metálicos o cosas que generen un fuerte campo magnético. Por ejemplo, ¡no haga pruebas si tiene su teléfono cerca de la computadora o de cualquier teclado físico! Este es un veneno puro para probar la geolocalización de la brújula. Algunos apps pueden medir la intensidad del campo magnético (si el dispositivo lo admite). Cuando te acerques a cosas de metal experimentarás valores más altos y cambios fuertes en las direcciones. Por diversión, también hay algunos "metal detectors": esta aplicación reconoce los cambios en el campo magnético y vibra cuando está cerca de un "objeto metálico" o cosas que interfieren magnéticamente con el dispositivo.

3) Recuerde actualizar el rumbo cuando inclina su dispositivo al modo horizontal. (article is a must read!) Esto se debe a que el valor de azimut se basa en la rotación del eje perpendicular al plano del teléfono. ¡Cuando gira el dispositivo a horizontal, este valor se cambia por +/- 90º! ¡Esto no se resuelve al deshabilitar el modo de paisaje de la aplicación! Tendrá que determinarlo mediante programación analizando rotaciones alrededor de los otros dos ejes (cabeceo y balanceo). Esto no es trivial, pero hay algunos ejemplos en algún lugar de la red.

edición: Si está interesado en algún código, echa un vistazo a Mixare, es una fuente aumentada marco realidad abierta bajo la GPL3 para Android. Eche un vistazo a su código con respecto a la orientación, la geolocalización de la brújula y el rumbo.

PD: No tengo ningún tipo de conexión con los creadores de las aplicaciones mencionadas.

+1

1) ¿Hay alguna manera de decirle al usuario que el dispositivo no está calibrado?2) ¿Hay alguna manera de saber cuándo hay interferencia magnética? 3) Desactivé el modo paisaje así que no me preocupo por eso, ¿verdad? – eladrich

+0

He actualizado la respuesta. Espero contestar algunas de sus preguntas – MobileCushion

+0

@MobileCushion muy buena respuesta, muchas gracias – RiadSaadi

Cuestiones relacionadas