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.
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)?
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!
Schauen wir uns zunächst die Rotationsmatrix an.
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.
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)
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)
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.) **
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)
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.)
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.
Im rechtshändigen Koordinatensystem ist Quaternion (dh um eine beliebige Achse drehen)
q^{right} = [q_w, q_x, q_y, q_z]
ist.
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 ...)
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.
Gleiches gilt dafür! Die Definition ist die gleiche!
Der Rotationsvektor im rechtshändigen Koordinatensystem (dh um eine beliebige Achse drehen) ist
n^{right} = [u, v, w]
Der Rotationsvektor im linkshändigen Koordinatensystem (dh um eine beliebige Achse drehen) ist
n^{left} = [u, v, w]
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.
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!
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
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.
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
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)
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
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.
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