proximidad plus giroscopio funciona especificaciones configurar calibrar brujula iphone ios compass-geolocation iphone-4 gyroscope

plus - giroscopio iphone 7 no funciona



Retraso del compás de compás con el giroscopio en el iPhone 4 (4)

Aquí hay un ejemplo de una aplicación de iPhone donde la brújula se compensa con el giroscopio. El código y el proyecto se pueden ver aquí: http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/

He estado experimentando con la brújula y el giroscopio en el iPhone 4 y me gustaría algo de ayuda con un problema que estoy teniendo. Quiero compensar la lentitud de la brújula usando datos del giroscopio.

Usando CMMotionManager y su objeto CMDeviceMotion ( motionManager.deviceMotion ), obtengo el objeto CMAttitude . Corrígeme si me equivoco (por favor), pero esto es lo que CMAttitude la propiedad de yaw del objeto CMAttitude (no necesito pitch ni roll para mis propósitos):

  • yaw oscila entre 0 y PI cuando el teléfono apunta hacia abajo (según lo indicado por deviceMotion.gravity.z ) y se balancea en sentido contrario a las agujas del reloj y de 0 a -PI cuando se gira hacia la derecha
  • cuando el dispositivo apunta hacia arriba, la yaw oscila entre -PI a 0 y PI a 0 , respectivamente
  • y a partir de los datos de la brújula (estoy usando locationManager.heading.magneticHeading ), veo que la brújula da valores de 0 a 360 , y el valor aumenta al girar en el sentido de las agujas del reloj.

Está bien, así que usando toda esta información, puedo obtener un valor que llamo horizontal que, independientemente de si el dispositivo está apuntando hacia arriba o hacia abajo, dará valores de 0 a 360 y aumentará cuando el dispositivo gire en el sentido de las agujas del reloj. (Aunque sigo teniendo problemas cuando deviceManager.gravity.z tiene un valor de 0 - el valor de deviceManager.gravity.z se deviceManager.gravity.z en este valor de gravity.z ).

Me parece que podría "sincronizar" los valores horizontal y magneticHeading Cabezal, usando un valor horizontal calculado que se asigna al magneticHeading , y "sincronizar" el valor horizontal el horizontal magneticHeading cuando siento que la brújula ha "alcanzado".

Entonces mis preguntas:

  • ¿Estoy en el camino correcto con esto?
  • ¿Estoy utilizando correctamente los datos de giro de CMDeviceMotion y las suposiciones que enumeré anteriormente?
  • ¿Por qué podría yaw cuando gravity.z tiene alrededor de 0 ?

Muchas gracias. Espero escuchar sus respuestas!


La dirección del vector del eje de guiñada no está definida cuando está en gravedad cero (o caída libre, o lo suficientemente cerca).

Para realizar la sincronización mientras está en movimiento, debe crear un filtro para su valor "horizontal" que tenga las mismas características de respuesta de retardo / retardo que la brújula magnética. O eso, o espere hasta que el movimiento se detenga lo suficiente para que ambos valores se estabilicen antes de volver a calcular la compensación.


La respuesta a la pregunta 1 es Sí, la pregunta 2 está en el camino correcto, pero podría usar un nombre de variable que no sea ''horizontal'', la pregunta 3 será respondida por hotpaw2 y también una alerta en un helicóptero o helicóptero a una altitud cercana a cero alertaría El piloto con una alarma. Hay un retraso de tiempo porque parte del software es local, mientras que hay otros factores que pueden ralentizarlo, incluido el acceso a un sensor para detectar ondas magnéticas, la posición y dirección del dispositivo, preparar la salida gráfica para la pantalla de la brújula, calcular y generar datos del giroscopio y los sensores a través de una interfaz relativamente lenta, utilizando un dispositivo portátil de propósito general no diseñado a medida para el tipo de tarea que se le solicita.


Solo trato de responder ... corrigeme si me equivoco ..

1.Si estás en el camino correcto

2. gravedad en CM ya está "aislada" de la gravedad del usuario (valor de gravedad causado por la aceleración del usuario) por eso hay dos gravedad, la "gravedad" y "userAcceleration" está en la documentación de apple CM // Nota: no completamente aislado //

3. si tiene una gravedad 0, significa que el eje correspondiente es perpendicular a la gravedad. gravity.z es la pantalla del iPhone por eso es -9.82m / s2 si pones el escritorio con la pantalla en posición vertical, realmente es difícil obtener 0 o el valor máximo de la gravedad debido al ruido del sensor (es normal, todo el sensor tiene una sensor de ruido especialmente barato).

Lo que hago en mis aplicaciones es cambiar mi eje de referencia a otro eje (en su caso puede ser x o y) para ciertos límites, la forma en que la estrategia depende del propósito o qué lado es su referencia.

La otra cosa es que el giroscopio es rápido pero no es estable, necesita volver a calibrar el valor para varios intervalos. En mi caso cada 5 segundos. He experimentado con giroscopio para calcular el ángulo entre dos planos, lo intento con una regla de 90 grados y dará un error de 0,5 grados cada segundo y seguiré aumentando, pero eso es mío, tal vez otros tengan un método mejor para evitar el error.

a continuación son mis pasos "

  1. En eso
  2. Leer gravedad XYZ -> Xg Yg Zg
  3. Compruebe si Xg <0.25 Si es VERDADERO intente Yg, entonces Zg // Nota 1 = 1g = 9.82 m / s ^ 2
  4. Lee la brújula y el giro
  5. Configure y calibre el girocompás con la brújula y calcúlelo según el eje que uso en el punto 3.
  6. Si transcurren 5 segundos, vuelva a calibrar, lea la brújula
  7. Si la diferencia con la lectura del giroscopio es> 5 grados, omita la recalibración del giroscopio.
  8. Si la diferencia con la lectura de giroscopio es <5 grados, calibre el giroscopio utilizando el valor de la brújula

Nota: para el número 7: es para comprobar si el teléfono se ve afectado por el campo magnético o cerca de una línea de alta tensión o de alta tensión o en equipos ruidosos y pesados ​​en la planta de fabricación.

Eso es todo ... Espero que esto pueda ayudarte ... Y perdón por mi inglés ...