Si consideri un apparato sico composto da due sistemi di riferimento distinti.
Per fissare le idee pensiamo ad un sistema composto da due camere con campo di visione in larga parte sovrapposto .
E' possibile dunque rilevare con i due sistemi di riferimento la posizione di talune features (per comodità consideriamo i classici pallini) in numero adeguato, disposti anche a casaccio (per comodità siano messi a scacchiera).
La correlazione tra i due sistemi di riferimento può essere descritta mediante una relazione polinomiale fra i vari punti:
Dove n è il numero di punti. Dato g grado del polinomio, il numero di parametri q dipende da g secondo la relazione:
In generale possiamo scrivere la relazione tra i punti nei due sistemi di riferimento con la semplice equazione matriciale:
Dove:
La risoluzione del sistema come noto è data dalla seguente.
Consideriamo il caso (reale) in cui i due sistemi di riferimento abbiano la stessa unità di misura e che gli effetti distorsivi dei due sistemi di visione siano già stati appianati dalla calibrazione delle camere.
Ci troviamo dunque nella situazione raffigurata di seguito.
Roto-Traslazione fra due sistemi di riferimento
Questa rappresentazione sta a significare che abbiamo una nuvola di punti in un sistema di riferimento che si traduce in una corrispettiva nuvola di punti roto-traslata in un secondo sistema di riferimento. In questo caso il grado del polinomio sarà pari a 1, quindi si avrà che il numero di colonne della matrice incognità sarà di 3 (q=3).
Nel caso specifico la matrice incognita:
Rappresenterà una traslazione-rotazione:
Con T vettore traslazione e R matrice di rotazione.
Riporto un esempio di utilizzo della classe da me creata per il calcolo della roto-traslazione fra due sistemi di riferimento.
//Read coordinates
std::list<double> coords;
unsigned int nR, nC;
loadNumFile("RT.txt", coords, nR, nC);
assert(nR > 3);
assert(nC == 4);
//Set first & second reference system points
std::list<Point> first;
std::list<Point> second;
auto it = coords.begin();
Point C;
Point M;
while (it != coords.end()) {
M.x = (*it);
it++;
M.y = (*it);
it++;
C.x = (*it);
it++;
C.y = (*it);
it++;
first.push_back(M);
second.push_back(C);
}
printf("\n Num points: %d \n", nR);
Matrix K = TraslationRotation(first,second);
std::cout<<"\nRotation-Traslation matrix:\n";
print(K);
std::cout<<"\n";
L'ouput dell'esempio sarà il seguente:
Num points: 66
Rotation-Traslation matrix:
2.539 0.997 -0.001
-3.974 0.002 0.998
Si noti come in effetti la prima colonna sia un vettore traslazione mentre la matrice quadrata di lato 2 formata dalla seconda e terza colonna sia molto simile all'identità (in effetti i due sistemi di riferimento da cui sono stati rilevati i punti erano ben poco ruotati l'uno rispetto all'altro).