Я сравнил выходные данные функций scipy и MATLAB для создания 3D-матриц вращения, и две программы показали разные результаты.
Первый SciPys scipy.spatial.transform.Rotation :
>>> import numpy as np
>>> from scipy.spatial.transform import Rotation as R
>>> R.from_euler('zyz', [np.pi/2, np.pi/2, 0]).as_dcm()
array([[ 0.00000000e+00, -2.22044605e-16, 1.00000000e+00],
[ 1.00000000e+00, 2.22044605e-16, 0.00000000e+00],
[-2.22044605e-16, 1.00000000e+00, 2.22044605e-16]])
>>> R.from_euler('zyz', [0, np.pi/2, np.pi/2]).as_dcm()
array([[ 0.00000000e+00, -1.00000000e+00, 2.22044605e-16],
[ 2.22044605e-16, 2.22044605e-16, 1.00000000e+00],
[-1.00000000e+00, 0.00000000e+00, 2.22044605e-16]])
Теперь функции matlabs eul2rotm :
>> eul2rotm([pi/2 pi/2 0], 'ZYZ')
ans =
0.0000 -1.0000 0.0000
0.0000 0.0000 1.0000
-1.0000 0 0.0000
>> eul2rotm([0 pi/2 pi/2], 'ZYZ')
ans =
0.0000 -0.0000 1.0000
1.0000 0.0000 0
-0.0000 1.0000 0.0000
В итоге порядок применения поворотов выглядит иначе. Но какой из них правильный? Я ценю любую помощь.
Протестировано с SciPy 1.3.1, NumPy 1.15.4 и Matlab R2018b.