proximidad giroscopio funciona funcion configurar calibrar activar acelerometro iphone ios ipad accelerometer gyroscope

configurar - giroscopio iphone 7 no funciona



Giroscopio en iPhone (1)

[Completamente revisado]

(1) ángulos extraños

A primera vista, confundí la situación con algunos problemas típicos relacionados con Euler Angles . Debido a que están cerca de esta área problemática y es muy importante tenerlo en cuenta, dejo esta parte de la respuesta original. Los problemas de Euler Angle son:

  • Ambigüedad, ya que la relación entre el estado de rotación y la representación de los ángulos de Euler no es biyectiva, es decir, un conjunto de ángulos describe una rotación, pero una rotación puede representarse mediante más de un conjunto de ángulos de Euler. En la Fig. 3 de su pregunta, puede lograr la misma rotación ya sea con 1: Yaw=30°, 2: Pitch=90° o con 1: Pitch=90°, 2: Roll=30°
  • Problema de bloqueo de cardán : puede perder un grado de libertad y el dispositivo ya no puede girar alrededor de uno de los ejes. La solución es usar cuaterniones o matrices de rotación.

Pero como dijiste en tu comentario, el verdadero culpable parece ser el marco de referencia. Comenzando con iOS 5.0, Apple mejoró el algoritmo de fusión del sensor y también consideró los datos del campo magnético para calcular CMAttitude. Aunque todavía existe el método anterior startDeviceMotionUpdates , ahora utiliza una referencia predeterminada CMAttitudeReferenceFrameXArbitraryZVertical para que todas las medidas CMAttitudeReferenceFrameXArbitraryZVertical relacionadas con "El eje Z es vertical y el eje X apunta en una dirección arbitraria en el plano horizontal ".

Para obtener sus datos con respecto a la referencia al inicio (o cualquier otra rotación), debe almacenar la instancia CMAttitude que desee como referencia y luego usar el método multiplyByInverseOfAttitude CMAttitude para transformar cada nueva actitud, es decir, al comienzo de su handleDeviceMotion método.

(2) Guiñada a la deriva

Creo que esto está relacionado con un error en iOS 6 como el que describí en Derivar el ángulo de guiñada después de avanzar rápido, ya que solía funcionar bien en la versión anterior. Archivé un error, veamos cuándo lo arreglarán.

ACTUALIZACIÓN 2

Como comentarios y chat mostraron que el objetivo era controlar un robot simplemente inclinando el dispositivo. En este caso, conocer el estado de rotación completo del dispositivo está alterando el control al cambiar la dirección de marcha. Por lo tanto, un enfoque basado en el acelerómetro puro utilizando CMDeviceMotion.gravity es mucho más conveniente.

Necesito ayuda para usar el giroscopio en iPhone. No puedo entender las lecturas de CMAttitude con respecto al cabeceo, balanceo y guiñada en una situación particular.

Este es mi código

- (void)handleDeviceMotion:(CMDeviceMotion*)motion { NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI); NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI); NSLog(@"Roll %f ",attitude.roll * 180 / M_PI); }

Supongamos que iPhone se encuentra en un avión como en la siguiente figura:

pitch, roll y yaw son (casi) 0 grados y cualquier giro alrededor de un eje devuelve lecturas comprensibles. Por ejemplo, girando el dispositivo hacia la derecha, el Guiñada disminuye y el Paso y el Giro permanecen en 0.

Ahora el iPhone está en la siguiente posición:

y la medición se inicia nuevamente.

Las lecturas son: Yaw = 0, Pitch = 90, Roll = 0

Dado que los dispositivos giraron alrededor de este eje, el tono aumenta.

Moviendo el iPhone a esta posición:

las lecturas son: Guiñada = 30, Paso = 90, Roll = 0

Una vez más, dado que el dispositivo gira alrededor del eje Yaw, este valor cambia y los demás no.

Mover el dispositivo alrededor del eje del rodillo:

las lecturas son: Yaw = 0, Pitch = 90, Roll = -20.

Ahora lo que no puedo entender Moviendo el iPhone alrededor de un círculo de radio R (R> 0), como en esta figura:

Los cambios de guiñada mientras tanto Pitch and Roll no lo hacen.

Hubiera esperado que Yaw se hubiera mantenido sin cambios y Roll hubiera cambiado.

¿Cómo puedo compensar esto ya que estoy interesado exclusivamente en rotaciones alrededor del eje de Yaw hechas por el usuario?

Otro problema que tengo es a la deriva. El iPhone está en la posición descrita en la segunda figura, tomada en mi mano en reposo durante mucho tiempo (1 minuto o más). El Guiñada aumenta constantemente. ¿Alguna idea de cómo compensar la deriva?

Gracias de antemano

ACTUALIZAR He seguido las sugerencias de Kay pero nada cambia. Un poco más de detalle en mi código. Me gustaría usar Yaw para rotar un UIImage solo cuando el usuario gira el dispositivo alrededor del eje de Yaw. Esto funciona, pero cuando el usuario gira alrededor de su propio eje vertical, el Guiñada cambia. Supongo que eso no es correcto, ya que cuando el usuario se mueve alrededor de su eje vertical, los dispositivos no giran alrededor de su propio eje de Yaw. Tal vez yo estoy equivocado. Este es mi código original:

- (void)handleDeviceMotion:(CMDeviceMotion*)motion { CMAttitude *attitude = motion.attitude; NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI); NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI); NSLog(@"Roll %f ",attitude.roll * 180 / M_PI); image.transform = CGAffineTransformMakeRotation(-attitude.yaw); }

Este es el código después de la sugerencia de Kay:

- (void)handleDeviceMotion:(CMDeviceMotion*)motion { CMAttitude *attitude = motion.attitude; if (startAttitude == 0) { startAttitude = attitude; } [attitude multiplyByInverseOfAttitude:startAttitude]; NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI); NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI); NSLog(@"Roll %f ",attitude.roll * 180 / M_PI); image.transform = CGAffineTransformMakeRotation(-attitude.yaw); }

Comienzo la monitorización del movimiento del dispositivo con

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical toQueue:[NSOperationQueue currentQueue] withHandler: ^(CMDeviceMotion *motion, NSError *error){ [self performSelectorOnMainThread:@selector(handleDeviceMotion:) withObject:motion waitUntilDone:YES]; }];