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