scipy.spatial.transform.Rotation.

from_quat#

метод класса Вращение.from_quat(cls, quat, *, 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, и предполагается порядок скаляр-последний.

Опытные пользователи могут быть заинтересованы в «двойном покрытии» 3D-пространства представлением кватернионами [2]. Начиная с версии 1.11.0, следующий поднабор (и только этот поднабор) операций над Rotation r соответствующий кватерниону q гарантированно сохраняют свойство двойного покрытия: r = Rotation.from_quat(q), r.as_quat(canonical=False), r.inv(), и композиция с использованием * оператор, такой как r*r.

Параметры:
quatarray_like, форма (N, 4) или (4,)

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

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

Whether the scalar component goes first or last. Default is False, i.e. the scalar-last order is assumed.

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

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

Ссылки

[2]

Hanson, Andrew J. "Visualizing quaternions." Morgan Kaufmann Publishers Inc., San Francisco, CA. 2006.

Примеры

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

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

>>> r = R.from_quat([0, 0, 0, 1])
>>> r.as_matrix()
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
>>> r = R.from_quat([1, 0, 0, 0], scalar_first=True)
>>> r.as_matrix()
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

Можно инициализировать несколько вращений в одном объекте, передавая двумерный массив:

>>> r = R.from_quat([
... [1, 0, 0, 0],
... [0, 0, 0, 1]
... ])
>>> r.as_quat()
array([[1., 0., 0., 0.],
       [0., 0., 0., 1.]])
>>> r.as_quat().shape
(2, 4)

Также возможно иметь стек из одного вращения:

>>> r = R.from_quat([[0, 0, 0, 1]])
>>> r.as_quat()
array([[0., 0., 0., 1.]])
>>> r.as_quat().shape
(1, 4)

Кватернионы нормализуются перед инициализацией.

>>> r = R.from_quat([0, 0, 1, 1])
>>> r.as_quat()
array([0.        , 0.        , 0.70710678, 0.70710678])