scipy.spatial.transform.Rotation.

as_quat#

Вращение.as_quat(self, канонический=False, *, scalar_first=False)#

Представить в виде кватернионов.

Вращения в 3-х измерениях могут быть представлены с использованием единичных нормированных кватернионов [1].

4 компонента кватерниона разделены на скалярную часть w и векторная часть (x, y, z) и может быть выражен через угол theta и ось n вращения следующим образом:

w = cos(theta / 2)
x = sin(theta / 2) * n_x
y = sin(theta / 2) * n_y
z = sin(theta / 2) * n_z

Существует 2 соглашения для порядка компонентов в кватернионе:

  • скалярный первый порядок – (w, x, y, z)

  • скаляр-последний порядок – (x, y, z, w)

Выбор контролируется scalar_first аргумент. По умолчанию установлено значение False, и используется порядок скаляр-последний.

Отображение из кватернионов в повороты является двузначным, т.е. кватернионы q и -q, где -q просто меняет знак каждой компоненты, представляя то же самое пространственное вращение.

Параметры:
каноническийbool, по умолчанию False

Следует ли отображать избыточное двойное покрытие пространства вращений в уникальное «каноническое» одиночное покрытие. Если True, то кватернион выбирается из {q, -q} так, чтобы член w был положительным. Если член w равен 0, то кватернион выбирается так, чтобы первый ненулевой член из x, y и z был положительным.

scalar_firstbool, необязательно

Идёт ли скалярная компонента первой или последней. По умолчанию False, т.е. используется порядок скаляр-последний.

Возвращает:
quatnumpy.ndarray, форма (4,) или (N, 4)

Форма зависит от формы входных данных, использованных для инициализации.

Ссылки

Примеры

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

Вращение может быть представлено как кватернион с порядком компонентов либо скаляр-последний (по умолчанию), либо скаляр-первый. Это показано для одного вращения:

>>> r = R.from_matrix(np.eye(3))
>>> r.as_quat()
array([0., 0., 0., 1.])
>>> r.as_quat(scalar_first=True)
array([1., 0., 0., 0.])

Когда несколько вращений хранятся в одном объекте Rotation, результат будет двумерным массивом:

>>> r = R.from_rotvec([[np.pi, 0, 0], [0, 0, np.pi/2]])
>>> r.as_quat().shape
(2, 4)

Кватернионы могут быть отображены из избыточного двойного покрытия пространства вращений в каноническое представление с положительным членом w.

>>> r = R.from_quat([0, 0, 0, -1])
>>> r.as_quat()
array([0. , 0. , 0. , -1.])
>>> r.as_quat(canonical=True)
array([0. , 0. , 0. , 1.])