2011-06-06 9 views
10

He estado trabajando en una pequeña aplicación de brújula en los últimos días, y he puesto el código en funcionamiento, pero parece que la lectura de la brújula no es precisa. Después de calibrar ambos teléfonos, mi primera prueba de que encontré esto en el que simplemente sostuve el teléfono y la superficie plana miré la lectura, luego la volteé horizontalmente y la puse contra la misma superficie plana (un giro de 180 *) y el valor no cambia 180 * estaba más cerca de 240 *.la brújula de Android parece poco fiable

Luego probé la lectura frente a una brújula, a veces la lectura parecía estar cerca pero en otros puntos era más de 50 * off. Incluso traté de poner mi teléfono y mi brújula en el piso para mantener las brújulas alejadas de cualquier interferencia magnética con los mismos resultados (nótese que también mantengo la brújula y el teléfono separados manteniéndolos en la misma dirección alineándolos con los bordes de un libro) .

Luego puse la aplicación de muestra en otro teléfono (primero fue Nexus S, el segundo fue Motorola droid 1). Entre los dos teléfonos, la diferencia varía entre ser igual en algunos puntos pero en la mayoría de los puntos estar entre 50 y 15 grados.

He revisado la documentación y también he revisado muchas publicaciones en el foro y no veo a nadie con los mismos resultados. Puede haber un pequeño error en mi código que está causando que mi lectura salga de manera incorrecta, o algún error documentado que no veo.

¡Cualquier idea o sugerencia sería muy apreciada!

Heres mi código en el sensor cambió en mi clase SensorEventListener

public void onSensorChanged(SensorEvent event) 
    { 
     // If the sensor data is unreliable return 
     if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) 
     { 
      Toast.makeText(main.this, "Sensor Status Unreliable",Toast.LENGTH_SHORT).show(); 
     } 





     // Gets the value of the sensor that has been changed 
     switch (event.sensor.getType()) 
     { 
     case Sensor.TYPE_ACCELEROMETER: 
      m_vfgravity = event.values.clone(); 
      break; 
     case Sensor.TYPE_MAGNETIC_FIELD: 
      m_vfgeomag = event.values.clone(); 
      break; 
     } 

     if (m_vfgravity != null && m_vfgeomag != null) 
     { 
      if(SensorManager.getRotationMatrix(m_vfinR, m_vfI, m_vfgravity, m_vfgeomag)) 
      { 
       SensorManager.getOrientation(m_vfinR, m_vforientVals); 

       m_fCompBearing = (float) Math.round((Math.toDegrees(m_vforientVals[0])) *2)/2; 

       //convert to 0-360 from -180-180 
       if(m_fCompBearing < 0.0) 
       { 
        m_fCompBearing = 360 + m_fCompBearing; 
       } 


       mCompHead.setText("" + (int)m_fCompBearing); 
      } 

      calcOffset(); 
      rotateCmp(); 
     } 
    } 

Y código en el crear de mi actividad

mSMngr = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    mSListener = new cSensorListener(); 

    mSMngr.registerListener(mSListener, 
      mSMngr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
      SensorManager.SENSOR_DELAY_UI); 
    mSMngr.registerListener(mSListener, 
      mSMngr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_UI); 

Gracias de antemano!

Edición: también lo intenté con el droide X con los peores resultados hasta el momento ... Cuando el teléfono se gira alrededor de 45 grados (girado alrededor del eje z un sistema de coordenadas de la computadora) el rumbo de la brújula puede cambiar más de 180 grados, De hecho, el valor del encabezado va en la dirección opuesta a los otros teléfonos cuando se gira en la misma dirección. Este es el único teléfono que produce este resultado incluso después de la calibración en la configuración. También su es un fondo de pantalla en vivo brújula que pruebo que no tiene el mismo problema. Así que supongo que podría hacer algo en el software para evitar esto.

+0

¿Estás seguro de que Android es el problema y no el hardware? –

+0

Una fuente obvia de diff sería magnética frente al norte verdadero. FWIW, mi unidad básica de garmin gps apunta hacia adelante si giras un círculo sin moverse. La única forma de utilizar estas unidades gps básicas es apuntar en la dirección de desplazamiento y _mov_ adelante. Esto puede no tener nada que ver con su problema, ¿pero? – JAL

+0

Primero de gracias por las respuestas rápidas. bueno, se supone que el administrador del sensor siempre debe regresar al norte magnético, el gps regresaría al verdadero norte porque usa la dirección del movimiento en lat/lon que se basa en el norte verdadero. En cuanto a que se trata de un problema de hardware, esta es una posibilidad, sin embargo, he visto aplicaciones que arrojarán resultados similares en todos los ámbitos y se preguntaron cómo lo harían. Probé también con DroidX y los resultados fueron muy diferentes en el Droid X, mi imagen de brújula incluso giró en direcciones opuestas. – ocross

Respuesta

3

Bueno después de muchas pruebas y depuración. Llegué a la conclusión de que sí, ya que algunos de ustedes mencionaron las diferencias que mi droide 1 y Nexus S eran puramente diferencia de hardware e interferencia magnética.

Sin embargo, el Droid X era un problema diferente, lo que sea que intenté no pude obtener las lecturas correctas de la manera recomendada con getRotationMatrix y getOrientation, incluso cuando se agrega la función de coordenadas de re-map. Así que después de algunos retoques sin éxito, pensé en darle una oportunidad al sensor de orientación.

Google dice que esta forma está obsoleta y recomiendan hacerlo de la manera en que comencé con, sin embargo intenté todo tipo de combinaciones con esa manera sin éxito.Así que seguí e ignoré su advertencia y usé el sensor de orientación ... y funcionó. Por qué ? No tengo ni idea, el droide x es un sistema operativo más nuevo que mi droide 1, por lo que no debería tener que ver con el uso de código heredado. Sin embargo, tiene sentido por qué las aplicaciones de brújula que escribió en Target 1.6 funcionarían mientras mi aplicación que hacía la "forma recomendada" no funcionaba.

Si alguien tiene alguna forma mejor de hacerlo, hágamelo saber, o si conoce una forma de hacerlo funcionar con getRotationMatrix y getOrientation también diga.

De lo contrario, para cualquier persona que golpee esta pared de ladrillo tan duro como lo hice aquí está el código que terminó trabajando para mí.

mi en el sensor cambió

 switch (event.sensor.getType()) 
     { 
     case Sensor.TYPE_ORIENTATION: 
      m_vforientVals = event.values.clone(); 
      break; 
     } 

     if(m_vforientVals != null) 
     { 
      m_fCompBearing = m_vforientVals[0];    


      mCompHead.setText("" + (int)m_fCompBearing); 

      calcOffset(); 
      rotateCmp(); 
     } 

e inicializar el oyente sensor de

mSMngr.registerListener(mSListener,mSMngr.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
          SensorManager.SENSOR_DELAY_NORMAL); 
2

Su código se ve bien para mí, si hubiera un error en su código, estoy bastante seguro de que ambos dispositivos sufrirían de eso. Creo que es el hardware en los dispositivos lo que está causando las diferencias. ¿Ha "calibrado" ambas brújulas moviendo el teléfono en forma de ocho figuras? Muchas aplicaciones de brújula sugieren eso, incluido el software de mapas que viene con dispositivos Symbian. Eso podría funcionar

+0

Gracias por la respuesta, y usted hace un gran punto sobre la calibración que puede hacer una gran diferencia y hacer las brújulas poco confiables. Desafortunadamente, este fue un paso que olvidé mencionar que hice antes de las pruebas (lo edité ahora). Le daré otra oportunidad y calibraré aún más esta vez, también veré si observo mejores resultados. – ocross

31

A pesar de que el autor respondió a su propia pregunta que tengo que tocar aquí sólo para reforzar la inutilidad casi absoluta de cualquier tipo de funcionalidad brújula en la plataforma Android.

He llegado a la conclusión de que cualquiera que dependa de una aplicación de brújula de Android está buscando problemas, ninguno de ellos funciona de manera confiable y no es culpa del desarrollador.

Google y los mfg simplemente no han proporcionado una manera de obtener una precisión confiable de estos dispositivos, o incluso para determinar si la precisión es confiable, que es aún peor porque a veces lo son y muchas veces no lo son y si alguien confía en estos dispositivos para la orientación real Dios los ayude. El motivo por el cual el autor probablemente cree que está obteniendo mejores resultados es que usan un filtro de ruido bastante bueno en el sensor de orientación desaprobado (por qué no pudieron hacerlo en el método más reciente). un solo dispositivo después de la calibración esto parece funcionar, pero en el campo usando muchos dispositivos, he encontrado que en su mayor parte la fiabilidad siempre está en cuestión.

Primero, el ruido generado por los sensores magnéticos y de orientación es horrible, sí, esto puede superarse con las técnicas DSP adecuadas, y con 2.3 y teléfonos habilitados para giroscopio mejorará en general, pero la vergüenza de Google y la Mfg mucho tiempo de desarrollador con implementaciones deficientes de productos de hardware y software.

En segundo lugar, probé al menos 18 teléfonos con el filtro DSP adecuado y mientras eso limpia el ruido no ayuda con precisión, incluso el mismo modelo de teléfonos tiene salidas diferentes (aunque algunos modelos parecen mejores que otros)

En tercer lugar, tiene poco para determinar si los sensores están calibrados, incluso haciendo el movimiento espástico de la figura 8 puede o no calibrar el teléfono y el usuario nunca sabe si funciona o no, a menos que tenga un brújula para verificar, que tipo de derrotas el punto, ¿no?

NOTA: puede multiplicar y sumar los sensores magnéticos entre sí y tomar la raíz cuadrada de ese sqrt (x * x + y * y + z * z) y asegurarse de que esté entre 25 y 65 o menos, esto es un indicador que puedes usar para detectar campos anómalos pero no es completamente confiable, mejor que nada, supongo.

En cuarto lugar, muchos teléfonos son completamente confiables, calibrados o no, que no se limita a los tipos de modelo, pero posiblemente QA de mala calidad por parte de la mfg, realmente no sé por qué pero puedo decir que 3 HTC ARIA producido resultados tremendamente diferentes (uno a 30 grados, los otros 50 y un tercero casi al instante) lo mismo con increíbles, nexus, etc.

Probé 18 teléfonos y muchos eran bastante precisos SI se podía calibrar correctamente, pero muchos de ellos tomaron 2-10 intentos (lo verificamos después de cada intento de calibración con una brújula de alta precisión) y más de unas pocas veces simplemente NO calibraría en absoluto.

NOTA: tienes que dar cuenta de la declinación para un desplazamiento norte verdadero, lo que puedes hacer con la API en Android si tienes acceso a las coordenadas GPS actuales, altitud, hora del día, etc. el problema NO fue declinación y si comparas con una brújula eso no es un problema de todos modos, ya que también se verá afectado por los campos magnéticos locales.

Fith, los arranques en frío siempre requieren el paso de calibración en cada teléfono que probamos, que incluye la X, la increíble, la Aria, la Nexus y la Thunderbolt. En otras palabras, la primera vez que inicia el sensor escuchando el 95% del tiempo requerirá un paso de calibración (incluso un reloj roto es correcto dos veces al día), por lo que si insiste en agregar esta funcionalidad, le diría a su usuario que lo haga en el comienzo de cada evento oyente.

Si deja los sensores en funcionamiento (mal para la batería), entonces puede o no tener que volver a calibrar según los campos en los que se encuentre) el método anterior funciona bien para eso.

La conclusión es que cuando funcionan parecen geniales, pero NUNCA se puede estar seguro de la precisión del azimut, lo que los hace poco confiables e inútiles para cualquier trabajo real.

Personalmente usaría un GPS teniendo mientras me muevo y luego un método de rotación de vectores si es posible, podría no ser perfecto, pero sería muchísimo mejor que la implementación craptacular que tiene en la línea actual de teléfonos para acimut

Perdón por la respuesta larga pero he perdido casi un mes tratando de hacer que esto funcione con la ayuda de un experto ingeniero de DSP y hemos escrito mucho sobre la plataforma de Android como útil en este sentido.

A "En ocasiones, esto funciona, otras veces no lo hará, nunca se puede estar seguro a menos que tenga una brújula real". En mi opinión, se debe incluir una exención de responsabilidad en cada aplicación de la brújula.

+2

Sí, estoy de acuerdo contigo. Llegué a la conclusión de que debe darse cuenta de que habrá un margen de error de +30 grados con las lecturas que parece que en la mayoría de mis dispositivos (solo probado con 6) se mantiene entre un rango de alrededor de 10. As por eso dije que el sensor de orientación era la solución porque el droide X no funcionaba en absoluto.La lectura no era casi correcta cuando los otros estaban cerca con un margen de error y al cambiar a la orientación, la X funcionaba de manera similar a los demás. La reducción de ruido fue agradable, pero ya estaba haciendo mi propio filtro de paso bajo después de obtener los valores. – ocross

+0

@ocross Lo que encontré fue que si el archivo de sensores cfg se borraba, el problema de compensación y el problema de recalibración desaparecían. El problema es que requiere acceso de root, y es solo temporal. También el problema de adherencia parece estar relacionado con la calibración manual en los teléfonos que pruebo, el movimiento de la muñeca de lazy-8 fijo al menos eso. Para el otro, tuve que incluir y compensar la función que podría ser "sincronizada" con el rumbo gps (la precisión de velocidad debe ser buena) o manualmente por el usuario. El problema es que la deriva ocurre con el tiempo – Idistic

+0

Este tipo de publicación es a la vez una bendición y una maldición: iba a confiar en los acelerómetros para determinar el rumbo (otro método no tan confiable), pero me preguntaba si cambiar a magnetómetros para el rumbo la determinación no hubiera sido una mejor idea desde el principio. Como voy a necesitar una lectura precisa paso a paso del rumbo, los acelerómetros no funcionan y las brújulas parecen no funcionar, ¿qué queda entonces? ¿Es el GPS lo suficientemente confiable? Incluso con la interferencia del horizonte? – ravemir

Cuestiones relacionadas