2013-02-22 2 views
11

Я использую два изображения одного объекта, объект обтекает определенную степень от его первого изображения.Как рассчитать угол от матрицы поворота

Я вычислил POSE каждого изображения и преобразовал вектор вращения в матрицу, используя Rodergues(). Теперь, как я могу рассчитать и посмотреть, сколько он повернут с первой позиции?

Я перепробовал много способов, но ответы не были близки

EDIT: Моя камера фиксируются только объект двигается.

ответ

26

Мы можем получить углы Эйлера из матрицы вращения, используя следующую формулу.

Учитывая, 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).

Смотрите также http://www.soi.city.ac.uk/~sbbh653/publications/euler.pdf

+1

Большое вам спасибо за помощь. +1 –

+0

Есть ли способ определить, в каком порядке эти вращения должны применяться для достижения этой матрицы? –

7

Если R является (3x3) матрица вращения, то угол поворота будет ACOS ((Tr (R) -1)/2), где тр (R) является след матрица (т. е. сумма диагональных элементов).

Это то, о чем вы просили; Я оцениваю вероятность 90%, что это не то, что вы хотите.

+0

Это дает ровно одно скалярное значение, соответствующее углу поворота вдоль **, ось которого **? –

+1

@ SaravanabalagiRamachandran: Собственный вектор матрицы, конечно. Просто разрешите (** R ** - ** I **) X = 0 для X (где X и 0 - векторы). – Beta

0

Пусть R1c и R2c быть матрицы 2 вращения вы вычислили. Они выражают вращение от объекта в позициях 1 и 2 соответственно к кадру камеры (отсюда и второй суффикс c). Необходимая матрица вращения находится от позы 1 до позиции 2, то есть R12. Чтобы вычислить его, вы должны повернуть, на ваш взгляд, объект с pose_1-to-camera, затем с камеры на pose_2. Последний поворот является обратной камеры pose_2-к-espressed по R2c, следовательно:

R12 = R1c * inv(R2c)

Из матрицы R12 можно затем вычислить угол и ось вращения по формуле Rodiguez в.

1

Для справки, этот код вычисляет углы Эйлера в 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]; 

кодекс предусматривает Грэм Тейлор, Джефф Хинтон и Сэм Roweis.Для получения дополнительной информации см. here