scipy.spatial.transform.Rotation.

from_matrix#

метод класса Вращение.from_matrix(cls, матрица)#

Инициализировать из матрицы вращения.

Вращения в 3-х измерениях могут быть представлены с помощью 3 x 3 ортогональных матриц [1]. Если входные данные не ортогональны, создается приближение путем ортогонализации входной матрицы с использованием метода, описанного в [2], а затем преобразуйте ортогональные матрицы вращения в кватернионы, используя алгоритм, описанный в [3]. Матрицы должны быть правосторонними.

Параметры:
матрицаarray_like, форма (N, 3, 3) или (3, 3)

Одна матрица или набор матриц, где matrix[i] является i-й матрицей.

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

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

Примечания

Эта функция ранее называлась from_dcm.

Добавлено в версии 1.4.0.

Ссылки

[3]

F. Landis Markley, «Unit Quaternion from Rotation Matrix», Journal of guidance, control, and dynamics vol. 31.2, pp. 440-442, 2008.

Примеры

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

Инициализация одиночного вращения:

>>> r = R.from_matrix([
... [0, -1, 0],
... [1, 0, 0],
... [0, 0, 1]])
>>> r.single
True
>>> r.as_matrix().shape
(3, 3)

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

>>> r = R.from_matrix([
... [
...     [0, -1, 0],
...     [1, 0, 0],
...     [0, 0, 1],
... ],
... [
...     [1, 0, 0],
...     [0, 0, -1],
...     [0, 1, 0],
... ]])
>>> r.as_matrix().shape
(2, 3, 3)
>>> r.single
False
>>> len(r)
2

Если входные матрицы не являются специальными ортогональными (ортогональными с определителем, равным +1), то сохраняется специальная ортогональная оценка:

>>> a = np.array([
... [0, -0.5, 0],
... [0.5, 0, 0],
... [0, 0, 0.5]])
>>> np.linalg.det(a)
0.125
>>> r = R.from_matrix(a)
>>> matrix = r.as_matrix()
>>> matrix
array([[ 0., -1.,  0.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  1.]])
>>> np.linalg.det(matrix)
1.0

Также возможен стек, содержащий одно вращение:

>>> r = R.from_matrix([[
... [0, -1, 0],
... [1, 0, 0],
... [0, 0, 1]]])
>>> r.as_matrix()
array([[[ 0., -1.,  0.],
        [ 1.,  0.,  0.],
        [ 0.,  0.,  1.]]])
>>> r.as_matrix().shape
(1, 3, 3)