2013-02-22 24 views
11

Sto usando due immagini del singolo oggetto, l'oggetto viene instradato di un certo grado dalla sua prima immagine.Come calcolare l'angolo dalla matrice di rotazione

Ho calcolato il POSE di ciascuna immagine e convertito il vettore di rotazione in Matrix utilizzando Rodergues(). Ora come faccio a calcolare e vedere quanto viene ruotato dalla sua prima posizione?

Ho provato molti modi, ma le risposte non era erano vicini

EDIT: La mia macchina fotografica è fissato solo l'oggetto è in movimento.

risposta

26

Possiamo ottenere angoli euler dalla matrice di rotazione utilizzando la seguente formula.

Data una matrice 3 × 3 rotazione

enter image description here

I 3 angoli di Eulero sono

enter image description here

enter image description here

enter image description here

Qui atan2 è la stessa funzione tangente dell'arco, con il controllo del quadrante, di solito si trova in C o Matlab.

Nota: prestare attenzione se l'angolo attorno all'asse y è esattamente di +/- 90 °. In tal caso, tutti gli elementi nella prima colonna e nell'ultima riga, ad eccezione di quello nell'angolo inferiore, che è o 1 o -1, saranno 0 (cos (1) = 0). Una soluzione sarebbe quella di fissare la rotazione attorno all'asse x a 180 ° e calcolare l'angolo attorno all'asse z da: atan2 (r_12, -r_22).

Vedi anche http://www.soi.city.ac.uk/~sbbh653/publications/euler.pdf

+1

Grazie mille per il vostro aiuto .. +1 –

+0

C'è anche un modo per determinare in quale ordine queste rotazioni devono essere applicate per ottenere questa matrice? –

7

Se R è il (3x3) matrice di rotazione, allora l'angolo di rotazione sarà acos ((tr (R) -1)/2), dove TR (R) è la traccia la matrice (cioè la somma degli elementi diagonali).

Questo è quello che hai chiesto; Stimo una probabilità del 90% che non è quello che vuoi.

+0

questo dà esattamente un valore scalare corrispondente all'angolo di rotazione lungo ** quale asse **? –

+1

@SaravanabalagiRamachandran: l'autovettore della matrice, ovviamente. Basta risolvere (** R ** - ** I **) X = 0 per X (dove X e 0 sono vettori). – Beta

0

Let R1c e R2c essere i 2 matrici di rotazione che avete calcolato. Questi esprimono le rotazioni dall'oggetto nelle pose 1 e 2 rispettivamente al fotogramma della telecamera (da qui il secondo suffisso c). La matrice di rotazione desiderata è dalla posa 1 alla posa 2, cioè R12. Per calcolarlo devi ruotare, nella tua mente, l'oggetto da pose_1 a macchina fotografica, poi dalla camera-a-posa_2. Quest'ultima rotazione è l'inverso della telecamera pose_2-a-espressed da R2c, quindi:

R12 = R1c * inv(R2c)

Dalla matrice R12 è possibile calcolare l'angolo e l'asse di rotazione usando la formula di Rodiguez.

1

Per riferimento, il codice calcola l'angolo di Eulero in 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]; 

codice fornito da Graham Taylor, Geoff Hinton e Sam Roweis.Per ulteriori informazioni, vedere here

Problemi correlati