C'est une note tout à fait personnelle à l'époque car j'avais besoin de convertir la rotation dans le système de coordonnées de gauche (souvent utilisé en vision par ordinateur et Unity) et la rotation dans le système de coordonnées de droite (souvent utilisé dans les robots et les systèmes physiques). De nombreuses bibliothèques sont créées dans le système de coordonnées droitier, j'ai donc résumé comment convertir à ce moment-là.
En premier lieu, que représente la rotation
Ils sont quatre. Je vais omettre chaque explication ici. Parce qu'il y a beaucoup d'articles expliqués Par exemple
J'espère que vous pouvez vous référer. La seule chose qui m'intéresse est la suivante. Y a-t-il une différence entre la rotation de $ θ $ (autour d'un axe arbitraire) dans le système de coordonnées de gauche et de $ θ $ (autour d'un axe arbitraire) dans un système de coordonnées de droite?
Fondamentalement, le système de coordonnées de gauche doit être considéré comme le calcul du système de coordonnées de gauche, et le système de coordonnées de droite doit être considéré comme le calcul du système de coordonnées de droite. Cependant, si vous voulez voir ~ dans le système de coordonnées droitier à partir du système de coordonnées gauche, vous devez le convertir!
Regardons d'abord la matrice de rotation.
Regardons l'axe des x, l'axe des y, l'axe des z et la circonférence de l'axe arbitraire. Cela signifie quel type de transformation doit être effectué pour faire pivoter θ (autour d'un certain axe) dans le système de coordonnées de droite.
R^{right}_x =
\left(
\begin{array}{ccc}
1 & 0 & 0 \\
0 & \cos \theta & - \sin \theta \\
0 & \sin \theta & \cos \theta
\end{array}
\right)
R^{right}_y =
\left(
\begin{array}{ccc}
\cos \theta & 0 & \sin \theta \\
0 & 1 & 0 \\
- \sin \theta & 0 & \cos \theta
\end{array}
\right)
R^{right}_z =
\left(
\begin{array}{ccc}
\cos \theta & - \sin \theta & 0 \\
\sin \theta & \cos \theta & 0 \\
0 & 0 & 1
\end{array}
\right)
Si vous faites pivoter $ \ theta $ avec $ n = [n_x, n_y, n_z] $,
R^{right}_n =
\left(
\begin{array}{ccc}
n_x^2(1- \cos \theta) + \cos \theta &
n_x n_y (1- \cos \theta) - n_z \sin \theta &
n_x n_z (1- \cos \theta) + n_y \sin \theta \\
n_x n_y (1- \cos \theta) + n_z \sin \theta &
n_y^2(1- \cos \theta) + \cos \theta &
n_y n_z (1- \cos \theta) - n_x \sin \theta \\
n_x n_z (1- \cos \theta) - n_y \sin \theta &
n_y n_z (1- \cos \theta) + n_x \sin \theta &
n_z^2(1- \cos \theta) + \cos \theta
\end{array}
\right)
Regardons l'axe des x, l'axe des y, l'axe des z et la circonférence de l'axe arbitraire. Cela signifie quel type de transformation doit être effectué pour faire pivoter θ (autour d'un certain axe) dans le système de coordonnées de gauche. ** (J'ai fait une erreur dans l'article que j'ai mentionné au début ... C'est une correction.) **
R^{left}_x =
\left(
\begin{array}{ccc}
1 & 0 & 0 \\
0 & \cos \theta & - \sin \theta \\
0 & \sin \theta & \cos \theta
\end{array}
\right)
R^{left}_y =
\left(
\begin{array}{ccc}
\cos \theta & 0 & \sin \theta \\
0 & 1 & 0 \\
-\sin \theta & 0 & \cos \theta
\end{array}
\right)
R^{left}_z =
\left(
\begin{array}{ccc}
\cos \theta & -\sin \theta & 0 \\
\sin \theta & \cos \theta & 0 \\
0 & 0 & 1
\end{array}
\right)
Si vous faites pivoter $ \ theta $ avec $ n = [n_x, n_y, n_z] $,
R^{left}_n =
\left(
\begin{array}{ccc}
n_x^2(1- \cos \theta) + \cos \theta &
n_x n_y (1- \cos \theta) - n_z \sin \theta &
n_x n_z (1- \cos \theta) + n_y \sin \theta \\
n_x n_y (1- \cos \theta) + n_z \sin \theta &
n_y^2(1- \cos \theta) + \cos \theta &
n_y n_z (1- \cos \theta) - n_x \sin \theta \\
n_x n_z (1- \cos \theta) - n_y \sin \theta &
n_y n_z (1- \cos \theta) + n_x \sin \theta &
n_z^2(1- \cos \theta) + \cos \theta
\end{array}
\right)
Est le même. Je pense que c'est parce que le système de coordonnées lui-même est défini de manière à avoir un sens. (Je pense que c'est parce que θ est réglé pour inverser la rotation en premier lieu, et les axes sont également permutés.) (Je ne suis pas sûr, donc si vous avez des commentaires, s'il vous plaît.)
Que se passe-t-il lorsque la matrice de rotation du système de coordonnées droitier est visualisée à partir du système de coordonnées gauche? C'est une histoire.
** Ce n'est pas grave si vous déménagez! ** **
Il ne vous reste donc plus qu'à déménager. Facile.
Dans le système de coordonnées droitier, quaternion (ce qui signifie tourner autour d'un axe arbitraire) est
q^{right} = [q_w, q_x, q_y, q_z]
est.
Dans le système de coordonnées de gauche, le quaternion (c'est-à-dire tourner autour d'un axe arbitraire) est
q^{left} = [q_w, q_x, q_y, q_z]
est. Eh bien, ici, n'est-ce pas pareil? Je pense que ce sera le cas, mais c'est la même chose. Evidemment, c'est pareil. (Parce que la quarternion n'est pas quelque chose comme ça dans le système de coordonnées gauche ...)
Mais que se passe-t-il si nous parlons de ce qui précède et regardons le quaternion dans le système de coordonnées droitier dans le système de coordonnées gauche? C'est différent s'il s'agit d'une histoire.
q^{right} = [q_{w1}, q_{x1}, q_{y1}, q_{z1}]
Est
q^{left} = [q_{w1}, -q_{x1}, q_{y1}, -q_{z1}]
Sera.
La même chose est vraie pour cela! La définition est la même!
Le vecteur de rotation dans le système de coordonnées droitier (ce qui signifie tourner autour d'un axe arbitraire) est
n^{right} = [u, v, w]
Le vecteur de rotation dans le système de coordonnées gauche (ce qui signifie tourner autour d'un axe arbitraire) est
n^{left} = [u, v, w]
Mais que se passe-t-il si nous regardons le vecteur de rotation dans le système de coordonnées droitier dans le système de coordonnées gauche? C'est différent s'il s'agit d'une histoire.
n^{right} = [u_1, v_1, w_1]
Est
n^{left} = [-u_1, v_1, -w_1]
Sera.
Dans le système de coordonnées droitier, en prenant le produit extérieur de deux vecteurs, $ a = [a_x, a_y, a_z] $, $ b = [b_x, b_y, b_z] $
a \times b =
\left(
\begin{array}{c}
a_y b_z - a_z b_y \\
a_z b_x - a_x b_z \\
a_x b_y - a_y b_x
\end{array}
\right)
Ce sera. Avec numpy,
>>> a = np.array([1., 2., 3.])
>>> b = np.array([4., 5., 6.])
>>> np.cross(a, b)
# array([-3., 6., -3.])
Vous pouvez calculer avec!
La direction du produit extérieur est opposée, mais θ est également opposée, il devrait donc être utilisable tel quel après tout. .. ..
a \times b =
\left(
\begin{array}{c}
a_z b_y - a_y b_z \\
a_x b_z - a_z b_x \\
a_y b_x - a_x b_y
\end{array}
\right)
Donc c'est pareil!
>>> a = np.array([1., 2., 3.])
>>> b = np.array([4., 5., 6.])
>>> np.cross(a, b)
# array([-3., 6., -3.])
atan
Prendre arctan dans le système de coordonnées droitier est numpy
>>> a = 1.
>>> b = 2.
>>> np.arctan2(a, b)
# 0.4636476090008061
Peut être calculé comme.
Prendre arctan dans le système de coordonnées de gauche est l'opposé du calcul dans le système de coordonnées de droite, mais le vecteur dans le système de coordonnées de gauche est converti en système de coordonnées de droite (inversion de l'axe y), puis arctan est pris. Ici, θ a un moins, mais lorsque vous renvoyez l'angle au système de coordonnées de gauche (car θ est défini dans la direction opposée). .. .. Après tout, cela restera le même.
>>> a = 1.
>>> b = 2.
>>> np.arctan2(a, b)
# 0.4636476090008061
Je veux convertir le quaternion $ q ^ {right} = [q_ {w1}, q_ {x1}, q_ {y1}, q_ {z1}] $ dans le système de coordonnées droitier en la matrice de rotation $ R ^ {right} $. En général, la conversion du quaternion en matrice de rotation est la suivante:
R^{right}_{q^{right}} =
\left(
\begin{array}{ccc}
q_w^2 + q_x^2 - q_y^2 - q_z^2 &
2(q_x q_y - q_w q_z) &
2(q_z q_x - q_w q_y) \\
2(q_x q_y - q_w q_z) &
q_w^2 - q_x^2 + q_y^2 - q_z^2 &
2(q_y q_z - q_w q_x) \\
2(q_z q_x - q_w q_y) &
2(q_y q_z - q_w q_x) &
q_w^2 - q_x^2 + q_y^2 - q_z^2
\end{array}
\right)
Je veux convertir le quaternion $ q ^ {left} = [q_ {w1}, q_ {x1}, q_ {y1}, q_ {z1}] $ dans le système de coordonnées de gauche en la matrice de rotation $ R ^ {left} $. Vous pouvez l'utiliser comme d'habitude.
R^{left}_{q^{left}} =
\left(
\begin{array}{ccc}
q_w^2 + q_x^2 - q_y^2 - q_z^2 &
2(q_x q_y - q_w q_z) &
2(q_z q_x - q_w q_y) \\
2(q_x q_y - q_w q_z) &
q_w^2 - q_x^2 + q_y^2 - q_z^2 &
2(q_y q_z - q_w q_x) \\
2(q_z q_x - q_w q_y) &
2(q_y q_z - q_w q_x) &
q_w^2 - q_x^2 + q_y^2 - q_z^2
\end{array}
\right)^T
Un certain document parle de calculer la différence de matrice de rotation avec le vecteur de rotation. C'était fini. Plus précisément, j'aimerais que vous voyiez l'annexe A, mais le fait est que la matrice de rotation est un vecteur équivalent à axe carré (légèrement différent du vecteur de rotation). La littérature elle-même décrit la méthode de calcul dans le système de coordonnées droitier. Peut être utilisé tel quel dans le flux ci-dessus.
Si vous utilisez ce qui précède
Je veux faire du quaternion du système de coordonnées droitier une matrice de rotation du système de coordonnées droitier et en faire une matrice de rotation du système de coordonnées gaucher.
Vous pouvez aussi dire!
C'est juste un mémo, alors n'hésitez pas à commenter s'il y a des erreurs.
Recommended Posts