from_quat#
- classmethod Rotation.from_quat(cls, quat, *, scalar_first=False)#
Aus Quaternionen initialisieren.
Rotationen in 3 Dimensionen können mit Einheitsnorm-Quaternionen dargestellt werden [1].
Die 4 Komponenten eines Quaternions werden in einen Skalarteil
wund einen Vektorteil(x, y, z)unterteilt und können aus dem Winkelthetaund der Achseneiner Rotation wie folgt ausgedrückt werdenw = 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 angenommen.
Fortgeschrittene Benutzer könnten sich für die „doppelte Überlagerung“ des 3D-Raums durch die Quaternion-Darstellung interessieren [2]. Ab Version 1.11.0 sind die folgenden (und nur diese) Operationen auf einem
Rotationr, die einem Quaternionqentsprechen, garantiert, die doppelte Überlagerungseigenschaft zu erhalten:r = Rotation.from_quat(q),r.as_quat(canonical=False),r.inv()und die Komposition über den Operator*, wie z.B.r*r.- Parameter:
- quatarray_like, Form (N, 4) oder (4,)
Jede Zeile ist ein (möglicherweise nicht normiertes) Quaternion, das eine aktive Rotation darstellt. Jedes Quaternion wird auf Einheitsnorm normiert.
- scalar_firstbool, optional
Ob die Skalar-Komponente zuerst oder zuletzt kommt. Standard ist False, d.h. die Skalar-zuletzt-Reihenfolge wird angenommen.
- Rückgabe:
- rotation
RotationInstanz Objekt, das die durch die Eingabe-Quaternionen dargestellten Rotationen enthält.
- rotation
Referenzen
[2]Hanson, Andrew J. „Visualizing quaternions.“ Morgan Kaufmann Publishers Inc., San Francisco, CA. 2006.
Beispiele
>>> from scipy.spatial.transform import Rotation as R
Eine Rotation kann mit der Skalar-zuletzt- (Standard) oder Skalar-zuerst-Komponentenreihenfolge aus einem Quaternion initialisiert werden, wie unten gezeigt
>>> r = R.from_quat([0, 0, 0, 1]) >>> r.as_matrix() array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) >>> r = R.from_quat([1, 0, 0, 0], scalar_first=True) >>> r.as_matrix() array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
Es ist möglich, mehrere Rotationen in einem einzigen Objekt zu initialisieren, indem ein 2-dimensionales Array übergeben wird
>>> r = R.from_quat([ ... [1, 0, 0, 0], ... [0, 0, 0, 1] ... ]) >>> r.as_quat() array([[1., 0., 0., 0.], [0., 0., 0., 1.]]) >>> r.as_quat().shape (2, 4)
Es ist auch möglich, einen Stapel einer einzelnen Rotation zu haben
>>> r = R.from_quat([[0, 0, 0, 1]]) >>> r.as_quat() array([[0., 0., 0., 1.]]) >>> r.as_quat().shape (1, 4)
Quaternionen werden vor der Initialisierung normiert.
>>> r = R.from_quat([0, 0, 1, 1]) >>> r.as_quat() array([0. , 0. , 0.70710678, 0.70710678])