scipy.spatial.transform.Rotation.

as_quat#

Rotation.as_quat(self, canonical=False, *, scalar_first=False)#

Als Quaternionen darstellen.

Rotationen in 3 Dimensionen können mit Quaternionen mit Norm 1 [1] dargestellt werden.

Die 4 Komponenten eines Quaternions werden in einen Skalarteil w und einen Vektorteil (x, y, z) unterteilt und können aus dem Winkel theta und der Achse n einer Rotation wie folgt ausgedrückt werden

w = cos(theta / 2)
x = sin(theta / 2) * n_x
y = sin(theta / 2) * n_y
z = sin(theta / 2) * n_z

Es gibt 2 Konventionen zur Reihenfolge der Komponenten in einem Quaternion

  • Skalar-zuerst-Reihenfolge – (w, x, y, z)

  • Skalar-zuletzt-Reihenfolge – (x, y, z, w)

Die Wahl wird durch das Argument scalar_first gesteuert. Standardmäßig ist es False und die Skalar-zuletzt-Reihenfolge wird verwendet.

Die Abbildung von Quaternionen zu Rotationen ist zweideutig, d. h. die Quaternionen q und -q, wobei -q einfach das Vorzeichen jeder Komponente umkehrt, stellen dieselbe räumliche Rotation dar.

Parameter:
canonicalbool, standardmäßig False

Ob die redundante doppelte Überdeckung des Rotationsraums auf eine eindeutige "kanonische" einfache Überdeckung abgebildet wird. Wenn True, dann wird das Quaternion aus {q, -q} so gewählt, dass der w-Term positiv ist. Wenn der w-Term 0 ist, dann wird das Quaternion so gewählt, dass der erste Nicht-Null-Term der x-, y- und z-Terme positiv ist.

scalar_firstbool, optional

Ob die Skalarkomponente zuerst oder zuletzt kommt. Standard ist False, d. h. die Skalar-zuletzt-Reihenfolge wird verwendet.

Rückgabe:
quatnumpy.ndarray, Form (4,) oder (N, 4)

Die Form hängt von der Form der bei der Initialisierung verwendeten Eingaben ab.

Referenzen

Beispiele

>>> from scipy.spatial.transform import Rotation as R
>>> import numpy as np

Eine Rotation kann als Quaternion mit entweder Skalar-zuletzt (Standard) oder Skalar-zuerst-Komponentenreihenfolge dargestellt werden. Dies wird für eine einzelne Rotation gezeigt

>>> r = R.from_matrix(np.eye(3))
>>> r.as_quat()
array([0., 0., 0., 1.])
>>> r.as_quat(scalar_first=True)
array([1., 0., 0., 0.])

Wenn mehrere Rotationen in einem einzigen Rotationsobjekt gespeichert sind, ist das Ergebnis ein 2-dimensionales Array

>>> r = R.from_rotvec([[np.pi, 0, 0], [0, 0, np.pi/2]])
>>> r.as_quat().shape
(2, 4)

Quaternionen können von einer redundanten doppelten Abdeckung des Rotationsraums auf eine kanonische Darstellung mit einem positiven w-Term abgebildet werden.

>>> r = R.from_quat([0, 0, 0, -1])
>>> r.as_quat()
array([0. , 0. , 0. , -1.])
>>> r.as_quat(canonical=True)
array([0. , 0. , 0. , 1.])