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 entre0
yPI
cuando el teléfono apunta hacia abajo (según lo indicado pordeviceMotion.gravity.z
) y se balancea en sentido contrario a las agujas del reloj y de0
a-PI
cuando se gira hacia la derecha - cuando el dispositivo apunta hacia arriba, la
yaw
oscila entre-PI
a0
yPI
a0
, respectivamente - y a partir de los datos de la brújula (estoy usando
locationManager.heading.magneticHeading
), veo que la brújula da valores de0
a360
, 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
cuandogravity.z
tiene alrededor de0
?
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 "
- En eso
- Leer gravedad XYZ -> Xg Yg Zg
- Compruebe si Xg <0.25 Si es VERDADERO intente Yg, entonces Zg // Nota 1 = 1g = 9.82 m / s ^ 2
- Lee la brújula y el giro
- Configure y calibre el girocompás con la brújula y calcúlelo según el eje que uso en el punto 3.
- Si transcurren 5 segundos, vuelva a calibrar, lea la brújula
- Si la diferencia con la lectura del giroscopio es> 5 grados, omita la recalibración del giroscopio.
- 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 ...