BIRDy/Benchmark/Robot_Identification_Results/postProcessing.m

2405 lines
114 KiB
Matlab

function [flag] = postProcessing(robot, benchmarkSettings, experimentDataStruct)
% Authors: Quentin Leboutet, Julien Roux, Alexandre Janot, Gordon Cheng
%%
% We start by loading the desired experiment data in proper data structures:
initL2Error = zeros(1, benchmarkSettings.numberOfInitialEstimates);
finalL2Error = zeros(benchmarkSettings.numberOfInitialEstimates, benchmarkSettings.numberOfExperimentsPerInitialPoint, benchmarkSettings.nbAlg);
finalTime = zeros(benchmarkSettings.numberOfInitialEstimates, benchmarkSettings.numberOfExperimentsPerInitialPoint, benchmarkSettings.nbAlg);
iterConv = ones(benchmarkSettings.numberOfInitialEstimates, benchmarkSettings.numberOfExperimentsPerInitialPoint, benchmarkSettings.nbAlg);
modelRecalcConv = ones(benchmarkSettings.numberOfInitialEstimates, benchmarkSettings.numberOfExperimentsPerInitialPoint, benchmarkSettings.nbAlg);
paramError = zeros(benchmarkSettings.numberOfInitialEstimates, benchmarkSettings.numberOfExperimentsPerInitialPoint, benchmarkSettings.nbAlg, robot.paramVectorSize);
paramValue = zeros(benchmarkSettings.numberOfInitialEstimates, benchmarkSettings.numberOfExperimentsPerInitialPoint, benchmarkSettings.nbAlg, robot.paramVectorSize);
paramInitValue = zeros(benchmarkSettings.numberOfInitialEstimates, benchmarkSettings.numberOfExperimentsPerInitialPoint, robot.paramVectorSize);
decimRate = zeros(benchmarkSettings.nbAlg, 1);
averageTime = zeros(1, benchmarkSettings.nbAlg);
stdTime = zeros(1, benchmarkSettings.nbAlg);
averageIter = zeros(1, benchmarkSettings.nbAlg);
stdIter = zeros(1, benchmarkSettings.nbAlg);
averageError = zeros(1, benchmarkSettings.nbAlg);
convergence = zeros(benchmarkSettings.numberOfInitialEstimates, benchmarkSettings.numberOfExperimentsPerInitialPoint, benchmarkSettings.nbAlg);
averageParamError = zeros(robot.paramVectorSize, benchmarkSettings.nbAlg);
stdParamError = zeros(robot.paramVectorSize, benchmarkSettings.nbAlg);
stdError = zeros(1, benchmarkSettings.nbAlg);
resFlag = false;
for index=1:benchmarkSettings.nbAlg
% Loading data:
if benchmarkSettings.identificationMethods.showResults(index)==1 % If the method is selected
resFlag = true;
resultFile = sprintf('%s_%s/decim_%d/results_%s_%s.mat', robot.name, benchmarkSettings.noiseLevel, benchmarkSettings.decimRate, benchmarkSettings.identificationMethods.algName{index}, robot.name)
resultVariable = sprintf('results_%s',benchmarkSettings.identificationMethods.algName{index});
if exist(fullfile(resultFile),'file') == 2
resultDataStruct{index} = load(resultFile);
Beta_obj = eval(sprintf('resultDataStruct{index}.%s.benchmarkSettings.Beta_obj',resultVariable));
for i=1:benchmarkSettings.numberOfInitialEstimates
initL2Error(i) = norm(eval(sprintf('resultDataStruct{index}.%s.benchmarkSettings.Initial_Beta(:, i)',resultVariable))-Beta_obj);
for j=1:benchmarkSettings.numberOfExperimentsPerInitialPoint
theta = reshape(eval(sprintf('resultDataStruct{index}.%s.Betas(i, j, :)',resultVariable)), robot.paramVectorSize, 1);
finalTime(i, j, index) = eval(sprintf('resultDataStruct{index}.%s.times(i, j)',resultVariable));
error = norm(Beta_obj-theta);
if (error>50*norm(Beta_obj-benchmarkSettings.Initial_Beta(:,i))) && ~strcmp(benchmarkSettings.identificationMethods.algName{index}, 'LS') % If final error is greater than the initial error
convergence(i,j,index) = 0;
finalL2Error(i, j, index) = 0;
paramError(i, j, index, :) = 0*(Beta_obj-theta);
paramValue(i, j, index, :) = theta;
else
convergence(i,j,index) = 1;
finalL2Error(i, j, index) = error;
paramError(i, j, index, :) = Beta_obj-theta;
paramValue(i, j, index, :) = theta;
end
paramInitValue(i, j, :) = eval(sprintf('resultDataStruct{index}.%s.benchmarkSettings.Initial_Beta(:, i)',resultVariable));
decimRate(index) = eval(sprintf('resultDataStruct{index}.%s.benchmarkSettings.decimRate',resultVariable));
if strcmp(benchmarkSettings.identificationMethods.algName{index}, 'DIDIM') || strcmp(benchmarkSettings.identificationMethods.algName{index}, 'IV')
iterConv(i, j, index) = eval(sprintf('resultDataStruct{index}.%s.iteration(i, j)',resultVariable));
modelRecalcConv(i, j, index) = eval(sprintf('resultDataStruct{index}.%s.iteration(i, j)',resultVariable));
end
if strcmp(benchmarkSettings.identificationMethods.algName{index}, 'PC_DIDIM') || strcmp(benchmarkSettings.identificationMethods.algName{index}, 'PC_IV')
iterConv(i, j, index) = eval(sprintf('resultDataStruct{index}.%s.iteration(i, j)',resultVariable));
modelRecalcConv(i, j, index) = eval(sprintf('resultDataStruct{index}.%s.iteration(i, j)',resultVariable));
end
if strcmp(benchmarkSettings.identificationMethods.algName{index}, 'CLOE') || strcmp(benchmarkSettings.identificationMethods.algName{index}, 'CLIE')
modelRecalcConv(i, j, index) = eval(sprintf('resultDataStruct{index}.%s.iteration(i, j).funcCount',resultVariable));
iterConv(i, j, index) = eval(sprintf('resultDataStruct{index}.%s.iteration(i, j).iterations',resultVariable));
end
end
for k=1:robot.paramVectorSize
stdParamError(k,index) = stdParamError(k,index)+std(paramError(i, find(convergence(i,:,index)), index,k));
end
end
% if strcmp(benchmarkSettings.identificationMethods.algName{index}, 'EKF') || strcmp(benchmarkSettings.identificationMethods.algName{index}, 'UKF') || strcmp(benchmarkSettings.identificationMethods.algName{index}, 'SRUKF')|| strcmp(benchmarkSettings.identificationMethods.algName{index}, 'CDKF') || strcmp(benchmarkSettings.identificationMethods.algName{index}, 'SRCDKF')
% paramEvolution(:,:,:,index) = eval(sprintf('resultDataStruct{index}.%s.Betas_iteration',resultVariable));
% end
convIndex = find(convergence(:,:,index)); % index of the points which converged.
fE = reshape(finalL2Error(:,:, index), benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint,1);
fT(:,index) = reshape(finalTime(:,:, index), benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint,1);
fI(:,index) = reshape(iterConv(:,:, index), benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint,1);
fR(:,index) = reshape(modelRecalcConv(:,:, index), benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint,1);
for i = 1:robot.paramVectorSize
fEP(:,i, index) = reshape(paramError(:,:, index,i), benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint,1);
fP(:,i, index) = reshape(paramValue(:,:, index,i), benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint,1);
end
averageIter(index) = mean(fI(convIndex));
averageTime(index) = mean(fT(convIndex, index));
averageError(index) = mean(fE(convIndex));
stdError(index) = std(reshape(fE(convIndex), numel(fE(convIndex)), 1));
stdTime(index) = std(reshape(finalTime(:, :, index), numel(finalTime(:, :, index)), 1));
stdIter(index) = std(reshape(iterConv(:, :, index), numel(iterConv(:, :, index)), 1));
averageParamError(:,index) = mean(fEP(convIndex,:, index),1);
averageParam(:,index) = mean(fP(convIndex,:, index),1);
% errorFunction(robot, benchmarkSettings, experimentDataStruct, averageParam(:,index), index, i)
for i = 1:robot.paramVectorSize
ss = reshape(eval(sprintf('resultDataStruct{index}.%s.Betas(1:benchmarkSettings.numberOfInitialEstimates, 1:benchmarkSettings.numberOfExperimentsPerInitialPoint, i)',resultVariable)),benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint,1);
stdParamError(i,index) = std(ss(convIndex));
end
% if strcmp(benchmarkSettings.identificationMethods.algName{index}, 'EKF') || strcmp(benchmarkSettings.identificationMethods.algName{index}, 'UKF') || strcmp(benchmarkSettings.identificationMethods.algName{index}, 'SRUKF')|| strcmp(benchmarkSettings.identificationMethods.algName{index}, 'CDKF') || strcmp(benchmarkSettings.identificationMethods.algName{index}, 'SRCDKF')
% getCovarianceVideo(eval(sprintf('resultDataStruct{index}.%s.Covariance_iteration',resultVariable)), benchmarkSettings.identificationMethods.algName{index}, 100, false)
% end
else
resultDataStruct{index} = 0;
end
end
end
%% Run result analysis tools:
if resFlag == true
methods = categorical(benchmarkSettings.identificationMethods.algName);
methods = reordercats(methods,benchmarkSettings.identificationMethods.algName);
% generation of a tabular with average and std parameter errors for latex
% generateLaTeXparamTab(robot, benchmarkSettings, resultDataStruct, averageParamError, stdParamError)
% generateLaTeXparamTabPercent(robot, benchmarkSettings, resultDataStruct, averageParamError, stdParamError)
% generateLaTeXparamTabPercent2(robot, benchmarkSettings, resultDataStruct, averageParamError, stdParamError)
% % % % % generateLaTeXFOMTab(robot, benchmarkSettings, experimentDataStruct, fP, fEP, fT, fI, fR, averageParam, stdParamError, averageTime, averageIter)
%generateLaTeXFOMTabTot(robot, benchmarkSettings, experimentDataStruct, fP, fEP, fT, fI, fR, averageParam, stdParamError, averageTime, averageIter)
% generateReport(robot, benchmarkSettings, experimentDataStruct, fP, fEP, fT, fI, fR, averageParam, averageParamError, stdParamError, averageTime, averageIter);
% plotRecalculatedClosedLoopDDM(robot, benchmarkSettings, resultDataStruct, experimentDataStruct);
% plotRawResults(benchmarkSettings, fEP, fT);
% plotRawResultsHistogram(benchmarkSettings, fEP, fT);
% plotRawResultsParamwise(robot, benchmarkSettings, fEP, fT)
% plot3DMeanResults(robot, benchmarkSettings, averageParamError);
% plotSummary(benchmarkSettings, averageTime, averageIter, averageError, stdError, methods);
% plotConvergenceStatus(robot, benchmarkSettings, convergence, decimRate);
% plotParamwiseHoriz(robot, benchmarkSettings, averageParamError, stdParamError);
% plotParamwiseVert(robot, benchmarkSettings, averageParamError, stdParamError);
% plotRecalculatedTorquesFull(robot, benchmarkSettings, experimentDataStruct, averageParam, false);
% % % % % % % % plotParamwiseVertNew(robot, benchmarkSettings, averageParamError, stdParamError, decimRate);
%
% for i=1:robot.nbDOF
% plotRecalculatedTorques(robot, benchmarkSettings, Q, Qp, Qpp, Tau, t, averageParam, i);
% end
%
% plotErrorHistogram(robot, benchmarkSettings, experimentDataStruct, decimRate, averageParam, stdParamError);
%
% checkStatHypotheses(robot, benchmarkSettings, experimentDataStruct, decimRate, averageParam, stdParamError);
plotParamwiseMatrix(robot, benchmarkSettings, averageParamError, stdParamError, decimRate);
%
% %% Parameter Convergence Kalman
% cc=parula(robot.paramVectorSize);
% index = find(benchmarkSettings.identificationMethods.showResults);
% counter = 0;
% indexK = [];
% for i=1:sum(benchmarkSettings.identificationMethods.showResults)
% if strcmp(benchmarkSettings.identificationMethods.algName{index(i)}, 'EKF') || strcmp(benchmarkSettings.identificationMethods.algName{index(i)}, 'UKF') || strcmp(benchmarkSettings.identificationMethods.algName{index(i)}, 'SRUKF')|| strcmp(benchmarkSettings.identificationMethods.algName{index(i)}, 'CDKF') || strcmp(benchmarkSettings.identificationMethods.algName{index(i)}, 'SRCDKF')
% counter = counter+1;
% indexK(counter) = index(i);
% end
% if counter == 1
% figure('Name','Parameter Convergence')
% end
% for i=1:counter
% subplot(counter,1,i)
% for j=1:robot.paramVectorSize
% plot(paramEvolution(j,:,1200,indexK(i))','LineWidth',2 ,'color',cc(j,:))
% hold on
% plot(repmat(benchmarkSettings.Beta_obj(j),1,size(paramEvolution,2))','--','LineWidth',2,'color',cc(j,:))
% end
% title(sprintf('\\textbf{Convergence} \\boldmath{$%s$}', benchmarkSettings.identificationMethods.algName{indexK(i)}), 'Interpreter', 'LaTeX')
% end
% end
%
end
end
%%%%%%%%%%%%%%%%%%%%%%%
%% generateReport:
%%%%%%%%%%%%%%%%%%%%%%%
% mkdir(sprintf('%s/%s_%s/decim%d/paramError',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i))))
function []=generateReport(robot, benchmarkSettings, experimentDataStruct, fP, fEP, fT, fI, fR, averageParam, averageParamError, stdParamError, averageTime, averageIter)
if strcmp(robot.name, 'TX40_uncoupled')
name = 'TX40';
else
name = robot.name;
end
% Import the DOM and Report API packages so you do not have to use long class names.
import mlreportgen.report.*;
import mlreportgen.dom.*;
imgStyle = {ScaleToFit(true)};
% Create a container to hold the report content.
% To create a Word report, change the output type from "pdf" to "docx".
% rpt = mlreportgen.report.Report("PortraitAndLandscapeReport", "pdf");
rpt = Report(sprintf('%s_%s_decim_%d',robot.name, benchmarkSettings.noiseLevel, benchmarkSettings.decimRate),"pdf");
open(rpt);
% Specify the page orientation, height, and width.
pageLayoutObj.PageSize.Orientation = "portrait";
pageLayoutObj.PageSize.Height = "297mm";
pageLayoutObj.PageSize.Width = "210mm";
% Specify the page margins.
pageLayoutObj.PageMargins.Top = "0cm";
pageLayoutObj.PageMargins.Bottom = "0cm";
pageLayoutObj.PageMargins.Left = "0cm";
pageLayoutObj.PageMargins.Right = "0cm";
pageLayoutObj.PageMargins.Header = "0cm";
pageLayoutObj.PageMargins.Footer = "0cm";
% Add the page layout object to the report.
add(rpt,pageLayoutObj);
% Genrate a table in LaTeX format, containing Figures of Merit (FOM) for
% the set of considered identification methods
N_fom = 5;
options.filter = 'butterworth';
Tau_decim = [];
Qpp_decim = [];
Qp_decim = [];
Q_decim = [];
for expNb = 1:1%benchmarkSettings.numberOfExperimentsPerInitialPoint % Concatenating the experiment data
% [~, ~, ~, ~, ~, ~, Tau_decim_exp, Qpp_decim_exp, Qp_decim_exp, Q_decim_exp, ~] = getFilteredData(robot, benchmarkSettings, experimentDataStruct, options, expNb,[]);
[~, Tau_decim_exp, Qpp_decim_exp, Qp_decim_exp, Q_decim_exp, ~, ~,~,~,~,~] = getFilteredData(robot, benchmarkSettings, experimentDataStruct, options, expNb,[]);
Tau_decim = [Tau_decim Tau_decim_exp];
Qpp_decim = [Qpp_decim Qpp_decim_exp];
Qp_decim = [Qp_decim Qp_decim_exp];
Q_decim = [Q_decim Q_decim_exp];
end
% Generation of the tabularcontatinning the average error and standard deviation of the error.
index = find(benchmarkSettings.identificationMethods.showResults);
% file = fopen(sprintf('%s/%s_%s/decim%d/LaTeX/FOMtab.tex',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, benchmarkSettings.decimRate(index(1))), 'w');
%
% fprintf(file, "\\cellcolor{green!45}\\textbf{%s, MCS, decim %d} & \\cellcolor{gray!25}$E(d_{\\boldsymbol{q}}), \\sigma_{\\boldsymbol{q}}$ & \\cellcolor{gray!25}$E(d_{\\boldsymbol{\\tau}}), \\sigma_{\\boldsymbol{\\tau}}$& \\cellcolor{gray!25}$E(d_{t}), \\sigma_{t}$ &\\cellcolor{gray!25} $E(d_{N_{it}}), \\sigma_{N_{it}}$ & \\cellcolor{gray!25}$E(d_{N_{sim}}), \\sigma_{N_{sim}}$ \\\\ \n",name ,benchmarkSettings.decimRate(index(1)));
% fprintf(file, "\\midrule\n");
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
nameAlgo = getNameId(benchmarkSettings,index,i)
% Compute relative torque error:
[~,nbSamples]=size(Tau_decim);
W = observationMatrixOrdered(robot.name, robot.paramVectorSize, robot.numericalParameters.Geometry, robot.numericalParameters.Gravity, Q_decim, Qp_decim, Qpp_decim);
% Y_tau_ref = W*benchmarkSettings.Beta_obj; % Recomputed torque with real parameter values
Y_tau_ref = torqueVectorOrdered(Tau_decim);
Y_tau_recomputed = W*averageParam(:,index(i));
Y_error_tau = Y_tau_ref - Y_tau_recomputed; % Recomputed torque with mean value of the estimated parameters
Y_error_tau_joint=zeros(nbSamples,robot.nbDOF);
Y_tau_joint=zeros(nbSamples,robot.nbDOF);
Y_tau_recomputed_joint=zeros(nbSamples,robot.nbDOF);
for jointNb = 1:robot.nbDOF
Y_error_tau_joint(:,jointNb) = Y_error_tau((jointNb-1)*nbSamples+1:jointNb*nbSamples);
Y_tau_joint(:,jointNb) = Y_tau_ref((jointNb-1)*nbSamples+1:jointNb*nbSamples);
Y_tau_recomputed_joint(:,jointNb) = Y_tau_recomputed((jointNb-1)*nbSamples+1:jointNb*nbSamples);
end
Y_error_tau_med = sqrt(sum(Y_error_tau_joint.^2,2));
Y_tau_med = sqrt(sum(Y_tau_joint.^2,2));
d_tau(i,1) = 100*mean(Y_error_tau_med./Y_tau_med);
sigma_d_tau(i,1) = 100*std(Y_error_tau_med./Y_tau_med);
% Compute relative joint position error:
t_control = linspace(benchmarkSettings.t_i, benchmarkSettings.t_f, benchmarkSettings.nbCtrlSamples); % Control epochs
augmentedDesiredState = benchmarkSettings.trajectoryData.getTrajectoryData(t_control, benchmarkSettings.interpolationAlgorithm); % augmentedState = [Qpp; Qp; Q];
[~, stateVector, ~] = integrateClosedLoopDynamics_mex(augmentedDesiredState, averageParam(:,index(i)), robot.name, robot.numericalParameters.Geometry, ...
robot.numericalParameters.Gravity, benchmarkSettings.t_i, benchmarkSettings.t_f, benchmarkSettings.nbCtrlSamples, benchmarkSettings.nbSamples, ...
robot.controlParameters.Kp, robot.controlParameters.Ki, robot.controlParameters.Kd, robot.controlParameters.Ktau, robot.controlParameters.antiWindup, ...
robot.physicalConstraints.limQ_L, robot.physicalConstraints.limQ_U, robot.physicalConstraints.limQp_L, robot.physicalConstraints.limQp_U, ...
robot.physicalConstraints.limQpp_L, robot.physicalConstraints.limQpp_U, robot.physicalConstraints.limTau_L, robot.physicalConstraints.limTau_U, benchmarkSettings.integrationAlgorithm);
Q_sim = stateVector(robot.nbDOF+1:2*robot.nbDOF,benchmarkSettings.samplingBorder+1:end-benchmarkSettings.samplingBorder);
Qp_sim = stateVector(1:robot.nbDOF,benchmarkSettings.samplingBorder+1:end-benchmarkSettings.samplingBorder);
t_sample = linspace(benchmarkSettings.t_i, benchmarkSettings.t_f, benchmarkSettings.nbSamples); % Control epochs
stateVectorDesired = benchmarkSettings.trajectoryData.getTrajectoryData(t_sample, benchmarkSettings.interpolationAlgorithm); % augmentedState = [Qpp; Qp; Q];
Q_sim_decim = [];
Qp_sim_decim = [];
Qd_decim = [];
Qpd_decim = [];
for jointNb = 1:robot.nbDOF
Q_sim_decim(jointNb,:) = decimate(Q_sim(jointNb,:),benchmarkSettings.decimRate/benchmarkSettings.decimRate);
Qp_sim_decim(jointNb,:) = decimate(Qp_sim(jointNb,:),benchmarkSettings.decimRate/benchmarkSettings.decimRate);
Qd_decim(jointNb,:) = decimate(stateVectorDesired(2*robot.nbDOF + jointNb,benchmarkSettings.samplingBorder+1:end-benchmarkSettings.samplingBorder),benchmarkSettings.decimRate/benchmarkSettings.decimRate);
Qpd_decim(jointNb,:) = decimate(stateVectorDesired(robot.nbDOF + jointNb,benchmarkSettings.samplingBorder+1:end-benchmarkSettings.samplingBorder),benchmarkSettings.decimRate/benchmarkSettings.decimRate);
end
Y_error_Q = torqueVectorOrdered(Q_decim-Q_sim_decim);
Y_Q_ref = torqueVectorOrdered(Q_decim);
for jointNb = 1:robot.nbDOF
Y_error_Q_joint(:,jointNb) = Y_error_Q((jointNb-1)*nbSamples+1:jointNb*nbSamples);
Y_Q_joint(:,jointNb) = Y_Q_ref((jointNb-1)*nbSamples+1:jointNb*nbSamples);
end
Y_error_Q_med = sqrt(sum(Y_error_Q_joint.^2,2));
Y_Q_med = sqrt(sum(Y_Q_joint.^2,2));
d_q(i,1) = 100*mean(Y_error_Q_med./Y_Q_med);
sigma_d_q(i,1) = 100*std(Y_error_Q_med./Y_Q_med);
% Compute average parameter error:
paramRef = repmat(benchmarkSettings.Beta_obj.',benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint,1);
relativeAverageParamErrorsMC = (2/robot.paramVectorSize)*sum(abs(fEP(:,:,index(i)))./(abs(paramRef)+abs(fP(:,:,index(i)))),2); % series of d_\beta for each MC experiment
d_beta(i,1) = 100*mean(relativeAverageParamErrorsMC);
sigma_d_beta(i,1) = 100*std(relativeAverageParamErrorsMC);
% Get the mean time required to compute one parameter estimate:
d_t(i,1) = mean(fT(:,index(i)));
sigma_d_t(i,1) = 100*std(fT(:,index(i)))/mean(fT(:,index(i)));
% If applicable, get the number of iterations required to compute one
% parameter estimate:
d_i(i,1) = mean(fI(:,index(i)));
sigma_d_i(i,1) = 100*std(fI(:,index(i)))/mean(fI(:,index(i)));
% If applicable, get the number of model recalculations required to compute one
% parameter estimate:
d_r(i,1) = mean(fR(:,index(i)));
if mean(fR(:,index(i)))~=0
sigma_d_r(i,1) = 100*std(fR(:,index(i)))/mean(fR(:,index(i)));
else
sigma_d_r(i,1) = -1;
end
% mean_fom(1,i) = d_beta(i);
mean_fom(1,i) = d_q(i);
mean_fom(2,i) = d_tau(i);
mean_fom(3,i) = d_t(i);
mean_fom(4,i) = d_i(i);
mean_fom(5,i) = d_r(i);
% unit{1} = '\%';
unit{1} = '\%';
unit{2} = '\%';
unit{3} = 's';
unit{4} = '';
unit{5} = '';
% sigma_fom(1,i) = sigma_d_beta(i);
sigma_fom(1,i) = sigma_d_q(i);
sigma_fom(2,i) = sigma_d_tau(i);
sigma_fom(3,i) = sigma_d_t(i);
sigma_fom(4,i) = sigma_d_i(i);
sigma_fom(5,i) = sigma_d_r(i);
Algorithm{i,1} = getNameId(benchmarkSettings,index,i);
% fprintf(file, "\\textbf{%s}", nameAlg);
%
% for j = 1:N_fom
% if j == N_fom
% if ~strcmp(nameAlg,'CLIE') && ~strcmp(nameAlg,'CLOE') ~= ~strcmp(nameAlg,'DIDIM') ~= ~strcmp(nameAlg,'IDIM-IV') ~= ~strcmp(nameAlg,'PC-IDIM-IV') ~= ~strcmp(nameAlg,'PC-DIDIM')
% fprintf(file, " & N.A.");
% else
% fprintf(file, " & %5.2f%s (%1.2f\\%%)", mean_fom(j,i), unit{j}, sigma_fom(j,i));
% end
% elseif j == 1
% fprintf(file, " & %5.3f%s (%1.2f\\%%)", mean_fom(j,i), unit{j}, sigma_fom(j,i));
% else
% fprintf(file, " & %5.2f%s (%1.2f\\%%)", mean_fom(j,i), unit{j}, sigma_fom(j,i));
% end
%
% end
% fprintf(file, "\\\\ \n");
end
% % mltable = table(sigma_d_q,sigma_d_tau,sigma_d_t, sigma_d_i, sigma_d_r);
% mltable = table(Algorithm, d_q, d_tau, d_t, d_i, d_r);
%
% mltableObj = MATLABTable(mltable);
% tbodyObj = mltableObj.Body;
% tbodyObj.TableEntriesStyle = {Color('blue')};
% tbODYObj.TableEntriesHAlign = 'center';
%
% add(chapter,mltableObj)
% fclose(file);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
options.filter = 'butterworth';
set(0, 'DefaultFigureRenderer', 'painters');
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
chapter = Chapter("Title", sprintf('%s, %s, %s, decimation rate %d',name, benchmarkSettings.identificationMethods.algName{index(i)}, benchmarkSettings.noiseLevel, benchmarkSettings.decimRate));
section = Section("Title", "Parameter Errors");
barh(1:robot.paramVectorSize, averageParamError(:,index(i)), 'FaceColor', [0 .39 .74], 'EdgeColor', [0 .59 .94], 'FaceAlpha',0.75);
hold on
errorbar(averageParamError(:,index(i)),1:robot.paramVectorSize, stdParamError(:,index(i)),'horizontal','r.','LineWidth',0.5)
hold off
grid on
grid minor
ylabel('Index');
xlabel('Parameter Error');
xlim([-0.5 0.5])
x=0.5;
nameAlgo = getNameId(benchmarkSettings,index,i);
text(0.4*(-ones(1,robot.paramVectorSize)).^(0:robot.paramVectorSize-1), linspace(1-x,robot.paramVectorSize-x,robot.paramVectorSize),strcat('err(',strcat(num2str(linspace(1,robot.paramVectorSize,robot.paramVectorSize).','%d\n'),strcat(')=',strcat(strcat(num2str(averageParamError(:,index(i)),'%5.3f\n'),'±'),num2str(stdParamError(:,index(i)),'%5.3f\n'))))),'vert','bottom','horiz','center','Rotation',0,'FontSize', 8);
title(sprintf('Parameter Identification %s %s', name, nameAlgo))
legend({'mean', 'std'},'Location','southoutside','Orientation','horizontal')
set(gcf,'OuterPosition',[0 0 960 540]);
pbaspect([2 1 1])
figMeanErrorVar=Figure();
figMeanErrorVarImg = Image(getSnapshotImage(figMeanErrorVar, rpt));
figMeanErrorVarImg.Style = imgStyle;
% Add the table to the chapter
add(section,figMeanErrorVarImg)
add(chapter, section)
Tau_ndecim = [];
Qpp_ndecim = [];
Qp_ndecim = [];
Q_ndecim = [];
for expNb = 1:1%benchmarkSettings.numberOfExperimentsPerInitialPoint % Concatenating the experiment data
[t_ndecim, Tau_ndecim_exp, Qpp_ndecim_exp, Qp_ndecim_exp, Q_ndecim_exp, ~, ~, ~, ~, ~, ~] = getFilteredData(robot, benchmarkSettings, experimentDataStruct, options, expNb,[]);
Tau_ndecim = [Tau_ndecim Tau_ndecim_exp];
Qpp_ndecim = [Qpp_ndecim Qpp_ndecim_exp];
Qp_ndecim = [Qp_ndecim Qp_ndecim_exp];
Q_ndecim = [Q_ndecim Q_ndecim_exp];
end
% Compute the observation matrix:
W = observationMatrix(robot.name, robot.paramVectorSize, robot.numericalParameters.Geometry, robot.numericalParameters.Gravity, Q_ndecim, Qp_ndecim, Qpp_ndecim);
% num = [ 1, 0.0781, 0.2344;... % Crimson Red
% 0, 0.9000, 0.1;... % Real Green
% 0.1172, 0.5625, 1.0000;... % Deep Sky Blue
% 1.0000, 0, 1.0000;... % Magenta
% 0, 1.0000, 1.0000;... % Cyan
% 0.8000, 0.2695, 0;... % Orange
% 0, 1.0000, 0.25000;... % Light Green
% 0, 0, 0.5000;... % Navy Blue
% 0.5000, 0, 0.5000;... % Purple
% 0.5391, 0.1680, 0.8828;... % BlueViolet
% 0, 0, 1.0000;... % Blue
% 0.5000, 0.5000, 0.5000]; % Gray
%
% set(groot,'defaultAxesColorOrder',num)
section = Section("Title", "Recomputed torques");
for jointNb = 1:robot.nbDOF
referenceTau = W*benchmarkSettings.Beta_obj;
graph = plot(t_ndecim, Tau_ndecim(jointNb,:),'Color',[0, 0, 0.5000],'LineWidth',1);
graph.Color(4)=0.1;
hold on
plot(t_ndecim,referenceTau(jointNb:robot.nbDOF:end),'Color',[0, 0.9000, 0.1], 'LineWidth',2);
hold on
recomputedTau = W*averageParam(:,index(i));
plot(t_ndecim, recomputedTau(jointNb:robot.nbDOF:end),'Color',[1, 0.0781, 0.2344],'LineWidth',1);
hold off
xlabel('Time [s]');
ylabel(sprintf('Torque [N.m]'));
title(sprintf('Recomputed torque %s %s, joint %d',name, nameAlgo, jointNb))
grid on
grid minor
if benchmarkSettings.experimentOnTrueRobot == true
legend({'Real','CAD Parameters',sprintf('%s',nameAlgo)},'Location','southoutside','Orientation','horizontal')
else
legend({'Real','Reference',sprintf('%s',nameAlgo)},'Location','southoutside','Orientation','horizontal')
end
set(gcf,'OuterPosition',[0 0 960 540]);
figTorqueError=Figure();
figTorqueErrorImg = Image(getSnapshotImage(figTorqueError, rpt));
figTorqueErrorImg.Style = imgStyle;
% Add the figure to the chapter
add(section,figTorqueErrorImg)
end
add(chapter,section)
% section = Section("Title", "Recomputed velocities");
% for jointNb = 1:robot.nbDOF
% plot(t_decim, Qpd_decim(jointNb,:),'--','Color',[0.1172, 0.5625, 1.0000],'LineWidth',2);
% hold on
% plot(t_decim, Qp_decim(jointNb,:),'Color',[0, 0, 0.5000],'LineWidth',1.5);
% hold on
% plot(t_decim,Qp_sim_decim(jointNb,:),'Color',[0, 0.9000, 0.1], 'LineWidth',1);
% hold on
% plot(t_decim,100*(Qp_decim(jointNb,:)-Qp_sim_decim(jointNb,:)),'Color',[1, 0.0781, 0.2344], 'LineWidth',1);
% hold off
% xlabel('Time [s]');
% ylabel(sprintf('Joint velocity [rad/s]'));
% title(sprintf('Joint velocity %s joint %d in closed loop with the %s estimates',name, jointNb, nameAlgo))
% grid on
% grid minor
% legend({'Desired','Real',sprintf('Recomputed %s',nameAlgo), 'Error: 100 x (Real - Recomputed)'},'Location','southoutside','Orientation','horizontal')
% set(gcf,'OuterPosition',[0 0 960 540]);
%
% figQpError=Figure();
% figQpErrorImg = Image(getSnapshotImage(figQpError, rpt));
% figQpErrorImg.Style = imgStyle;
% % Add the figure to the chapter
% add(section,figQpErrorImg)
% end
% add(chapter,section)
% section = Section("Title", "Recomputed positions");
% for jointNb = 1:robot.nbDOF
% plot(t_decim, Qd_decim(jointNb,:),'--','Color',[0.1172, 0.5625, 1.0000],'LineWidth',2);
% hold on
% plot(t_decim, Q_decim(jointNb,:),'Color',[0, 0, 0.5000],'LineWidth',1.5);
% hold on
% plot(t_decim,Q_sim_decim(jointNb,:),'Color',[0, 0.9000, 0.1], 'LineWidth',1);
% hold on
% plot(t_decim,100*(Q_decim(jointNb,:)-Q_sim_decim(jointNb,:)),'Color',[1, 0.0781, 0.2344], 'LineWidth',1);
% hold off
% xlabel('Time [s]');
% ylabel(sprintf('Joint position [rad]'));
% title(sprintf('Joint position %s joint %d in closed loop with the %s estimates',name, jointNb, nameAlgo))
% grid on
% grid minor
% legend({'Desired','Real',sprintf('Recomputed %s',nameAlgo), 'Error: 100 x (Real - Recomputed)'},'Location','southoutside','Orientation','horizontal')
% set(gcf,'OuterPosition',[0 0 960 540]);
%
% figQpError=Figure();
% figQpErrorImg = Image(getSnapshotImage(figQpError, rpt));
% figQpErrorImg.Style = imgStyle;
% % Add the figure to the chapter
% add(section,figQpErrorImg)
% end
% add(chapter,section)
% Add the chapter to the report
add(rpt, chapter);
delete(gcf);
end
% Generate and display the report
close(rpt);
rptview(rpt);
end
%%%%%%%%%%%%%%%%%%%%%%%
%% generateLaTeXFOMTab:
%%%%%%%%%%%%%%%%%%%%%%%
function []=generateLaTeXFOMTab(robot, benchmarkSettings, experimentDataStruct, fP, fEP, fT, fI, fR, averageParam, stdParamError, averageTime, averageIter)
% Genrate a table in LaTeX format, containing Figures of Merit (FOM) for
% the set of considered identification methods
N_fom = 5;
options.filter = 'butterworth';
Tau_decim = [];
Qpp_decim = [];
Qp_decim = [];
Q_decim = [];
for expNb = 1:1%benchmarkSettings.numberOfExperimentsPerInitialPoint % Concatenating the experiment data
% [~, ~, ~, ~, ~, ~, Tau_decim_exp, Qpp_decim_exp, Qp_decim_exp, Q_decim_exp, ~] = getFilteredData(robot, benchmarkSettings, experimentDataStruct, options, expNb,[]);
[~, Tau_decim_exp, Qpp_decim_exp, Qp_decim_exp, Q_decim_exp, ~, ~,~,~,~,~] = getFilteredData(robot, benchmarkSettings, experimentDataStruct, options, expNb,[]);
Tau_decim = [Tau_decim Tau_decim_exp];
Qpp_decim = [Qpp_decim Qpp_decim_exp];
Qp_decim = [Qp_decim Qp_decim_exp];
Q_decim = [Q_decim Q_decim_exp];
end
% Generation of the tabularcontatinning the average error and standard deviation of the error.
index = find(benchmarkSettings.identificationMethods.showResults);
file = fopen(sprintf('%s/%s_%s/decim%d/LaTeX/FOMtab.tex',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, benchmarkSettings.decimRate(index(1))), 'w');
if strcmp(robot.name, "TX40_uncoupled")
name = "TX40";
else
name = robot.name;
end
fprintf(file, "\\cellcolor{green!45}\\textbf{%s, MCS, decim %d} & \\cellcolor{gray!25}$E(d_{\\boldsymbol{q}}), \\sigma_{\\boldsymbol{q}}$ & \\cellcolor{gray!25}$E(d_{\\boldsymbol{\\tau}}), \\sigma_{\\boldsymbol{\\tau}}$& \\cellcolor{gray!25}$E(d_{t}), \\sigma_{t}$ &\\cellcolor{gray!25} $E(d_{N_{it}}), \\sigma_{N_{it}}$ & \\cellcolor{gray!25}$E(d_{N_{sim}}), \\sigma_{N_{sim}}$ \\\\ \n",name ,benchmarkSettings.decimRate(index(1)));
fprintf(file, "\\midrule\n");
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
% Compute relative torque error:
[~,nbSamples]=size(Tau_decim);
W = observationMatrixOrdered(robot.name, robot.paramVectorSize, robot.numericalParameters.Geometry, robot.numericalParameters.Gravity, Q_decim, Qp_decim, Qpp_decim);
% Y_tau_ref = W*benchmarkSettings.Beta_obj; % Recomputed torque with real parameter values
Y_tau_ref = torqueVectorOrdered(Tau_decim);
Y_tau_recomputed = W*averageParam(:,index(i));
Y_error_tau = Y_tau_ref - Y_tau_recomputed; % Recomputed torque with mean value of the estimated parameters
Y_error_tau_joint=zeros(nbSamples,robot.nbDOF);
Y_tau_joint=zeros(nbSamples,robot.nbDOF);
Y_tau_recomputed_joint=zeros(nbSamples,robot.nbDOF);
for jointNb = 1:robot.nbDOF
Y_error_tau_joint(:,jointNb) = Y_error_tau((jointNb-1)*nbSamples+1:jointNb*nbSamples);
Y_tau_joint(:,jointNb) = Y_tau_ref((jointNb-1)*nbSamples+1:jointNb*nbSamples);
Y_tau_recomputed_joint(:,jointNb) = Y_tau_recomputed((jointNb-1)*nbSamples+1:jointNb*nbSamples);
end
figure()
plot(Y_tau_joint(:,1),'r')
hold on
plot(Y_tau_recomputed_joint(:,1),'b')
figure()
plot(Y_tau_joint(:,2),'r')
hold on
plot(Y_tau_recomputed_joint(:,2),'b')
figure()
plot(Y_tau_joint(:,3),'r')
hold on
plot(Y_tau_recomputed_joint(:,3),'b')
figure()
plot(Y_tau_joint(:,4),'r')
hold on
plot(Y_tau_recomputed_joint(:,4),'b')
figure()
plot(Y_tau_joint(:,5),'r')
hold on
plot(Y_tau_recomputed_joint(:,5),'b')
figure()
plot(Y_tau_joint(:,6),'r')
hold on
plot(Y_tau_recomputed_joint(:,6),'b')
pause
Y_error_tau_med = sqrt(sum(Y_error_tau_joint.^2,2));
Y_tau_med = sqrt(sum(Y_tau_joint.^2,2));
d_tau(i) = 100*mean(Y_error_tau_med./Y_tau_med);
sigma_d_tau(i) = 100*std(Y_error_tau_med./Y_tau_med);
% Compute relative joint position error:
t_control = linspace(benchmarkSettings.t_i, benchmarkSettings.t_f, benchmarkSettings.nbCtrlSamples); % Control epochs
augmentedDesiredState = benchmarkSettings.trajectoryData.getTrajectoryData(t_control, benchmarkSettings.interpolationAlgorithm); % augmentedState = [Qpp; Qp; Q];
[~, stateVector, ~] = integrateClosedLoopDynamics_mex(augmentedDesiredState, averageParam(:,index(i)), robot.name, robot.numericalParameters.Geometry, ...
robot.numericalParameters.Gravity, benchmarkSettings.t_i, benchmarkSettings.t_f, benchmarkSettings.nbCtrlSamples, benchmarkSettings.nbSamples, ...
robot.controlParameters.Kp, robot.controlParameters.Ki, robot.controlParameters.Kd, robot.controlParameters.Ktau, robot.controlParameters.antiWindup, ...
robot.physicalConstraints.limQ_L, robot.physicalConstraints.limQ_U, robot.physicalConstraints.limQp_L, robot.physicalConstraints.limQp_U, ...
robot.physicalConstraints.limQpp_L, robot.physicalConstraints.limQpp_U, robot.physicalConstraints.limTau_L, robot.physicalConstraints.limTau_U, benchmarkSettings.integrationAlgorithm);
Q_sim = stateVector(robot.nbDOF+1:2*robot.nbDOF,benchmarkSettings.samplingBorder+1:end-benchmarkSettings.samplingBorder);
Qp_sim = stateVector(1:robot.nbDOF,benchmarkSettings.samplingBorder+1:end-benchmarkSettings.samplingBorder);
Q_sim_decim = [];
Qp_sim_decim = [];
for jointNb = 1:robot.nbDOF
Q_sim_decim(jointNb,:) = decimate(Q_sim(jointNb,:),benchmarkSettings.decimRate/benchmarkSettings.decimRate);
Qp_sim_decim(jointNb,:) = decimate(Qp_sim(jointNb,:),benchmarkSettings.decimRate/benchmarkSettings.decimRate);
end
% figure()
% plot(Q_sim_decim.','b')
% hold on
% plot(Q_decim.','r')
%
% figure()
% plot(Qp_sim_decim.','b')
% hold on
% plot(Qp_decim.','r')
Y_error_Q = torqueVectorOrdered(Q_decim-Q_sim_decim);
Y_Q_ref = torqueVectorOrdered(Q_decim);
for jointNb = 1:robot.nbDOF
Y_error_Q_joint(:,jointNb) = Y_error_Q((jointNb-1)*nbSamples+1:jointNb*nbSamples);
Y_Q_joint(:,jointNb) = Y_Q_ref((jointNb-1)*nbSamples+1:jointNb*nbSamples);
end
Y_error_Q_med = sqrt(sum(Y_error_Q_joint.^2,2));
Y_Q_med = sqrt(sum(Y_Q_joint.^2,2));
d_q(i) = 100*mean(Y_error_Q_med./Y_Q_med);
sigma_d_q(i) = 100*std(Y_error_Q_med./Y_Q_med);
% Compute average parameter error:
paramRef = repmat(benchmarkSettings.Beta_obj.',benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint,1);
relativeAverageParamErrorsMC = (2/robot.paramVectorSize)*sum(abs(fEP(:,:,index(i)))./(abs(paramRef)+abs(fP(:,:,index(i)))),2); % series of d_\beta for each MC experiment
d_beta(i) = 100*mean(relativeAverageParamErrorsMC);
sigma_d_beta(i) = 100*std(relativeAverageParamErrorsMC);
% Get the mean time required to compute one parameter estimate:
d_t(i) = mean(fT(:,index(i)));
sigma_d_t(i) = 100*std(fT(:,index(i)))/mean(fT(:,index(i)));
% If applicable, get the number of iterations required to compute one
% parameter estimate:
d_i(i) = mean(fI(:,index(i)));
sigma_d_i(i) = 100*std(fI(:,index(i)))/mean(fI(:,index(i)));
% If applicable, get the number of model recalculations required to compute one
% parameter estimate:
d_r(i) = mean(fR(:,index(i)));
if mean(fR(:,index(i)))~=0
sigma_d_r(i) = 100*std(fR(:,index(i)))/mean(fR(:,index(i)));
else
sigma_d_r(i) = -1;
end
% mean_fom(1,i) = d_beta(i);
mean_fom(1,i) = d_q(i);
mean_fom(2,i) = d_tau(i);
mean_fom(3,i) = d_t(i);
mean_fom(4,i) = d_i(i);
mean_fom(5,i) = d_r(i);
% unit{1} = '\%';
unit{1} = '\%';
unit{2} = '\%';
unit{3} = 's';
unit{4} = '';
unit{5} = '';
% sigma_fom(1,i) = sigma_d_beta(i);
sigma_fom(1,i) = sigma_d_q(i);
sigma_fom(2,i) = sigma_d_tau(i);
sigma_fom(3,i) = sigma_d_t(i);
sigma_fom(4,i) = sigma_d_i(i);
sigma_fom(5,i) = sigma_d_r(i);
nameAlg = getNameId(benchmarkSettings,index,i);
fprintf(file, "\\textbf{%s}", nameAlg);
for j = 1:N_fom
if j == N_fom
if ~strcmp(nameAlg,'CLIE') && ~strcmp(nameAlg,'CLOE') ~= ~strcmp(nameAlg,'DIDIM') ~= ~strcmp(nameAlg,'IDIM-IV') ~= ~strcmp(nameAlg,'PC-IDIM-IV') ~= ~strcmp(nameAlg,'PC-DIDIM')
fprintf(file, " & N.A.");
else
fprintf(file, " & %5.2f%s (%1.2f\\%%)", mean_fom(j,i), unit{j}, sigma_fom(j,i));
end
elseif j == 1
fprintf(file, " & %5.3f%s (%1.2f\\%%)", mean_fom(j,i), unit{j}, sigma_fom(j,i));
else
fprintf(file, " & %5.2f%s (%1.2f\\%%)", mean_fom(j,i), unit{j}, sigma_fom(j,i));
end
end
fprintf(file, "\\\\ \n");
end
fclose(file);
% replace the format E of matlab with \cdot10^{ of latex using a unix
% command line -> DO NOT WORK IN WINDOWS
% if isunix
% unix(sprintf("sed -i 's/E/\\cdot10^{/g' FOMtab_%s.txt", robot.name));
% end
end
function []=generateLaTeXFOMTabTot(robot, benchmarkSettings, experimentDataStruct, fP, fEP, fT, fI, fR, averageParam, stdParamError, averageTime, averageIter)
if strcmp(robot.name, "TX40_uncoupled")
name = "TX40";
nameTot = "Staubli TX40";
elseif strcmp(robot.name, "TX40")
name = robot.name;
nameTot = "Staubli TX40";
elseif strcmp(robot.name, "RV2SQ")
name = robot.name;
nameTot = "Mitsubishi RV2SQ";
else
name = robot.name;
end
% Genrate a table in LaTeX format, containing Figures of Merit (FOM) for
% the set of considered identification methods
N_fom = 5;
options.filter = 'butterworth';
Tau_decim = [];
Qpp_decim = [];
Qp_decim = [];
Q_decim = [];
for expNb = 1:1%benchmarkSettings.numberOfExperimentsPerInitialPoint % Concatenating the experiment data
% [~, ~, ~, ~, ~, ~, Tau_decim_exp, Qpp_decim_exp, Qp_decim_exp, Q_decim_exp, ~] = getFilteredData(robot, benchmarkSettings, experimentDataStruct, options, expNb,[]);
[~, Tau_decim_exp, Qpp_decim_exp, Qp_decim_exp, Q_decim_exp, ~, ~,~,~,~,~] = getFilteredData(robot, benchmarkSettings, experimentDataStruct, options, expNb,[]);
Tau_decim = [Tau_decim Tau_decim_exp];
Qpp_decim = [Qpp_decim Qpp_decim_exp];
Qp_decim = [Qp_decim Qp_decim_exp];
Q_decim = [Q_decim Q_decim_exp];
end
% Generation of the tabularcontatinning the average error and standard deviation of the error.
index = find(benchmarkSettings.identificationMethods.showResults);
folderPath = sprintf('Benchmark/Robot_Identification_Results/LaTeX/%s_%s/decim%d/LaTeX', robot.name, benchmarkSettings.noiseLevel, benchmarkSettings.decimRate(index(1)))
templateFolderPath = 'Benchmark/Robot_Identification_Results/LaTeX/Template';
filePath = sprintf('Benchmark/Robot_Identification_Results/LaTeX/%s_%s/decim%d/LaTeX/FOMtab.tex', robot.name, benchmarkSettings.noiseLevel, benchmarkSettings.decimRate(index(1)));
robotHasSymbolicModel = exist(folderPath, 'dir');
if robotHasSymbolicModel == 0 % If the resut folder does not exist
disp('The LaTeX report folder was not detected: creating it...');
mkdir(folderPath)
copyfile(templateFolderPath, folderPath)
addpath(genpath('Benchmark')); % Add the newly created directories to the matlab path
end
%
%
% if isunix
% unix(sprintf("mkdir -p %s/%s_%s/decim%d/LaTeX/", benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, benchmarkSettings.decimRate(index(1))));
% unix(sprintf("touch %s/%s_%s/decim%d/LaTeX/FOMtab.tex", benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, benchmarkSettings.decimRate(index(1))));
% end
file = fopen(filePath, 'w');
fprintf(file, "\\documentclass[letterpaper, 10 pt, conference]{ieeeconf} \n");
fprintf(file, "\n");
fprintf(file, "\\IEEEoverridecommandlockouts\n");
fprintf(file, "\n");
fprintf(file, "\\overrideIEEEmargins\n");
fprintf(file, "\n");
fprintf(file, "\\usepackage{cite}\n");
fprintf(file, "\\usepackage{graphics} \n");
fprintf(file, "\\usepackage[table, dvipsnames]{xcolor} \n");
fprintf(file, "\\usepackage{epsfig} \n");
fprintf(file, "\\usepackage{times} \n");
fprintf(file, "\\usepackage{amsmath} \n");
fprintf(file, "\\usepackage{amssymb} \n");
fprintf(file, "\\usepackage{color} \n");
fprintf(file, "\\usepackage{subfig} \n");
fprintf(file, "\\usepackage{tikz} \n");
fprintf(file, "\\usepackage{url} \n");
fprintf(file, "\\usepackage{algorithm2e} \n");
fprintf(file, "\\usepackage{threeparttable} \n");
fprintf(file, "\\usepackage{booktabs, dcolumn} \n");
fprintf(file, "\\newcommand\\mc[1]{\\multicolumn{1}{c}{#1}} \n");
fprintf(file, "\\usepackage{tabularx} \n");
fprintf(file, "\\newcolumntype{d}[1]{D{.}{.}{\\#1}} \n");
fprintf(file, "\\usepackage{makecell} \n");
fprintf(file, "\\usepackage{stfloats} \n");
fprintf(file, "\\makeatletter\n");
fprintf(file, "\\def\\endfigure{\\end@float} \n");
fprintf(file, "\\def\\endtable{\\end@float} \n");
fprintf(file, "\\makeatother \n");
fprintf(file, "\\usepackage{ulem} \n");
fprintf(file, "\\usepackage{stfloats} \n");
fprintf(file, "\\usepackage{geometry} \n");
fprintf(file, "\\geometry{ a4paper, total={170mm,257mm}, left=20mm, top=20mm } \n");
fprintf(file, "\n");
fprintf(file, "\\begin{document} \n");
fprintf(file, " \\title{\\LARGE \\bf Experiment Report %s Monte Carlo Simulation %d Samples, %s} \n", name, benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint, benchmarkSettings.noiseLevel);
fprintf(file, " \\author{Quentin~Leboutet, Julien~Roux, Alexandre~Janot,\\\\ \n");
fprintf(file, " J.~Rogelio~Guadarrama-Olvera, and~Gordon~Cheng} \n");
fprintf(file, " \\maketitle \n");
fprintf(file, "\\noindent \\textbf{Experiment conditions: } \n");
fprintf(file, "\\begin{itemize} \n");
fprintf(file, " \\item Robot: \\textbf{%s}, %d-DoF manipulator \n",nameTot, robot.nbDOF);
fprintf(file, " \\item $%d\\times %d = %d$ standard parameters (no $\\boldsymbol{\\tau}_{off}$) \n", robot.nbDOF, robot.numericalParameters.numParam(1), robot.nbDOF*robot.numericalParameters.numParam(1) );
fprintf(file, " \\item $%d$ base parameters \n", robot.paramVectorSize);
fprintf(file, " \\item Control frequency: %d Hz \n",benchmarkSettings.f_ctrl);
fprintf(file, " \\item Sampling frequency: %d Hz \n",benchmarkSettings.f);
fprintf(file, " \\item Decimation frequency: %d Hz \n",benchmarkSettings.fdecim);
fprintf(file, " \\item Decimation ratio: %d \n",benchmarkSettings.decimRate);
fprintf(file, " \\item Butterworth filter cutoff frequency: %d Hz \n",benchmarkSettings.filter.butterworth.freq_fil);
fprintf(file, " \\item Experiment duration: %d s \n",benchmarkSettings.t_f-benchmarkSettings.t_i);
fprintf(file, " \\item Noise levels: \\textbf{%s} levels \n",benchmarkSettings.noiseLevel);
fprintf(file, " \\begin{itemize} \n");
fprintf(file, " \\item Torque noise standard deviation: $\\boldsymbol{\\sigma_\\tau} = %f N.m $ \n",robot.numericalParameters.sd_tau(1));
fprintf(file, " \\item Position noise standard deviation: $\\boldsymbol{\\sigma_q} = %f deg $ \n",robot.numericalParameters.sd_q(1));
fprintf(file, " \\end{itemize} \n");
fprintf(file, " \\item \\textbf{No regularization} in general, except for PC-OLS-Euclidean, PC-OLS-Entropic, and PC-OLS-ConstPullback. In these cases, the regularization weight is set to $10^{-2}$. \n");
fprintf(file, "\\end{itemize} \n");
fprintf(file, "\\begin{table*}[t!] \n");
fprintf(file, " \\small \n");
fprintf(file, " \\centering \n");
fprintf(file, " \\begin{threeparttable} \n");
fprintf(file, " \\begin{tabular}{| l | c | c | c | c | c | c |} \n");
fprintf(file, " \\toprule \n");
fprintf(file, "\\cellcolor{green!45}\\textbf{%s, MCS, decim %d} & \\cellcolor{gray!25}$E(d_{\\boldsymbol{q}}), \\sigma_{\\boldsymbol{q}}$ & \\cellcolor{gray!25}$E(d_{\\boldsymbol{\\tau}}), \\sigma_{\\boldsymbol{\\tau}}$& \\cellcolor{gray!25}$E(d_{t}), \\sigma_{t}$ &\\cellcolor{gray!25} $E(d_{N_{it}}), \\sigma_{N_{it}}$ & \\cellcolor{gray!25}$E(d_{N_{sim}}), \\sigma_{N_{sim}}$ \\\\ \n",name ,benchmarkSettings.decimRate(index(1)));
fprintf(file, "\\midrule\n");
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
% Compute relative torque error:
[~,nbSamples]=size(Tau_decim);
W = observationMatrixOrdered(robot.name, robot.paramVectorSize, robot.numericalParameters.Geometry, robot.numericalParameters.Gravity, Q_decim, Qp_decim, Qpp_decim);
% Y_tau_ref = W*benchmarkSettings.Beta_obj; % Recomputed torque with real parameter values
Y_tau_ref = torqueVectorOrdered(Tau_decim);
Y_tau_recomputed = W*averageParam(:,index(i));
Y_error_tau = Y_tau_ref - Y_tau_recomputed; % Recomputed torque with mean value of the estimated parameters
Y_error_tau_joint=zeros(nbSamples,robot.nbDOF);
Y_tau_joint=zeros(nbSamples,robot.nbDOF);
Y_tau_recomputed_joint=zeros(nbSamples,robot.nbDOF);
for jointNb = 1:robot.nbDOF
Y_error_tau_joint(:,jointNb) = Y_error_tau((jointNb-1)*nbSamples+1:jointNb*nbSamples);
Y_tau_joint(:,jointNb) = Y_tau_ref((jointNb-1)*nbSamples+1:jointNb*nbSamples);
Y_tau_recomputed_joint(:,jointNb) = Y_tau_recomputed((jointNb-1)*nbSamples+1:jointNb*nbSamples);
end
% figure()
% plot(Y_tau_joint(:,1),'r')
% hold on
% plot(Y_tau_recomputed_joint(:,1),'b')
%
% figure()
% plot(Y_tau_joint(:,2),'r')
% hold on
% plot(Y_tau_recomputed_joint(:,2),'b')
%
% figure()
% plot(Y_tau_joint(:,3),'r')
% hold on
% plot(Y_tau_recomputed_joint(:,3),'b')
%
% figure()
% plot(Y_tau_joint(:,4),'r')
% hold on
% plot(Y_tau_recomputed_joint(:,4),'b')
%
% figure()
% plot(Y_tau_joint(:,5),'r')
% hold on
% plot(Y_tau_recomputed_joint(:,5),'b')
%
% figure()
% plot(Y_tau_joint(:,6),'r')
% hold on
% plot(Y_tau_recomputed_joint(:,6),'b')
%
% pause
Y_error_tau_med = sqrt(sum(Y_error_tau_joint.^2,2));
Y_tau_med = sqrt(sum(Y_tau_joint.^2,2));
d_tau(i) = 100*mean(Y_error_tau_med./Y_tau_med);
sigma_d_tau(i) = 100*std(Y_error_tau_med./Y_tau_med);
% Compute relative joint position error:
t_control = linspace(benchmarkSettings.t_i, benchmarkSettings.t_f, benchmarkSettings.nbCtrlSamples); % Control epochs
augmentedDesiredState = benchmarkSettings.trajectoryData.getTrajectoryData(t_control, benchmarkSettings.interpolationAlgorithm); % augmentedState = [Qpp; Qp; Q];
[~, stateVector, ~] = integrateClosedLoopDynamics_mex(augmentedDesiredState, averageParam(:,index(i)), robot.name, robot.numericalParameters.Geometry, ...
robot.numericalParameters.Gravity, benchmarkSettings.t_i, benchmarkSettings.t_f, benchmarkSettings.nbCtrlSamples, benchmarkSettings.nbSamples, ...
robot.controlParameters.Kp, robot.controlParameters.Ki, robot.controlParameters.Kd, robot.controlParameters.Ktau, robot.controlParameters.antiWindup, ...
robot.physicalConstraints.limQ_L, robot.physicalConstraints.limQ_U, robot.physicalConstraints.limQp_L, robot.physicalConstraints.limQp_U, ...
robot.physicalConstraints.limQpp_L, robot.physicalConstraints.limQpp_U, robot.physicalConstraints.limTau_L, robot.physicalConstraints.limTau_U, benchmarkSettings.integrationAlgorithm);
Q_sim = stateVector(robot.nbDOF+1:2*robot.nbDOF,benchmarkSettings.samplingBorder+1:end-benchmarkSettings.samplingBorder);
Qp_sim = stateVector(1:robot.nbDOF,benchmarkSettings.samplingBorder+1:end-benchmarkSettings.samplingBorder);
Q_sim_decim = [];
Qp_sim_decim = [];
for jointNb = 1:robot.nbDOF
Q_sim_decim(jointNb,:) = decimate(Q_sim(jointNb,:),benchmarkSettings.decimRate/benchmarkSettings.decimRate);
Qp_sim_decim(jointNb,:) = decimate(Qp_sim(jointNb,:),benchmarkSettings.decimRate/benchmarkSettings.decimRate);
end
% figure('Name', 'Q')
% plot(Q_sim_decim.','b')
% hold on
% plot(Q_decim.','r')
%
% figure('Name', 'Qp')
% plot(Qp_sim_decim.','b')
% hold on
% plot(Qp_decim.','r')
Y_error_Q = torqueVectorOrdered(Q_decim-Q_sim_decim);
Y_Q_ref = torqueVectorOrdered(Q_decim);
for jointNb = 1:robot.nbDOF
Y_error_Q_joint(:,jointNb) = Y_error_Q((jointNb-1)*nbSamples+1:jointNb*nbSamples);
Y_Q_joint(:,jointNb) = Y_Q_ref((jointNb-1)*nbSamples+1:jointNb*nbSamples);
end
Y_error_Q_med = sqrt(sum(Y_error_Q_joint.^2,2));
Y_Q_med = sqrt(sum(Y_Q_joint.^2,2));
d_q(i) = 100*mean(Y_error_Q_med./Y_Q_med);
sigma_d_q(i) = 100*std(Y_error_Q_med./Y_Q_med);
% Compute average parameter error:
paramRef = repmat(benchmarkSettings.Beta_obj.',benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint,1);
relativeAverageParamErrorsMC = (2/robot.paramVectorSize)*sum(abs(fEP(:,:,index(i)))./(abs(paramRef)+abs(fP(:,:,index(i)))),2); % series of d_\beta for each MC experiment
d_beta(i) = 100*mean(relativeAverageParamErrorsMC);
sigma_d_beta(i) = 100*std(relativeAverageParamErrorsMC);
% Get the mean time required to compute one parameter estimate:
d_t(i) = mean(fT(:,index(i)));
sigma_d_t(i) = 100*std(fT(:,index(i)))/mean(fT(:,index(i)));
% If applicable, get the number of iterations required to compute one
% parameter estimate:
d_i(i) = mean(fI(:,index(i)));
sigma_d_i(i) = 100*std(fI(:,index(i)))/mean(fI(:,index(i)));
% If applicable, get the number of model recalculations required to compute one
% parameter estimate:
d_r(i) = mean(fR(:,index(i)));
if mean(fR(:,index(i)))~=0
sigma_d_r(i) = 100*std(fR(:,index(i)))/mean(fR(:,index(i)));
else
sigma_d_r(i) = -1;
end
% mean_fom(1,i) = d_beta(i);
mean_fom(1,i) = d_q(i);
mean_fom(2,i) = d_tau(i);
mean_fom(3,i) = d_t(i);
mean_fom(4,i) = d_i(i);
mean_fom(5,i) = d_r(i);
% unit{1} = '\%';
unit{1} = '\%';
unit{2} = '\%';
unit{3} = 's';
unit{4} = '';
unit{5} = '';
% sigma_fom(1,i) = sigma_d_beta(i);
sigma_fom(1,i) = sigma_d_q(i);
sigma_fom(2,i) = sigma_d_tau(i);
sigma_fom(3,i) = sigma_d_t(i);
sigma_fom(4,i) = sigma_d_i(i);
sigma_fom(5,i) = sigma_d_r(i);
nameAlg = getNameId(benchmarkSettings,index,i);
fprintf(file, "\\textbf{%s}", nameAlg);
for j = 1:N_fom
if j == N_fom
if ~strcmp(nameAlg,'CLIE') && ~strcmp(nameAlg,'CLOE') ~= ~strcmp(nameAlg,'DIDIM') ~= ~strcmp(nameAlg,'IDIM-IV') ~= ~strcmp(nameAlg,'PC-IDIM-IV') ~= ~strcmp(nameAlg,'PC-DIDIM')
fprintf(file, " & N.A.");
else
fprintf(file, " & %5.2f%s (%1.2f\\%%)", mean_fom(j,i), unit{j}, sigma_fom(j,i));
end
elseif j == 1
fprintf(file, " & %5.3f%s (%1.2f\\%%)", mean_fom(j,i), unit{j}, sigma_fom(j,i));
else
fprintf(file, " & %5.2f%s (%1.2f\\%%)", mean_fom(j,i), unit{j}, sigma_fom(j,i));
end
end
fprintf(file, "\\\\ \n");
end
fprintf(file, "\\bottomrule\n");
fprintf(file, " \\end{tabular} \n");
fprintf(file, " \\end{threeparttable} \n");
fprintf(file, " \\caption{Various figures of merit computed for the %s model, with a sampling frequency $f = %d Hz$ and a decimation rate of %d. These results are obtained using the average values $E(d)$ and standard deviations $\\sigma$ of the %d parameter estimates obtained during the MCS. } \n", nameTot, benchmarkSettings.f, benchmarkSettings.decimRate, benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint);
fprintf(file, "\\end{table*} \n");
fprintf(file, "\\end{document} \n");
fclose(file);
% replace the format E of matlab with \cdot10^{ of latex using a unix
% command line -> DO NOT WORK IN WINDOWS
% if isunix
% unix(sprintf("sed -i 's/E/\\cdot10^{/g' FOMtab_%s.txt", robot.name));
% end
end
%%%%%%%%%%%%%%%%%%%%%%%
%% generateLaTeXparamTab:
%%%%%%%%%%%%%%%%%%%%%%%
function []=generateLaTeXparamTab(robot, benchmarkSettings, resultDataStruct, averageParamError, stdParamError)
N_param = robot.paramVectorSize;
N_methode = benchmarkSettings.nbAlg;
% Generation of the tabularcontatinning the average error and standard deviation of the error.
file = fopen('tab.txt', 'w');
for i = 1:N_param
fprintf(file, "\\beta_{%d}= % 5.4f", i, benchmarkSettings.Beta_obj(i));
for j = 1:N_methode
if benchmarkSettings.identificationMethods.showResults(j)==1
fprintf(file, " & %5.4f + %.0E}", averageParamError(i, j), stdParamError(i, j));
end
end
fprintf(file, "\\\\ \n");
end
fclose(file);
% replace the format E of matlab with \cdot10^{ of latex using a unix
% command line -> DO NOT WORK IN WINDOWS
if isunix
unix("sed -i 's/E/\\cdot10^{/g' tab.txt");
end
% Generation of the tabular containing the average identified parameters and there standard deviation
averageParameters = zeros(N_param, N_methode);
stdParameters = zeros(N_param, N_methode);
for i=1:N_methode
if benchmarkSettings.identificationMethods.showResults(i)==1
Betas = eval(sprintf('resultDataStruct{i}.results_%s.Betas',benchmarkSettings.identificationMethods.algName{i}));
averageParameters(:,i) = reshape(mean(reshape(Betas(1:benchmarkSettings.numberOfInitialEstimates, 1:benchmarkSettings.numberOfExperimentsPerInitialPoint,:), benchmarkSettings.numberOfInitialEstimates*robot.paramVectorSize,robot.paramVectorSize)), robot.paramVectorSize, 1);
stdParameters(:, i) = reshape(std(reshape(Betas(1:benchmarkSettings.numberOfInitialEstimates, 1:benchmarkSettings.numberOfExperimentsPerInitialPoint,:), benchmarkSettings.numberOfInitialEstimates*robot.paramVectorSize,robot.paramVectorSize)), robot.paramVectorSize,1); % maybe replace 0 by 1 to weight by N-1 instead of N iyswIm
end
end
file_bis = fopen('tab_identified_param.txt', 'w');
for i = 1:N_param
fprintf(file_bis, "\\beta_{%d}= % 5.4f", i, benchmarkSettings.Beta_obj(i));
indexMethods = find(benchmarkSettings.identificationMethods.showResults(:));
[~, indexMin(i)] = min(abs(averageParamError(i,indexMethods)));
counter = 0;
for j = indexMethods(1):indexMethods(end)
counter = counter +1;
if benchmarkSettings.identificationMethods.showResults(j)==1
if counter == indexMin(i) % Best estimate
fprintf(file_bis, " & \\color{blue}%5.4f \\color{black}+ %.0E}", averageParameters(i, j), stdParameters(i, j));
else
fprintf(file_bis, " & %5.4f + %.0E}", averageParameters(i, j), stdParameters(i, j));
end
end
end
fprintf(file_bis, "\\\\ \n");
end
fclose(file_bis);
% replace the format E of matlab with \cdot10^{ of latex using a unix
% command line -> DO NOT WORK IN WINDOWS
if isunix
unix("sed -i 's/E/\\cdot10^{/g' tab_identified_param.txt");
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% generateLaTeXparamTabPercent:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function []=generateLaTeXparamTabPercent(robot, benchmarkSettings, resultDataStruct, averageParamError, stdParamError)
N_param = robot.paramVectorSize;
N_methode = benchmarkSettings.nbAlg;
% Generation of the tabular containing the average identified parameters and there standard deviation
averageParameters = zeros(N_param, N_methode);
stdParameters = zeros(N_param, N_methode);
for i=1:N_methode
if benchmarkSettings.identificationMethods.showResults(i)==1
Betas = eval(sprintf('resultDataStruct{i}.results_%s.Betas',benchmarkSettings.identificationMethods.algName{i}));
averageParameters(:,i) = reshape(mean(reshape(Betas(1:benchmarkSettings.numberOfInitialEstimates, 1:benchmarkSettings.numberOfExperimentsPerInitialPoint,:), benchmarkSettings.numberOfInitialEstimates*robot.paramVectorSize,robot.paramVectorSize)), robot.paramVectorSize, 1);
stdParameters(:, i) = reshape(std(reshape(Betas(1:benchmarkSettings.numberOfInitialEstimates, 1:benchmarkSettings.numberOfExperimentsPerInitialPoint,:), benchmarkSettings.numberOfInitialEstimates*robot.paramVectorSize,robot.paramVectorSize)), robot.paramVectorSize,1); % maybe replace 0 by 1 to weight by N-1 instead of N iyswIm
end
end
file = fopen('tab_identified_param_percent.txt', 'w');
for i = 1:N_param
fprintf(file, "$\\beta_{%d}$=\\textbf{%1.4f}", i, benchmarkSettings.Beta_obj(i));
indexMethods = find(benchmarkSettings.identificationMethods.showResults(:));
% [~, indexMin(i)] = min(abs(averageParamError(i,indexMethods)));
[~,indexMin(i,:)]=sort(abs(averageParamError(i,indexMethods)));
counter = 0;
for j = indexMethods(1):indexMethods(end) % For all the possible methods
if benchmarkSettings.identificationMethods.showResults(j)==1
counter = counter +1;
if counter == indexMin(i,1) % Best estimate
fprintf(file, "&\\cellcolor{blue!25}\\textbf{%1.4f}", averageParameters(i, j));
% fprintf(file, " & \\color{blue}%1.2f \\color{black} (%1.1f\\%%)", averageParameters(i, j), sqrt(stdParameters(i, j))/abs(averageParameters(i, j)));
elseif counter == indexMin(i,2) % Second best estimate
fprintf(file, "&\\cellcolor{cyan!25}\\textbf{%1.4f}", averageParameters(i, j));
elseif counter == indexMin(i,3) % Third best estimate
fprintf(file, "&\\cellcolor{green!25}\\textbf{%1.4f}", averageParameters(i, j));
elseif counter == indexMin(i,end) % Worst estimate
fprintf(file, "&\\cellcolor{red!25}\\textbf{%1.4f}", averageParameters(i, j));
elseif counter == indexMin(i,end-1) % Second worst estimate
fprintf(file, "&\\cellcolor{orange!25}\\textbf{%1.4f}", averageParameters(i, j));
elseif counter == indexMin(i,end-2) % Third worst estimate
fprintf(file, "&\\cellcolor{yellow!25}\\textbf{%1.4f}", averageParameters(i, j));
else
fprintf(file, "&%1.4f", averageParameters(i, j));
% fprintf(file, " & %1.2f (%1.1f\\%%)", averageParameters(i, j), sqrt(stdParameters(i, j))/abs(averageParameters(i, j)));
end
end
end
fprintf(file, "\\\\ \n");
end
fclose(file);
% replace the format E of matlab with \cdot10^{ of latex using a unix
% command line -> DO NOT WORK IN WINDOWS
% if isunix
% unix("sed -i 's/E/\\cdot10^{/g' tab_identified_param_percent.txt");
% end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% generateLaTeXparamTabPercent:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function []=generateLaTeXparamTabPercent2(robot, benchmarkSettings, resultDataStruct, averageParamError, stdParamError)
N_param = robot.paramVectorSize;
N_methode = benchmarkSettings.nbAlg;
% Generation of the tabular containing the average identified parameters and there standard deviation
averageParameters = zeros(N_param, N_methode);
stdParameters = zeros(N_param, N_methode);
for i=1:N_methode
if benchmarkSettings.identificationMethods.showResults(i)==1
Betas = eval(sprintf('resultDataStruct{i}.results_%s.Betas',benchmarkSettings.identificationMethods.algName{i}));
averageParameters(:,i) = reshape(mean(reshape(Betas(1:benchmarkSettings.numberOfInitialEstimates, 1:benchmarkSettings.numberOfExperimentsPerInitialPoint,:), benchmarkSettings.numberOfInitialEstimates*robot.paramVectorSize,robot.paramVectorSize)), robot.paramVectorSize, 1);
stdParameters(:, i) = reshape(std(reshape(Betas(1:benchmarkSettings.numberOfInitialEstimates, 1:benchmarkSettings.numberOfExperimentsPerInitialPoint,:), benchmarkSettings.numberOfInitialEstimates*robot.paramVectorSize,robot.paramVectorSize)), robot.paramVectorSize,1); % maybe replace 0 by 1 to weight by N-1 instead of N iyswIm
end
end
file = fopen('tab_identified_param_percent.txt', 'w');
for i = 1:N_param
fprintf(file, "$\\beta_{%d}$=\\textbf{%1.4f}", i, benchmarkSettings.Beta_obj(i));
indexMethods = find(benchmarkSettings.identificationMethods.showResults(:));
% [~, indexMin(i)] = min(abs(averageParamError(i,indexMethods)));
[~,indexMin(i,:)]=sort(abs(averageParamError(i,indexMethods)));
counter = 0;
for j = indexMethods(1):indexMethods(end) % For all the possible methods
if benchmarkSettings.identificationMethods.showResults(j)==1
counter = counter +1;
if counter == indexMin(i,1) % Best estimate
fprintf(file, "&\\cellcolor{blue!25}\\textbf{%1.1f(%1.1f)}", averageParameters(i, j), stdParameters(i, j)/abs(averageParameters(i, j)));
% fprintf(file, " & \\color{blue}%1.2f \\color{black} (%1.1f\\%%)", averageParameters(i, j), sqrt(stdParameters(i, j))/abs(averageParameters(i, j)));
elseif counter == indexMin(i,2) % Second best estimate
fprintf(file, "&\\cellcolor{cyan!25}\\textbf{%1.1f(%1.1f)}", averageParameters(i, j), stdParameters(i, j)/abs(averageParameters(i, j)));
elseif counter == indexMin(i,3) % Third best estimate
fprintf(file, "&\\cellcolor{green!25}\\textbf{%1.1f(%1.1f)}", averageParameters(i, j), stdParameters(i, j)/abs(averageParameters(i, j)));
elseif counter == indexMin(i,end) % Worst estimate
fprintf(file, "&\\cellcolor{red!25}\\textbf{%1.1f(%1.0f)}", averageParameters(i, j), stdParameters(i, j)/abs(averageParameters(i, j)));
elseif counter == indexMin(i,end-1) % Second worst estimate
fprintf(file, "&\\cellcolor{orange!25}\\textbf{%1.1f(%1.0f)}", averageParameters(i, j), stdParameters(i, j)/abs(averageParameters(i, j)));
elseif counter == indexMin(i,end-2) % Third worst estimate
fprintf(file, "&\\cellcolor{yellow!25}\\textbf{%1.1f(%1.0f)}", averageParameters(i, j), stdParameters(i, j)/abs(averageParameters(i, j)));
else
fprintf(file, "&%1.1f(%1.1f)", averageParameters(i, j), stdParameters(i, j)/abs(averageParameters(i, j)));
% fprintf(file, " & %1.2f (%1.1f\\%%)", averageParameters(i, j), sqrt(stdParameters(i, j))/abs(averageParameters(i, j)));
end
end
end
fprintf(file, "\\\\ \n");
end
fclose(file);
% replace the format E of matlab with \cdot10^{ of latex using a unix
% command line -> DO NOT WORK IN WINDOWS
% if isunix
% unix("sed -i 's/E/\\cdot10^{/g' tab_identified_param_percent.txt");
% end
end
%%%%%%%%%%%%%%%%%%%%%%
%% getCovarianceVideo:
%%%%%%%%%%%%%%%%%%%%%%
function []=getCovarianceVideo(Covariance_iteration, algName, iteration, writeVideo)
if nargin < 3
writeVideo = false;
end
figure('Name','Covariance Matrix')
for i=1:size(Covariance_iteration,3)
image(1000*Covariance_iteration(:,:,i,iteration));
title(sprintf('Covariance Matrix %s, Iteration %d', algName, iteration-47));
F(i) = getframe(gcf);
drawnow
end
if writeVideo == true
% create the video writer with 1 fps
writerObj = VideoWriter(sprintf('covariance_it_%d.avi',iteration));
writerObj.FrameRate = 10;
% set the seconds per image
% open the video writer
open(writerObj);
% write the frames to the video
for i=1:length(F)
% convert the image to a frame
frame = F(i) ;
writeVideo(writerObj, frame);
end
% close the writer object
close(writerObj);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% plotRecalculatedTorques:
%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [status] = plotRecalculatedTorques(robot, benchmarkSettings, Q, Qp, Qpp, Tau, t, averageParam, jointNb)
% Compute the observation matrix:
W = observationMatrix(robot.name, robot.paramVectorSize, robot.numericalParameters.Geometry, robot.numericalParameters.Gravity, Q, Qp, Qpp);
referenceTau = W*benchmarkSettings.Beta_obj;
h=figure('Name','Torques');
plot1 = plot(t, Tau(jointNb,:),'Color',[0.5 0.5 1],'LineWidth',0.5);
hold on
graph(2) = plot(t, referenceTau(jointNb:robot.nbDOF:end),'b', 'LineWidth',3.5);
index = find(benchmarkSettings.identificationMethods.showResults);
j=1;
type = {'--', '-'};
k = -1;
r=1;
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
hold on
k = k+1;
recomputedTau = W*averageParam(:,index(i));
ax = gca;
if k == 2
r=r+1;
k=0;
end
ax.ColorOrderIndex = r;
graph(i+2) = plot(t, recomputedTau(jointNb:robot.nbDOF:end),type{j+1},'LineWidth',1);
legendInfo{i+2}=sprintf('%s',benchmarkSettings.identificationMethods.algName{index(i)},'Interpreter', 'LaTeX');
j= ~j;
end
hold off
plot1(1,1).Color(4)=0.25;
graph(1) = plot1;
legendInfo{1}='real';
legendInfo{2}='reference';
legend(graph,legendInfo{:})
xlabel('\textbf{Time [s]}','Interpreter', 'LaTeX');
ylabel('\textbf{Torque [N.m]}','Interpreter', 'LaTeX');
title(sprintf('\\textbf{Recomputed torque} \\boldmath{$%s$} \\textbf{joint %d}',robot.name, jointNb),'Interpreter', 'LaTeX')
grid on
grid minor
set(h,'Units','Inches');
pos = get(h,'Position');
set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h,sprintf('%s/%s/recomputedTorqueJoint%d',benchmarkSettings.outputPath ,robot.name, jointNb),'-dsvg','-r0')
savefig(h,sprintf('%s/%s/recomputedTorqueJoint%d.fig',benchmarkSettings.outputPath ,robot.name, jointNb));
status = true;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% plotRecalculatedTorquesFull:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [status] = plotRecalculatedTorquesFull(robot, benchmarkSettings, experimentDataStruct, averageParam, saveGraph)
options.filter = 'butterworth';
Tau_decim = [];
Qpp_decim = [];
Qp_decim = [];
Q_decim = [];
for expNb = 1:1%benchmarkSettings.numberOfExperimentsPerInitialPoint % Concatenating the experiment data
[t_decim, Tau_decim_exp, Qpp_decim_exp, Qp_decim_exp, Q_decim_exp, ~, ~, ~, ~, ~, ~] = getFilteredData(robot, benchmarkSettings, experimentDataStruct, options, expNb,[]);
Tau_decim = [Tau_decim Tau_decim_exp];
Qpp_decim = [Qpp_decim Qpp_decim_exp];
Qp_decim = [Qp_decim Qp_decim_exp];
Q_decim = [Q_decim Q_decim_exp];
end
% Compute the observation matrix:
W = observationMatrix(robot.name, robot.paramVectorSize, robot.numericalParameters.Geometry, robot.numericalParameters.Gravity, Q_decim, Qp_decim, Qpp_decim);
num = [ 1, 0.0781, 0.2344;... % Crimson Red
0, 0.9000, 0.1;... % Real Green
0.1172, 0.5625, 1.0000;... % Deep Sky Blue
1.0000, 0, 1.0000;... % Magenta
0, 1.0000, 1.0000;... % Cyan
0.8000, 0.2695, 0;... % Orange
0, 1.0000, 0.25000;... % Light Green
0, 0, 0.5000;... % Navy Blue
0.5000, 0, 0.5000;... % Purple
0.5391, 0.1680, 0.8828;... % BlueViolet
0, 0, 1.0000;... % Blue
0.5000, 0.5000, 0.5000]; % Gray
set(groot,'defaultAxesColorOrder',num)
figure('Name','Torques','Renderer', 'painters', 'Position', [10 10 1200 600]);
for jointNb = 1:robot.nbDOF
referenceTau = W*benchmarkSettings.Beta_obj;
subplot(ceil(robot.nbDOF/2),2,jointNb)
graph(1) = plot(t_decim, Tau_decim(jointNb,:),'Color',[0,0,0.5],'LineWidth',1);
% hold on
% graph(2) = plot(referenceTau(jointNb:robot.nbDOF:end),'g', 'LineWidth',3.5);
index = find(benchmarkSettings.identificationMethods.showResults);
j=1;
type = {'-', '-'};
k = -1;
r=1;
NN = sum(benchmarkSettings.identificationMethods.showResults);
for i=1:NN
hold on
k = k+1;
recomputedTau = W*averageParam(:,index(i));
ax = gca;
if k == 1
r=r+1;
k=0;
end
nameAlg = getNameId(benchmarkSettings,index,i);
graph(i+NN+1) = plot(t_decim, Tau_decim(jointNb,:).'-recomputedTau(jointNb:robot.nbDOF:end),'Color',[1/((i+1)^(i/2)), 1/((i+1)^(i/2)), 1/((i+1)^(i/2))],'LineWidth',1);
legendInfo{i+NN+1}=sprintf('Error %s',nameAlg);
ax.ColorOrderIndex = r;
graph(i+1) = plot(t_decim, recomputedTau(jointNb:robot.nbDOF:end),type{j+1},'LineWidth',1);
legendInfo{i+1}=sprintf('%s',nameAlg);
% ax.ColorOrderIndex = r;
j= ~j;
end
hold off
% graph(1,1).Color(4)=1;
% graph(1) = plot1;
legendInfo{1}='real';
% legendInfo{2}='reference';
xlabel('\textbf{Time [s]}','Interpreter', 'LaTeX');
ylabel(sprintf('\\textbf{Torque [N.m]}'),'Interpreter', 'LaTeX');
title(sprintf('\\textbf{Recomputed torque} \\boldmath{$%s$} \\textbf{joint %d}',robot.name, jointNb),'Interpreter', 'LaTeX')
grid on
grid minor
end
legend(graph,legendInfo{:},'Interpreter', 'LaTeX','Orientation','horizontal')
status = true;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% plotRecalculatedClosedLoopDDM:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [status]=plotRecalculatedClosedLoopDDM(robot, benchmarkSettings, resultDataStruct, experimentDataStruct)
% This function plot the trajectory errors obtained with each identification method
t_control = linspace(benchmarkSettings.t_i, benchmarkSettings.t_f, benchmarkSettings.nbCtrlSamples); % Control epochs
augmentedInitialState = [experimentDataStruct.Qpp(:,1,1); experimentDataStruct.Qp(:,1,1); experimentDataStruct.Q(:,1,1)]; % X = [Qp;Q]:
augmentedDesiredState = benchmarkSettings.trajectoryData.getTrajectoryData(t_control, benchmarkSettings.interpolationAlgorithm); % augmentedState = [Qpp; Qp; Q];
t = linspace(benchmarkSettings.t_i, benchmarkSettings.t_f, benchmarkSettings.nbSamples); % Sampling times
for i=1:numel(benchmarkSettings.identificationMethods.showResults)
if benchmarkSettings.identificationMethods.showResults(i)==1
Betas = eval(sprintf('resultDataStruct{i}.results_%s.Betas',benchmarkSettings.identificationMethods.algName{i}));
averageParameters(:,i) = reshape(mean(reshape(Betas, benchmarkSettings.numberOfInitialEstimates*robot.paramVectorSize,robot.paramVectorSize)), robot.paramVectorSize, 1);
stdParameters(:, i) = reshape(std(reshape(Betas, benchmarkSettings.numberOfInitialEstimates*robot.paramVectorSize,robot.paramVectorSize)), robot.paramVectorSize,1); % maybe replace 0 by 1 to weight by N-1 instead of N iyswIm
end
end
foundResults = find(benchmarkSettings.identificationMethods.showResults);
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
% Simulate robot dynamic behavior with the estimated parameters
[~, State_it(:,:,i), ~] = integrateClosedLoopDynamics_mex(augmentedDesiredState, averageParameters(:,foundResults(i)), robot.name, robot.numericalParameters.Geometry, ...
robot.numericalParameters.Gravity, benchmarkSettings.t_i, benchmarkSettings.t_f, benchmarkSettings.nbCtrlSamples, benchmarkSettings.nbSamples, robot.controlParameters.Kp, ...
robot.controlParameters.Ki, robot.controlParameters.Kd, robot.controlParameters.Ktau, robot.controlParameters.antiWindup, robot.physicalConstraints.limQ_L, robot.physicalConstraints.limQ_U,...
robot.physicalConstraints.limQp_L, robot.physicalConstraints.limQp_U, robot.physicalConstraints.limQpp_L, robot.physicalConstraints.limQpp_U, robot.physicalConstraints.limTau_L, ...
robot.physicalConstraints.limTau_U, benchmarkSettings.integrationAlgorithm);
for j=1:size(State_it,2)
H = feval(sprintf('HT_dh%d_world_%s', robot.nbDOF,robot.name), State_it(robot.nbDOF+1:end,j,i), robot.numericalParameters.Geometry);
X(:,j,i) = H(1:3,4);
end
end
figure('Name','Parameter validation')
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
subplot(sum(benchmarkSettings.identificationMethods.showResults),1,i)
plot((experimentDataStruct.Q(:,:,1) - State_it(robot.nbDOF+1:end,:,i))');
benchmarkSettings.identificationMethods.algName{foundResults(i)};
grid on
grid minor
legend
title(sprintf('Joint errors due to parameter mismatch of %s', benchmarkSettings.identificationMethods.algName{foundResults(i)}));
end
figure('Name','Parameter validation 3D')
realParameters = plot3(experimentDataStruct.X(1,:,1), experimentDataStruct.X(2,:,1), experimentDataStruct.X(3,:,1), 'LineStyle','-', 'Linewidth',2,'HandleVisibility','off');
hold on
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
identifiedParameters(i) = plot3(X(1,:,i), X(2,:,i), X(3,:,i), 'LineStyle','--', 'Linewidth',2,'HandleVisibility','off');
k = benchmarkSettings.identificationMethods.algName{foundResults(i)};
legendInfo{i}=sprintf('%s trajectory',k);
hold on
end
grid on
grid minor
hold off
title('Trajectory');
legend([realParameters identifiedParameters],{'Real trajectory' legendInfo{:}})
status = true;
end
%%%%%%%%%%%%%%%%%
%% errorFunction:
%%%%%%%%%%%%%%%%%
function [ Error ] = errorFunction(robot, benchmarkSettings, experimentDataStruct, Beta, index, expNb)
q = experimentDataStruct.Q(:,:,expNb)';
% Simulation of the robot using the computed parameters:
[~, State_it, ~] = integrateClosedLoopDynamics_mex(augmentedDesiredState, averageParameters(:,foundResults(i)), robot.name, robot.numericalParameters.Geometry, ...
robot.numericalParameters.Gravity, benchmarkSettings.t_i, benchmarkSettings.t_f, benchmarkSettings.nbCtrlSamples, benchmarkSettings.nbSamples, robot.controlParameters.Kp, ...
robot.controlParameters.Ki, robot.controlParameters.Kd, robot.controlParameters.Ktau, robot.controlParameters.antiWindup, robot.physicalConstraints.limQ_L, robot.physicalConstraints.limQ_U,...
robot.physicalConstraints.limQp_L, robot.physicalConstraints.limQp_U, robot.physicalConstraints.limQpp_L, robot.physicalConstraints.limQpp_U, robot.physicalConstraints.limTau_L, ...
robot.physicalConstraints.limTau_U, benchmarkSettings.integrationAlgorithm);
size(q)
size(State_it(robot.nbDOF+1:end,:)')
Err=(q-State_it(robot.nbDOF+1:end,:)');
figure('Name',sprintf('%s',benchmarkSettings.identificationMethods.algName{index}));
subplot(2,1,1)
plot(State_it(robot.nbDOF+1:end,:)','--','LineWidth',2)
hold on
plot(q,'LineWidth',1)
legend('q1 simulated','q1 robot')
xlabel('Samples');
ylabel('Q');
title(sprintf('Trajectory %s',benchmarkSettings.identificationMethods.algName{index}))
grid on
grid minor
subplot(2,1,2)
plot(100*Err)
legend('100 x Error')
xlabel('Samples');
ylabel('Joint Error');
title(sprintf('Trajectory Error %s',benchmarkSettings.identificationMethods.algName{index}))
grid on
grid minor
Error = kstest(Err);
figure
hist(Err)
end
%%%%%%%%%%%%%%%
%% plotSummary:
%%%%%%%%%%%%%%%
function [status] = plotSummary(benchmarkSettings, averageTime, averageIter, averageError, stdError, methods)
% Summary
h = figure('Name','Summary','units','normalized','outerposition',[0 0 1 1]);
colormap parula
cmap = colormap;
subplot(4,1,1)
bm = bar(methods, averageError, 0.5, 'FaceColor', 'flat');
for k = 1:benchmarkSettings.nbAlg
bm.CData(k,:) = cmap(k,:);
end
text(1:length(averageError),averageError,num2str(averageError',3),'vert','bottom','horiz','center');
box off
% yticks(1:2:benchmarkSettings.nbAlg);
% ylim([0 benchmarkSettings.nbAlg]);
grid on
grid minor
title("Average error")
subplot(4,1,2);
bs = bar(methods, stdError, 0.5, 'FaceColor', 'flat');
for k = 1:benchmarkSettings.nbAlg
bs.CData(k,:) = cmap(k,:);
end
text(1:length(stdError),stdError,num2str(stdError','%.1e'),'vert','bottom','horiz','center');
box off
grid on
grid minor
% ylim([0 3.5])
title("Error Standard Deviation")
subplot(4,1,3)
bt = bar(methods, log10(averageTime+1), 0.5, 'FaceColor', 'flat');
for k = 1:benchmarkSettings.nbAlg
bt.CData(k,:) = cmap(k,:);
end
text(1:length(averageTime),log10(averageTime+1),num2str(averageTime','%.1us'),'vert','bottom','horiz','center');
box off
yticks(log10([1 2 10 60 600 3600]));
ylim([0 log10(20000)]);
grid on
grid minor
yticklabels({'0', '1s', '10s', '1min', '10min', '1h'});
title("Average Computation Time")
subplot(4,1,4)
it = bar(methods, averageIter, 0.5, 'FaceColor', 'flat');
for k = 1:benchmarkSettings.nbAlg
it.CData(k,:) = cmap(k,:);
end
text(1:length(averageIter),averageIter,num2str(averageIter','%.1u'),'vert','bottom','horiz','center');
box off
grid on
grid minor
title("Average Number of Model Recalculation to Convergence")
set(h,'Units','Inches');
pos = get(h,'Position');
set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h,'Summary','-dpdf','-r0')
status = true;
end
%%%%%%%%%%%%%%%%%%%%%
%% plot3DMeanResults:
%%%%%%%%%%%%%%%%%%%%%
function [status] = plot3DMeanResults(robot, benchmarkSettings, averageParamError)
% Parameter error mean value
h=figure('Name','Parameter error mean value')
colormap jet
b = bar3(1:robot.paramVectorSize, averageParamError(:,find(benchmarkSettings.identificationMethods.showResults)));
% for k = 1:numel(b)
% cdata = get(b(k),'zdata');
% cdata=repmat(max(abs(cdata),[],2),1,4);
% set(b(k),'cdata',cdata,'facecolor','interp')
% end
for k = 1:length(b)
zdata = b(k).ZData;
b(k).CData = zdata;
b(k).FaceColor = 'interp';
end
% daspect([3 20 0.0330]);
grid on
grid minor
title("Average Parameter error")
set(h,'Units','Inches');
pos = get(h,'Position');
set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h,'Mean results','-dpdf','-r0')
status = true;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% plotRawResultsParamwise:
%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [status] = plotRawResultsParamwise(robot, benchmarkSettings, fEP, fT)
colormap hsv
cmap = colormap;
h=figure('Name','Raw Results')
index = find(benchmarkSettings.identificationMethods.showResults);
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
for j=1:robot.paramVectorSize
graph(i) = plot3(fEP(:,j,index(i))',j*ones(benchmarkSettings.numberOfInitialEstimates*benchmarkSettings.numberOfExperimentsPerInitialPoint,1),log(fT(:,index(i))+1),'.','color',cmap(2*i,:));
hold on
end
legendInfo{i}=sprintf('%s',benchmarkSettings.identificationMethods.algName{index(i)});
end
zlabel('\textbf{Computation Time [s]}','Interpreter', 'LaTeX');
xlabel('\textbf{Error}','Interpreter', 'LaTeX');
ylabel('\textbf{Parameter Index}','Interpreter', 'LaTeX');
grid on
grid minor
% ylim([0, 5])
hold off
title('Algotithm Performance');
legend(graph,legendInfo{:})
set(h,'Units','Inches');
pos = get(h,'Position');
set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h,'Raw_paramwise','-dpdf','-r0')
status = true;
end
%%%%%%%%%%%%%%%%%%
%% plotRawResults:
%%%%%%%%%%%%%%%%%%
function [status] = plotRawResults(benchmarkSettings, fEP, fT)
marker = {'o','+','*','.','x','s','d','^','v','>','<','p','h','o','+','*','.','x','s','d','^','v','>','<','p','h'};
h=figure('Name','Raw Results')
index = find(benchmarkSettings.identificationMethods.showResults);
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
graph(i) = scatter(vecnorm(fEP(:,:,index(i))'),log2(fT(:,index(i))+1),40,marker{i});
hold on
legendInfo{i}=sprintf('%s',benchmarkSettings.identificationMethods.algName{index(i)});
end
ylabel('\textbf{Computation Time [s]}','Interpreter', 'LaTeX');
xlabel('\textbf{Error RMS}','Interpreter', 'LaTeX');
grid on
grid minor
ylim([0, 5])
hold off
title('Algotithm Performance');
legend(graph,legendInfo{:})
set(h,'Units','Inches');
pos = get(h,'Position');
set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h,'Raw_mean','-dpdf','-r0')
status = true;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% plotRawResultsHistogram:
%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [status] = plotRawResultsHistogram(benchmarkSettings, fEP, fT)
% Graph computation time vs error RMS
h=figure('Name','Raw Results')
index = find(benchmarkSettings.identificationMethods.showResults);
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
graph(i) = histogram2(vecnorm(fEP(:,:,index(i))'),fT(:,index(i))');
hold on
legendInfo{i}=sprintf('%s',benchmarkSettings.identificationMethods.algName{index(i)});
end
ylabel('\textbf{Computation Time [s]}','Interpreter', 'LaTeX');
xlabel('\textbf{Error RMS}','Interpreter', 'LaTeX');
grid on
grid minor
ylim([0, 2])
hold off
title('Algotithm Performance');
legend(graph,legendInfo{:})
set(h,'Units','Inches');
pos = get(h,'Position');
set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h,'raw_hist','-dpdf','-r0')
status = true;
end
%%%%%%%%%%%%%%%%%%%%%%%%%
%% plotConvergenceStatus:
%%%%%%%%%%%%%%%%%%%%%%%%%
function [status] = plotConvergenceStatus(robot, benchmarkSettings, convergence, decimRate)
% Convergence Status
h=figure('Name','Convergence')
index = find(benchmarkSettings.identificationMethods.showResults);
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
subplot(ceil(sum(benchmarkSettings.identificationMethods.showResults)/2),2,i)
imagesc(repmat(convergence(:,:,index(i)),1,1,3));
% colorbar
title(sprintf('\\textbf{Convergence} \\boldmath{$%s$}', benchmarkSettings.identificationMethods.algName{index(i)}), 'Interpreter', 'LaTeX')
ylabel('Initial estimate', 'Interpreter', 'LaTeX')
xlabel('Independant run', 'Interpreter', 'LaTeX')
end
set(h,'Units','Inches');
pos = get(h,'Position');
set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
versionMatlab = ver('matlab');
if str2double(versionMatlab.Version)>=9.8
exportgraphics(h,sprintf('%s/%s/decim%d/paramError/Conv-%s%s',benchmarkSettings.outputPath ,robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)},'.pdf'),'BackgroundColor','none');
else
print(h,sprintf('%s/%s/decim%d/paramError/Conv-%s',benchmarkSettings.outputPath ,robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}), '-dpdf','-r0');
end
status = true;
end
%%%%%%%%%%%%%%%%%%%%%%
%% plotParamwiseHoriz:
%%%%%%%%%%%%%%%%%%%%%%
function [status] = plotParamwiseHoriz(robot, benchmarkSettings, averageParamError, stdParamError)
% Parameter error mean value and stdandard deviation
h=figure('Name','Parameter error mean value and stdandard deviation')
index = find(benchmarkSettings.identificationMethods.showResults);
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
subplot(sum(benchmarkSettings.identificationMethods.showResults),1,i)
bar(1:robot.paramVectorSize, averageParamError(:,index(i)));
hold on
errorbar(averageParamError(:,index(i)), stdParamError(:,index(i)),'.','LineWidth',2)
hold off
grid on
grid minor
xlabel('\textbf{Index}','Interpreter', 'LaTeX');
ylabel('\textbf{Error}','Interpreter', 'LaTeX');
ylim([-0.26 0.26])
% text(1:length(averageParamError(:,index(i))),averageParamError(:,index(i)),num2str(averageParamError(:,index(i)),'%10.2e\n'),'Rotation',90);
box off
title(sprintf('\\textbf{Average Parameter Errors and Standard Deviations} \\boldmath{$%s$}', benchmarkSettings.identificationMethods.algName{index(i)}), 'Interpreter', 'LaTeX')
end
legend({'mean', 'std'},'Interpreter', 'LaTeX')
set(h,'Units','Inches');
pos = get(h,'Position');
set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h,'Hist_horiz','-dpdf','-r0')
status = true;
end
%%%%%%%%%%%%%%%%%%%%%
%% plotParamwiseVert:
%%%%%%%%%%%%%%%%%%%%%
function [status] = plotParamwiseVert(robot, benchmarkSettings, averageParamError, stdParamError)
% Parameter error mean value and stdandard deviation 2
h=figure('Name','Parameter error mean value and stdandard deviation 2')
index = find(benchmarkSettings.identificationMethods.showResults);
% subplot(1,sum(benchmarkSettings.identificationMethods.showResults),1)
% barh(1:robot.paramVectorSize, averageParamError(:,index(1)));
% hold on
% errorbar(averageParamError(:,index(1)),1:robot.paramVectorSize, stdParamError(:,index(1)),'horizontal','.','LineWidth',2)
% hold off
% grid on
% grid minor
% ylabel('\textbf{Index}','Interpreter', 'LaTeX');
% xlabel('\textbf{Error}','Interpreter', 'LaTeX');
% % xlim([-0.26 0.26])
% % text(max(0,averageParamError(:,index(1))), 1:length(averageParamError(:,index(1))),strcat(strcat(num2str(averageParamError(:,index(1)),'%10.2e\n'),'±'),num2str(stdParamError(:,index(1)),'%10.2e\n')),'vert','bottom','horiz','left','Rotation',0);
% box off
% title(sprintf('\\boldmath{$%s$}', benchmarkSettings.identificationMethods.algName{index(1)}), 'Interpreter', 'LaTeX')
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
subplot(1,sum(benchmarkSettings.identificationMethods.showResults),i)
barh(1:robot.paramVectorSize, averageParamError(:,index(i)));
hold on
errorbar(averageParamError(:,index(i)),1:robot.paramVectorSize, stdParamError(:,index(i)),'horizontal','r.','LineWidth',0.5)
hold off
grid on
grid minor
ylabel('\textbf{Index}','Interpreter', 'LaTeX');
xlabel('\textbf{Parameter Error}','Interpreter', 'LaTeX');
% xlim([-1.5 1.6])
% text(max(0,averageParamError(:,index(i)))+0.025, 1:length(averageParamError(:,index(i))),strcat(strcat(num2str(averageParamError(:,index(i)),'%10.2e\n'),'±'),num2str(stdParamError(:,index(i)),'%10.2e\n')),'vert','bottom','horiz','left','Rotation',0);
box off
title(sprintf('\\boldmath{$%s$}', benchmarkSettings.identificationMethods.algName{index(i)}), 'Interpreter', 'LaTeX')
end
legend({'mean', 'std'},'Interpreter', 'LaTeX')
set(h,'Units','Inches');
pos = get(h,'Position');
set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h,'Hist_vert','-dpdf','-r0')
status = true;
end
%%%%%%%%%%%%%%%%%%%%%%%%
%% plotParamwiseVertNew:
%%%%%%%%%%%%%%%%%%%%%%%%
function [status] = plotParamwiseVertNew(robot, benchmarkSettings, averageParamError, stdParamError, decimRate)
% Parameter error mean value and stdandard deviation 2
index = find(benchmarkSettings.identificationMethods.showResults);
% subplot(1,sum(benchmarkSettings.identificationMethods.showResults),1)
% barh(1:robot.paramVectorSize, averageParamError(:,index(1)));
% hold on
% errorbar(averageParamError(:,index(1)),1:robot.paramVectorSize, stdParamError(:,index(1)),'horizontal','.','LineWidth',2)
% hold off
% grid on
% grid minor
% ylabel('\textbf{Index}','Interpreter', 'LaTeX');
% xlabel('\textbf{Error}','Interpreter', 'LaTeX');
% % xlim([-0.26 0.26])
% % text(max(0,averageParamError(:,index(1))), 1:length(averageParamError(:,index(1))),strcat(strcat(num2str(averageParamError(:,index(1)),'%10.2e\n'),'±'),num2str(stdParamError(:,index(1)),'%10.2e\n')),'vert','bottom','horiz','left','Rotation',0);
% box off
% title(sprintf('\\boldmath{$%s$}', benchmarkSettings.identificationMethods.algName{index(1)}), 'Interpreter', 'LaTeX')
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
h=figure('Name','Parameter error mean value and stdandard deviation 2');
barh(1:robot.paramVectorSize, averageParamError(:,index(i)), 'FaceColor', [0 .39 .74], 'EdgeColor', [0 .59 .94], 'FaceAlpha',0.75);
hold on
errorbar(averageParamError(:,index(i)),1:robot.paramVectorSize, stdParamError(:,index(i)),'horizontal','r.','LineWidth',0.5)
hold off
grid on
grid minor
ylabel('\textbf{Index}','Interpreter', 'LaTeX');
xlabel('\textbf{Parameter Error}','Interpreter', 'LaTeX');
xlim([-0.5 0.5])
x=0.5;
text(0.4*(-ones(1,robot.paramVectorSize)).^(0:robot.paramVectorSize-1), linspace(1-x,robot.paramVectorSize-x,robot.paramVectorSize),strcat('err(',strcat(num2str(linspace(1,robot.paramVectorSize,robot.paramVectorSize).','%d\n'),strcat(')=',strcat(strcat(num2str(averageParamError(:,index(i)),'%5.3f\n'),'±'),num2str(stdParamError(:,index(i)),'%5.3f\n'))))), 'Interpreter', 'LaTeX','vert','bottom','horiz','center','Rotation',0,'FontSize', 10);
box off
% title(sprintf('\\textbf{Parameter Identification} \\boldmath{$%s$}', benchmarkSettings.identificationMethods.algName{index(i)}), 'Interpreter', 'LaTeX')
legend({'mean', 'std'},'Interpreter', 'LaTeX','Location','northoutside','Orientation','horizontal')
set(h,'PaperPositionMode','Auto','Position', [0 0 960 540])
h.Color='w';
h.OuterPosition=h.InnerPosition;
if ~exist(sprintf('%s/%s_%s/decim%d/paramError',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i))), 'dir')
mkdir(sprintf('%s/%s_%s/decim%d/paramError',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i))))
end
print(h,sprintf('%s/%s_%s/decim%d/paramError/paramError-%s',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}),'-dsvg','-r0')
savefig(h,sprintf('%s/%s_%s/decim%d/paramError/paramError-%s',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}));
versionMatlab = ver('matlab');
if str2double(versionMatlab.Version)>=9.8
exportgraphics(h,sprintf('%s/%s_%s/decim%d/paramError/paramError-%s%s',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)},'.pdf'),'BackgroundColor','none');
else
print(h,sprintf('%s/%s_%s/decim%d/paramError/paramError-%s',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}), '-dpdf','-r0');
end
end
status = true;
end
function [status] = plotParamwiseMatrix(robot, benchmarkSettings, averageParamError, stdParamError, decimRate)
% Parameter error mean value and stdandard deviation 2
index = find(benchmarkSettings.identificationMethods.showResults);
averageParamErrorMat = [];
stdParamErrorMat = [];
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
averageParamErrorMat = [averageParamErrorMat averageParamError(:,index(i))];
stdParamErrorMat = [stdParamErrorMat stdParamError(:,index(i))];
l2Error(i) = norm(averageParamError(:,index(i)));
name{i} = getNameId(benchmarkSettings,index,i);
end
[~,I] = sort(l2Error,'descend');
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
namesSorted{i} = name{I(i)};
end
averageParamErrorMatSorted = averageParamErrorMat(:,I);
stdParamErrorMatSorted = stdParamErrorMat(:,I);
[X,Y] = meshgrid(1:robot.paramVectorSize,1:sum(benchmarkSettings.identificationMethods.showResults));
ticks = linspace(1,2*sum(benchmarkSettings.identificationMethods.showResults), sum(benchmarkSettings.identificationMethods.showResults));
figure('Name','Parameter error mean value and stdandard deviation 6');
bar3(ticks,abs(averageParamErrorMatSorted)',0.8);
% colormap(jet);
hold on
q = quiver3(X,Y, abs(averageParamErrorMatSorted)', zeros(size(averageParamErrorMatSorted')), zeros(size(averageParamErrorMatSorted')), abs(averageParamErrorMatSorted)'+abs(stdParamErrorMatSorted)','linewidth',2, 'color', 'r');
q.ShowArrowHead = 'off';
grid on
grid minor
xticks(1:sum(benchmarkSettings.identificationMethods.showResults));
xticklabels(namesSorted);
title("Average Parameter error")
% set(b,'Units','Inches');
% pos = get(b,'Position');
% set(b,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
% print(b,'Mean results','-dpdf','-r0')
% Change the colormap to gray (so higher values are
% black and lower values are white)
% textStrings = num2str(averageParamError(:), '%0.2f'); % Create strings from the matrix values
% textStrings = strtrim(cellstr(textStrings)); % Remove any space padding
% [x, y] = meshgrid(1:52); % Create x and y coordinates for the strings
% hStrings = text(x(:), y(:), textStrings(:), ... % Plot the strings
% 'HorizontalAlignment', 'center');
% midValue = mean(get(gca, 'CLim')); % Get the middle value of the color range
% textColors = repmat(averageParamError(:) > midValue, 1, 3); % Choose white or black for the
% text color of the strings so
% they can be easily seen over
% the background color
% set(hStrings, {'Color'}, num2cell(textColors, 2)); % Change the text colors
% set(gca, 'XTick', 1:5, ... % Change the axes tick marks
% 'XTickLabel', {'A', 'B', 'C', 'D', 'E'}, ... % and tick labels
% 'YTick', 1:5, ...
% 'YTickLabel', {'A', 'B', 'C', 'D', 'E'}, ...
% 'TickLength', [0 0]);
%
% for i=1:sum(benchmarkSettings.identificationMethods.showResults)
% h=figure('Name','Parameter error mean value and stdandard deviation 2');
% barh(1:robot.paramVectorSize, averageParamError(:,index(i)), 'FaceColor', [0 .39 .74], 'EdgeColor', [0 .59 .94], 'FaceAlpha',0.75);
% hold on
% errorbar(averageParamError(:,index(i)),1:robot.paramVectorSize, stdParamError(:,index(i)),'horizontal','r.','LineWidth',0.5)
% hold off
% grid on
% grid minor
% ylabel('\textbf{Index}','Interpreter', 'LaTeX');
% xlabel('\textbf{Parameter Error}','Interpreter', 'LaTeX');
% xlim([-0.5 0.5])
% x=0.5;
% text(0.4*(-ones(1,robot.paramVectorSize)).^(0:robot.paramVectorSize-1), linspace(1-x,robot.paramVectorSize-x,robot.paramVectorSize),strcat('err(',strcat(num2str(linspace(1,robot.paramVectorSize,robot.paramVectorSize).','%d\n'),strcat(')=',strcat(strcat(num2str(averageParamError(:,index(i)),'%5.3f\n'),'±'),num2str(stdParamError(:,index(i)),'%5.3f\n'))))), 'Interpreter', 'LaTeX','vert','bottom','horiz','center','Rotation',0,'FontSize', 10);
% box off
% % title(sprintf('\\textbf{Parameter Identification} \\boldmath{$%s$}', benchmarkSettings.identificationMethods.algName{index(i)}), 'Interpreter', 'LaTeX')
% legend({'mean', 'std'},'Interpreter', 'LaTeX','Location','northoutside','Orientation','horizontal')
% set(h,'PaperPositionMode','Auto','Position', [0 0 960 540])
% h.Color='w';
% h.OuterPosition=h.InnerPosition;
%
% if ~exist(sprintf('%s/%s_%s/decim%d/paramError',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i))), 'dir')
% mkdir(sprintf('%s/%s_%s/decim%d/paramError',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i))))
% end
%
% print(h,sprintf('%s/%s_%s/decim%d/paramError/paramError-%s',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}),'-dsvg','-r0')
% savefig(h,sprintf('%s/%s_%s/decim%d/paramError/paramError-%s',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}));
%
% versionMatlab = ver('matlab');
% if str2double(versionMatlab.Version)>=9.8
% exportgraphics(h,sprintf('%s/%s_%s/decim%d/paramError/paramError-%s%s',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)},'.pdf'),'BackgroundColor','none');
% else
% print(h,sprintf('%s/%s_%s/decim%d/paramError/paramError-%s',benchmarkSettings.outputPath, robot.name, benchmarkSettings.noiseLevel, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}), '-dpdf','-r0');
% end
% end
status = true;
end
function [status] = plotParamwiseSeparated(robot, benchmarkSettings, averageParamError, stdParamError)
%% Parameter error mean value and stdandard deviation 3
index = find(benchmarkSettings.identificationMethods.showResults);
subplot(1,sum(benchmarkSettings.identificationMethods.showResults),1)
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
h = figure('Name',sprintf('Parameter error mean value and stdandard deviation %s',benchmarkSettings.identificationMethods.algName{index(i)}),'units','normalized','outerposition',[0 0 1 1]);
bar(1:robot.paramVectorSize, averageParamError(:,index(i)));
hold on
errorbar(averageParamError(:,index(i)), stdParamError(:,index(i)),'.','LineWidth',2)
hold off
grid on
grid minor
ylabel('\textbf{Index}','Interpreter', 'LaTeX');
xlabel('\textbf{Error}','Interpreter', 'LaTeX');
% xlim([-0.1 0.26])
% text(max(0,averageParamError(:,index(i)))+0.025, 1:length(averageParamError(:,index(i))),strcat(strcat(num2str(averageParamError(:,index(i)),'%10.2e\n'),'±'),num2str(stdParamError(:,index(i)),'%10.2e\n')),'vert','bottom','horiz','left','Rotation',0);
box off
title(sprintf('\\boldmath{$%s$}', benchmarkSettings.identificationMethods.algName{index(i)}), 'Interpreter', 'LaTeX')
legend({'mean', 'std'},'Interpreter', 'LaTeX')
set(h,'Units','Inches');
pos = get(h,'Position');
set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h,sprintf('%s',benchmarkSettings.identificationMethods.algName{index(i)}),'-dpdf','-r0')
end
status = true;
end
%%%%%%%%%%%%%%%%%%%%%%%
%% checkStatHypotheses:
%%%%%%%%%%%%%%%%%%%%%%%
function [status] = checkStatHypotheses(robot, benchmarkSettings, experimentDataStruct, decimRate, averageParam, stdParamError)
options.filter = 'no';
Tau_decim = [];
Qpp_decim = [];
Qp_decim = [];
Q_decim = [];
for expNb = 1:1 %benchmarkSettings.numberOfExperimentsPerInitialPoint % Concatenating the experiment data
[~, ~, ~, ~, ~, ~, Tau_decim_exp, Qpp_decim_exp, Qp_decim_exp, Q_decim_exp, ~] = getFilteredData(robot, benchmarkSettings, experimentDataStruct, options, expNb,[]);
Tau_decim = [Tau_decim Tau_decim_exp];
Qpp_decim = [Qpp_decim Qpp_decim_exp];
Qp_decim = [Qp_decim Qp_decim_exp];
Q_decim = [Q_decim Q_decim_exp];
end
% [~, ~, ~, ~, ~, ~, Tau_decim, Qpp_decim, Qp_decim, Q_decim, ~] = getFilteredData(robot, benchmarkSettings, experimentDataStruct, options, 1,[]);
index = find(benchmarkSettings.identificationMethods.showResults);
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
Y_tau = torqueVectorOrdered(Tau_decim);
W = observationMatrixOrdered(robot.name, robot.paramVectorSize, robot.numericalParameters.Geometry, robot.numericalParameters.Gravity, Q_decim, Qp_decim, Qpp_decim);
error_e = Y_tau - W*averageParam(:,index(i));
[~,nbSamples]=size(Tau_decim);
disp('Relative torque error:')
% Autocorrelation plots:
h0 = figure('Name','Residuals Autocorrelations');
for jointNb = 1:robot.nbDOF
% error_e_joint = error_e((jointNb-1)*nbSamples+1:jointNb*nbSamples);
error_e_joint = filloutliers(error_e((jointNb-1)*nbSamples+1:jointNb*nbSamples),'next');
subplot(ceil(robot.nbDOF/2),2,jointNb)
[acf,lags,bounds,h] = autocorr(error_e_joint,'NumLags',20,'NumSTD',2);
grid on
grid minor
title('')
ylabel(sprintf('\\textbf{Link %d}',jointNb),'Interpreter', 'LaTeX');
xlabel('\textbf{Lag}','Interpreter', 'LaTeX');
end
sgtitle(sprintf('\\textbf{Residuals Autocorrelations} \\boldmath{$%s$} \\boldmath{$%s$}', benchmarkSettings.identificationMethods.algName{index(i)}, robot.name),'Interpreter', 'LaTeX')
% Kolmogorov-Smirnov test:
for jointNb = 1:robot.nbDOF
% error_e_joint = error_e((jointNb-1)*nbSamples+1:jointNb*nbSamples);
error_e_joint = filloutliers(error_e((jointNb-1)*nbSamples+1:jointNb*nbSamples),'next');
error_e_norm = error_e_joint/std(error_e_joint);
if kstest(error_e_norm) == 1
disp(sprintf('Kolmogorov-Smirnov goodness-of-fit hypothesis test %s joint %d: UNSUCCESSFUL',benchmarkSettings.identificationMethods.algName{index(i)}, jointNb))
else
disp(sprintf('Kolmogorov-Smirnov goodness-of-fit hypothesis test %s joint %d: SUCCESSFUL',benchmarkSettings.identificationMethods.algName{index(i)}, jointNb))
end
end
% Saving figures:
% set(h0,'Units','Inches');
% pos = get(h0,'Position');
% set(h0,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
% print(h0,sprintf('%s/%s/decim%d/residualAutocorrelations/residualAutocorrelations-%s',robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}),'-dsvg','-r0')
% savefig(h0,sprintf('%s/%s/decim%d/residualAutocorrelations/residualAutocorrelations-%s.fig',robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}));
%
end
status = true;
end
%%%%%%%%%%%%%%%%%%%%%%
%% plotErrorHistogram:
%%%%%%%%%%%%%%%%%%%%%%
function [status] = plotErrorHistogram(robot, benchmarkSettings, experimentDataStruct, decimRate, averageParam, stdParamError)
options.filter = 'no';
Tau_decim = [];
Qpp_decim = [];
Qp_decim = [];
Q_decim = [];
t_decim = [];
for expNb = 1:benchmarkSettings.numberOfExperimentsPerInitialPoint % Concatenating the experiment data
[~, ~, ~, ~, ~, t_decim_exp, Tau_decim_exp, Qpp_decim_exp, Qp_decim_exp, Q_decim_exp, ~] = getFilteredData(robot, benchmarkSettings, experimentDataStruct, options, expNb,[]);
if isempty(t_decim)
dt = t_decim_exp(2)-2*t_decim_exp(1);
else
dt = t_decim(end)+t_decim_exp(2)-2*t_decim_exp(1);
end
t_decim = [t_decim t_decim_exp+dt];
Tau_decim = [Tau_decim Tau_decim_exp];
Qpp_decim = [Qpp_decim Qpp_decim_exp];
Qp_decim = [Qp_decim Qp_decim_exp];
Q_decim = [Q_decim Q_decim_exp];
end
index = find(benchmarkSettings.identificationMethods.showResults);
for i=1:sum(benchmarkSettings.identificationMethods.showResults)
Y_tau = torqueVectorOrdered(Tau_decim);
W = observationMatrixOrdered(robot.name, robot.paramVectorSize, robot.numericalParameters.Geometry, robot.numericalParameters.Gravity, Q_decim, Qp_decim, Qpp_decim);
error_e = Y_tau - W*averageParam(:,index(i));
[~,nbSamples]=size(Tau_decim);
% disp(' Relative error ')
% 100*norm(error_e((jointNb-1)*nbSamples+1:jointNb*nbSamples))/norm(Y_tau((jointNb-1)*nbSamples+1:jointNb*nbSamples))
% fitdist(error_e/std(error_e),'Normal')
h0 = figure('Name',sprintf('Torque error signal %s', benchmarkSettings.identificationMethods.algName{index(i)}),'units','normalized');
for jointNb = 1:robot.nbDOF
error_e_joint = error_e((jointNb-1)*nbSamples+1:jointNb*nbSamples);
subplot(ceil(robot.nbDOF/2),2,jointNb)
plot(t_decim, error_e_joint)
% plot(error_e_joint/std(error_e_joint))
title(sprintf('\\textbf{Joint %d}', jointNb),'Interpreter', 'LaTeX');
xlabel('\textbf{Time [s]}','Interpreter', 'LaTeX');
ylabel('\textbf{Torque error [N.m]}','Interpreter', 'LaTeX');
grid on
grid minor
end
h1 = figure('Name',sprintf('Torque error signal %s no outliers', benchmarkSettings.identificationMethods.algName{index(i)}),'units','normalized');
for jointNb = 1:robot.nbDOF
error_e_joint = filloutliers(error_e((jointNb-1)*nbSamples+1:jointNb*nbSamples),'next');
subplot(ceil(robot.nbDOF/2),2,jointNb)
plot(t_decim, error_e_joint)
% plot(error_e_joint/std(error_e_joint))
title(sprintf('\\textbf{Joint %d}', jointNb),'Interpreter', 'LaTeX');
xlabel('\textbf{Time [s]}','Interpreter', 'LaTeX');
ylabel('\textbf{Torque error [N.m]}','Interpreter', 'LaTeX');
grid on
grid minor
end
h2 = figure('Name',sprintf('Normalized histogram of %s error and estimated Gaussian', benchmarkSettings.identificationMethods.algName{index(i)}),'units','normalized');
for jointNb = 1:robot.nbDOF
error_e_joint = error_e((jointNb-1)*nbSamples+1:jointNb*nbSamples);
subplot(ceil(robot.nbDOF/2),2,jointNb)
hst = histfit(error_e_joint/std(error_e_joint));
grid on
grid minor
title(sprintf('\\textbf{Joint %d}', jointNb),'Interpreter', 'LaTeX');
xlabel('\textbf{Normalized torque}','Interpreter', 'LaTeX');
xlim([-6,6]);
ylabel('\textbf{Population}','Interpreter', 'LaTeX');
hst(1).FaceColor = [.8 .8 1];
end
sgtitle(sprintf('\\textbf{Normalized histograms of} \\boldmath{$%s$} \\textbf{error and estimated Gaussians}', benchmarkSettings.identificationMethods.algName{index(i)}),'Interpreter', 'LaTeX')
% h3 = figure('Name',sprintf('Normalized histogram of %s error and estimated Gaussian no outliers', benchmarkSettings.identificationMethods.algName{index(i)}),'units','normalized');
% for jointNb = 1:robot.nbDOF
% error_e_joint = filloutliers(error_e((jointNb-1)*nbSamples+1:jointNb*nbSamples),'next');
% size(error_e_joint)
% subplot(ceil(robot.nbDOF/2),2,jointNb)
% hst = histfit(error_e_joint/std(error_e_joint));
% grid on
% grid minor
% title(sprintf('\\textbf{Joint %d}', jointNb),'Interpreter', 'LaTeX');
% xlabel('\textbf{Normalized torque}','Interpreter', 'LaTeX');
% xlim([-6,6]);
% ylabel('\textbf{Population}','Interpreter', 'LaTeX');
% hst(1).FaceColor = [.8 .8 1];
% end
% sgtitle(sprintf('\\textbf{Normalized histograms of} \\boldmath{$%s$} \\textbf{error and estimated Gaussians}', benchmarkSettings.identificationMethods.algName{index(i)}),'Interpreter', 'LaTeX')
% Saving figures:
set(h0,'Units','Inches');
pos = get(h0,'Position');
set(h0,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h0,sprintf('%s/%s/decim%d/errorHistogram/torqueError-%s',benchmarkSettings.outputPath ,robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}),'-dsvg','-r0')
savefig(h0,sprintf('%s/%s/decim%d/errorHistogram/torqueError-%s.fig',benchmarkSettings.outputPath ,robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}));
set(h1,'Units','Inches');
pos = get(h1,'Position');
set(h1,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h1,sprintf('%s/%s/decim%d/errorHistogram/torqueError-%sNoOutliers',benchmarkSettings.outputPath ,robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}),'-dsvg','-r0')
savefig(h1,sprintf('%s/%s/decim%d/errorHistogram/torqueError-%sNoOutliers.fig',benchmarkSettings.outputPath ,robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}));
set(h2,'Units','Inches');
pos = get(h2,'Position');
set(h2,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(h2,sprintf('%s/%s/decim%d/errorHistogram/histogramTorqueError-%s',benchmarkSettings.outputPath ,robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}),'-dsvg','-r0')
savefig(h2,sprintf('%s/%s/decim%d/errorHistogram/histogramTorqueError-%s.fig',benchmarkSettings.outputPath ,robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}));
% set(h3,'Units','Inches');
% pos = get(h3,'Position');
% set(h3,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
% print(h3,sprintf('%s/%s/decim%d/errorHistogram/histogramTorqueError-%sNoOutliers',robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}),'-dsvg','-r0')
% savefig(h3,sprintf('%s/%s/decim%d/errorHistogram/histogramTorqueError-%sNoOutliers.fig',robot.name, decimRate(index(i)), benchmarkSettings.identificationMethods.algName{index(i)}));
%
end
status = true;
end
%%%%%%%%%%%%%%%%%%%%%%%
%% torqueVectorOrdered:
%%%%%%%%%%%%%%%%%%%%%%%
function [Y_tau] = torqueVectorOrdered(Tau)
% Authors: Quentin Leboutet, Julien Roux, Alexandre Janot and Gordon Cheng
%
% Building the sampled torque vector.
[nbDOF,nbSamples]=size(Tau);
Y_tau = zeros(nbDOF*nbSamples, 1);
for i=1:nbDOF
for j=1:nbSamples
Y_tau((i-1)*nbSamples+j)=Tau(i,j);
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% observationMatrixOrdered:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [W_ord] = observationMatrixOrdered(robotName, paramVectorSize, Geometry, Gravity, Q, Qp, Qpp)
% Authors: Quentin Leboutet, Julien Roux, Alexandre Janot and Gordon Cheng
%
% Building of the observation matrix W for the current iteration of Beta
[nbDOF,nbSamples]=size(Q);
W = zeros(nbSamples*nbDOF, paramVectorSize);
W_ord = zeros(nbSamples*nbDOF, paramVectorSize);
for i=1:nbSamples
% Compute the observation matrix:
switch robotName % [toyRobot, SCARA, UR3, UR5, UR10, TX40, TX40_uncoupled, RX90, PUMA560, REEMC_right_arm, ICUB_right_arm, NAO_right_arm]
case 'TX40'
W(nbDOF*(i-1)+1:nbDOF*i,:) = Regressor_Y_TX40(Q(:,i), Qp(:,i), Qpp(:,i), Geometry, Gravity);
case 'TX40_uncoupled'
W(nbDOF*(i-1)+1:nbDOF*i,:) = Regressor_Y_TX40_uncoupled(Q(:,i), Qp(:,i), Qpp(:,i), Geometry, Gravity);
case 'RV2SQ'
W(nbDOF*(i-1)+1:nbDOF*i,:) = Regressor_Y_RV2SQ(Q(:,i), Qp(:,i), Qpp(:,i), Geometry, Gravity);
otherwise
W(nbDOF*(i-1)+1:nbDOF*i,:) = feval(sprintf('Regressor_Y_%s',robotName),Q(:,i), Qp(:,i), Qpp(:,i), Geometry, Gravity); % Much slower when compiled !
end
end
for i=1:nbDOF
W_ord(nbSamples*(i-1)+1:nbSamples*i,:) = W(i:nbDOF:end,:);
end
end
function nameAlg = getNameId(benchmarkSettings,index,i)
switch benchmarkSettings.identificationMethods.algName{index(i)}
case 'OLS'
nameAlg = 'IDIM-OLS';
case 'OLS_f'
nameAlg = 'IDIM-OLS filtered';
case 'WLS'
nameAlg = 'IDIM-WLS';
case 'WLS_f'
nameAlg = 'IDIM-WLS filtered';
case 'TLS'
nameAlg = 'IDIM-TLS';
case 'TLS_f'
nameAlg = 'IDIM-TLS filtered';
case 'ML'
nameAlg = 'ML';
case 'ML_f'
nameAlg = 'ML filtered';
case 'IV'
nameAlg = 'IDIM-IV';
case 'DIDIM'
nameAlg = 'DIDIM';
case 'CLIE'
nameAlg = 'CLIE';
case 'CLOE'
nameAlg = 'CLOE';
case 'EKF'
nameAlg = 'EKF';
case 'SREKF'
nameAlg = 'SREKF';
case 'UKF'
nameAlg = 'UKF';
case 'SRUKF'
nameAlg = 'SRUKF';
case 'CDKF'
nameAlg = 'CDKF';
case 'SRCDKF'
nameAlg = 'SRCDKF';
case 'ANN'
nameAlg = 'ANN';
case 'ANN_f'
nameAlg = 'ANN filtered';
case 'HTRNN'
nameAlg = 'HTRNN';
case 'HTRNN_f'
nameAlg = 'HTRNN filtered';
case 'IRLS'
nameAlg = 'IRLS';
case 'IRLS_f'
nameAlg = 'IRLS filtered';
case 'PC_OLS_Euclidean'
nameAlg = 'PC-OLS Euclidean';
case 'PC_OLS_Euclidean_f'
nameAlg = 'PC-OLS filtered Euclidean';
case 'PC_OLS_Entropic'
nameAlg = 'PC-OLS Entropic';
case 'PC_OLS_Entropic_f'
nameAlg = 'PC-OLS filtered Entropic';
case 'PC_OLS_ConstPullback'
nameAlg = 'PC-OLS ConstPullback';
case 'PC_OLS_ConstPullback_f'
nameAlg = 'PC-OLS filtered ConstPullback';
case 'PC_IV'
nameAlg = 'PC-IDIM-IV';
case 'PC_DIDIM'
nameAlg = 'PC-DIDIM';
case 'PC_OLS'
nameAlg = 'PC-IDIM-OLS';
case 'PC_OLS_f'
nameAlg = 'PC-IDIM-OLS filtered';
case 'PC_WLS'
nameAlg = 'PC-IDIM-WLS';
case 'PC_WLS_f'
nameAlg = 'PC-IDIM-WLS filtered';
case 'PC_IRLS'
nameAlg = 'PC-IDIM-IRLS';
case 'PC_IRLS_f'
nameAlg = 'PC-IDIM-IRLS filtered';
otherwise
benchmarkSettings.identificationMethods.algName{index(i)}
error('Unknown algorithm');
end
end