You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.0 KiB
Matlab

function correctedData = testICP(anglex, angley, anglez)
% erstellung der testrotation, Winkelangabe in grad
Rz = [cos(anglez) -sin(anglez) 0;
sin(anglez) cos(anglez) 0;
0 0 1];
Ry = [ cos(angley) 0 sin(angley);
0 1 0;
-sin(angley) 0 cos(angley)];
Rx = [1 0 0;
0 cos(anglex) -sin(anglex);
0 sin(anglex) cos(anglex)];
R = Rz * Ry * Rx;
%% generate random model
model = rand(3, 10)*100
%% generate noise
noise = rand(3, 10)*5;
% rotate and translate model to use as data to be matched
%data = R * model + 200;
% rotate and translate model to use as data to be matched and add noise
data = R * model + 200 + noise;
%% center model cloud
cm = sum(model')' / size(model,2);
centerModel = model - repmat(cm, 1, size(model,2));
%% center data cloud
cd = sum(data')' / size(data,2);
centerData = data - repmat(cd, 1, size(data,2));
%% correlation matrix H
H = zeros(3,3);
for i=1:size(data,2)
for j=1:3
for k=1:3
H(j,k) = H(j,k) + centerModel(j,i)*centerData(k,i);
end
end
end
% H = zeros(3,3);
% for i=1:3
% for j=1:3
% H(i,j) = model(i,:) *data(j,:)';
% end
% end
%% rotation
% error in the paper: not H*H' but H'*H!
HH = H'*H;
[eVec, eVal] = eig(HH);
lamb1=eVal(1,1);
lamb2=eVal(2,2);
lamb3=eVal(3,3);
u1=eVec(:,1);
u2=eVec(:,2);
u3=eVec(:,3);
R=H*(1/sqrt(lamb1)*(u1*u1') + 1/sqrt(lamb2)*(u2*u2') + 1/sqrt(lamb3)*(u3*u3'))
%% translation
t=(cm - R*cd)
%% transform data to match the model
transformeddata = R*data + repmat(t, 1, size(data,2))
%%plot model and transformed data
plot3(transformeddata(1,:),transformeddata(2,:),transformeddata(3,:), 'r.', model(1,:),model(2,:),model(3,:),'go')
legend ('transformed data', 'model', 'Location','NorthEast')
end