123 lines
3.8 KiB
Matlab
123 lines
3.8 KiB
Matlab
clear all;
|
|
|
|
folder = 'calibration_data/new_indoor/';
|
|
files = dir(folder);
|
|
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));
|
|
all_data = [];
|
|
figure(1); 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);
|
|
if isempty(data)
|
|
continue
|
|
end
|
|
caliDist = table2array(data(:, 2))';
|
|
rawRTT = table2array(data(:, 3))';
|
|
rawRTTVar = table2array(data(:, 4))';
|
|
rawDist = table2array(data(:, 5))';
|
|
rawDistVar = table2array(data(:, 6))';
|
|
rssi = table2array(data(:, 7))';
|
|
time = 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);
|
|
|
|
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);
|
|
|
|
all_data = [...
|
|
all_data,...
|
|
[rawDist; targets(i) * ones(1, size(rawDist, 2))]...
|
|
];
|
|
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(2); 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.');
|
|
|
|
% 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, 'k.');
|
|
|
|
fprintf('Std Err:\n');
|
|
fprintf(' linear mode: %.6f\n', mstd_linear);
|
|
fprintf(' parabolic mode: %.6f\n', mstd_parabolic);
|
|
|