scipy.spatial.transform.Rotation.

as_euler#

Rotation.as_euler(self, seq, degrees=False)#

表示為歐拉角。

任何方位都可以表示為 3 次基本旋轉的組合。一旦選擇了軸序列,歐拉角就定義了繞每個軸的旋轉角度 [1]

使用了來自 [2] 的演算法來計算繞給定軸序列旋轉的歐拉角。

歐拉角存在萬向鎖問題 [3],其中表示法失去一個自由度,並且無法唯一確定第一和第三個角度。在這種情況下,會發出警告,並且第三個角度設定為零。但是請注意,返回的角度仍然表示正確的旋轉。

參數:
seq字串,長度為 3

3 個字元,屬於集合 {'X', 'Y', 'Z'}(用於內在旋轉)或 {'x', 'y', 'z'}(用於外在旋轉)[1]。相鄰軸不能相同。外在和內在旋轉不能在一個函數呼叫中混合使用。

degrees布林值,選填

如果此標誌為 True,則返回的角度以度為單位,否則以弧度為單位。預設值為 False。

回傳:
anglesndarray,形狀為 (3,) 或 (N, 3)

形狀取決於用於初始化物件的輸入形狀。返回的角度在以下範圍內

  • 第一個角度屬於 [-180, 180] 度(包含兩端)

  • 第三個角度屬於 [-180, 180] 度(包含兩端)

  • 第二個角度屬於

    • [-90, 90] 度(如果所有軸都不同,例如 xyz)

    • [0, 180] 度(如果第一和第三軸相同,例如 zxz)

參考文獻

[2]

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

範例

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

表示單次旋轉

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

表示單次旋轉的堆疊

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

在單一物件中表示多次旋轉

>>> r = R.from_rotvec([
... [0, 0, np.pi/2],
... [0, -np.pi/3, 0],
... [np.pi/4, 0, 0]])
>>> r.as_euler('zxy', degrees=True)
array([[ 90.,   0.,   0.],
       [  0.,   0., -60.],
       [  0.,  45.,   0.]])
>>> r.as_euler('zxy', degrees=True).shape
(3, 3)