Я пытаюсь найти углы Эйлера, которые позволяют преобразовать точку A
в точку B
в трехмерном пространстве.
Рассмотрим нормализованные векторы A = [1, 0, 0]
и B = [0.32 0.88 -0.34]
.
Я понимаю, что вычисляя перекрестное произведение A × B
, я получаю ось вращения. Угол между A
и B
определяется как tan⁻¹(||cross||, A·B)
, где A·B
- это скалярное произведение между A
и B
.
Это дает мне вектор вращения rotvec = [0 0.36 0.93 1.24359531111]
, который равен rotvec = [A × B; angle]
(перекрестное произведение нормализовано).
Теперь мой вопрос: Как мне перейти отсюда, чтобы получить углы Эйлера, соответствующие преобразованию от A
к B
?
В MATLAB функция vrrotvec2mat получает в качестве входных данных вектор вращения и выводит матрицу вращения. . Затем функция rotm2eul должна вернуть соответствующие углы Эйлера. Я получаю следующий результат (в радианах): [0.2456 0.3490 1.2216]
в соответствии с соглашением XYZ
. Однако это не ожидаемый результат.
Правильный ответ - [0 0.3490 1.2216]
, что соответствует повороту на 20°
и 70°
в Y
и Z
соответственно.
Когда я использую eul2rot([0 0.3490 1.2216])
(с eul2rot
, взятым из здесь) для проверки Полученная матрица вращения отличается от той, которую я получаю при использовании vrrotvec2mat(rotvec)
.
У меня также есть спинет Python, который дает точно такие же результаты, как описано выше.
--- Python (2.7) с использованием transform3d ---
import numpy as np
import transforms3d
cross = np.cross(A, B)
dot = np.dot(A, B.transpose())
angle = math.atan2(np.linalg.norm(cross), dot)
rotation_axes = sklearn.preprocessing.normalize(cross)
rotation_m = transforms3d.axangles.axangle2mat(rotation_axes[0], angle, True)
rotation_angles = transforms3d.euler.mat2euler(rotation_m, 'sxyz')
Что мне здесь не хватает? Что мне делать вместо этого?
Спасибо