lunedì 26 marzo 2018

Vettore normale su nuvola di punti

Il problema e' questo : data una nuvola di punti, generata da un sensore come Kinect, determinare i vettori normali delle superfici triangolari che hanno come vertici i punti della nuvola stessa.
Il sistema di coordinate ha l'asse Z orientato come la distanza dal sensore, X ed Y invece sono lungo la dimensione della matrice di acquisizione

Presi tre punti nello spazio (x1,y1,z1),(x2,y2,z2),(x3,y3,z3) non allineati (questa condizione visto che i dati vengono da uno strumento di misura reale diciamo che e' soddisfatta a priori) per calcolare l'equazione del piano si deve calcolare il determinante della seguente matrice con la condizione che sia uguale a zero

(x-x1,   y-y1, z-z1,
 x2-x1, y2-y1, z2-z1,
 x3-x2, y3-y2, z3-z2)

con la formula di Laplace per il determinante si ha che (x,y,z sono le variabili)

(x-x1)[(y2-y1)(z3-z1)-(y3-y1)(z2-z2)] - (y-y1)[(x2-x1)(z3-z1)-(x3-x1)(z2-z1)]+ (z-z1)[(x2-x1)(y3-y1)-(x3-x1)(y2-y1)]= 0

si ha cosi' un risultato nella forma

ax+by+cz = 0

una volta calcolato il piano si deve calcolare la normale (nx,ny,nz)si calcola la derivata parziale 

F = ax +by+cz

nx = dF/dx, ny = dF/dy, nz = dF/dz.

Visto che si tratta di un piano la derivata parziale e' banale e le componenti del vettore normale sono (a,b,c)

-----------------------------------------------------------
Un metodo alternativo (che non prevede di calcolare prima l'equazione di un piano) e' quella di calcolare il prodotto vettoriale tra i due del triangolo). Per esempio dati sempre i tre punti (x1,y1,z1),(x2,y2,z2),(x3,y3,z3) si prendono due vettori

v = (x2-x1, y2-y1, z2-z1)
w = (x3-x1, y3-y1, y3-y1)

il vettore normale e' dato dal determinante della matrice

(x,y,z
v1 ,v2 ,v3,
w1,w2,w2)

n = u X v = (v2w3-v3w2)x+(v3w1-v1w3)y+(v1w2-v2w1)z


Adesso c'e il problema e' di normali ce ne sono due essendo la superficie orientata (brutalmente una sotto ed una sopra al piano) oppure nel prodotto vettoriale dipende dall'ordine con cui si pongono i vettori (vXw e' diverso da wXv)

A questo punto si puo' procedere normalizzando il vettore.

nn1 = n1/sqrt(n1n1+n2n2+n3n3)
nn2 = n2/sqrt(n1n1+n2n2+n3n3)
nn3 = n3/sqrt(n1n1+n2n2+n3n3)

il passaggio da coordinate cartesiane a coordinate.




Se si guarda la libreria PCL la ricostruzione della normale ad una superficie viene effettuata mediante il calcolo delle componenti principali che permette anche di gestire anche che l'orientazione delle normali sia coerente 

Nessun commento:

Posta un commento

Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...