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)