Sia dato un sistema di riferimento, pensiamo al solito ad una camera, e si abbia un dispositivo che faccia ruotare un oggetto con un centro di rotazione che non
coincide con l'origine del sistema di riferimento (un piatto rotante sotto la camera per fissare le idee).
Mediante delle osservazioni di un punto sull'oggetto che ruota vogliamo determinare il centro di rotazione, per semplicità pensiamo di fare un numero congruo di rilevazioni (n) ad una distanza angolare fissa. Il sistema è rappresentabile mediante la figura che segue.
Figura 1: Rotazione di un punto con distanza angolare costante
Si può scrivere la sequente semplice relazione vettoriale fra un punto ed il precedente.
Dove R è la matrice di rotazione nel piano:
Raffiguriamo il generico punto i-esimo.
I vettori con origine sull'origine del sistema di riferimento sono:
Mentre usando la regola del parallelogramma si ricava:
Per la (1.1) e la (1.2), per ogni punto dal secondo in poi si può scrivere:
Accorpando le equazioni di tutti i punti in un unico sistema si ricava.
Rinominando le matrici in modo intuitivo si ha:
Che si risolve usando la pseudoinversa:
Un'osservazione che ritengo interessantissima, il raggio della circonferenza non appare da nessuna parte.
E se lo scostamento angolare tra una acquisizione e l'altra non fosse costante?
Similmente a quanto visto si ha che:
Quindi le matrici divengono:
Riporto un esempio di utilizzo della classe da me creata per il calcolo del centro di rotazione.
In allegato trovate anche un file Octave per eseguire dei test, nell'esempio riportato vengono generati dei punti in una circonferenza con sommato un piccolo rumore bianco riportati nel grafico seguente.
Disposizione dei punti usati nell'esempio
//Read coordinates
std::list<Point> points;
Point::load("RC.txt", points);
std::cout << "Num. points read: " << points.size() <<"\n";
Point C = RotationCenter(points,deg2rad(5) );
std::cout << "Rotation center:\n";
print(C);
std::cout << "\n";
L'ouput dell'esempio sarà il seguente:
Num. points read: 12
Rotation center:
[ 77.140 ; 83.169 ]