[PYTHON] Traversons le mur du système de coordonnées gauche et du système de coordonnées droitier.

introduction

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à.

Quatre choses qui représentent la rotation

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?

Conclusion

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!

Matrice de rotation

Regardons d'abord la matrice de rotation.

Système de coordonnées à droite

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.

axe x

R^{right}_x = 
  \left(
    \begin{array}{ccc}
      1 & 0 & 0 \\
      0 & \cos \theta & - \sin \theta \\
      0 & \sin \theta & \cos \theta
    \end{array}
  \right)

axe y

R^{right}_y = 
  \left(
    \begin{array}{ccc}
      \cos \theta & 0 & \sin \theta \\
      0 & 1 & 0 \\
      - \sin \theta & 0 & \cos \theta
    \end{array}
  \right)

Axe z

R^{right}_z = 
  \left(
    \begin{array}{ccc}
      \cos \theta & - \sin \theta & 0 \\
      \sin \theta & \cos \theta & 0 \\
      0 & 0 & 1
    \end{array}
  \right)

Axe arbitraire

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)

Système de coordonnées gauche

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.) **

axe x

R^{left}_x = 
  \left(
    \begin{array}{ccc}
      1 & 0 & 0 \\
      0 & \cos \theta & - \sin \theta \\
      0 & \sin \theta & \cos \theta
    \end{array}
  \right)

axe y

R^{left}_y = 
  \left(
    \begin{array}{ccc}
      \cos \theta & 0 & \sin \theta \\
      0 & 1 & 0 \\
      -\sin \theta & 0 & \cos \theta
    \end{array}
  \right)

Axe z

R^{left}_z = 
  \left(
    \begin{array}{ccc}
      \cos \theta & -\sin \theta & 0 \\
      \sin \theta & \cos \theta & 0 \\
      0 & 0 & 1
    \end{array}
  \right)

Axe arbitraire

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.)

Convertit la matrice de rotation du système de coordonnées droitier en système de coordonnées gauche

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.

Quarternion

Système de coordonnées à droite

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.

Système de coordonnées gauche

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 ...)

Conversion du quaternion droitier au quaternion gaucher

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.

Vecteur de rotation

La même chose est vraie pour cela! La définition est la même!

Système de coordonnées à droite

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]

Système de coordonnées gauche

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]

Conversion du vecteur de rotation du système de coordonnées droitier au vecteur rotation du système de coordonnées gauche

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.

Produit extérieur (produit croisé)

Système de coordonnées à droite

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!

Système de coordonnées gauche

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

Système de coordonnées à droite

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.

Système de coordonnées gauche

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

Conversion de quaternion en matrice de rotation

Système de coordonnées à droite

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)

Système de coordonnées gauche

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

Conversion de la matrice de rotation en vecteur équivalent à axe carré

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.

Résumé

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

Traversons le mur du système de coordonnées gauche et du système de coordonnées droitier.
Conversion du système de coordonnées en ECEF et géodésique
Prédisons le timing de Barus et apprécions le film lentement
Comparons la transformée de Fourier de la source sonore synthétisée et le composite de la transformée de Fourier
L'histoire de Python et l'histoire de NaN
Décidons le gagnant du bingo
Ceci et celui de la notation d'inclusion.
Revoir le concept et la terminologie de la régression
L'histoire d'essayer deep3d et de perdre
Examinons le mécanisme de la chinchirorine de Kaiji
Jouons avec Python Receive et enregistrez / affichez le texte du formulaire de saisie
[Langage C] Faites attention à la combinaison de l'API de mise en mémoire tampon et de l'appel système sans mise en mémoire tampon