iw_intel8260_localization/calibration_plot.m

187 lines
6.8 KiB
Matlab

% clear all; %close all;
folder = 'calibration_data/new_indoor/';
files = dir(folder); files = files(3:end); % remove . and ..
targets = zeros(1, length(files));
for i = length(files):-1:1
if (~contains(files(i).name, 'result') ||...
contains(files(i).name, 'left') ||...
contains(files(i).name, 'right') ||...
contains(files(i).name, 'ap') ||...
contains(files(i).name, 'down') ||...
contains(files(i).name, 'up'))
files(i) = [];
targets(i) = [];
else
targets(i) = sscanf(files(i).name, 'result_%dcm.txt');
end
end
[targets, orderI] = sort(targets);
files = files(orderI);
median_result = zeros(1, length(files));
mean_result = zeros(1, length(files));
median_rssi = zeros(1, length(files));
median_diststd = zeros(1, length(files));
all_data = [];
figure(1); clf; hold on;
% figure(2); clf; hold on;
for i = 1:length(files)
filename = [folder, files(i).name];
fileID = fopen(filename, 'r');
formatSpec = [...
'Target: %x:%x:%x:%x:%x:%x, status: %d, ',...
'rtt: %d psec, distance: %d cm\n'...
];
data = fscanf(fileID, formatSpec, [9 Inf]);
fclose(fileID);
if isempty(data)
data = readtable(filename, 'ReadVariableNames', 0);
if isempty(data)
continue
end
data = data(2:end, :);
caliDist = str2double(table2array(data(:, 2)))';
rawRTT = str2double(table2array(data(:, 3)))';
rawRTTVar = str2double(table2array(data(:, 4)))';
rawDist = str2double(table2array(data(:, 5)))';
rawDistVar = str2double(table2array(data(:, 6)))';
rssi = str2double(table2array(data(:, 7)))';
time = str2double(table2array(data(:, 8)))';
else
% get rid of invalid data
data(:, data(7, :) ~= 0) = [];
data(:, data(9, :) < -1000) = [];
rawDist = data(9, :);
end
mean_result(i) = mean(rawDist);
median_result(i) = median(rawDist);
median_diststd(i) = median(sqrt(rawDistVar));
median_rssi(i) = median(rssi);
fprintf('distance: %d:\n', targets(i));
fprintf('* mean: %.2f (uncalibrated)\n', mean_result(i));
fprintf('* median: %.2f (uncalibrated)\n', median_result(i));
fprintf('* std: %.2f (uncalibrated)\n', std(rawDist));
figure(1); cdfplot(rawDist);
% figure(2);
% scatter3(...
% sqrt(rawDistVar),...
% rssi,...
% rawDist - targets(i));
all_data = [...
all_data,...
[rawDist;...
targets(i) * ones(1, size(rawDist, 2));...
sqrt(rawDistVar);...
rssi
]...
];
end
% % shuffle
% shuffled_data = all_data(:, randperm(size(all_data, 2)));
%
% % 10-fold cross validation
% step = floor(size(shuffled_data, 2) / 20);
% params = zeros(2, 20);
% mse = zeros(1, 20);
% for i = 1:20
% from = step * (i - 1) + 1;
% to = step * i;
% train_data = shuffled_data;
% test_data = train_data(:, from:to);
% train_data(:, from:to) = [];
% params(:, i) = polyfit(train_data(1, :), train_data(2, :), 1);
% test_est = params(1, i) * test_data(1, :) + params(2, i);
% mse(i) = sum((test_est - test_data(2, :)).^2) / size(test_data, 2);
% end
% param(1) = sum(params(1, :)) / size(mse, 2);
% % mse ./ sum(mse) * params(1, :)';
% param(2) = sum(params(2, :)) / size(mse, 2);
% % mse ./ sum(mse) * params(2, :)';
% validated_fit_data = param(1) * all_data(1, :) + param(2);
% mstd_1 = sqrt(sum((validated_fit_data - all_data(2, :)).^2) /...
% size(all_data, 2));
figure(3); clf; hold on;
scatter(all_data(1, :), all_data(2, :), 'b.');
plot(median_result, targets, 'r', 'LineWidth', 2)
% linear fit
param_linear = polyfit(all_data(1, :), all_data(2, :), 1);
data_linear = param_linear(1) * all_data(1, :) + param_linear(2);
mstd_linear = sqrt(...
sum((data_linear - all_data(2, :)).^2) / size(all_data, 2));
scatter(all_data(1, :), data_linear, 'c.');
diffs = data_linear - all_data(2, :); diffs_std = [];
figure(4); clf; hold on;
cdfplot(diffs)
% for i = 1:size(targets, 2)
% diffs_std(i) = std(diffs(all_data(2, :) == targets(i)));
% % pause;
% end
% scatter(median_rssi, diffs_std)
figure(3);
% parabolic fit
param_parabolic = polyfit(all_data(1, :), all_data(2, :), 2);
data_parabolic = ...
param_parabolic(1) * all_data(1, :).^2 +...
param_parabolic(2) * all_data(1, :) + ...
param_parabolic(3);
mstd_parabolic = sqrt(...
sum((data_parabolic - all_data(2, :)).^2) / size(all_data, 2));
scatter(all_data(1, :), data_parabolic, 'g.');
xlabel('Raw Distance');
ylabel('Target Distance');
legend('all data', 'median val', 'linear fit', 'parabolic fit', 'location', 'best')
fprintf('Std Err:\n');
fprintf(' linear mode: %.6f\n', mstd_linear);
fprintf(' parabolic mode: %.6f\n', mstd_parabolic);
%
% diffs = [];
% diffs = [diffs, calibration_walking('calibration_data/walking_outdoor/result_walking_3800_to_100cm_1517706485.txt')];
% diffs = [diffs, calibration_walking('calibration_data/walking_outdoor/result_walking_3800_to_100cm_1517706584.txt')];
% diffs = [diffs, calibration_walking('calibration_data/walking_outdoor/result_walking_3800_to_100cm_1517706685.txt')];
% diffs = [diffs, calibration_walking('calibration_data/walking_outdoor/result_walking_3800_to_100cm_1517706784.txt')];
% diffs = [diffs, calibration_walking('calibration_data/walking_outdoor/result_walking_3800_to_100cm_1517706881.txt')];
% diffs = [diffs, calibration_walking('calibration_data/walking_outdoor/result_walking_3800_to_100cm_1517706976.txt')];
% diffs = [diffs, calibration_walking('calibration_data/walking_outdoor/result_walking_3800_to_100cm_1517707172.txt')];
% pd = fitdist(diffs(~isnan(diffs))', 'Normal');
% prob_fit = cdf(pd, diffs(~isnan(diffs))');
% figure(10); clf; hold on;
% scatter(diffs(~isnan(diffs))', prob_fit);
% cdfplot(diffs); xlim([-200, 200])
% xlabel('Distance Err (cm)')
% title('Distribution of Distance Err When Walking')
% legend('fitted \mu=53.5043, \sigma=72.1852', 'actual dist error', 'location', 'best')
%
diffs = [];
diffs = [diffs, calibration_walking('calibration_data/walking_indoor/result_walking_3600_to_100cm_1517693155.txt')];
diffs = [diffs, calibration_walking('calibration_data/walking_indoor/result_walking_3600_to_100cm_1517693287.txt')];
diffs = [diffs, calibration_walking('calibration_data/walking_indoor/result_walking_3600_to_100cm_1517693408.txt')];
diffs = [diffs, calibration_walking('calibration_data/walking_indoor/result_walking_3600_to_100cm_1517693534.txt')];
pd = fitdist(diffs(~isnan(diffs))', 'Normal');
prob_fit = cdf(pd, diffs(~isnan(diffs))');
figure(11); clf; hold on;
scatter(diffs(~isnan(diffs))', prob_fit);
cdfplot(diffs); xlim([-200, 200])
xlabel('Distance Err (cm)')
title('Distribution of Distance Err When Walking')
legend('fitted \mu=28.8055, \sigma=50.1228', 'actual dist error', 'location', 'best')