Conversion des vecteurs de rotation et de translation OpenCV à la rotation XYZ et à la position XYZ
Il y a des résultats Google et des messages stackoverflow qui semblent répondre à cette question, mais le fait est que je ne peux pas les comprendre. Peu importe ce que je lis, je ne peux pas me concentrer sur les quaternions et les angles D'Euler et Rodriguez se transforme et tout ça.
N'importe qui pour m'expliquer comme je suis 12 Comment obtenir des vecteurs de rotation et de traduction retournés par la méthode solvePnP () D'OpenCV à la Position xyz et aux valeurs de Rotation xyz que je peux brancher dans un graphique 3d application?
Ceci est pour une application de réalité augmentée en C++. J'ai la pièce OpenCV en marche, traquant un markerboard et envoyant des vecteurs de rotation et de traduction au programme graphique, mais je n'ai aucune idée de comment utiliser cette information pour poser mon objet 3d.
je veux vraiment comprendre les maths derrière ceci, et apprécierai toute explication patiente de la théorie ici. Mais je me contenterai aussi d'un pointeur vers un code que je peux copier / coller et apprendre le la théorie un autre jour. En fait, j'ai l'impression d'apprendre des choses comme ça plus vite en voyant du code concret et en travaillant en arrière vers la théorie.
modifier: Comme il y a des ... ce qui devrait clairement me mener dans la bonne direction, mais ça pourrait aussi bien être les plans d'une machine à voyager dans le temps pour ce que je sais. Il m'est venu à l'esprit que je demandais peut-être des maths de rattrapage, mais ça ne peut pas être la première fois.
modifier: Voici un exemple du vecteur de rotation et de la traduction vecteur retourné de solvePnP ()... converti en XML pour le voyage à l'application graphique. Notez que chacun de ceux-ci, j'ai vu contient trois lignes et une colonne.
<Tvec type_id="opencv-matrix">
<rows>3</rows>
<cols>1</cols>
<dt>f</dt>
<data>
-2.50094433e+01 -6.59909010e+00 1.07882790e+02
</data>
</Tvec>
<Rvec type_id="opencv-matrix">
<rows>3</rows>
<cols>1</cols>
<dt>f</dt>
<data>
-1.92100227e+00 -2.11300254e-01 2.80715879e-02
</data>
</Rvec>
3 réponses
au départ, Je ne savais rien des formats utilisés par OpenCV. Donc d'abord quelques recherches. En regardant la documentation solvePnP
, on dirait qu'il renvoie une matrice. (Le Rodrigues2
fonction mentionnée dans une version plus ancienne dans le docs Rodrigues
ces jours-ci.)
La description, il indique que vous pouvez vous attendre à une matrice avec une seule ligne ou une seule colonne. La direction de ce vecteur indique l'axe de rotation, tandis que la longueur (ou "normale") du vecteur donne l'angle.
donc votre input est en représentation angle-axe. Que vous pouvez interpréter comme un simultanée rotation à propos de la x,o et z Haches. Donc si par "rotation XYZ" vous voulez dire rotation simultanée, alors vous êtes déjà là. Si, toutefois, vous voulez dire une combinaison qui tourne d'abord sur le x l'axe et à propos de la o l'axe et à propos de la z axis, vous êtes dans une configuration étrange, et vous devriez probablement vous assurer d'utiliser la bonne API.
si elle est Euler angles vous êtes après, alors les appeler "rotation XYZ" est quelque peu trompeur. L'article de Wikipedia formalismes de Rotation en trois dimensions donne une liste des différents formats, et comment convertir entre eux. En particulier, il donne des formules pour convertir de L'axe et l'angle à la matrice et de là à des angles d'euler.
assurez-vous que vous utilisez la bonne représentation pour correspondre à votre machine de sortie graphique. Ou si vous avez le choix, essayez de travailler directement sur les rotation marix représentation, comme cela devrait être plus facile à comprendre et travailler avec.
étendre vos vecteurs 3D à des coordonnées homogènes (4D). Cela signifie un vecteur 4D avec des composants (X, Y, Z, 1)
créer une matrice de transformation 4x4 basée sur vos paramètres de rotation et de traduction. C'est ce qu'on appelle une transformation affine. Vous êtes sur la bonne voie avec l'article sur les matrices de rotation.
Multipliez vos Vecteurs de coordonnées avec la matrice de transformation.
découvrez cette section de Wikipédia:http://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations
Il a un exemple posé en coordonnées 2d, je suis sûr que vous obtenez assez de l'idée d'étendre à la 3d.
à mon avis, OpenCv retourne déjà les rotations XYZ. Prenez votre main gauche ( règle de la main gauche) et fermez votre poing. Coller le pouce vers le haut (axe z), étendre l'index droit devant vous (axe x), puis étendre le majeur vers la droite (axe y).
Aucune orientation particulière vecteur peut être donné par jusqu'à trois rotations. Il est important de se rendre compte que vous pouvez obtenir des rotations équivalentes. Par exemple, tournez autour de l'axe z de sorte que votre index points à votre droite. Une rotation équivalente serait Y, X, puis Y de nouveau, sans jamais impliquer l'axe Z.
cependant, lorsque vous utilisez la matrice de rotation complète (3x3), vous n'avez pas à vous soucier de ces conventions, parce qu'elles sont toutes fusionnées ensemble dans la matrice. C'est ce que le papier que vous avez lié est sur, et pas voyage dans le temps, qui est chanceux puisque la plupart des majors de mathématiques seraient en mesure de voyager dans le temps, donc dooming Humanity.
Vecteurs de Rotation se réfère cependant habituellement vers quel vecteur dans l'Espace votre objet doit tourner.