2013-01-14 2 views
4

Je veux mon application pour être en mesure de détecter une rotation de l'appareil lorsque l'appareil est tenu horizontalement. Je pourrais utiliser des lectures d'une boussole mais je crois que les valeurs de lacet du gyroscope seraient plus précises. Compte tenu des lectures de lacet, quel serait le meilleur algorithme pour déterminer une rotation de 360 ​​° (dans le sens des aiguilles d'une montre ou dans le sens inverse des aiguilles d'une montre). Et il doit être un 360 ° complet, pas seulement tourner le téléphone de 180 ° dans une direction et de 180 ° dans la direction opposée.Détecter 360 ° de rotation de l'appareil en utilisant iOS gyroscope

Répondre

2

Voici une idée en supposant que vous pouvez obtenir l'affichage à des intervalles courts, et que le lacet peut être remis à zéro à un point de départ spécifique. Ceci est différent de l'autre réponse, qui détecte les cercles pleins à partir d'un point de départ continuellement adapté.

Dans cette approche, nous continuons à comparer le lacet actuel au lacet précédent, en demandant si un point de contrôle à 180 degrés ou PI a été passé. Initialement, l'indicateur de point de contrôle cp_pi est NO et le fait passer dans l'une ou l'autre direction fait basculer son état. Notez que lacet change son signe en deux endroits, au point zéro et de nouveau à PI à -PI.

En supposant que votre objet a deux propriétés qui sont persistantes entre tick s du détecteur, BOOL cp_pi; et float prev_yaw;, nous considérons que d_yaw est inférieur à PI pour traverser 0 et plus grand que PI pour traverser à l'extrémité opposée de votre cercle. Lorsque vous traversez la fin opposée, nous basculons cp_pi. Lorsque cp_pi est YES en traversant 0, nous sommes assurés d'avoir passé un cercle complet - sinon, cp_pi aurait été décommuter à NO:

-(void)tick 
{ 
    float yaw = [self zeroedYaw]; 
    if ((fabs(yaw) == PI) || (yaw == 0.0f)) return; 

    if (yaw * prev_yaw < 0) 
    { 
     float d_yaw = fabs(yaw - prev_yaw); 
     if (d_yaw > PI) 
     { 
      cp_pi = ! cp_pi; 
     } 
     else if (cp_pi) 
     { 
      // fire detection event 
     } 
    } 
    prev_yaw = yaw; 
} 

Notez que pour rendre notre vie plus facile, nous sautons la fonction de détecteur entièrement si yaw est assis directement sur l'un des points de contrôle.

+0

Que se passe-t-il si je franchis 180 ° dans un sens, puis que je reviens à 180 ° dans le sens inverse en direction de 0? Est-ce que cela comptera toujours comme une rotation? – thisiscrazy4

+0

Ce serait bien, car 'cp_pi =! cp_pi' retournera à 'NON 'au deuxième passage, donc il ne sera pas détecté comme une rotation. –

+0

Si vous tournez ensuite une autre fois pour compléter le cercle complet, 'cp_pi' retournera' YES' à +/- 'PI', et l'événement finira par se déclencher à 0. Ainsi, seuls les cercles complets seront pris en compte. –

3

Vous utiliseriez CoreMotion pour obtenir la rotation autour de l'axe vertical. Vous devez ajouter le delta des événements de rotation. Chaque fois qu'une valeur minimale est dans une direction différente de la précédente, vous réinitialisez votre point de départ. Ensuite, lorsque vous arrivez à plus ou moins 360 degrés à partir de ce point de départ, vous avez la rotation.

+0

Oui, CoreMotion utilise une combinaison du gyroscope et une boussole pour donner une lecture plus précise et exacte de l'orientation de l'appareil. – Fogmeister

Questions connexes