% batch16 - investigates error in hand-eye calibration % % See also: batch15 batch15; % load all values and perform hand-eye calibration % Output: gHc - calculated camera-to-gripper transform % bHg - measured gripper-to-base transform % wHc - camera-to-world transform obtained from camera calibration M = size(bHg,3); % number of calibration positions % Verify that the calibration is successfull % Take the average of all world-to-base transforms bHw = zeros(4,4,M); bHwsum = zeros(4,4); for i = 1:M, bHw(:,:,i) = bHg(:,:,i) * gHc * cHw(:,:,i); bHwsum = bHwsum + bHw(:,:,i); end; bHwmean = bHwsum / M; transError = zeros(M,1); axisError = zeros(M,1); angleError = zeros(M,1); for i = 1:M, transError(i) = norm( transl(bHw(:,:,i)) - transl(bHwmean)); % axisError (i) = end; % Eliminate calibration positions number 4,6,7 % .. because they have the highest error % .. relative to the mean eliminate = [4,6,7]; bHg1 = bHg; bHg1(:,:,eliminate) = []; wHc1 = wHc; wHc1(:,:,eliminate) = []; gHc1 = handEye(bHg1, wHc1); [dT, dAxisAngle, dRotAngle] = poseDiff(gHc, gHc1); disp(sprintf('Translational Error = %8.4f mm', norm(dT))); disp(sprintf('Misalignment Error = %8.4f degrees', dAxisAngle/pi*180) ); disp(sprintf('Rotation angle Error = %8.4f degrees', dRotAngle /pi*180) );