Как рассчитать угол от матрицы вращения
Я использую два изображения одного объекта, объект в определенной степени обходит его первое изображение.
Я вычислил POSE каждого изображения и преобразовал вектор вращения в Matrix, используя Rodergues(). Теперь, как я могу рассчитать и посмотреть, сколько он повернут с первой позиции?
Я пробовал много способов, но ответов было не так близко
EDIT: моя камера фиксирована только для перемещения объекта.
Ответы
Ответ 1
Мы можем получить углы Эйлера из матрицы вращения, используя следующую формулу.
Учитывая матрицу вращения 3 × 3
![enter image description here]()
3 угла Эйлера
![enter image description here]()
![enter image description here]()
![enter image description here]()
Здесь atan2 - это та же функция арктангенса, с проверкой квадрантов, которую вы обычно найдете в C или Matlab.
Примечание. Необходимо соблюдать осторожность, если угол вокруг оси y равен + / -90 °. В этом случае все элементы в первом столбце и последней строке, кроме элемента в нижнем углу, который равен 1 или -1, будут равны 0 (cos (1) = 0). Одним из решений было бы зафиксировать вращение вокруг оси x на 180 ° и вычислить угол вокруг оси z из: atan2 (r_12, -r_22).
См. Также https://www.geometrictools.com/Documentation/EulerAngles.pdf, который включает в себя реализации для шести различных порядков углов Эйлера.
Ответ 2
Если R - матрица вращения (3x3), то угол поворота будет acos ((tr (R) - 1)/2), где tr ( R) - след матрицы (т.е. сумма диагональных элементов).
Это то, о чем вы просили; Я оцениваю вероятность 90% того, что вы не хотите.
Ответ 3
Для вашей справки этот код вычисляет углы Эйлера в MATLAB:
function Eul = RotMat2Euler(R)
if R(1,3) == 1 | R(1,3) == -1
%special case
E3 = 0; %set arbitrarily
dlta = atan2(R(1,2),R(1,3));
if R(1,3) == -1
E2 = pi/2;
E1 = E3 + dlta;
else
E2 = -pi/2;
E1 = -E3 + dlta;
end
else
E2 = - asin(R(1,3));
E1 = atan2(R(2,3)/cos(E2), R(3,3)/cos(E2));
E3 = atan2(R(1,2)/cos(E2), R(1,1)/cos(E2));
end
Eul = [E1 E2 E3];
Код, предоставленный Грэмом Тейлором, Джеффом Хинтоном и Сэмом Роуэсом. Для получения дополнительной информации см. здесь
Ответ 4
Пусть R1c и R2c - две матрицы вращения, которые вы вычислили. Они выражают вращение от объекта в позициях 1 и 2 соответственно к кадру камеры (отсюда и второй суффикс c). Необходимая матрица вращения находится от позы 1 до позиции 2, то есть R12. Чтобы вычислить его, вы должны повернуть, на ваш взгляд, объект с pose_1-to-camera, затем с камеры на pose_2. Последнее вращение является обратным к pose_2-to-camera, поданному R2c, следовательно:
R12 = R1c * inv(R2c)
Из матрицы R12 вы можете вычислить угол и ось вращения с помощью формулы Родигеза.