scipy.spatial.transform.Rotation.

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 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 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 Rotation r, die einem Quaternion q entsprechen, 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:
rotationRotation Instanz

Objekt, das die durch die Eingabe-Quaternionen dargestellten Rotationen enthält.

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