scipy.spatial.transform.Rotation.

from_davenport#

метод класса Вращение.from_davenport(cls, оси, порядок, углы, градусы=False)#

Инициализировать из углов Дэвенпорта.

Вращения в 3-D могут быть представлены последовательностью из 3 вращений вокруг последовательности осей.

Три вращения могут быть либо в глобальной системе отсчёта (внешние), либо в системе отсчёта, связанной с телом (внутренние), которая прикреплена к вращающемуся объекту и движется вместе с ним [1].

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

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

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

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

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

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

порядокstring

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

углыfloat или array_like, форма (N,) или (N, [1 или 2 или 3])

Углы Эйлера, заданные в радианах (градусы равно False) или степени (градусы равно True). Для одной оси, углы может быть:

  • единственное значение

  • array_like с формой (N,), где каждый angle[i] соответствует одному вращению

  • array_like с формой (N, 1), где каждый angle[i, 0] соответствует одному вращению

Для 2 и 3 осей, углы может быть:

  • array_like с формой (W,) где W это количество строк оси, что соответствует одному вращению с W оси

  • array_like с формой (N, W), где каждый angle[i] соответствует последовательности углов Дэвенпорта, описывающей единственное вращение

градусыbool, необязательно

Если True, то предполагается, что заданные углы указаны в градусах. По умолчанию False.

Возвращает:
вращениеRotation экземпляр

Объект, содержащий вращение, представленное последовательностью вращений вокруг заданных осей с заданными углами.

Ссылки

[2]

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

Примеры

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

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

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

Инициализировать одно вращение с заданной последовательностью осей:

>>> axes = [ez, ey, ex]
>>> r = R.from_davenport(axes, 'extrinsic', [90, 0, 0], degrees=True)
>>> r.as_quat().shape
(4,)

Это эквивалентно углам Эйлера в данном случае:

>>> r.as_euler('zyx', degrees=True)
array([90.,  0., -0.])

Инициализировать несколько вращений в одном объекте:

>>> r = R.from_davenport(axes, 'extrinsic', [[90, 45, 30], [35, 45, 90]], degrees=True)
>>> r.as_quat().shape
(2, 4)

Использование только одной или двух осей также возможно:

>>> r = R.from_davenport([ez, ex], 'extrinsic', [[90, 45], [35, 45]], degrees=True)
>>> r.as_quat().shape
(2, 4)

Некканонические оси возможны, и они не должны быть нормализованы, пока последовательные оси ортогональны:

>>> e1 = [2, 0, 0]
>>> e2 = [0, 1, 0]
>>> e3 = [1, 0, 1]
>>> axes = [e1, e2, e3]
>>> r = R.from_davenport(axes, 'extrinsic', [90, 45, 30], degrees=True)
>>> r.as_quat()
[ 0.701057,  0.430459, -0.092296,  0.560986]