Forum
>>
Programmazione Python
>>
Files e Directory
>>
Calcolo rotazioni e traslazioni al fine di sovrapporre dei punti nello spazio
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da roro |
2015-10-31 13:26:22 - Calcolo rotazioni e traslazioni al fine di sovrapporre dei punti nello spazio
|
Salve ragazzi, non sono un esperta del linguaggio python (questa è la prima volta che ci metto mani) e devo fare un progetto che mi permette di sovrapporre dei punti nello spazio. In particolare ho due Dataset (file di tipo csv) e devo fare in modo che i punti del secondo dataset si sovrappongono con quelli del primo.
So che devo calcolare la matrice di rototraslazione e moltiplicarla per la configurazione di punti che voglio rototraslare. PS: non saprei nemmeno da dove iniziare. Come si importano i dataset? come posso effettuare delle operazioni su di essi? Il codice sul quale devo basarmi è il seguente: from numpy import * from math import sqrt # Input: expects Nx3 matrix of points # Returns R,t # R = 3x3 rotation matrix # t = 3x1 column vector def rigid_transform_3D(A, B): assert len(A) == len(B) N = A.shape0; # total points centroid_A = mean(A, axis=0) centroid_B = mean(B, axis=0) # centre the points AA = A - tile(centroid_A, (N, 1)) BB = B - tile(centroid_B, (N, 1)) # dot is matrix multiplication for array H = transpose(AA) * BB U, S, Vt = linalg.svd(H) R = Vt.T * U.T # special reflection case if linalg.det(R) < 0: print "Reflection detected" Vt[2,:] *= -1 R = Vt.T * U.T t = -R*centroid_A.T + centroid_B.T print t return R, t # Test with random data # Random rotation and translation R = mat(random.rand(3,3)) t = mat(random.rand(3,1)) # make R a proper rotation matrix, force orthonormal U, S, Vt = linalg.svd(R) R = U*Vt # remove reflection if linalg.det(R) < 0: Vt[2,:] *= -1 R = U*Vt # number of points n = 10 A = mat(random.rand(n,3)); B = R*A.T + tile(t, (1, n)) B = B.T; # recover the transformation ret_R, ret_t = rigid_transform_3D(A, B) A2 = (ret_R*A.T) + tile(ret_t, (1, n)) A2 = A2.T # Find the error err = A2 - B err = multiply(err, err) err = sum(err) rmse = sqrt(err/n); print "Points A" print A print "" print "Points B" print B print "" print "Rotation" print R print "" print "Translation" print t print "" print "RMSE:", rmse print "If RMSE is near zero, the function is correct!" Ma come faccio ad applicarlo al mio dataset?Grazie in anticipo --- Ultima modifica di roro in data 2015-11-01 11:30:43 --- |
Pagina: 1
Esegui il login per scrivere una risposta.