[PYTHON] Überqueren wir die Wand des linkshändigen Koordinatensystems und des rechtshändigen Koordinatensystems.

Einführung

Es ist zu dieser Zeit eine ganz persönliche Notiz, da ich die Rotation im linken Koordinatensystem (häufig in Computer Vision und Unity verwendet) und die Rotation im rechten Koordinatensystem (häufig in Robotern und physischen Systemen verwendet) konvertieren musste. Viele Bibliotheken werden im rechtshändigen Koordinatensystem erstellt, daher habe ich zusammengefasst, wie zu diesem Zeitpunkt konvertiert werden soll.

Vier Dinge, die Rotation darstellen

In erster Linie, was Rotation darstellt

Es gibt vier. Ich werde jede Erklärung hier weglassen. Weil dort viele Artikel erklärt werden Zum Beispiel

Ich hoffe, Sie können sich darauf beziehen. Das einzige, worauf ich neugierig bin, ist das Folgende. Gibt es einen Unterschied zwischen dem Drehen von $ θ $ im linkshändigen Koordinatensystem (um eine beliebige Achse) und dem Drehen von $ θ $ in einem rechtshändigen Koordinatensystem (um eine beliebige Achse)?

Fazit

Grundsätzlich sollte das linkshändige Koordinatensystem als Berechnung des linkshändigen Koordinatensystems und das rechtshändige Koordinatensystem als Berechnung des rechtshändigen Koordinatensystems betrachtet werden. Wenn Sie jedoch ~ im rechtshändigen Koordinatensystem vom linkshändigen Koordinatensystem sehen möchten, müssen Sie es konvertieren!

Rotationsmatrix

Schauen wir uns zunächst die Rotationsmatrix an.

Rechtes Koordinatensystem

Betrachten wir den Umfang der x-Achse, der y-Achse, der z-Achse und der beliebigen Achse. Dies bedeutet, welche Art von Transformation durchgeführt werden sollte, um θ (um eine bestimmte Achse) im rechtshändigen Koordinatensystem zu drehen.

x-Achse

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

y-Achse

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

Z-Achse

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

Beliebige Achse

Wenn Sie $ \ theta $ mit $ n = [n_x, n_y, n_z] $ drehen,

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)

Linkes Koordinatensystem

Betrachten wir den Umfang der x-Achse, der y-Achse, der z-Achse und der beliebigen Achse. Dies bedeutet, welche Art von Transformation durchgeführt werden sollte, um θ (um eine bestimmte Achse) im linkshändigen Koordinatensystem zu drehen. ** (Ich habe einen Fehler in dem Artikel gemacht, den ich am Anfang erwähnt habe ... Es ist eine Korrektur.) **

x-Achse

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

y-Achse

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

Z-Achse

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

Beliebige Achse

Wenn Sie $ \ theta $ mit $ n = [n_x, n_y, n_z] $ drehen,

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)

Ist dasselbe. Ich denke, das liegt daran, dass das Koordinatensystem selbst so eingestellt ist, dass es Sinn macht. (Ich denke, das liegt daran, dass θ in erster Linie auf Umkehrrotation eingestellt ist und die Achsen ebenfalls vertauscht sind.) (Ich bin mir ein wenig unsicher. Wenn Sie also Kommentare haben, bitte.)

Konvertieren Sie die Rotationsmatrix des rechtshändigen Koordinatensystems in das linkshändige Koordinatensystem

Was passiert, wenn die Rotationsmatrix des rechtshändigen Koordinatensystems vom linkshändigen Koordinatensystem aus betrachtet wird? Es ist eine Geschichte.

** Es ist in Ordnung, wenn Sie umziehen! ** ** **

Alles was Sie tun müssen, ist umzuziehen. Einfach.

Quarternion

Rechtes Koordinatensystem

Im rechtshändigen Koordinatensystem ist Quaternion (dh um eine beliebige Achse drehen)

q^{right} = [q_w, q_x, q_y, q_z]

ist.

Linkes Koordinatensystem

Im linkshändigen Koordinatensystem ist das Quaternion (dh um eine beliebige Achse drehen)

q^{left} = [q_w, q_x, q_y, q_z]

ist. Nun, hier ist es nicht dasselbe? Ich denke es wird sein, aber es ist das gleiche. Offensichtlich ist es das gleiche. (Weil die Quarternion im linkshändigen Koordinatensystem nicht so ist ...)

Konvertieren Sie von rechtshändiger Quaternion zu linkshändiger Quaternion

Aber was ist, wenn wir über das Obige sprechen und die Quaternion im rechtshändigen Koordinatensystem im linkshändigen Koordinatensystem betrachten? Es ist anders, wenn es eine Geschichte ist.

q^{right} = [q_{w1}, q_{x1}, q_{y1}, q_{z1}]

Ist

q^{left} = [q_{w1}, -q_{x1}, q_{y1}, -q_{z1}]

Wird sein.

Rotationsvektor

Gleiches gilt dafür! Die Definition ist die gleiche!

Rechtes Koordinatensystem

Der Rotationsvektor im rechtshändigen Koordinatensystem (dh um eine beliebige Achse drehen) ist

n^{right} = [u, v, w]

Linkes Koordinatensystem

Der Rotationsvektor im linkshändigen Koordinatensystem (dh um eine beliebige Achse drehen) ist

n^{left} = [u, v, w]

Konvertieren Sie vom Rotationsvektor des rechtshändigen Koordinatensystems in den Rotationsvektor des linkshändigen Koordinatensystems

Was aber, wenn wir den Rotationsvektor im rechtshändigen Koordinatensystem im linkshändigen Koordinatensystem betrachten? Es ist anders, wenn es eine Geschichte ist.

n^{right} = [u_1, v_1, w_1]

Ist

n^{left} = [-u_1, v_1, -w_1]

Wird sein.

Äußeres Produkt (Kreuzprodukt)

Rechtes Koordinatensystem

Im rechtshändigen Koordinatensystem wird das äußere Produkt zweier Vektoren genommen: $ 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)

Es wird sein. Mit numpy,

>>> a = np.array([1., 2., 3.])
>>> b = np.array([4., 5., 6.])

>>> np.cross(a, b)
# array([-3.,  6., -3.])

Sie können mit berechnen!

Linkes Koordinatensystem

Die Richtung des äußeren Produkts ist entgegengesetzt, aber θ ist auch entgegengesetzt, so dass es immerhin verwendbar sein sollte. .. ..

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)

So ist es auch!

>>> a = np.array([1., 2., 3.])
>>> b = np.array([4., 5., 6.])

>>> np.cross(a, b)
# array([-3.,  6., -3.])

atan

Rechtes Koordinatensystem

Die Aufnahme von Arctan in das rechtshändige Koordinatensystem ist numpy

>>> a = 1.
>>> b = 2.
>>> np.arctan2(a, b)
# 0.4636476090008061

Kann berechnet werden als.

Linkes Koordinatensystem

Die Aufnahme von Arctan im linkshändigen Koordinatensystem ist das Gegenteil der Berechnung im rechtshändigen Koordinatensystem, aber der Vektor im linkshändigen Koordinatensystem wird in das rechtshändige Koordinatensystem konvertiert (Inversion der y-Achse), und dann wird Arctan genommen. Hier hat θ ein Minus, aber wenn Sie den Winkel zum linkshändigen Koordinatensystem zurückgeben (weil θ in die entgegengesetzte Richtung eingestellt ist). .. .. Immerhin wird es gleich bleiben.

>>> a = 1.
>>> b = 2.
>>> np.arctan2(a, b)
# 0.4636476090008061

Von Quaternion in Rotationsmatrix konvertieren

Rechtes Koordinatensystem

Ich möchte das Quaternion $ q ^ {right} = [q_ {w1}, q_ {x1}, q_ {y1}, q_ {z1}] $ im rechtshändigen Koordinatensystem in die Rotationsmatrix $ R ^ {right} $ konvertieren. Im Allgemeinen ist die Umwandlung von Quaternion in Rotationsmatrix wie folgt:

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)

Linkes Koordinatensystem

Ich möchte das Quaternion $ q ^ {left} = [q_ {w1}, q_ {x1}, q_ {y1}, q_ {z1}] $ im linkshändigen Koordinatensystem in die Rotationsmatrix $ R ^ {left} $ konvertieren. Sie können es wie gewohnt verwenden.

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

Umwandlung von Rotationsmatrix in äquivalenten Vektor der quadratischen Achse

Ein bestimmtes Dokument befasst sich mit der Berechnung der Differenz in der Rotationsmatrix mit dem Rotationsvektor. Es war raus. Insbesondere möchte ich, dass Sie Anhang A sehen, aber der Punkt ist, dass die Rotationsmatrix ein äquivalenter Vektor der quadratischen Achse ist (der sich geringfügig vom Rotationsvektor unterscheidet). Die Literatur selbst beschreibt die Berechnungsmethode im rechtshändigen Koordinatensystem. Kann wie oben beschrieben verwendet werden.

Zusammenfassung

Wenn Sie die oben genannten verwenden

Ich möchte die Quaternion des rechtshändigen Koordinatensystems zu einer Rotationsmatrix des rechtshändigen Koordinatensystems und zu einer Rotationsmatrix des linkshändigen Koordinatensystems machen.

Du kannst auch sagen!

Es ist nur ein Memo, also zögern Sie nicht zu kommentieren, wenn es irgendwelche Fehler gibt.

Recommended Posts

Überqueren wir die Wand des linkshändigen Koordinatensystems und des rechtshändigen Koordinatensystems.
Konvertierung des Koordinatensystems in ECEF und Geodätik
Lassen Sie uns das Timing von Barus vorhersagen und den Film langsam genießen
Vergleichen wir die Fourier-Transformation der synthetisierten Schallquelle und die Zusammensetzung der Fourier-Transformation
Die Geschichte von Python und die Geschichte von NaN
Lassen Sie uns den Gewinner des Bingo bestimmen
Dies und das der Einschlussnotation.
Überprüfen Sie das Konzept und die Terminologie der Regression
Die Geschichte, deep3d auszuprobieren und zu verlieren
Untersuchen wir den Mechanismus von Kaijis Chinchirorin
Lassen Sie uns mit Python Receive spielen und den Text des Eingabeformulars speichern / anzeigen
[C-Sprache] Achten Sie auf die Kombination aus Puffer-API und nicht pufferndem Systemaufruf