scipy.spatial.transform.Rotation.

as_davenport#

Rotation.as_davenport(self, axes, order, degrees=False)#

Als Davenport-Winkel darstellen.

Jede Orientierung kann als Komposition von 3 elementaren Rotationen ausgedrückt werden.

Sowohl für Euler-Winkel als auch für Davenport-Winkel müssen aufeinanderfolgende Achsen orthogonal sein (axis2 ist orthogonal zu axis1 und axis3). Für Euler-Winkel gibt es eine zusätzliche Beziehung zwischen axis1 oder axis3, mit zwei Möglichkeiten:

  • axis1 und axis3 sind ebenfalls orthogonal (asymmetrische Sequenz)

  • axis1 == axis3 (symmetrische Sequenz)

Für Davenport-Winkel wird diese letzte Beziehung gelockert [1], und nur die Anforderung orthogonaler aufeinanderfolgender Achsen wird beibehalten.

Eine leicht modifizierte Version des Algorithmus aus [2] wurde verwendet, um Davenport-Winkel für die Rotation um eine gegebene Achsenfolge zu berechnen.

Davenport-Winkel leiden, genau wie Euler-Winkel, unter dem Problem der Gimbal Lock [3], bei dem die Darstellung einen Freiheitsgrad verliert und es nicht möglich ist, den ersten und dritten Winkel eindeutig zu bestimmen. In diesem Fall wird eine Warnung ausgegeben und der dritte Winkel auf Null gesetzt. Beachten Sie jedoch, dass die zurückgegebenen Winkel immer noch die korrekte Rotation darstellen.

Parameter:
axesarray_like, shape (3,) or ([1 or 2 or 3], 3)

Achse der Rotation, wenn eindimensional. Wenn zweidimensional, beschreibt die Achsenfolge für Rotationen, wobei jede Achse axes[i, :] die i-te Achse ist. Wenn mehr als eine Achse gegeben ist, muss die zweite Achse orthogonal zu der ersten und dritten Achse sein.

orderstring

Wenn es zur Menge {‘e’, ‘extrinsic’} gehört, wird die Sequenz als extrinsisch behandelt. Wenn es zur Menge {‘i’, ‘intrinsic’} gehört, wird die Sequenz als intrinsisch behandelt.

degreesboolean, optional

Die zurückgegebenen Winkel sind in Grad, wenn dieses Flag True ist, andernfalls sind sie im Bogenmaß. Standard ist False.

Rückgabe:
anglesndarray, shape (3,) or (N, 3)

Die Form hängt von der Form der zur Initialisierung des Objekts verwendeten Eingaben ab. Die zurückgegebenen Winkel liegen im Bereich

  • Der erste Winkel liegt im Bereich [-180, 180] Grad (beide einschließlich)

  • Der dritte Winkel liegt im Bereich [-180, 180] Grad (beide einschließlich)

  • Der zweite Winkel gehört zu einer Menge der Größe 180 Grad, gegeben durch: [-abs(lambda), 180 - abs(lambda)], wobei lambda der Winkel zwischen der ersten und dritten Achse ist.

Referenzen

[1]

Shuster, Malcolm & Markley, Landis. (2003). Generalization of the Euler Angles. Journal of the Astronautical Sciences. 51. 123-132. 10.1007/BF03546304.

[2]

Bernardes E, Viollet S (2022) Quaternion to Euler angles conversion: A direct, general and computationally efficient method. PLoS ONE 17(11): e0276302. 10.1371/journal.pone.0276302

Beispiele

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

Davenport-Winkel sind eine Verallgemeinerung von Euler-Winkeln, wenn wir die kanonische Basis-Achsen verwenden.

>>> ex = [1, 0, 0]
>>> ey = [0, 1, 0]
>>> ez = [0, 0, 1]

Eine einzelne Rotation darstellen

>>> r = R.from_rotvec([0, 0, np.pi/2])
>>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True)
array([90.,  0.,  0.])
>>> r.as_euler('zxy', degrees=True)
array([90.,  0.,  0.])
>>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True).shape
(3,)

Stapel von Einzelrotationen darstellen

>>> r = R.from_rotvec([[0, 0, np.pi/2]])
>>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True)
array([[90.,  0.,  0.]])
>>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True).shape
(1, 3)

Mehrere Rotationen in einem einzigen Objekt darstellen

>>> r = R.from_rotvec([
... [0, 0, 90],
... [45, 0, 0]], degrees=True)
>>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True)
array([[90.,  0.,  0.],
       [ 0., 45.,  0.]])
>>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True).shape
(2, 3)