34 votes

iPhone - comprendre la rotation de l'iPhone

Je suis cogner ma tête sur le mur en essayant de le comprendre. Voir la photo suivante.

Supposons que j'ai un iPhone posé sur une table. À cette époque, la rotation des lectures thru cœur de mouvement sont 0,0,0 pour le lacet, roulis et de tangage (photo de Une).

Puis-je rouler à 90 degrés. Maintenant, il est assis sur la table avec son côté gauche, bouton d'accueil sur la droite. Maintenant, il lit 0,0,0 (image B).

Maintenant, je lacet de 180 degrés. Il est maintenant assis à son côté droit sur la table. La maison de bouton sur la gauche. Il lit maintenant 180,0,0 (photo C).

Le problème vient, si je roule maintenant. Supposons que je roule il -45 degrés. Je devrais être la lecture de 180,-45,0 mais au lieu de cela je suis à la lecture de 180,-45,180???? (photo D).

Pourquoi est-ce? Pourquoi est-il en me donnant une valeur pour la hauteur, si je n'ai jamais changé? Comment peut-être de hauteur influencé par une rotation dans d'autres angles? merci.

enter image description here

9voto

Kay Points 6742

Compte tenu de l'affaire que vous pouvez vivre avec delta mouvements, vous pouvez utiliser "quaternion différence de l'opération". Disons que vous avez une rotation précédente, comme les quaternions appelé t1 et le courant d'un t2. Ensuite, vous pouvez calculer le delta dQ entre eux de sorte que q2 = q1*dQ est valide. Tout ce que vous avez à faire est de construire l'inverse de t1 (t1^(-1)) et puis, vous obtenez:

dQ = t1^(-1) * t2

Si deviceMotionInterval est suffisamment élevée, vous pouvez toujours avoir à portée de main les petits angles d'Euler, sans 90° singularités ou d'autres beasty choses. L'éventuel inconvénient de cette solution serait peut-être une légère dérive en raison de la propagation des erreurs et le manque de rétroaction à partir de votre espace virtuel. Exemple: si vous avez votre iPhone sur une table montrant un cube, puis faire une séquence de rotations, vous pouvez trouver une angulaires displacment du cube lorsque vous mettez le téléphone en position de départ.

[EDIT:Oublié une partie] Pour se débarrasser de la dérive de l'effet, vous avez "seulement" besoin d'un moyen d'exprimer votre dernier objet réel de la position (t1) comme un quaternion, c'est à dire les coordonnées dans votre application comme affiché sur l'écran. Si vous utilisez des outils comme l'Unité, il pourrait être juste en lisant la propriété de l'objet. Si vous ne disposez pas d'un accès facile, vous pouvez avoir la possibilité de suivre cette position manuellement.

Si vous souhaitez en savoir plus au sujet de ce prendre un coup d'oeil à la 3D en mathématiques apprêt pour le graphisme et le développement d'un jeu, par Fletcher Dunn,Ian Parberry page 168.

3voto

Kay Points 6742

Angles d'Euler sont pas que des chiffres précis pour decribing arbitraire de rotation comme les quaternions ou matrices de rotation. Il y a souvent plus d'une série d'angles de decribe une rotation et donc il n'est pas unique.

[Edit:] Comme l'a déclaré Harinder core mouvement convertit les angles dans la représentation canonique c'est à dire il y a quelques contraintes - je ne suis pas sûr, mais pensez à l'angle de tangage est limitée à [-90;90].

Jetez un oeil à Cardan de Verrouillage ou de certains articles similaires sur le phénomène.

1voto

Tommy Points 56749

J'ai été incapable de reproduire le même résultat. À l'aide de la (libre) Gyroscope application, les rapports que le roulis, le tangage, le lacet I get (0, 0, 0) pour la position de A, alors (-90, 0, 0) B (-90, 0, 180) pour C (qui, en fait, l'appareil se détourner de moi, contrairement à votre schéma), puis (-45, 0, 180) pour D.

Même en le feuilletant que, parce que vous semblez être sur la liste de lacet, roulis, tangage, c'est encore (0, 0, 0) -> (0, -90, 0) -> (180, -90, 0) -> (180, -45, 0). L'ajout d'un rouleau par -90 avant de signaler rendrait le tangage et en lacet axes parallèles, la création de gimbal lock , comme l'a mentionné plus rapide typers que moi.

Le problème de base est que toute tentative pour décrire la rotation dans les trois axes donne un ordre implicite de rotations - il de "faire tourner cette beaucoup autour de x, alors ce beaucoup autour de y, puis autant de z". Est-ce que vous choisissez, il ya toujours une possibilité pour la rotation autour du premier axe d'aligner les deux autres axes. L'Orientation est en trois dimensions, de sorte que peut être décrit par trois chiffres (par exemple, en utilisant les quaternions unitaires, mais en laissant le quatrième terme implicite), mais pas par les angles d'Euler.

EDIT: en référence à votre commentaire ci-dessus, vous pouvez obtenir delta mouvements par l'enregistrement d'un gestionnaire -startDeviceMotionUpdatesToQueue:withHandler:. Que vais recevoir une série de CMDeviceMotions, à partir de laquelle vous pouvez regarder le rotationRate membre.

0voto

iHS Points 3045

L'accéléromètre mesure la somme de deux vecteurs accélération: la gravité et l'accélération de l'utilisateur. L'utilisateur accélération est l'accélération que l'utilisateur donne à l'appareil. Parce que de Base le Mouvement est en mesure de suivre un appareil attitude en utilisant le gyroscope et l'accéléromètre, il peut différencier entre gravité et accélération de l'utilisateur

Cela pourrait être utile pour vous:

un-absolue-degré-mesure

0voto

occulus Points 10906

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X