Comportamiento extraño de las medidas del campo magnético mientras gira el dispositivo

La situación:

Estoy tratando de crear un sistema de localización de interiores con el uso de las variaciones de campo magnético dentro de un edificio a través de huellas dactilares. Como sensor estoy usando mi teléfono móvil Galaxy Nexus.

Básicamente la idea de obtener mis huellas dactilares es medir el campo magnético en las direcciones x, y y z respectivamente y girar el vector por la orientación del móvil para llevar el vector al sistema de coordenadas del mundo. Para localizar a alguien también mide el campo magnético, gira el vector y lo envía al servidor donde ejecutaré mis algoritmos de localización.

Mi problema:

Cuando mido el campo magnético en el mismo punto en diferentes orientaciones no obtengo el mismo resultado después de girar el vector. Incluso la intensidad del campo no es lo mismo.

Para demostrar esto he hecho cuatro mediciones en la misma posición y he girado el móvil alrededor de su eje z ( especificación estándar de Android ) en 90, 180 y 270 grados en sentido contrario a las agujas del reloj respectivamente. Los resultados se pueden ver en esa "tabla" y en las gráficas de Matlab (sigue el enlace) a continuación (si quieres tener otras opiniones, házmelo saber)

Edit: Para ser más precisos: Lo que realmente hice fue que definí mi propio sistema de coordenadas llamado vamos a decir el sistema de coordenadas de la habitación. Tomé una pared de la habitación y la definí como norte. El eje y de mi teléfono extranjeros con esa pared (en la primera posición), mientras que estaba plana sobre la mesa. Por lo tanto, el eje z positivo apunta al cielo y el eje x se define como las paredes en 90 grados. Los vectores nombrados con 'Raw' son los valores sin procesar del teléfono y por lo tanto están en el sistema de coordenadas del teléfono. El vector denominado con 'Rotated' es rotado en ese 'sistema de coordenadas de la habitación'. En la gráfica los vectores punteados son los vectores crudos y los sólidos los girados.

╔═════════════╦════════╦════════╦════════╦══════════╗ ║ Vector ║ X ║ Y ║ Z ║ Strength ║ ╠═════════════╬════════╬════════╬════════╬══════════╣ ║ 0°Raw ║ 17.55 ║ 8.21 ║ -36.83 ║ 41.62 ║ ║ 0°Rotated ║ 17.55 ║ 8.21 ║ -36.83 ║ 41.62 ║ ║ 90°Raw ║ 15.74 ║ -11.36 ║ -36.86 ║ 41.66 ║ ║ 90°Rotated ║ 11.36 ║ 15.74 ║ -36.86 ║ 41.66 ║ ║ 180°Raw ║ -65.06 ║ -16.18 ║ -44.79 ║ 80.63 ║ ║ 180°Rotated ║ 65.06 ║ 16.18 ║ -44.79 ║ 80.63 ║ ║ 270°Raw ║ 6.38 ║ 61.95 ║ -46.37 ║ 77.64 ║ ║ 270°Rotated ║ 61.95 ║ -6.38 ║ -46.37 ║ 77.64 ║ ╚═════════════╩════════╩════════╩════════╩══════════╝ 

Introduzca aquí la descripción de la imagenIntroduzca aquí la descripción de la imagen

Como se puede ver incluso después de rotarlos que realmente no coincide. ¿Tienes alguna idea de por qué esto podría ser? ¿Algo que no haya considerado todavía? ¡Muchas gracias por adelantado!

Edit2 :

Segundo experimento

Hice otro experimento con mejores resultados pero todavía no tan bueno como esperaba. Esta vez la dirección no es tan constante como debería ser. Esta vez hice mis mediciones al aire libre. Yo aliené el eje y al norte verdadero y lo puse plano en el suelo. Lo giré aproximadamente 3 veces 90 grados en sentido contrario a las agujas del reloj. Tomé con otra cámara una imagen de la posición del móvil y midí la rotación real con photoshop. Los resultados que puedes ver en la tabla y en las parcelas de abajo:

 ╔═════════════╦════════╦════════╦════════╦══════════╗ ║ Vector ║ X ║ Y ║ Z ║ Strength ║ ╠═════════════╬════════╬════════╬════════╬══════════╣ ║ 0°Raw ║ 1.22 ║ 20.31 ║ -57.53 ║ 61.02 ║ ║ 0°Rotated ║ 1.22 ║ 20.31 ║ -57.53 ║ 61.02 ║ ║ 104°Raw ║ 25.92 ║ 5.66 ║ -57.53 ║ 63.35 ║ ║ 104°Rotated ║ -11.93 ║ 23.70 ║ -57.53 ║ 63.35 ║ ║ 204°Raw ║ 5.42 ║ -16.86 ║ -59.67 ║ 62.24 ║ ║ 204°Rotated ║ -11.90 ║ 13.12 ║ -59.67 ║ 62.24 ║ ║ 290°Raw ║ -12.18 ║ 0.73 ║ -57.85 ║ 59.12 ║ ║ 290°Rotated ║ -3.64 ║ 11.64 ║ -57.85 ║ 59.12 ║ ╚═════════════╩════════╩════════╩════════╩══════════╝ 

Introduzca aquí la descripción de la imagenIntroduzca aquí la descripción de la imagen

Notas adicionales:

Los valores se promedian en un par de segundos. Así que no es un problema de ruido.

Sé que no puedo usar la función getOrientation porque usa el campo magnético para calcular la orientación y que no tendría sentido ya que quiero encontrar las variaciones del campo magnético. Para el ejemplo anterior he creado el quaternion de rotación manualmente.

Asegúrese de que está monitoreando la precisión de los sensores a través del onAccuracyChanged(Sensor sensor, int accuracy) . Encuentro que con mi tableta Nexus 10, la precisión cambia regularmente, y cuando es baja o poco fiable, obtengo resultados similares a los tuyos.

  • ¿Cómo conservar la instancia de fragmento de fragmento de reproducción de vídeo después de un cambio de orientación?
  • Android: la vista previa de la cámara es lateral
  • Android: diseño alternativo xml para el modo horizontal
  • Uso de giroscopio Android en lugar de acelerómetro. Encontré un montón de fragmentos, pero no hay código completo
  • ¿Cómo reemplazar adecuadamente Sensor.TYPE_ORIENTATION (que ahora está obsoleto)?
  • Ayuda natural de la orientación del sensor de Android
  • Guardar datos y cambiar la orientación
  • Visualización de imágenes de la tarjeta sd en gridview android
  • OnSurfaceCreated () se llama cambios de orientación cada vez
  • Android: orientación de la vista previa de la cámara en modo vertical
  • OnCreate no se llama cuando la pantalla gira - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.