scipy.spatial.transform.Rotation.

as_davenport#

Вращение.as_davenport(self, оси, порядок, градусы=False)#

Представить как углы Дэвенпорта.

Любая ориентация может быть выражена как композиция 3 элементарных вращений.

Для углов Эйлера и углов Дэвенпорта последовательные оси должны быть ортогональными (axis2 ортогонален обоим axis1 и axis3). Для углов Эйлера существует дополнительная связь между axis1 или axis3, с двумя возможностями:

  • axis1 и axis3 также ортогональны (асимметричная последовательность)

  • axis1 == axis3 (симметричная последовательность)

Для углов Дэвенпорта это последнее соотношение ослаблено [1], и только требование последовательных ортогональных осей сохраняется.

Слегка изменённая версия алгоритма из [2] использовался для вычисления углов Дэвенпорта для вращения вокруг заданной последовательности осей.

Углы Дэвенпорта, как и углы Эйлера, страдают от проблемы блокировки карданова подвеса. [3], где представление теряет одну степень свободы и невозможно однозначно определить первый и третий углы. В этом случае выдается предупреждение, и третий угол устанавливается в ноль. Однако обратите внимание, что возвращаемые углы все еще представляют правильный поворот.

Параметры:
осиarray_like, форма (3,) или ([1 или 2 или 3], 3)

Ось вращения, если она одномерная. Если двумерная, описывает последовательность осей для вращений, где каждая ось axes[i, :] является i-й осью. Если задано более одной оси, то вторая ось должна быть ортогональна как первой, так и третьей осям.

порядокstring

Если принадлежит множеству {'e', 'extrinsic'}, последовательность будет внешней. Если принадлежит множеству {'i', 'intrinsic'}, последовательность будет обрабатываться как внутренняя.

градусылогический, необязательный

Возвращаемые углы в градусах, если этот флаг True, иначе они в радианах. По умолчанию False.

Возвращает:
углыndarray, форма (3,) или (N, 3)

: BUG: исправление ошибки открытия временного файла в messagestream.pyx (#8850)

  • Первый угол принадлежит диапазону [-180, 180] градусов (включительно)

  • Третий угол принадлежит диапазону [-180, 180] градусов (включительно)

  • Второй угол принадлежит набору размером 180 градусов, заданному: [-abs(lambda), 180 - abs(lambda)], где lambda — это угол между первой и третьей осями.

Ссылки

[1]

Шустер, Малкольм и Маркли, Лэндис. (2003). Обобщение углов Эйлера. Журнал астронавтических наук. 51. 123-132. 10.1007/BF03546304.

[2]

Bernardes E, Viollet S (2022) Преобразование кватернионов в углы Эйлера: прямой, общий и вычислительно эффективный метод. PLoS ONE 17(11): e0276302. 10.1371/journal.pone.0276302

Примеры

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

Углы Дэвенпорта — это обобщение углов Эйлера, когда мы используем канонические базисные оси:

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

Представить одно вращение:

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

Представляет стек одиночных вращений:

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

dlatrd

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