Finish metrology and open-loop plant sections

This commit is contained in:
Thomas Dehaeze 2024-11-13 17:11:40 +01:00
parent e847b5f98e
commit 6aa8242d3a
27 changed files with 5477 additions and 7 deletions

View File

@ -10809,6 +10809,762 @@ data2orgtable(data_results, {'Tomography ($R_z$ 1rpm)', 'Tomography ($R_z$ 6rpm)
| Diffraction Tomography ($R_z$ 1rpm, $D_y$ 0.1mm/s) | 75 | 9 | 118 | | Diffraction Tomography ($R_z$ 1rpm, $D_y$ 0.1mm/s) | 75 | 9 | 118 |
| Diffraction Tomography ($R_z$ 1rpm, $D_y$ 1mm/s) | 428 | 11 | 169 | | Diffraction Tomography ($R_z$ 1rpm, $D_y$ 1mm/s) | 428 | 11 | 169 |
* TODO SRI Figures :noexport:
** Open Loop Figure / Effect of mass
#+begin_src matlab :exports none
%% Save Identified Plants
load('G_ol.mat', 'G_int_m0', 'G_int_m1', 'G_int_m2', 'G_int_m3', 'f');
#+end_src
#+begin_src matlab :exports none :results none
%% Measured transfer function from generated voltages to measured voltage on the force sensors
figure;
t = tiledlayout(6, 6, 'TileSpacing', 'compact', 'Padding', 'None');
for i = 1:6
for j = 1:6
nexttile();
if i == j
plot(f, abs(G_int_m0(:, i, j)), 'color', [colors(1,:), 1]);
else
plot(f, abs(G_int_m0(:, i, j)), 'color', [colors(1,:), 0.5]);
end
set(gca, 'XTickLabel',[]);
set(gca, 'YTickLabel',[]);
if j == 1
ylabel(sprintf('$dL_{%i}$', i))
end
if i == 6
xlabel(sprintf('$u_{%i}$', j))
end
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-7, 2e-4]);
xlim([1, 1e3]);
end
end
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_6x6_plant.pdf', 'width', 1000, 'height', 1000, 'transparent', false);
#+end_src
#+RESULTS:
[[file:figs/sri2024_6x6_plant.png]]
#+begin_src matlab :exports none :results none
%% Measured transfer function from generated voltages to measured voltage on the force sensors
figure;
tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None');
ax1 = nexttile([2,1]);
hold on;
for i = 1:5
for j = i+1:6
plot(f, abs(G_int_m0(:, i, j)), 'color', [colors(1,:), 0.2], ...
'HandleVisibility', 'off');
end
end
plot(f, abs(G_int_m0(:,1, 1)), 'color', [colors(1,:), 1.0], ...
'DisplayName', '$m = 0$ kg');
for i = 2:6
plot(f, abs(G_int_m0(:,i, i)), 'color', [colors(1,:), 1.0], ...
'HandleVisibility', 'off');
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/V]'); set(gca, 'XTickLabel',[]);
ylim([1e-8, 2e-4]);
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
ax2 = nexttile;
hold on;
for i =1:6
plot(f, 180/pi*unwrapphase(angle(-G_int_m0(:,i, i)), f), 'color', [colors(1,:), 1.0]);
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
yticks(-360:90:360);
ylim([-270, 20])
linkaxes([ax1,ax2],'x');
xlim([1, 1e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_plant_m0.pdf', 'width', 1000, 'height', 1000, 'transparent', false);
#+end_src
#+RESULTS:
[[file:figs/sri2024_plant_m0.png]]
#+begin_src matlab :exports none :results none
%% Measured transfer function from generated voltages to measured voltage on the force sensors
figure;
tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None');
ax1 = nexttile([2,1]);
hold on;
for i = 1:5
for j = i+1:6
plot(f, abs(G_int_m0(:, i, j)), 'color', [colors(1,:), 0.2], ...
'HandleVisibility', 'off');
end
end
plot(f, abs(G_int_m0(:,1, 1)), 'color', [colors(1,:), 1.0], ...
'DisplayName', '$m = 0$ kg');
for i = 2:6
plot(f, abs(G_int_m0(:,i, i)), 'color', [colors(1,:), 1.0], ...
'HandleVisibility', 'off');
end
for i = 1:5
for j = i+1:6
plot(f, abs(G_int_m1(:, i, j)), 'color', [colors(2,:), 0.2], ...
'HandleVisibility', 'off');
end
end
plot(f, abs(G_int_m1(:,1, 1)), 'color', [colors(2,:), 1.0], ...
'DisplayName', '$m = 15$ kg');
for i = 2:6
plot(f, abs(G_int_m1(:,i, i)), 'color', [colors(2,:), 1.0], ...
'HandleVisibility', 'off');
end
for i = 1:5
for j = i+1:6
plot(f, abs(G_int_m2(:, i, j)), 'color', [colors(3,:), 0.2], ...
'HandleVisibility', 'off');
end
end
plot(f, abs(G_int_m2(:,1, 1)), 'color', [colors(3,:), 1.0], ...
'DisplayName', '$m = 30$ kg');
for i = 2:6
plot(f, abs(G_int_m2(:,i, i)), 'color', [colors(3,:), 1.0], ...
'HandleVisibility', 'off');
end
for i = 1:5
for j = i+1:6
plot(f, abs(G_int_m3(:, i, j)), 'color', [colors(4,:), 0.2], ...
'HandleVisibility', 'off');
end
end
plot(f, abs(G_int_m3(:,1, 1)), 'color', [colors(4,:), 1.0], ...
'DisplayName', '$m = 45$ kg');
for i = 2:6
plot(f, abs(G_int_m3(:,i, i)), 'color', [colors(4,:), 1.0], ...
'HandleVisibility', 'off');
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/V]'); set(gca, 'XTickLabel',[]);
ylim([1e-8, 2e-4]);
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
ax2 = nexttile;
hold on;
for i =1:6
plot(f, 180/pi*unwrapphase(angle(-G_int_m0(:,i, i)), f), 'color', [colors(1,:), 1.0]);
plot(f, 180/pi*unwrapphase(angle(-G_int_m1(:,i, i)), f), 'color', [colors(2,:), 1.0]);
plot(f, 180/pi*unwrapphase(angle(-G_int_m2(:,i, i)), f), 'color', [colors(3,:), 1.0]);
plot(f, 180/pi*unwrapphase(angle(-G_int_m3(:,i, i)), f), 'color', [colors(4,:), 1.0]);
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
yticks(-360:90:360);
ylim([-270, 20])
linkaxes([ax1,ax2],'x');
xlim([1, 1e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_plant_m3.pdf', 'width', 1000, 'height', 1000, 'transparent', false);
#+end_src
#+RESULTS:
[[file:figs/sri2024_plant_m3.png]]
** Effect of Active Damping
#+begin_src matlab :exports none
%% Save Identified Plants
load('G_hac.mat', 'G_hac_m0', 'G_hac_m1', 'G_hac_m2', 'G_hac_m3', 'f');
#+end_src
#+begin_src matlab :exports none :results none
%% description
figure;
tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None');
ax1 = nexttile([2,1]);
hold on;
plot(f, abs(G_int_m0(:, 1, 1)), 'color', [colors(1,:)], ...
'DisplayName', '$m = 0$ - OL');
for i = 2:6
plot(f, abs(G_int_m0(:,i, i)), 'color', [colors(1,:)], ...
'HandleVisibility', 'off')
end
plot(f, abs(G_hac_m0(:, 1, 1)), 'color', [colors(2,:)], ...
'DisplayName', '$m = 0$ - Damped');
for i = 2:6
plot(f, abs(G_hac_m0(:,i, i)), 'color', [colors(2,:)], ...
'HandleVisibility', 'off')
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/V]'); set(gca, 'XTickLabel',[]);
ylim([1e-8, 2e-4]);
legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
ax2 = nexttile;
hold on;
for i =1:6
plot(f, 180/pi*unwrapphase(angle(-G_int_m0(:,i, i)), f), 'color', [colors(1,:)]);
end
for i =1:6
plot(f, 180/pi*unwrapphase(angle(G_hac_m0(:,i, i)), f), 'color', [colors(2,:)]);
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
yticks(-360:90:360);
ylim([-270, 20])
linkaxes([ax1,ax2],'x');
xlim([1, 1e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_plant_m0_comp_damped.pdf', 'width', 1000, 'height', 1000, 'transparent', false);
#+end_src
#+RESULTS:
[[file:figs/sri2024_plant_m0_comp_damped.png]]
#+begin_src matlab :exports none :results none
%% Measured transfer function from generated voltages to measured voltage on the force sensors
figure;
tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None');
ax1 = nexttile([2,1]);
hold on;
for i = 1:5
for j = i+1:6
plot(f, abs(G_hac_m0(:, i, j)), 'color', [colors(1,:), 0.2], ...
'HandleVisibility', 'off');
end
end
plot(f, abs(G_hac_m0(:,1, 1)), 'color', [colors(1,:), 1.0], ...
'DisplayName', '$m = 0$ kg');
for i = 2:6
plot(f, abs(G_hac_m0(:,i, i)), 'color', [colors(1,:), 1.0], ...
'HandleVisibility', 'off');
end
for i = 1:5
for j = i+1:6
plot(f, abs(G_hac_m1(:, i, j)), 'color', [colors(2,:), 0.2], ...
'HandleVisibility', 'off');
end
end
plot(f, abs(G_hac_m1(:,1, 1)), 'color', [colors(2,:), 1.0], ...
'DisplayName', '$m = 15$ kg');
for i = 2:6
plot(f, abs(G_hac_m1(:,i, i)), 'color', [colors(2,:), 1.0], ...
'HandleVisibility', 'off');
end
for i = 1:5
for j = i+1:6
plot(f, abs(G_hac_m2(:, i, j)), 'color', [colors(3,:), 0.2], ...
'HandleVisibility', 'off');
end
end
plot(f, abs(G_hac_m2(:,1, 1)), 'color', [colors(3,:), 1.0], ...
'DisplayName', '$m = 30$ kg');
for i = 2:6
plot(f, abs(G_hac_m2(:,i, i)), 'color', [colors(3,:), 1.0], ...
'HandleVisibility', 'off');
end
for i = 1:5
for j = i+1:6
plot(f, abs(G_hac_m3(:, i, j)), 'color', [colors(4,:), 0.2], ...
'HandleVisibility', 'off');
end
end
plot(f, abs(G_hac_m3(:,1, 1)), 'color', [colors(4,:), 1.0], ...
'DisplayName', '$m = 45$ kg');
for i = 2:6
plot(f, abs(G_hac_m3(:,i, i)), 'color', [colors(4,:), 1.0], ...
'HandleVisibility', 'off');
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/V]'); set(gca, 'XTickLabel',[]);
ylim([1e-8, 2e-4]);
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
ax2 = nexttile;
hold on;
for i =1:6
plot(f, 180/pi*unwrapphase(angle(G_hac_m0(:,i, i)), f), 'color', [colors(1,:), 1.0]);
plot(f, 180/pi*unwrapphase(angle(G_hac_m1(:,i, i)), f), 'color', [colors(2,:), 1.0]);
plot(f, 180/pi*unwrapphase(angle(G_hac_m2(:,i, i)), f), 'color', [colors(3,:), 1.0]);
plot(f, 180/pi*unwrapphase(angle(G_hac_m3(:,i, i)), f), 'color', [colors(4,:), 1.0]);
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
yticks(-360:90:360);
ylim([-270, 20])
linkaxes([ax1,ax2],'x');
xlim([1, 1e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_plant_m3_damped.pdf', 'width', 1000, 'height', 1000, 'transparent', false);
#+end_src
#+RESULTS:
[[file:figs/sri2024_plant_m3_damped.png]]
#+begin_src matlab :exports none :results none
%% Measured transfer function from generated voltages to measured voltage on the force sensors
figure;
tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None');
ax1 = nexttile([2,1]);
hold on;
plot(f, abs(G_int_m0(:,1,1)), 'color', [colors(1,:), 0.5], 'DisplayName', 'Undamped');
plot(f, abs(G_hac_m0(:,1,1)), 'color', [colors(2,:), 0.5], 'DisplayName', 'damped');
for i = 1:6
plot(f, abs(G_int_m0(:,i, i)), 'color', [colors(1,:), 0.5], 'HandleVisibility', 'off');
plot(f, abs(G_int_m1(:,i, i)), 'color', [colors(1,:), 0.5], 'HandleVisibility', 'off');
plot(f, abs(G_int_m2(:,i, i)), 'color', [colors(1,:), 0.5], 'HandleVisibility', 'off');
plot(f, abs(G_int_m3(:,i, i)), 'color', [colors(1,:), 0.5], 'HandleVisibility', 'off');
end
for i = 1:6
plot(f, abs(G_hac_m0(:,i, i)), 'color', [colors(2,:), 0.5], 'HandleVisibility', 'off');
plot(f, abs(G_hac_m1(:,i, i)), 'color', [colors(2,:), 0.5], 'HandleVisibility', 'off');
plot(f, abs(G_hac_m2(:,i, i)), 'color', [colors(2,:), 0.5], 'HandleVisibility', 'off');
plot(f, abs(G_hac_m3(:,i, i)), 'color', [colors(2,:), 0.5], 'HandleVisibility', 'off');
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/V]'); set(gca, 'XTickLabel',[]);
legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
ylim([1e-8, 2e-4]);
ax2 = nexttile;
hold on;
for i =1:6
plot(f, 180/pi*unwrapphase(angle(-G_int_m0(:,i, i)), f), 'color', [colors(1,:), 0.5]);
plot(f, 180/pi*unwrapphase(angle(-G_int_m1(:,i, i)), f), 'color', [colors(1,:), 0.5]);
plot(f, 180/pi*unwrapphase(angle(-G_int_m2(:,i, i)), f), 'color', [colors(1,:), 0.5]);
plot(f, 180/pi*unwrapphase(angle(-G_int_m3(:,i, i)), f), 'color', [colors(1,:), 0.5]);
end
for i = 1:6
plot(f, 180/pi*unwrapphase(angle(G_hac_m0(:,i, i)), f), 'color', [colors(2,:), 0.5]);
plot(f, 180/pi*unwrapphase(angle(G_hac_m1(:,i, i)), f), 'color', [colors(2,:), 0.5]);
plot(f, 180/pi*unwrapphase(angle(G_hac_m2(:,i, i)), f), 'color', [colors(2,:), 0.5]);
plot(f, 180/pi*unwrapphase(angle(G_hac_m3(:,i, i)), f), 'color', [colors(2,:), 0.5]);
end
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
yticks(-360:90:360);
ylim([-270, 20])
linkaxes([ax1,ax2],'x');
xlim([1, 1e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_plant_comp_damped_undamped.pdf', 'width', 1000, 'height', 1000, 'transparent', false);
#+end_src
#+RESULTS:
[[file:figs/sri2024_plant_comp_damped_undamped.png]]
** Comparison with the Model
#+begin_src matlab
%% Save Damped Plants
load('Gm.mat', 'Gm_hac_m0', 'Gm_hac_m1', 'Gm_hac_m2', 'Gm_hac_m3');
#+end_src
All elements:
#+begin_src matlab :exports none :results none
%% Measured transfer function from generated voltages to measured voltage on the force sensors
figure;
t = tiledlayout(6, 6, 'TileSpacing', 'compact', 'Padding', 'None');
for i = 1:6
for j = 1:6
nexttile();
hold on;
if i == j
plot(f, abs(G_hac_m0(:, i, j)), 'color', [colors(i,:), 0.5]);
plot(freqs, abs(squeeze(freqresp(Gm_hac_m0(sprintf('eL%i', i), sprintf('u%i', j)), freqs, 'Hz'))), '--', 'color', colors(i,:));
else
plot(f, abs(G_hac_m0(:, i, j)), 'color', [0, 0, 0, 0.5]);
plot(freqs, abs(squeeze(freqresp(Gm_hac_m0(sprintf('eL%i', i), sprintf('u%i', j)), freqs, 'Hz'))), '--', 'color', [0, 0, 0, 1]);
end
hold off;
set(gca, 'XTickLabel',[]);
set(gca, 'YTickLabel',[]);
if j == 1
ylabel(sprintf('$dL_{%i}$', i))
end
if i == 6
xlabel(sprintf('$u_{%i}$', j))
end
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-7, 1e-4]);
xlim([1, 1e3]);
end
end
#+end_src
#+begin_src matlab :exports none :results none
%% Measured transfer function from generated voltages to measured voltage on the force sensors
figure;
t = tiledlayout(6, 6, 'TileSpacing', 'compact', 'Padding', 'None');
for i = 1:6
for j = 1:6
nexttile();
hold on;
if i == j
plot(f, abs(G_hac_m0(:, i, j)), 'color', [colors(1,:), 1]);
plot(freqs, abs(squeeze(freqresp(Gm_hac_m0(sprintf('eL%i', i), sprintf('u%i', j)), freqs, 'Hz'))), 'k-');
else
plot(f, abs(G_hac_m0(:, i, j)), 'color', [colors(1,:), 0.5]);
plot(freqs, abs(squeeze(freqresp(Gm_hac_m0(sprintf('eL%i', i), sprintf('u%i', j)), freqs, 'Hz'))), '-', 'color', [0, 0, 0, 0.5]);
end
hold off;
set(gca, 'XTickLabel',[]);
set(gca, 'YTickLabel',[]);
if j == 1
ylabel(sprintf('$dL_{%i}$', i))
end
if i == 6
xlabel(sprintf('$u_{%i}$', j))
end
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylim([1e-7, 2e-4]);
xlim([1, 1e3]);
end
end
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_comp_plant_model_6x6.pdf', 'width', 1000, 'height', 1000, 'transparent', false);
#+end_src
#+RESULTS:
[[file:figs/sri2024_comp_plant_model_6x6.png]]
Diagonal elements:
#+begin_src matlab :exports none :results none
%% Comparison of the identified HAC plant and the HAC plant extracted from the simscape model
figure;
tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None');
ax1 = nexttile([2,1]);
hold on;
plot(f, abs(G_hac_m0(:, 1, 1)), 'color', [colors(1,:), 0.5], ...
'DisplayName', '$m = 0$ kg');
for i = 2:6
plot(f, abs(G_hac_m0(:,i, i)), 'color', [colors(1,:), 0.5], ...
'HandleVisibility', 'off')
end
plot(f, abs(G_hac_m1(:, 1, 1)), 'color', [colors(2,:), 0.5], ...
'DisplayName', '$m = 15$ kg');
for i = 2:6
plot(f, abs(G_hac_m1(:,i, i)), 'color', [colors(2,:), 0.5], ...
'HandleVisibility', 'off')
end
plot(f, abs(G_hac_m2(:, 1, 1)), 'color', [colors(3,:), 0.5], ...
'DisplayName', '$m = 30$ kg');
for i = 2:6
plot(f, abs(G_hac_m2(:,i, i)), 'color', [colors(3,:), 0.5], ...
'HandleVisibility', 'off')
end
plot(f, abs(G_hac_m3(:, 1, 1)), 'color', [colors(4,:), 0.5], ...
'DisplayName', '$m = 45$ kg');
for i = 2:6
plot(f, abs(G_hac_m3(:,i, i)), 'color', [colors(4,:), 0.5], ...
'HandleVisibility', 'off')
end
plot(freqs, abs(squeeze(freqresp(Gm_hac_m0('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(1,:), ...
'DisplayName', '$m = 0$ kg (model)');
plot(freqs, abs(squeeze(freqresp(Gm_hac_m1('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(2,:), ...
'DisplayName', '$m = 15$ kg (model)');
plot(freqs, abs(squeeze(freqresp(Gm_hac_m2('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(3,:), ...
'DisplayName', '$m = 30$ kg (model)');
plot(freqs, abs(squeeze(freqresp(Gm_hac_m3('eL1', 'u1'), freqs, 'Hz'))), '--', 'color', colors(4,:), ...
'DisplayName', '$m = 45$ kg (model)');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/V]'); set(gca, 'XTickLabel',[]);
ylim([1e-8, 2e-4]);
legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 2);
ax2 = nexttile;
hold on;
plot(f, 180/pi*unwrapphase(angle(G_hac_m0(:,1,1)), f), 'color', [colors(1,:), 0.5]);
for i = 2:6
plot(f, 180/pi*unwrapphase(angle(G_hac_m0(:,i, i)), f), 'color', [colors(1,:), 0.5]);
end
plot(f, 180/pi*unwrapphase(angle(G_hac_m1(:,1,1)), f), 'color', [colors(2,:), 0.5]);
for i = 2:6
plot(f, 180/pi*unwrapphase(angle(G_hac_m1(:,i, i)), f), 'color', [colors(2,:), 0.5]);
end
plot(f, 180/pi*unwrapphase(angle(G_hac_m2(:,1,1)), f), 'color', [colors(3,:), 0.5]);
for i = 2:6
plot(f, 180/pi*unwrapphase(angle(G_hac_m2(:,i, i)), f), 'color', [colors(3,:), 0.5]);
end
plot(f, 180/pi*unwrapphase(angle(G_hac_m3(:,1,1)), f), 'color', [colors(4,:), 0.5]);
for i = 2:6
plot(f, 180/pi*unwrapphase(angle(G_hac_m3(:,i, i)), f), 'color', [colors(4,:), 0.5]);
end
plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(exp(-3e-4*s)*Gm_hac_m0('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(1,:));
plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(exp(-3e-4*s)*Gm_hac_m1('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(2,:));
plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(exp(-3e-4*s)*Gm_hac_m2('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(3,:));
plot(freqs, 180/pi*unwrapphase(angle(squeeze(freqresp(exp(-3e-4*s)*Gm_hac_m3('eL1', 'u1'), freqs, 'Hz'))), f), '--', 'color', colors(4,:));
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
hold off;
yticks(-360:90:360);
ylim([-270, 20])
linkaxes([ax1,ax2],'x');
xlim([1, 1e3]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_comp_plant_model_damped_diag.pdf', 'width', 1000, 'height', 1000, 'transparent', false);
#+end_src
#+RESULTS:
[[file:figs/sri2024_comp_plant_model_damped_diag.png]]
** Tomography scans
#+begin_src matlab :exports none
data_tomo_30rpm_m0 = load(sprintf("%s/scans/2023-08-17_15-26_tomography_30rpm_m0_robust.mat", mat_dir));
data_tomo_30rpm_m0.time = Ts*[0:length(data_tomo_30rpm_m0.Rz)-1];
yztomographymoviesri('movies/sri2024_tomography_30rpm_m0_robust', data_tomo_30rpm_m0, 'xlim_ax1', [-3, 3], 'ylim_ax1', [-1.5, 1.5])
#+end_src
** Dy scan
#+begin_src matlab
%% Slow Ty scan (10um/s)
data_ty_ol_slow = load(sprintf("%s/scans/2023-08-21_20-05_ty_scan_m1_open_loop_slow.mat", mat_dir));
data_ty_ol_slow.time = Ts*[0:length(data_ty_ol_slow.Dy_int)-1];
data_ty_ol_slow.e_dy = detrend(data_ty_ol_slow.e_dy, 0);
data_ty_ol_slow.e_dz = detrend(data_ty_ol_slow.e_dz, 0);
#+end_src
#+begin_src matlab
fig = figure;
tiledlayout(2, 1, 'TileSpacing', 'compact', 'Padding', 'None');
ax1 = nexttile;
hold on;
plot(ax1, 1e6*data_ty_ol_slow.Ty, 1e6*data_ty_ol_slow.e_dy, '-', 'color', [colors(1,:)],'LineWidth',1);
% plot(ax1, 1e6*data_ty_cl_slow.Ty, 1e6*data_ty_cl_slow.e_dy, '-', 'color', [colors(2,:)],'LineWidth',1);
hold off;
set(gca, 'XTickLabel',[]);
ylabel("$D_y$ error [$\mu m$]");
ax2 = nexttile;
hold on;
plot(ax2, 1e6*data_ty_ol_slow.Ty, 1e6*data_ty_ol_slow.e_dz, '-', 'color', [colors(1,:)],'LineWidth',1);
% plot(ax2, 1e6*data_ty_cl_slow.Ty, 1e6*data_ty_cl_slow.e_dz, '-', 'color', [colors(2,:)],'LineWidth',1);
hold off;
xlabel("$D_y$ setpoint [$\mu m$]");
ylabel("Z motion [$\mu m$]");
linkaxes([ax1,ax2],'x');
xlim([-100, 100])
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_ty_scan_ol.pdf', 'width', 600, 'height', 1000, 'transparent', false);
#+end_src
#+name: fig:sri2024_ty_scan_ol
#+caption: description
#+RESULTS:
[[file:figs/sri2024_ty_scan_ol.png]]
#+begin_src matlab
fig = figure;
tiledlayout(2, 1, 'TileSpacing', 'compact', 'Padding', 'None');
ax1 = nexttile;
hold on;
plot(ax1, 1e6*data_ty_ol_slow.Ty, 1e6*data_ty_ol_slow.e_dy, '-', 'color', [colors(1,:)],'LineWidth',1, 'DisplayName', 'OL');
plot(ax1, 1e6*data_ty_cl_slow.Ty, 1e6*data_ty_cl_slow.e_dy, '-', 'color', [colors(2,:)],'LineWidth',1, 'DisplayName', sprintf('CL $\\epsilon_y = %.1f$ nm', 1e9*rms(data_ty_cl_slow.e_dy)));
hold off;
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
set(gca, 'XTickLabel',[]);
ylabel("$D_y$ error [$\mu m$]");
ax2 = nexttile;
hold on;
plot(ax2, 1e6*data_ty_ol_slow.Ty, 1e6*data_ty_ol_slow.e_dz, '-', 'color', [colors(1,:)],'LineWidth',1, 'DisplayName', 'OL');
plot(ax2, 1e6*data_ty_cl_slow.Ty, 1e6*data_ty_cl_slow.e_dz, '-', 'color', [colors(2,:)],'LineWidth',1, 'DisplayName', sprintf('CL $\\epsilon_z = %.1f$ nm', 1e9*rms(data_ty_cl_slow.e_dz)));
hold off;
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
xlabel("$D_y$ setpoint [$\mu m$]");
ylabel("Z motion [$\mu m$]");
linkaxes([ax1,ax2],'x');
xlim([-100, 100])
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_ty_scan_cl.pdf', 'width', 600, 'height', 1000, 'transparent', false);
#+end_src
#+name: fig:sri2024_ty_scan_cl
#+caption: description
#+RESULTS:
[[file:figs/sri2024_ty_scan_cl.png]]
#+begin_src matlab
fig = figure;
tiledlayout(2, 1, 'TileSpacing', 'compact', 'Padding', 'None');
ax1 = nexttile;
hold([ax1,ax2], 'on');
plot(ax1, 1e6*data_ol.Ty, 1e6*data_ol.e_dy, '-', 'color', [colors(1,:)],'LineWidth',1);
plot(ax1, 1e6*data_cl.Ty, 1e6*data_cl.e_dy, '-', 'color', [colors(2,:)],'LineWidth',1);
set(gca, 'XTickLabel',[]);
ylabel("$D_y$ error [$\mu m$]");
ax2 = nexttile;
plot(ax2, 1e6*data_cl.Ty, 1e6*data_cl.e_dz, '-', 'color', [colors(2,:)],'LineWidth',1);
plot(ax2, 1e6*data_ol.Ty, 1e6*data_ol.e_dz, '-', 'color', [colors(1,:)],'LineWidth',1);
xlabel("$D_y$ setpoint [$\mu m$]");
ylabel("Z motion [$\mu m$]");
#+end_src
#+begin_src matlab
dyscanmoviesri('movies/sri2024_ty_ol_slow', data_ty_ol_slow, 'xlim_ax1', [-100, 100], 'ylim_ax1', [-1.5, 1.5], 'xlim_ax2', [-100, 100], 'ylim_ax2', [-1, 1])
#+end_src
#+begin_src matlab
%% Slow Ty scan (10um/s) - CL
data_ty_cl_slow = load(sprintf("%s/scans/2023-08-21_20-07_ty_scan_m1_cf_closed_loop_slow.mat", mat_dir));
data_ty_cl_slow.time = Ts*[0:length(data_ty_cl_slow.Dy_int)-1];
#+end_src
#+begin_src matlab
dyscanclmoviesri('movies/sri2024_ty_cl_slow', data_ty_ol_slow, data_ty_cl_slow, 'xlim_ax1', [-100, 100], 'ylim_ax1', [-1.5, 1.5], 'xlim_ax2', [-100, 100], 'ylim_ax2', [-0.5, 0.5])
#+end_src
** Ry (reflectivity) scan
#+begin_src matlab
%% Load data for the reflectivity scan
data_ry = load(sprintf("%s/scans/2023-08-18_15-24_first_reflectivity_m0.mat", mat_dir));
data_ry.time = Ts*[0:length(data_ry.Ry_int)-1];
#+end_src
#+begin_src matlab
fig = figure;
tiledlayout(2, 1, 'TileSpacing', 'compact', 'Padding', 'None');
ax1 = nexttile;
hold on;
plot(data_ry.time, 1e6*data_ry.Ry_int, 'color', colors(2,:), 'DisplayName', sprintf('$\\epsilon R_y = %.2f$ $\\mu$rad RMS', 1e6*rms(data_ry.e_ry)))
plot(data_ry.time, 1e6*data_ry.m_hexa_ry, 'k--', 'DisplayName', '$R_y$ setpoint')
hold off;
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
set(gca, 'XTickLabel',[]);
ylabel("$R_y$ motion [$\mu$rad]");
ylim([-310, 310])
ax2 = nexttile;
hold on;
plot(data_ry.time, 1e9*data_ry.e_dy, 'DisplayName', sprintf('$\\epsilon D_y = %.0f$ nm RMS', 1e9*rms(data_ry.e_dy)))
plot(data_ry.time, 1e9*data_ry.e_dz, 'DisplayName', sprintf('$\\epsilon D_z = %.0f$ nm RMS', 1e9*rms(data_ry.e_dz)))
hold off;
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
xlabel("Time [s]");
ylabel("$D_y$, $D_z$ motion [nm]");
ylim([-150, 150])
linkaxes([ax1,ax2],'x');
xlim([0, 6.2]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_ry_scan_cl.pdf', 'width', 600, 'height', 1000, 'transparent', false);
#+end_src
#+name: fig:sri2024_ry_scan_cl
#+caption: description
#+RESULTS:
[[file:figs/sri2024_ry_scan_cl.png]]
** Dz scans
#+begin_src matlab
data_dz_10ums = load(sprintf("%s/scans/2023-08-18_15-33_dirty_layer_m0_small.mat", mat_dir));
data_dz_10ums.time = Ts*[0:length(data_dz_10ums.Dz_int)-1];
#+end_src
#+begin_src matlab
data_dz_100ums = load(sprintf("%s/scans/2023-08-18_15-32_dirty_layer_m0.mat", mat_dir));
data_dz_100ums.time = Ts*[0:length(data_dz_100ums.Dz_int)-1];
#+end_src
#+begin_src matlab
fig = figure;
tiledlayout(2, 1, 'TileSpacing', 'compact', 'Padding', 'None');
ax1 = nexttile;
hold on;
plot(data_dz_10ums.time, 1e6*data_dz_10ums.e_ry, ...
'DisplayName', sprintf('$\\epsilon R_y = %.2f$ $\\mu$rad RMS', 1e6*rms(data_dz_10ums.e_ry)))
plot(data_dz_10ums.time, 1e6*data_dz_10ums.e_dy, ...
'DisplayName', sprintf('$\\epsilon D_y = %.0f$ nm RMS', 1e9*rms(data_dz_10ums.e_dy)))
plot(data_dz_10ums.time, 1e6*data_dz_10ums.Dz_int, ...
'DisplayName', sprintf('$\\epsilon D_z = %.0f$ nm RMS', 1e9*rms(data_dz_10ums.e_dz)))
plot(data_dz_10ums.time, 1e6*data_dz_10ums.m_hexa_dz, 'k--', ...
'DisplayName', 'Setpoint, $10\mu$m/s')
hold off;
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
xlabel("Time [s]");
ylabel("Measured motion [$\mu$m, $\mu$rad]");
ylim([-11, 11])
ax2 = nexttile;
hold on;
plot(data_dz_100ums.time, 1e6*data_dz_100ums.e_ry, ...
'DisplayName', sprintf('$\\epsilon R_y = %.2f$ $\\mu$rad RMS', 1e6*rms(data_dz_100ums.e_ry)))
plot(data_dz_100ums.time, 1e6*data_dz_100ums.e_dy, ...
'DisplayName', sprintf('$\\epsilon D_y = %.0f$ nm RMS', 1e9*rms(data_dz_100ums.e_dy)))
plot(data_dz_100ums.time, 1e6*data_dz_100ums.Dz_int, ...
'DisplayName', sprintf('$\\epsilon D_z = %.0f$ nm RMS', 1e9*rms(data_dz_100ums.e_dz)))
plot(data_dz_100ums.time, 1e6*data_dz_100ums.m_hexa_dz, 'k--', ...
'DisplayName', 'Setpoint, $10\mu$m/s')
hold off;
legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
xlabel("Time [s]");
ylabel("Measured motion [$\mu$m, $\mu$rad]");
ylim([-110, 110])
linkaxes([ax1,ax2],'x');
xlim([0, 2.2])
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
exportFig('figs/sri2024_tz_scan_cl.pdf', 'width', 600, 'height', 1000, 'transparent', false);
#+end_src
#+name: fig:sri2024_tz_scan_cl
#+caption: description
#+RESULTS:
[[file:figs/sri2024_tz_scan_cl.png]]
* Helping Functions :noexport: * Helping Functions :noexport:
** =unwrapphase= ** =unwrapphase=
:PROPERTIES: :PROPERTIES:
@ -13135,6 +13891,7 @@ lion.J_int_to_X = [ 0 0 -0.787401574803149 -0.212
#+begin_src matlab #+begin_src matlab
save('./mat/stages.mat', 'lion', '-append'); save('./mat/stages.mat', 'lion', '-append');
#+end_src #+end_src
** Initialize Disturbances ** Initialize Disturbances
:PROPERTIES: :PROPERTIES:
:header-args:matlab+: :tangle ./matlab/src/initializeDisturbances.m :header-args:matlab+: :tangle ./matlab/src/initializeDisturbances.m

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 KiB

134
preamble_extra.tex Normal file
View File

@ -0,0 +1,134 @@
\usepackage{float}
\usepackage{enumitem}
\usepackage{caption,tabularx,booktabs}
\usepackage{bm}
\usepackage{xpatch} % Recommanded for biblatex
\usepackage[ % use biblatex for bibliography
backend=biber, % use biber backend (bibtex replacement) or bibtex
style=ieee, % bib style
hyperref=true, % activate hyperref support
backref=true, % activate backrefs
isbn=false, % don't show isbn tags
url=false, % don't show url tags
doi=false, % don't show doi tags
urldate=long, % display type for dates
maxnames=3, %
minnames=1, %
maxbibnames=5, %
minbibnames=3, %
maxcitenames=2, %
mincitenames=1 %
]{biblatex}
\setlength\bibitemsep{1.1\itemsep}
\usepackage{caption}
\usepackage{subcaption}
\captionsetup[figure]{labelfont=bf}
\captionsetup[subfigure]{labelfont=bf}
\captionsetup[listing]{labelfont=bf}
\captionsetup[table]{labelfont=bf}
\usepackage{xcolor}
\definecolor{my-blue}{HTML}{6b7adb}
\definecolor{my-pale-blue}{HTML}{e6e9f9}
\definecolor{my-red}{HTML}{db6b6b}
\definecolor{my-pale-red}{HTML}{f9e6e6}
\definecolor{my-green}{HTML}{6bdbb6}
\definecolor{my-pale-green}{HTML}{e6f9f3}
\definecolor{my-yellow}{HTML}{dbd26b}
\definecolor{my-pale-yellow}{HTML}{f9f7e6}
\definecolor{my-orange}{HTML}{dba76b}
\definecolor{my-pale-orange}{HTML}{f9f0e6}
\definecolor{my-grey}{HTML}{a3a3a3}
\definecolor{my-pale-grey}{HTML}{f0f0f0}
\definecolor{my-turq}{HTML}{6bc7db}
\definecolor{my-pale-turq}{HTML}{e6f6f9}
\usepackage{inconsolata}
\usepackage[newfloat=true, chapter]{minted}
\usemintedstyle{autumn}
\setminted{frame=lines,breaklines=true,tabsize=4,fontsize=\scriptsize,autogobble=true,labelposition=topline,bgcolor=my-pale-grey}
\setminted[matlab]{label=Matlab}
\setminted[latex]{label=LaTeX}
\setminted[bash]{label=Bash}
\setminted[python]{label=Python}
\setminted[text]{label=Results}
\setminted[md]{label=Org Mode}
\setmintedinline{fontsize=\normalsize,bgcolor=my-pale-grey}
\usepackage[most]{tcolorbox}
\tcbuselibrary{minted}
\newtcolorbox{seealso}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=See Also}
\newtcolorbox{hint}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=Hint}
\newtcolorbox{definition}{enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Definition}
\newtcolorbox{important}{ enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Important}
\newtcolorbox{exampl}[1][]{ enhanced,breakable,colback=my-pale-green,colframe=my-green,fonttitle=\bfseries,title=Example,#1}
\newtcolorbox{exercice}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Exercice}
\newtcolorbox{question}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Question}
\newtcolorbox{answer}{ enhanced,breakable,colback=my-pale-turq,colframe=my-turq,fonttitle=\bfseries,title=Answer}
\newtcolorbox{summary}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Summary}
\newtcolorbox{note}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Note}
\newtcolorbox{caution}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Caution}
\newtcolorbox{warning}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Warning}
\newtcolorbox{my-quote}[1]{%
colback=my-pale-grey,
grow to right by=-10mm,
grow to left by=-10mm,
boxrule=0pt,
boxsep=0pt,
breakable,
enhanced jigsaw,
borderline west={4pt}{0pt}{my-grey}}
\renewenvironment{quote}{\begin{my-quote}}{\end{my-quote}}
\newtcolorbox{my-verse}[1]{%
colback=my-pale-grey,
grow to right by=-10mm,
grow to left by=-10mm,
boxrule=0pt,
boxsep=0pt,
breakable,
enhanced jigsaw,
borderline west={4pt}{0pt}{my-grey}}
\renewenvironment{verse}{\begin{my-verse}}{\end{my-verse}}
\usepackage{environ}% http://ctan.org/pkg/environ
\NewEnviron{aside}{%
\marginpar{\BODY}
}
\renewenvironment{verbatim}{\VerbatimEnvironment\begin{minted}[]{text}}{\end{minted}}
\usepackage{soul}
\sethlcolor{my-pale-grey}
\let\OldTexttt\texttt
\renewcommand{\texttt}[1]{{\ttfamily\hl{\mbox{\,#1\,}}}}
\makeatletter
\preto\Gin@extensions{png,}
\DeclareGraphicsRule{.png}{pdf}{.pdf}{\noexpand\Gin@base.pdf}
\preto\Gin@extensions{gif,}
\DeclareGraphicsRule{.gif}{png}{.png}{\noexpand\Gin@base.png}
\makeatother
\usepackage{hyperref}
\hypersetup{
colorlinks = true,
allcolors = my-blue
}
\usepackage{hypcap}

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,4 +1,4 @@
% Created 2024-11-13 Wed 10:25 % Created 2024-11-13 Wed 17:06
% Intended LaTeX compiler: pdflatex % Intended LaTeX compiler: pdflatex
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt} \documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
@ -54,6 +54,7 @@ High authority control is then applied
\end{figure} \end{figure}
\chapter{Short Stroke Metrology System} \chapter{Short Stroke Metrology System}
\label{sec:org598c753}
\label{sec:test_id31_metrology} \label{sec:test_id31_metrology}
The control of the nano-hexapod requires an external metrology system measuring the relative position of the nano-hexapod top platform with respect to the granite. The control of the nano-hexapod requires an external metrology system measuring the relative position of the nano-hexapod top platform with respect to the granite.
As the long-stroke (\(\approx 1 \,cm^3\)) metrology system was not developed yet, a stroke stroke (\(> 100\,\mu m^3\)) was used instead to validate the nano-hexapod control. As the long-stroke (\(\approx 1 \,cm^3\)) metrology system was not developed yet, a stroke stroke (\(> 100\,\mu m^3\)) was used instead to validate the nano-hexapod control.
@ -91,6 +92,7 @@ This way, the gap between the sensor and the reference sphere is much larger (he
Nevertheless, the metrology system still has limited measurement range, as when the spheres are moving perpendicularly to the beam axis, the reflected light does not coincide with the incident light, and for some perpendicular displacement, the interference is too small to be detected. Nevertheless, the metrology system still has limited measurement range, as when the spheres are moving perpendicularly to the beam axis, the reflected light does not coincide with the incident light, and for some perpendicular displacement, the interference is too small to be detected.
\section{Metrology Kinematics} \section{Metrology Kinematics}
\label{sec:org1981747}
\label{ssec:test_id31_metrology_kinematics} \label{ssec:test_id31_metrology_kinematics}
The developed short-stroke metrology system is schematically shown in Figure \ref{fig:test_id31_metrology_kinematics}. The developed short-stroke metrology system is schematically shown in Figure \ref{fig:test_id31_metrology_kinematics}.
@ -133,6 +135,7 @@ The five equations \eqref{eq:test_id31_metrology_kinematics} can be written in a
\end{equation} \end{equation}
\section{Rough alignment of the reference spheres} \section{Rough alignment of the reference spheres}
\label{sec:orgd2560a6}
\label{ssec:test_id31_metrology_sphere_rought_alignment} \label{ssec:test_id31_metrology_sphere_rought_alignment}
The two reference spheres are aligned with the rotation axis of the spindle. The two reference spheres are aligned with the rotation axis of the spindle.
@ -147,6 +150,7 @@ This is probably limited due to the poor coaxiality between the cylinders and th
However, the alignment precision should be enough to stay in the acceptance of the interferometers. However, the alignment precision should be enough to stay in the acceptance of the interferometers.
\section{Tip-Tilt adjustment of the interferometers} \section{Tip-Tilt adjustment of the interferometers}
\label{sec:orgb663f66}
\label{ssec:test_id31_metrology_alignment} \label{ssec:test_id31_metrology_alignment}
The short stroke metrology system is placed on top of the main granite using a gantry made of granite blocs to have good vibration and thermal stability (Figure \ref{fig:short_stroke_metrology_overview}). The short stroke metrology system is placed on top of the main granite using a gantry made of granite blocs to have good vibration and thermal stability (Figure \ref{fig:short_stroke_metrology_overview}).
@ -165,6 +169,7 @@ This is equivalent as to optimize the perpendicularity between the interferomete
The lateral sensor heads (i.e. all except the top one), which are each fixed to a custom tip-tilt adjustment mechanism, are individually oriented such that the coupling efficient is maximized. The lateral sensor heads (i.e. all except the top one), which are each fixed to a custom tip-tilt adjustment mechanism, are individually oriented such that the coupling efficient is maximized.
\section{Fine Alignment of reference spheres using interferometers} \section{Fine Alignment of reference spheres using interferometers}
\label{sec:orgde2bc57}
\label{ssec:test_id31_metrology_sphere_fine_alignment} \label{ssec:test_id31_metrology_sphere_fine_alignment}
Thanks to the good alignment of the two reference spheres with the spindle axis and to the fine adjustment of the interferometers orientations, the interferometer measurement is made possible during complete spindle rotation. Thanks to the good alignment of the two reference spheres with the spindle axis and to the fine adjustment of the interferometers orientations, the interferometer measurement is made possible during complete spindle rotation.
@ -196,6 +201,7 @@ Remaining error after alignment is in the order of \(\pm5\,\mu\text{rad}\) for a
\section{Estimated measurement volume} \section{Estimated measurement volume}
\label{sec:org88488f3}
\label{ssec:test_id31_metrology_acceptance} \label{ssec:test_id31_metrology_acceptance}
Because the interferometers are pointing to spheres and not flat surfaces, the lateral acceptance is limited. Because the interferometers are pointing to spheres and not flat surfaces, the lateral acceptance is limited.
@ -222,6 +228,7 @@ The obtained lateral acceptance for pure displacements in any direction is estim
\section{Estimated measurement errors} \section{Estimated measurement errors}
\label{sec:org9791179}
\label{ssec:test_id31_metrology_errors} \label{ssec:test_id31_metrology_errors}
When using the NASS, the accuracy of the sample's positioning is linked to the accuracy of the external metrology. When using the NASS, the accuracy of the sample's positioning is linked to the accuracy of the external metrology.
@ -236,6 +243,7 @@ As the interferometer is pointing to a sphere and not to a plane, lateral motion
Then, the reference spheres have some deviations with respect to an ideal sphere. Then, the reference spheres have some deviations with respect to an ideal sphere.
They are meant to be used with capacitive sensors which are integrating the shape errors over large surfaces. They are meant to be used with capacitive sensors which are integrating the shape errors over large surfaces.
When using interferometers, the size of the ``light spot'' on the sphere surface is a circle with a diameter \(\approx 50\,\mu m\), therefore the system is more sensitive to shape errors with small features. When using interferometers, the size of the ``light spot'' on the sphere surface is a circle with a diameter \(\approx 50\,\mu m\), therefore the system is more sensitive to shape errors with small features.
As the interferometer light is travelling in air, the measured distance is sensitive to any variation in the refractive index of the air. As the interferometer light is travelling in air, the measured distance is sensitive to any variation in the refractive index of the air.
Therefore, any variation of air temperature, pressure or humidity will induce measurement errors. Therefore, any variation of air temperature, pressure or humidity will induce measurement errors.
For a measurement length of \(40\,mm\), a temperature variation of \(0.1\,{}^oC\) induces an errors in the distance measurement of \(\approx 4\,nm\). For a measurement length of \(40\,mm\), a temperature variation of \(0.1\,{}^oC\) induces an errors in the distance measurement of \(\approx 4\,nm\).
@ -259,5 +267,164 @@ The effect of the noise on the translation and rotation measurements is estimate
\caption{\label{fig:test_id31_metrology_errors}Estimated measurement errors of the metrology. Cross-coupling between lateral motion and vertical measurement is shown in (\subref{fig:test_id31_xy_map_sphere}). Effect of interferometer noise on the measured translations and rotations is shown in (\subref{fig:test_id31_interf_noise}).} \caption{\label{fig:test_id31_metrology_errors}Estimated measurement errors of the metrology. Cross-coupling between lateral motion and vertical measurement is shown in (\subref{fig:test_id31_xy_map_sphere}). Effect of interferometer noise on the measured translations and rotations is shown in (\subref{fig:test_id31_interf_noise}).}
\end{figure} \end{figure}
\chapter{Identified Open Loop Plant}
\label{sec:org7b9ff96}
\label{sec:test_id31_open_loop_plant}
\section{First Open-Loop Plant Identification}
\label{sec:orgd1bd080}
\label{ssec:test_id31_open_loop_plant_first_id}
The plant dynamics is first identified for a fixed spindle angle (at \(0\,\text{deg}\)) and without any payload.
The model dynamics is also identified in the same conditions.
A first comparison between the model and the measured dynamics is done in Figure \ref{fig:test_id31_first_id}.
A good match can be observed for the diagonal dynamics (except the high frequency modes which are not modeled).
However, the coupling for the transfer function from command signals \(\mathbf{u}\) to estimated strut motion from the external metrology \(e\mathbf{\mathcal{L}}\) is larger than expected (Figure \ref{fig:test_id31_first_id_int}).
\begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/test_id31_first_id_int.png}
\end{center}
\subcaption{\label{fig:test_id31_first_id_int}External Metrology}
\end{subfigure}
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/test_id31_first_id_iff.png}
\end{center}
\subcaption{\label{fig:test_id31_first_id_iff}Force Sensors}
\end{subfigure}
\caption{\label{fig:test_id31_first_id}Comparison between the measured dynamics and the multi-body model dynamics. Both for the external metrology (\subref{fig:test_id31_first_id_int}) and force sensors (\subref{fig:test_id31_first_id_iff}).}
\end{figure}
\section{Better Angular Alignment}
\label{sec:org205ba5e}
\label{ssec:test_id31_open_loop_plant_rz_alignment}
One possible explanation of the increased coupling observed in Figure \ref{fig:test_id31_first_id_int} is the poor alignment between the external metrology axes (i.e. the interferometer supports) and the nano-hexapod axes.
To estimate this alignment, a decentralized low-bandwidth feedback controller based on the nano-hexapod encoders is implemented.
This allowed to perform two straight movements of the nano-hexapod along the \(x\) and \(y\) axes in the frame of the nano-hexapod.
During these two movements, the external metrology measurement is recorded and shown in Figure \ref{fig:test_id31_Rz_align_error}.
It was found that there is a misalignment of 2.7 degrees (rotation along the vertical axis) between the interferometer axes and nano-hexapod axes.
This was corrected by adding an offset to the spindle angle.
To check that the alignment has improved, the same movement was performed using the nano-hexapod while recording the signal of the external metrology.
Results shown in Figure \ref{fig:test_id31_Rz_align_correct} are indeed indicating much better alignment.
\begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/test_id31_Rz_align_error.png}
\end{center}
\subcaption{\label{fig:test_id31_Rz_align_error}Before alignment}
\end{subfigure}
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,scale=1]{figs/test_id31_Rz_align_correct.png}
\end{center}
\subcaption{\label{fig:test_id31_Rz_align_correct}After alignment}
\end{subfigure}
\caption{\label{fig:test_id31_Rz_align_error}Measurement of the Nano-Hexapod axes in the frame of the external metrology. Before alignment (\subref{fig:test_id31_Rz_align_error}) and after alignment (\subref{fig:test_id31_Rz_align_correct}).}
\end{figure}
\section{Open-Loop Identification after alignment}
\label{sec:orgcb4c885}
\label{ssec:test_id31_open_loop_plant_after_alignment}
The plant dynamics is identified after the fine alignment and is compared with the model dynamics in Figure \ref{fig:test_id31_first_id_int_better_rz_align}.
Compared to the initial identification shown in Figure \ref{fig:test_id31_first_id_int}, the obtained coupling has decreased and is close to the coupling obtained with the multi-body model.
\begin{figure}[htbp]
\centering
\includegraphics[scale=1]{figs/test_id31_first_id_int_better_rz_align.png}
\caption{\label{fig:test_id31_first_id_int_better_rz_align}Decrease of the coupling with better Rz alignment}
\end{figure}
\section{Effect of Payload Mass}
\label{sec:org497746b}
\label{ssec:test_id31_open_loop_plant_mass}
The system dynamics was identified with four payload conditions that are shown in Figure \ref{fig:test_id31_picture_masses}.
The obtained direct terms are compared with the model dynamics in Figure \ref{fig:test_nhexa_comp_simscape_diag_masses}.
\begin{figure}[htbp]
\begin{subfigure}{0.24\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.99\linewidth]{figs/test_id31_picture_mass_m0.jpg}
\end{center}
\subcaption{\label{fig:test_id31_picture_mass_m0}$m=0\,\text{kg}$}
\end{subfigure}
\begin{subfigure}{0.24\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.99\linewidth]{figs/test_id31_picture_mass_m1.jpg}
\end{center}
\subcaption{\label{fig:test_id31_picture_mass_m1}$m=13\,\text{kg}$}
\end{subfigure}
\begin{subfigure}{0.24\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.99\linewidth]{figs/test_id31_picture_mass_m2.jpg}
\end{center}
\subcaption{\label{fig:test_id31_picture_mass_m2}$m=26\,\text{kg}$}
\end{subfigure}
\begin{subfigure}{0.24\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.99\linewidth]{figs/test_id31_picture_mass_m3.jpg}
\end{center}
\subcaption{\label{fig:test_id31_picture_mass_m3}$m=39\,\text{kg}$}
\end{subfigure}
\caption{\label{fig:test_id31_picture_masses}The four tested payload conditions. (\subref{fig:test_id31_picture_mass_m0}) without payload. (\subref{fig:test_id31_picture_mass_m1}) with \(13\,\text{kg}\) payload. (\subref{fig:test_id31_picture_mass_m2}) with \(26\,\text{kg}\) payload. (\subref{fig:test_id31_picture_mass_m3}) with \(39\,\text{kg}\) payload.}
\end{figure}
\begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/test_id31_comp_simscape_int_diag_masses.png}
\end{center}
\subcaption{\label{fig:test_id31_comp_simscape_int_diag_masses}from $u$ to $d_e$}
\end{subfigure}
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/test_id31_comp_simscape_iff_diag_masses.png}
\end{center}
\subcaption{\label{fig:test_id31_comp_simscape_iff_diag_masses}from $u$ to $V_s$}
\end{subfigure}
\caption{\label{fig:test_nhexa_comp_simscape_diag_masses}Comparison of the diagonal elements (i.e. ``direct'' terms) of the measured FRF matrix and the dynamics identified from the Simscape model. Both for the dynamics from \(u\) to \(e\mathcal{L}\) (\subref{fig:test_id31_comp_simscape_int_diag_masses}) and from \(u\) to \(V_s\) (\subref{fig:test_id31_comp_simscape_iff_diag_masses})}
\end{figure}
\section{Effect of Rotation}
\label{sec:orgff15d08}
\label{ssec:test_id31_open_loop_plant_rotation}
The dynamics was then identified while the Spindle was rotating at constant velocity.
Three identification experiments were performed: no spindle rotation, spindle rotation at \(36\,\text{deg}/s\) and at \(180\,\text{deg}/s\).
The comparison of the obtained dynamics from command signal \(u\) to estimated strut error \(e\mathcal{L}\) is done in Figure \ref{fig:test_id31_effect_rotation}.
Both direct terms (Figure \ref{fig:test_id31_effect_rotation_direct}) and coupling terms (Figure \ref{fig:test_id31_effect_rotation_coupling}) are unaffected by the rotation.
The same can be observed for the dynamics from the command signal to the encoders and to the force sensors.
This confirms that the rotation has no significant effect on the plant dynamics.
This also indicates that the metrology kinematics is correct and is working in real time.
\begin{figure}[htbp]
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/test_id31_effect_rotation_direct.png}
\end{center}
\subcaption{\label{fig:test_id31_effect_rotation_direct}Direct terms}
\end{subfigure}
\begin{subfigure}{0.49\textwidth}
\begin{center}
\includegraphics[scale=1,width=0.95\linewidth]{figs/test_id31_effect_rotation_coupling.png}
\end{center}
\subcaption{\label{fig:test_id31_effect_rotation_coupling}Coupling terms}
\end{subfigure}
\caption{\label{fig:test_id31_effect_rotation}Effect of the spindle rotation on the plant dynamics from \(u\) to \(e\mathcal{L}\). Three rotational velocities are tested (\(0\,\text{deg}/s\), \(36\,\text{deg}/s\) and \(180\,\text{deg}/s\)). Both direct terms (\subref{fig:test_id31_effect_rotation_direct}) and coupling terms (\subref{fig:test_id31_effect_rotation_coupling}) are displayed.}
\end{figure}
\section{Conclusion}
\label{sec:orgd703c88}
\begin{itemize}
\item Good match between the model and experiment
\end{itemize}
\printbibliography[heading=bibintoc,title={Bibliography}] \printbibliography[heading=bibintoc,title={Bibliography}]
\end{document} \end{document}