Как рассчитать угол от матрицы вращения

Я использую два изображения одного объекта, объект в определенной степени обходит его первое изображение.

Я вычислил 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 вы можете вычислить угол и ось вращения с помощью формулы Родигеза.