Pregunta

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

El uso de CMMotionManager y su objeto CMDeviceMotion (motionManager.deviceMotion), me sale el objeto CMAttitude. corrígeme si estoy equivocado (por favor), pero aquí es lo que he deducido de la propiedad del objeto CMAttitude yaw (no necesito ni pitch roll para mis propósitos):

  • rangos yaw de 0 a PI cuando el teléfono está apuntando hacia abajo (como se indica por deviceMotion.gravity.z) y movimientos de balanceo en sentido antihorario y 0 a -PI cuando basculada hacia la derecha
  • cuando el dispositivo está apuntando hacia arriba, los rangos de yaw de -PI a 0 y PI a 0, respectivamente
  • y de los datos de la brújula (estoy usando locationManager.heading.magneticHeading), veo que la brújula da valores de 0 a 360, con el aumento del valor al hacer pivotar hacia la derecha

De acuerdo, así que usar toda esta información en conjunto, yo soy capaz de obtener una horizontal que llamo valor que, independientemente de si el dispositivo está apuntando hacia arriba o hacia abajo, dará a los valores de 0 a 360 y aumentar cuando el dispositivo es girada hacia la derecha (aunque sigo teniendo problemas cuando deviceManager.gravity.z es de alrededor de 0 - el valor yaw asusta a este valor gravity.z)

.

Me parece que lo que pude "Sincronizar" los valores horizontal y magneticHeading, utilizando un valor horizontal calculado que se asigna a magneticHeading, y el valor horizontal "sincronizar" para magneticHeading cuando siento la brújula ha "atrapado".

Así que mis preguntas:

  • ¿Estoy en el camino correcto con esto?
  • Am I utilizando los datos de giróscopo de CMDeviceMotion correctamente y que los supuestos mencionados anteriormente correcta?
  • ¿Por qué podría yaw cabo monstruo cuando gravity.z es de alrededor de 0?

Muchas gracias. Espero con interés escuchar sus respuestas!

¿Fue útil?

Solución

Sólo tratando de respuesta ... me corrija si me equivoco ..

1.Sí. usted está en el camino correcto

2.gravity en CM ya está "aislado" de la gravedad de usuario (valor de la gravedad causada por la aceleración de usuario) es por eso que hay dos gravedad, la "gravedad" y "userAcceleration" en la documentación de su CM de manzana // Nota: no aislado por completo //

3. si usted tiene una gravedad 0 significa que el eje es perpendicular coresponding con la gravedad. gravity.z es la eso de la pantalla del iPhone por qué -9.82m / s2 si se pone sobre la mesa con la posición vertical de la pantalla, podía comprender que era difícil obtener 0 o el valor máximo de la gravedad debido al ruido del sensor (que es normal, todo el sensor tiene una sensor de ruido EXPECIALLY barato).

lo que hago en mis aplicaciones es voy a cambiar mi eje de referencia a otro eje (en su caso puede ser X o Y) para ciertos límites, cómo la estrategia se depende del propósito o qué lado es su referencia.

La otra cosa es, giroscopio es rápido pero no es estable, es necesario volver a calibrar el valor para varios intervalos. En mi caso, cada 5 segundos. Tengo experimento con giroscopio para el cálculo de ángulo entre dos planos, trato con regla exacly de 90 grados y se dará un error de 0,5 grados cada segundo intento y seguir aumentando, pero eso es mío, tal vez otros tienen un mejor método para evitar la error.

a continuación es mis pasos "

  1. Init
  2. Leer gravedad XYZ -> Xg Yg Zg
  3. Compruebe si Xg <0,25 Si es TRUE intento Yg continuación, Zg // Nota 1 = 1 g = 9,82 m / s ^ 2
  4. Leer la brújula y el giroscopio
  5. Configurar y calibrar el giroscopio usando la brújula y Calulate basado en cuyo eje i uso en el punto 3.
  6. Si 5 segundos es pasar a continuación, volver a calibrar, leer la brújula
  7. Si la diferencia con la lectura giroscopio es> 5 recalibartion grado de omisión del giroscopio.
  8. Si la diferencia con la lectura giroscopio es <5 grados calibrar el giroscopio utilizando valor de la brújula

Nota: para el número 7:. Es comprobar si el teléfono afectado con el campo magnético o acero enorme cerca de tales o alto voltaje de la línea eléctrica o en el ruidoso y equipo pesado en la planta de la fábrica

Eso es todo ... Espero que esto podría ayudar a ... Y lo siento por mi Inglés ..

Otros consejos

Este es un ejemplo de una aplicación para el iPhone, donde la brújula obtener compensación con el giroscopio. Código y el proyecto se puede ver aquí: http://www.sundh.com/blog/2011/09 / stabalize-brújula-de-iphone-con-giroscopio /

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

Con el fin de hacer la sincronización mientras está en movimiento, es necesario crear un filtro para el valor de "horizontal" que tiene las mismas características de respuesta de retraso / delay como la brújula magnética. O eso, o esperar hasta que el movimiento se detiene el tiempo suficiente para ambos valores se asiente antes de volver a calcular el desplazamiento.

respuesta a la pregunta 1 es afirmativa, la pregunta 2 que está en el camino correcto, pero se puede utilizar un nombre de variable que no es 'horizontal', la pregunta 3 es contestada por hotpaw2 y también una guiñada en un helicóptero o un helicóptero a cerca de cero altitud podría alertar al piloto con una alarma. Hay un retardo de tiempo debido a que parte del software es local, mientras que hay otros factores que pueden reducir la velocidad incluyendo el acceso a un sensor para detectar ondas magnéticas, la posición del dispositivo y la dirección, la preparación de la salida gráfica para la visualización de la brújula, la computación y la salida de datos del giroscopio y sensores a través de una interfaz relativamente lento, usando un dispositivo de mano de propósito general no diseñado a medida para el tipo de tarea se pide de él.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top