2011-12-09 3 views
4

Je suis actuellement confronté à un problème plus mathématique. Je développe une application qui s'intéresse à l'accélération dans les axes X et Y. En d'autres termes, je veux suivre l'accélération qui va à gauche ou à droite ou en arrière.Calcul de la matrice de rotation à l'aide de l'accéléromètre

Si l'appareil se trouve sur une table orientée vers le haut toutes les accélérations dans le sens nécessaire sont visibles dans les valeurs d'accélération de ces axes. Un problème survient lorsque le dispositif n'est pas placé dans une telle position et qu'il présente une certaine rotation autour de l'axe X ou Y (tangage, roulis).

je besoin d'une matrice de rotation (Rm) que je peux multiplier à une accélération des mesures (x) vecteur pour obtenir un nouveau vecteur calibré (x ') d'autres classes peuvent travailler avec: x' = Rm * x. Cela devrait être calculé à partir du vecteur de référence (0,0, -1) et du vecteur de gravité actuel du dispositif. Je sais que cela a quelque chose à voir avec les angles d'Euler mais je n'arrive pas à comprendre comment je peux les calculer et créer ma matrice de rotation avec ceux-ci. Je sais aussi qu'il y a une matrice de rotation dans la classe CMAttitude mais j'aimerais avoir plus d'informations sur la façon dont cette matrice est calculée.

Exemple:

Imaginez que vous voulez messure comment dur vous un freinage sur votre vélo. Si votre iPhone est monté sur le vélo avec l'affichage pointant vers le haut, vous pouvez lire l'accélération de la valeur y du vecteur d'accélération. Les autres classes de votre projet supposent que l'accélération au freinage peut toujours être vue dans cette valeur.

Le problème est lorsque l'iPhone est placé en mode portrait, l'affichage pointant vers vous. Alors le freinage n'augmenterait pas la valeur y mais la valeur z à la place. Vous devez donc faire pivoter votre valeur d'accélération de -90 degrés autour de l'axe des x.

J'ai besoin de cette matrice de rotation pour une rotation arbitraire de l'appareil. Je sais qu'il n'est pas possible de calculer la rotation autour de l'axe z à partir de vecteurs de gravité, mais comme les rotations x et y sont annulées, je vais bien.

Merci beaucoup pour votre aide

+0

Je vous suggère de retag cette question pour l'ouvrir à un public plus large. Ce n'est pas vraiment un problème limité à l'iPhone mais parfaitement aussi bien expliqué par les codeurs Android par exemple. – Till

Répondre

1

Pour calculer l'angle d'Euler vous devez calculer l'angle entre le vecteur de référence et le vecteur de gravité actuelle.

http://chemistry.about.com/od/workedchemistryproblems/a/scalar-product-vectors-problem.htm

La matrice de rotation est assez facile après. http://en.wikipedia.org/wiki/Rotation_matrix

Remarque Je suis sûr qu'il existe de nombreux moyens simples de faire cela dans ios et android sans avoir à effectuer ces calculs manuellement. Cette réponse est juste comment la géométrie fonctionne.

+0

Merci pour votre réponse. J'ai besoin d'annuler la rotation autour des axes x et y de sorte que toutes les accélérations (gauche, droite, arrière, avant) apparaissent dans les valeurs x et y du vecteur d'accélération et ne sont pas contenues dans la valeur z. J'ai donc besoin d'un angle pour la rotation x et d'un angle pour la rotation y et combiner les deux pour une matrice de rotation.Je ne vois pas comment je peux y parvenir avec juste l'angle entre ces vecteurs. A quoi ressemblerait la matrice de rotation? – ChrisIsBack

+0

pouvez-vous décrire un peu plus ce que vous essayez de faire? Grande image je veux dire. – Pablitorun

+0

Interdiction de poster des photos – ChrisIsBack

1

Je pense que le lien suivant devrait être utile Transforming iPhone Accelerometer Data to Automobile Axes attention de salaire il y a une erreur dans la matrice de rotation, l'élément RM11 il devrait être cos « Beta » * cos « gamma » et non cos « alpha » * cos "gamma"

+0

Batti, la page que vous avez lue est protégée contre un piratage. Avez-vous accès et pouvez poster ailleurs? – t9mike

+0

Peu importe. [DeviceMotion relatif à world - multiplyByInverseOfAttitude] (http://stackoverflow.com/a/8006783/420175) montre comment transformer les valeurs d'accélération relative à l'appareil en données relatives à la Terre pour iOS5 et au-dessus. – t9mike

Questions connexes