Add Complementary Filter Control
This commit is contained in:
parent
dcd3905c61
commit
04b9d7652b
1996
figs/inkscape/test_id31_cf_control.svg
Normal file
1996
figs/inkscape/test_id31_cf_control.svg
Normal file
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 180 KiB |
BIN
figs/test_id31_cf_control.pdf
Normal file
BIN
figs/test_id31_cf_control.pdf
Normal file
Binary file not shown.
BIN
figs/test_id31_cf_control.png
Normal file
BIN
figs/test_id31_cf_control.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
2299
figs/test_id31_cf_control_alpha.pdf
Normal file
2299
figs/test_id31_cf_control_alpha.pdf
Normal file
File diff suppressed because it is too large
Load Diff
BIN
figs/test_id31_cf_control_alpha.png
Normal file
BIN
figs/test_id31_cf_control_alpha.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 70 KiB |
BIN
figs/test_id31_cf_control_dy_dz_diff.pdf
Normal file
BIN
figs/test_id31_cf_control_dy_dz_diff.pdf
Normal file
Binary file not shown.
BIN
figs/test_id31_cf_control_dy_dz_diff.png
Normal file
BIN
figs/test_id31_cf_control_dy_dz_diff.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 55 KiB |
BIN
figs/test_id31_high_bandwidth_S.pdf
Normal file
BIN
figs/test_id31_high_bandwidth_S.pdf
Normal file
Binary file not shown.
BIN
figs/test_id31_high_bandwidth_S.png
Normal file
BIN
figs/test_id31_high_bandwidth_S.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 55 KiB |
BIN
figs/test_id31_high_bandwidth_T.pdf
Normal file
BIN
figs/test_id31_high_bandwidth_T.pdf
Normal file
Binary file not shown.
BIN
figs/test_id31_high_bandwidth_T.png
Normal file
BIN
figs/test_id31_high_bandwidth_T.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 58 KiB |
BIN
matlab/mat/2023-08-21_14-09_m0_cf_inv_tustin.mat
Normal file
BIN
matlab/mat/2023-08-21_14-09_m0_cf_inv_tustin.mat
Normal file
Binary file not shown.
BIN
matlab/mat/2023-08-21_14-19_m0_cf_inv_tustin_Dz_60Hz_a_20.mat
Normal file
BIN
matlab/mat/2023-08-21_14-19_m0_cf_inv_tustin_Dz_60Hz_a_20.mat
Normal file
Binary file not shown.
BIN
matlab/mat/2023-08-21_14-20_m0_cf_inv_tustin_Dy_60Hz_a_20.mat
Normal file
BIN
matlab/mat/2023-08-21_14-20_m0_cf_inv_tustin_Dy_60Hz_a_20.mat
Normal file
Binary file not shown.
BIN
matlab/mat/2023-08-21_17-56_m2_cf_10Hz_a2.mat
Normal file
BIN
matlab/mat/2023-08-21_17-56_m2_cf_10Hz_a2.mat
Normal file
Binary file not shown.
BIN
matlab/mat/2023-08-21_17-58_m2_cf_10Hz_a05.mat
Normal file
BIN
matlab/mat/2023-08-21_17-58_m2_cf_10Hz_a05.mat
Normal file
Binary file not shown.
@ -934,6 +934,129 @@ data_dt_1000ums.Dy_rms_cl = rms(detrend(data_dt_1000ums.Dy_int(i_dt_1000ums)-dat
|
||||
data_dt_1000ums.Dz_rms_cl = rms(detrend(data_dt_1000ums.Dz_int(i_dt_1000ums), 0));
|
||||
data_dt_1000ums.Ry_rms_cl = rms(detrend(data_dt_1000ums.Ry_int(i_dt_1000ums), 0));
|
||||
|
||||
%% Complementary Filter Control - Experimental Validation
|
||||
% Parameters to analyze results in the frequency domain
|
||||
Ts = 1e-4; % Sampling Time [s]
|
||||
Nfft = floor(2.0/Ts);
|
||||
win = hanning(Nfft);
|
||||
Noverlap = floor(Nfft/2);
|
||||
|
||||
%% Closed-Loop performance identification (S and T transfer functions)
|
||||
% Different parameters w0 in different directions
|
||||
data = load("2023-08-21_14-09_m0_cf_inv_tustin.mat");
|
||||
|
||||
[S_dy, f] = tfestimate(data.Dy.id_cl, data.Dy.e_dy, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_dy, ~] = tfestimate(data.Dy.id_cl, data.Dy.Dy_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
[S_dz, ~] = tfestimate(data.Dz.id_cl, data.Dz.e_dz, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_dz, ~] = tfestimate(data.Dz.id_cl, data.Dz.Dz_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
[S_ry, ~] = tfestimate(data.Ry.id_cl, data.Ry.e_ry, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_ry, ~] = tfestimate(data.Ry.id_cl, data.Ry.Ry_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
%% Obtained Closed-Loop transfer functions - Different Complementary filters for Dy and Dz
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, abs(S_dy), '-', 'color', colors(1,:),'DisplayName', '$S_{D_y}$');
|
||||
plot(f, abs(S_dz), '-', 'color', colors(2,:),'DisplayName', '$S_{D_z}$');
|
||||
plot(f, abs(S_ry), '-', 'color', colors(3,:),'DisplayName', '$S_{R_y}$');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||
ylim([1e-3, 5]);
|
||||
xlim([1, 1e3]);
|
||||
leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 18;
|
||||
|
||||
%% Effect of a change of complementary filter parameter alpha
|
||||
% w0 = 10, alpha = 2
|
||||
data_a2 = load("2023-08-21_17-56_m2_cf_10Hz_a2.mat");
|
||||
|
||||
[S_a2, ~] = tfestimate(data_a2.Dy.id_cl, data_a2.Dy.e_dy, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_a2, ~] = tfestimate(data_a2.Dy.id_cl, data_a2.Dy.Dy_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
% Analytical formulas
|
||||
w0 = 2*pi*10;
|
||||
alpha = 2;
|
||||
Hh_a2 = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
Hl_a2 = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
|
||||
% w0 = 10, alpha = 0.5
|
||||
data_a05 = load("2023-08-21_17-58_m2_cf_10Hz_a05.mat");
|
||||
|
||||
[S_a05, ~] = tfestimate(data_a05.Dz.id_cl, data_a05.Dz.e_dz, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_a05, ~] = tfestimate(data_a05.Dz.id_cl, data_a05.Dz.Dz_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
% Analytical formulas
|
||||
w0 = 2*pi*10;
|
||||
alpha = 0.5;
|
||||
Hh_a05 = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
Hl_a05 = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
|
||||
%% Obtained Closed-Loop transfer functions - Effect of changing alpha
|
||||
figure;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(Hh_a2, freqs, 'Hz'))), '--', 'color', colors(1,:),'DisplayName', '$\alpha = 2$, $H_H$, $H_L$');
|
||||
plot(f, abs(S_a2), '-', 'color', [colors(1,:), 0.5], 'linewidth', 2.5,'DisplayName', '$\alpha = 2$, $S$, $T$');
|
||||
plot(freqs, abs(squeeze(freqresp(Hh_a05, freqs, 'Hz'))), '--', 'color', colors(2,:),'DisplayName', '$\alpha = 0.5$, $H_H$, $H_L$');
|
||||
plot(f, abs(S_a05), '-', 'color', [colors(2,:), 0.5], 'linewidth', 2.5,'DisplayName', '$\alpha = 0.5$, $S$, $T$');
|
||||
plot(freqs, abs(squeeze(freqresp(Hl_a2, freqs, 'Hz'))), '--', 'color', colors(1,:), 'HandleVisibility', 'off');
|
||||
plot(f, abs(T_a2), '-', 'color', [colors(1,:), 0.5], 'linewidth', 2.5, 'HandleVisibility', 'off');
|
||||
plot(freqs, abs(squeeze(freqresp(Hl_a05, freqs, 'Hz'))), '--', 'color', colors(2,:), 'HandleVisibility', 'off');
|
||||
plot(f, abs(T_a05), '-', 'color', [colors(2,:), 0.5], 'linewidth', 2.5, 'HandleVisibility', 'off');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||
xlim([1, 1e3]);
|
||||
ylim([1e-3, 5]);
|
||||
leg = legend('location', 'south', 'FontSize', 8, 'NumColumns', 2);
|
||||
leg.ItemTokenSize(1) = 18;
|
||||
|
||||
%% Trying high bandwidth controllers - 60Hz
|
||||
% Z direction
|
||||
data = load("2023-08-21_14-19_m0_cf_inv_tustin_Dz_60Hz_a_20.mat");
|
||||
[S_dz, ~] = tfestimate(data.Dz.id_cl, data.Dz.e_dz, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_dz, ~] = tfestimate(data.Dz.id_cl, data.Dz.Dz_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
% Y direction
|
||||
data = load("2023-08-21_14-20_m0_cf_inv_tustin_Dy_60Hz_a_20.mat");
|
||||
[S_dy, ~] = tfestimate(data.Dy.id_cl, data.Dy.e_dy, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_dy, ~] = tfestimate(data.Dy.id_cl, data.Dy.Dy_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
% Analytical formulas
|
||||
w0 = 2*pi*60;
|
||||
alpha = 2;
|
||||
Hh_60Hz = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
Hl_60Hz = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
|
||||
%% Bode plot of the Weighting filters and Obtained complementary filters
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, abs(S_dy), '-', 'color', colors(1,:), 'DisplayName', '$S$, $D_y$');
|
||||
plot(f, abs(S_dz), '-', 'color', colors(2,:), 'DisplayName', '$S$, $D_z$');
|
||||
plot(freqs, abs(squeeze(freqresp(Hh_60Hz, freqs, 'Hz'))), 'k--','DisplayName', '$H_H$');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||
xlim([1, 1e3]);
|
||||
ylim([3e-4, 5]);
|
||||
leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 18;
|
||||
|
||||
%% Bode plot of the Weighting filters and Obtained complementary filters
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, abs(T_dy), '-', 'color', colors(1,:), 'DisplayName', '$T$, $D_y$');
|
||||
plot(f, abs(T_dz), '-', 'color', colors(2,:), 'DisplayName', '$T$, $D_z$');
|
||||
plot(freqs, abs(squeeze(freqresp(Hl_60Hz, freqs, 'Hz'))), 'k--','DisplayName', '$H_L$');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||
xlim([1, 1e3]);
|
||||
ylim([3e-4, 5]);
|
||||
leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 18;
|
||||
|
||||
%% Summary of results
|
||||
% 1e9*data_tomo_m0_Wz6.Dy_rms_ol, 1e9*data_tomo_m0_Wz6.Dz_rms_ol, 1e6*data_tomo_m0_Wz6.Ry_rms_ol; % Tomo - OL - 6deg/s - 0kg
|
||||
% 1e9*data_tomo_m0_Wz6.Dy_rms_cl, 1e9*data_tomo_m0_Wz6.Dz_rms_cl, 1e6*data_tomo_m0_Wz6.Ry_rms_cl; % Tomo - CL - 6deg/s - 0kg
|
||||
|
@ -3529,6 +3529,7 @@ Several scientific experiments were replicated, such as:
|
||||
- Diffraction Tomography:continuous $R_z$ rotation using the Spindle and lateral $D_y$ scans performed at the same time using the translation stage (Section ref:ssec:test_id31_scans_diffraction_tomo)
|
||||
|
||||
Unless explicitly stated, all closed-loop experiments were performed using the robust (i.e. conservative) high authority controller designed in Section ref:ssec:test_id31_iff_hac_controller.
|
||||
Higher performance controllers using complementary filters are investigated in Section ref:ssec:test_id31_cf_control.
|
||||
|
||||
For each experiment, the obtained performances are compared to the specifications for the most demanding case in which nano-focusing optics are used to focus the beam down to $200\,nm\times 100\,nm$.
|
||||
In this case, the goal is to keep the sample's point of interest in the beam, and therefore the $D_y$ and $D_z$ positioning errors should be less than $200\,nm$ and $100\,nm$ peak-to-peak, respectively.
|
||||
@ -3942,7 +3943,7 @@ data_tomo_m0_Wz180.Ry_rms_ol = rms(data_tomo_m0_Wz180.Ry_int(1:i_m0) - (y0 + R*s
|
||||
|
||||
A comparative analysis was conducted using three tomography scans at $180\,\text{deg/s}$ to evaluate the effectiveness of the HAC-LAC strategy in reducing positioning errors.
|
||||
The scans were performed under three conditions: open-loop, with decentralized IFF control, and with the complete HAC-LAC strategy.
|
||||
For these specific measurements, an enhanced high authority controller was optimized for low payload masses to meet the performance requirements.
|
||||
For this specific measurement, an enhanced high authority controller (discussed in Section ref:ssec:test_id31_cf_control) was optimized for low payload masses to meet the performance requirements.
|
||||
|
||||
Figure ref:fig:test_id31_hac_cas_cl presents the cumulative amplitude spectra of the position errors for all three cases.
|
||||
The results reveal two distinct control contributions: the decentralized IFF effectively attenuates vibrations near the nano-hexapod suspension modes (an achievement not possible with HAC alone), while the high authority controller suppresses low-frequency vibrations primarily arising from Spindle guiding errors.
|
||||
@ -5041,6 +5042,236 @@ data_dt_1000ums.Dz_rms_cl = rms(detrend(data_dt_1000ums.Dz_int(i_dt_1000ums), 0)
|
||||
data_dt_1000ums.Ry_rms_cl = rms(detrend(data_dt_1000ums.Ry_int(i_dt_1000ums), 0));
|
||||
#+end_src
|
||||
|
||||
** Feedback control using Complementary Filters
|
||||
<<ssec:test_id31_cf_control>>
|
||||
|
||||
# TODO - Add link to section
|
||||
A control architecture utilizing complementary filters to shape the closed-loop transfer functions was proposed during the detail design phase.
|
||||
Experimental validation of this architecture using the NASS is presented herein.
|
||||
|
||||
Given that performance requirements are specified in the Cartesian frame, decoupling of the plant within this frame was achieved using Jacobian matrices.
|
||||
Consequently, the control space comprises the directions $D_x$, $D_y$, $D_z$, $R_x$, and $R_y$.
|
||||
Control performance in each of these directions can be tuned independently.
|
||||
A schematic of the proposed control architecture is illustrated in Figure\nbsp{}ref:fig:test_id31_cf_control.
|
||||
|
||||
#+name: fig:test_id31_cf_control
|
||||
#+caption: Control architecture in the Cartesian frame. Only the controller corresponding to the $D_z$ direction is shown. $H_L$ and $H_H$ are complementary filters.
|
||||
[[file:figs/test_id31_cf_control.png]]
|
||||
|
||||
|
||||
# TODO - Add link to 2DoF model
|
||||
Implementation of this control architecture necessitates a plant model, which must subsequently be inverted.
|
||||
This plant model was derived from the multi-body model incorporating the previously detailed 2-DoF APA model, such that the model order stays relatively low.
|
||||
Proposed analytical formulas for complementary filters having $40\,\text{dB/dec}$ were used during this experimental validation.
|
||||
# TODO - Add link to the analytical formulas
|
||||
|
||||
An initial experimental validation was conducted under no-payload conditions, with control applied solely to the $D_y$, $D_z$, and $R_y$ directions.
|
||||
Increased control bandwidth was achieved for the $D_z$ and $R_y$ directions through appropriate tuning of the parameter $\omega_0$.
|
||||
The experimentally measured closed-loop sensitivity transfer functions corresponding to these three controlled directions are presented in Figure ref:fig:test_id31_cf_control_dy_dz_diff.
|
||||
|
||||
#+begin_src matlab
|
||||
%% Complementary Filter Control - Experimental Validation
|
||||
% Parameters to analyze results in the frequency domain
|
||||
Ts = 1e-4; % Sampling Time [s]
|
||||
Nfft = floor(2.0/Ts);
|
||||
win = hanning(Nfft);
|
||||
Noverlap = floor(Nfft/2);
|
||||
|
||||
%% Closed-Loop performance identification (S and T transfer functions)
|
||||
% Different parameters w0 in different directions
|
||||
data = load("2023-08-21_14-09_m0_cf_inv_tustin.mat");
|
||||
|
||||
[S_dy, f] = tfestimate(data.Dy.id_cl, data.Dy.e_dy, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_dy, ~] = tfestimate(data.Dy.id_cl, data.Dy.Dy_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
[S_dz, ~] = tfestimate(data.Dz.id_cl, data.Dz.e_dz, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_dz, ~] = tfestimate(data.Dz.id_cl, data.Dz.Dz_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
[S_ry, ~] = tfestimate(data.Ry.id_cl, data.Ry.e_ry, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_ry, ~] = tfestimate(data.Ry.id_cl, data.Ry.Ry_int, win, Noverlap, Nfft, 1/Ts);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Obtained Closed-Loop transfer functions - Different Complementary filters for Dy and Dz
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, abs(S_dy), '-', 'color', colors(1,:),'DisplayName', '$S_{D_y}$');
|
||||
plot(f, abs(S_dz), '-', 'color', colors(2,:),'DisplayName', '$S_{D_z}$');
|
||||
plot(f, abs(S_ry), '-', 'color', colors(3,:),'DisplayName', '$S_{R_y}$');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||
ylim([1e-3, 5]);
|
||||
xlim([1, 1e3]);
|
||||
leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 18;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/test_id31_cf_control_dy_dz_diff.pdf', 'width', 'half', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
Another test was conducted with a $26\,\text{kg}$ payload.
|
||||
For this configuration, complementary filters were implemented with $\omega_0 = 2\pi \cdot 10\,\text{rad/s}$, and parameter $\alpha$ was varied.
|
||||
The resulting experimentally obtained closed-loop transfer functions are compared against the theoretical complementary filter responses in Figure\nbsp{}ref:fig:test_id31_cf_control_alpha.
|
||||
As illustrated in the figure, a close correspondence between the measured closed-loop responses and the target complementary filter magnitude was observed.
|
||||
It also shows that the parameter $\alpha$ provides a mechanism for managing the trade-off between low-frequency disturbance rejection performance and the potential amplification of disturbances within the crossover frequency region.
|
||||
|
||||
#+begin_src matlab
|
||||
%% Effect of a change of complementary filter parameter alpha
|
||||
% w0 = 10, alpha = 2
|
||||
data_a2 = load("2023-08-21_17-56_m2_cf_10Hz_a2.mat");
|
||||
|
||||
[S_a2, ~] = tfestimate(data_a2.Dy.id_cl, data_a2.Dy.e_dy, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_a2, ~] = tfestimate(data_a2.Dy.id_cl, data_a2.Dy.Dy_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
% Analytical formulas
|
||||
w0 = 2*pi*10;
|
||||
alpha = 2;
|
||||
Hh_a2 = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
Hl_a2 = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
|
||||
% w0 = 10, alpha = 0.5
|
||||
data_a05 = load("2023-08-21_17-58_m2_cf_10Hz_a05.mat");
|
||||
|
||||
[S_a05, ~] = tfestimate(data_a05.Dz.id_cl, data_a05.Dz.e_dz, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_a05, ~] = tfestimate(data_a05.Dz.id_cl, data_a05.Dz.Dz_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
% Analytical formulas
|
||||
w0 = 2*pi*10;
|
||||
alpha = 0.5;
|
||||
Hh_a05 = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
Hl_a05 = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Obtained Closed-Loop transfer functions - Effect of changing alpha
|
||||
figure;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(Hh_a2, freqs, 'Hz'))), '--', 'color', colors(1,:),'DisplayName', '$\alpha = 2$, $H_H$, $H_L$');
|
||||
plot(f, abs(S_a2), '-', 'color', [colors(1,:), 0.5], 'linewidth', 2.5,'DisplayName', '$\alpha = 2$, $S$, $T$');
|
||||
plot(freqs, abs(squeeze(freqresp(Hh_a05, freqs, 'Hz'))), '--', 'color', colors(2,:),'DisplayName', '$\alpha = 0.5$, $H_H$, $H_L$');
|
||||
plot(f, abs(S_a05), '-', 'color', [colors(2,:), 0.5], 'linewidth', 2.5,'DisplayName', '$\alpha = 0.5$, $S$, $T$');
|
||||
plot(freqs, abs(squeeze(freqresp(Hl_a2, freqs, 'Hz'))), '--', 'color', colors(1,:), 'HandleVisibility', 'off');
|
||||
plot(f, abs(T_a2), '-', 'color', [colors(1,:), 0.5], 'linewidth', 2.5, 'HandleVisibility', 'off');
|
||||
plot(freqs, abs(squeeze(freqresp(Hl_a05, freqs, 'Hz'))), '--', 'color', colors(2,:), 'HandleVisibility', 'off');
|
||||
plot(f, abs(T_a05), '-', 'color', [colors(2,:), 0.5], 'linewidth', 2.5, 'HandleVisibility', 'off');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||
xlim([1, 1e3]);
|
||||
ylim([1e-3, 5]);
|
||||
leg = legend('location', 'south', 'FontSize', 8, 'NumColumns', 2);
|
||||
leg.ItemTokenSize(1) = 18;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
exportFig('figs/test_id31_cf_control_alpha.pdf', 'width', 'half', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:test_id31_cf_control_results
|
||||
#+caption: Measured closed-loop transfer functions. Different bandwidth can be specified for different directions using $\omega_0$ (\subref{fig:test_id31_cf_control_dy_dz_diff}). The shape can be adjusted using parameter $\alpha$ (\subref{fig:test_id31_cf_control_alpha}).
|
||||
#+attr_latex: :options [htbp]
|
||||
#+begin_figure
|
||||
#+attr_latex: :caption \subcaption{\label{fig:test_id31_cf_control_dy_dz_diff}Chose of bandwidth using $\omega_0$, $m = 0\,\text{kg}$}
|
||||
#+attr_latex: :options {0.49\textwidth}
|
||||
#+begin_subfigure
|
||||
#+attr_latex: :scale 0.9
|
||||
[[file:figs/test_id31_cf_control_dy_dz_diff.png]]
|
||||
#+end_subfigure
|
||||
#+attr_latex: :caption \subcaption{\label{fig:test_id31_cf_control_alpha}Effect of a change of $\alpha$, $m = 26\,\text{kg}$}
|
||||
#+attr_latex: :options {0.49\textwidth}
|
||||
#+begin_subfigure
|
||||
#+attr_latex: :scale 0.9
|
||||
[[file:figs/test_id31_cf_control_alpha.png]]
|
||||
#+end_subfigure
|
||||
#+end_figure
|
||||
|
||||
Finally, $\omega_0$ was gradually increased to estimate the maximum bandwidth (i.e. the best low frequency disturbance rejection) that can be achieved with this architecture.
|
||||
No payload was used for this test, and the parameter $\omega_0$ was increased for the controllers in the $D_y$ and $D_z$ directions.
|
||||
A value $\omega_0 = 2\pi \cdot 60 \,\text{rad/s}$ could be achieved.
|
||||
Measured closed-loop transfer functions are shown in Figure ref:fig:test_id31_high_bandwidth, indicating a reduction of disturbances in the considered direction of $1000$ at $1\,\text{Hz}$.
|
||||
For higher values of $\omega_0$, the system became unstable in the vertical direction, probably because of the resonance at $250\,\text{Hz}$ that is not well captured with the multi-body model (Figure ref:fig:test_id31_hac_plant_effect_mass).
|
||||
|
||||
#+begin_src matlab
|
||||
%% Trying high bandwidth controllers - 60Hz
|
||||
% Z direction
|
||||
data = load("2023-08-21_14-19_m0_cf_inv_tustin_Dz_60Hz_a_20.mat");
|
||||
[S_dz, ~] = tfestimate(data.Dz.id_cl, data.Dz.e_dz, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_dz, ~] = tfestimate(data.Dz.id_cl, data.Dz.Dz_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
% Y direction
|
||||
data = load("2023-08-21_14-20_m0_cf_inv_tustin_Dy_60Hz_a_20.mat");
|
||||
[S_dy, ~] = tfestimate(data.Dy.id_cl, data.Dy.e_dy, win, Noverlap, Nfft, 1/Ts);
|
||||
[T_dy, ~] = tfestimate(data.Dy.id_cl, data.Dy.Dy_int, win, Noverlap, Nfft, 1/Ts);
|
||||
|
||||
% Analytical formulas
|
||||
w0 = 2*pi*60;
|
||||
alpha = 2;
|
||||
Hh_60Hz = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
Hl_60Hz = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1));
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Bode plot of the Weighting filters and Obtained complementary filters
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, abs(S_dy), '-', 'color', colors(1,:), 'DisplayName', '$S$, $D_y$');
|
||||
plot(f, abs(S_dz), '-', 'color', colors(2,:), 'DisplayName', '$S$, $D_z$');
|
||||
plot(freqs, abs(squeeze(freqresp(Hh_60Hz, freqs, 'Hz'))), 'k--','DisplayName', '$H_H$');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||
xlim([1, 1e3]);
|
||||
ylim([3e-4, 5]);
|
||||
leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 18;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
yticks([1e-3, 1e-2, 1e-1, 1]);
|
||||
exportFig('figs/test_id31_high_bandwidth_S.pdf', 'width', 'half', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Bode plot of the Weighting filters and Obtained complementary filters
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, abs(T_dy), '-', 'color', colors(1,:), 'DisplayName', '$T$, $D_y$');
|
||||
plot(f, abs(T_dz), '-', 'color', colors(2,:), 'DisplayName', '$T$, $D_z$');
|
||||
plot(freqs, abs(squeeze(freqresp(Hl_60Hz, freqs, 'Hz'))), 'k--','DisplayName', '$H_L$');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Magnitude');
|
||||
xlim([1, 1e3]);
|
||||
ylim([3e-4, 5]);
|
||||
leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 18;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :exports results :results file replace
|
||||
yticks([1e-3, 1e-2, 1e-1, 1]);
|
||||
exportFig('figs/test_id31_high_bandwidth_T.pdf', 'width', 'half', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:test_id31_high_bandwidth
|
||||
#+caption: Measured Closed-Loop Sensitivity (\subref{fig:test_id31_high_bandwidth_S}) and Complementary Sensitivity (\subref{fig:test_id31_high_bandwidth_T}) transfer functions for the highest test bandwidth $\omega_0 = 2\pi\cdot 60\,\text{rad/s}$.
|
||||
#+attr_latex: :options [htbp]
|
||||
#+begin_figure
|
||||
#+attr_latex: :caption \subcaption{\label{fig:test_id31_high_bandwidth_S}Sensitivity}
|
||||
#+attr_latex: :options {0.49\textwidth}
|
||||
#+begin_subfigure
|
||||
#+attr_latex: :scale 0.9
|
||||
[[file:figs/test_id31_high_bandwidth_S.png]]
|
||||
#+end_subfigure
|
||||
#+attr_latex: :caption \subcaption{\label{fig:test_id31_high_bandwidth_T}Complementary Sensitivity}
|
||||
#+attr_latex: :options {0.49\textwidth}
|
||||
#+begin_subfigure
|
||||
#+attr_latex: :scale 0.9
|
||||
[[file:figs/test_id31_high_bandwidth_T.png]]
|
||||
#+end_subfigure
|
||||
#+end_figure
|
||||
|
||||
** Conclusion
|
||||
:PROPERTIES:
|
||||
:UNNUMBERED: t
|
||||
|
Binary file not shown.
@ -1,4 +1,4 @@
|
||||
% Created 2025-04-07 Mon 14:38
|
||||
% Created 2025-04-20 Sun 22:21
|
||||
% Intended LaTeX compiler: pdflatex
|
||||
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
|
||||
|
||||
@ -215,6 +215,7 @@ Results are summarized in Table \ref{tab:test_id31_metrology_acceptance}.
|
||||
The obtained lateral acceptance for pure displacements in any direction is estimated to be around \(+/-0.5\,mm\), which is enough for the current application as it is well above the micro-station errors to be actively corrected by the NASS.
|
||||
|
||||
\begin{table}[htbp]
|
||||
\caption{\label{tab:test_id31_metrology_acceptance}Estimated measurement range for each interferometer, and for three different directions.}
|
||||
\centering
|
||||
\begin{tabularx}{0.45\linewidth}{Xccc}
|
||||
\toprule
|
||||
@ -227,8 +228,6 @@ The obtained lateral acceptance for pure displacements in any direction is estim
|
||||
\(d_5\) (z) & \(1.33\, mm\) & \(1.06\,mm\) & \(>2\,mm\)\\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
\caption{\label{tab:test_id31_metrology_acceptance}Estimated measurement range for each interferometer, and for three different directions.}
|
||||
|
||||
\end{table}
|
||||
\section{Estimated measurement errors}
|
||||
\label{ssec:test_id31_metrology_errors}
|
||||
@ -739,6 +738,7 @@ Several scientific experiments were replicated, such as:
|
||||
\end{itemize}
|
||||
|
||||
Unless explicitly stated, all closed-loop experiments were performed using the robust (i.e. conservative) high authority controller designed in Section \ref{ssec:test_id31_iff_hac_controller}.
|
||||
Higher performance controllers using complementary filters are investigated in Section \ref{ssec:test_id31_cf_control}.
|
||||
|
||||
For each experiment, the obtained performances are compared to the specifications for the most demanding case in which nano-focusing optics are used to focus the beam down to \(200\,nm\times 100\,nm\).
|
||||
In this case, the goal is to keep the sample's point of interest in the beam, and therefore the \(D_y\) and \(D_z\) positioning errors should be less than \(200\,nm\) and \(100\,nm\) peak-to-peak, respectively.
|
||||
@ -748,6 +748,7 @@ In terms of RMS errors, this corresponds to \(30\,nm\) in \(D_y\), \(15\,nm\) in
|
||||
Results obtained for all experiments are summarized and compared to the specifications in Section \ref{ssec:test_id31_scans_conclusion}.
|
||||
|
||||
\begin{table}[htbp]
|
||||
\caption{\label{tab:test_id31_experiments_specifications}Specifications for the Nano-Active-Stabilization-System}
|
||||
\centering
|
||||
\begin{tabularx}{0.45\linewidth}{Xccc}
|
||||
\toprule
|
||||
@ -757,8 +758,6 @@ peak 2 peak & 200nm & 100nm & \(1.7\,\mu\text{rad}\)\\
|
||||
RMS & 30nm & 15nm & \(250\,\text{nrad}\)\\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
\caption{\label{tab:test_id31_experiments_specifications}Specifications for the Nano-Active-Stabilization-System}
|
||||
|
||||
\end{table}
|
||||
\section{Tomography Scans}
|
||||
\label{ssec:test_id31_scans_tomography}
|
||||
@ -824,7 +823,7 @@ Nevertheless, even with this robust (i.e. conservative) HAC implementation, the
|
||||
|
||||
A comparative analysis was conducted using three tomography scans at \(180\,\text{deg/s}\) to evaluate the effectiveness of the HAC-LAC strategy in reducing positioning errors.
|
||||
The scans were performed under three conditions: open-loop, with decentralized IFF control, and with the complete HAC-LAC strategy.
|
||||
For these specific measurements, an enhanced high authority controller was optimized for low payload masses to meet the performance requirements.
|
||||
For this specific measurement, an enhanced high authority controller (discussed in Section \ref{ssec:test_id31_cf_control}) was optimized for low payload masses to meet the performance requirements.
|
||||
|
||||
Figure \ref{fig:test_id31_hac_cas_cl} presents the cumulative amplitude spectra of the position errors for all three cases.
|
||||
The results reveal two distinct control contributions: the decentralized IFF effectively attenuates vibrations near the nano-hexapod suspension modes (an achievement not possible with HAC alone), while the high authority controller suppresses low-frequency vibrations primarily arising from Spindle guiding errors.
|
||||
@ -1083,6 +1082,74 @@ Alternatively, a feedforward controller could improve the lateral positioning ac
|
||||
\end{subfigure}
|
||||
\caption{\label{fig:test_id31_diffraction_tomo}Diffraction tomography scans (combined \(R_z\) and \(D_y\) motions) at several \(D_y\) velocities (\(R_z\) rotational velocity is \(6\,\text{deg/s}\)).}
|
||||
\end{figure}
|
||||
\section{Feedback control using Complementary Filters}
|
||||
\label{ssec:test_id31_cf_control}
|
||||
|
||||
A control architecture utilizing complementary filters to shape the closed-loop transfer functions was proposed during the detail design phase.
|
||||
Experimental validation of this architecture using the NASS is presented herein.
|
||||
|
||||
Given that performance requirements are specified in the Cartesian frame, decoupling of the plant within this frame was achieved using Jacobian matrices.
|
||||
Consequently, the control space comprises the directions \(D_x\), \(D_y\), \(D_z\), \(R_x\), and \(R_y\).
|
||||
Control performance in each of these directions can be tuned independently.
|
||||
A schematic of the proposed control architecture is illustrated in Figure~\ref{fig:test_id31_cf_control}.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[scale=1]{figs/test_id31_cf_control.png}
|
||||
\caption{\label{fig:test_id31_cf_control}Control architecture in the Cartesian frame. Only the controller corresponding to the \(D_z\) direction is shown. \(H_L\) and \(H_H\) are complementary filters.}
|
||||
\end{figure}
|
||||
|
||||
|
||||
Implementation of this control architecture necessitates a plant model, which must subsequently be inverted.
|
||||
This plant model was derived from the multi-body model incorporating the previously detailed 2-DoF APA model, such that the model order stays relatively low.
|
||||
Proposed analytical formulas for complementary filters having \(40\,\text{dB/dec}\) were used during this experimental validation.
|
||||
An initial experimental validation was conducted under no-payload conditions, with control applied solely to the \(D_y\), \(D_z\), and \(R_y\) directions.
|
||||
Increased control bandwidth was achieved for the \(D_z\) and \(R_y\) directions through appropriate tuning of the parameter \(\omega_0\).
|
||||
The experimentally measured closed-loop sensitivity transfer functions corresponding to these three controlled directions are presented in Figure \ref{fig:test_id31_cf_control_dy_dz_diff}.
|
||||
|
||||
Another test was conducted with a \(26\,\text{kg}\) payload.
|
||||
For this configuration, complementary filters were implemented with \(\omega_0 = 2\pi \cdot 10\,\text{rad/s}\), and parameter \(\alpha\) was varied.
|
||||
The resulting experimentally obtained closed-loop transfer functions are compared against the theoretical complementary filter responses in Figure~\ref{fig:test_id31_cf_control_alpha}.
|
||||
As illustrated in the figure, a close correspondence between the measured closed-loop responses and the target complementary filter magnitude was observed.
|
||||
It also shows that the parameter \(\alpha\) provides a mechanism for managing the trade-off between low-frequency disturbance rejection performance and the potential amplification of disturbances within the crossover frequency region.
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\begin{subfigure}{0.49\textwidth}
|
||||
\begin{center}
|
||||
\includegraphics[scale=1,scale=0.9]{figs/test_id31_cf_control_dy_dz_diff.png}
|
||||
\end{center}
|
||||
\subcaption{\label{fig:test_id31_cf_control_dy_dz_diff}Chose of bandwidth using $\omega_0$, $m = 0\,\text{kg}$}
|
||||
\end{subfigure}
|
||||
\begin{subfigure}{0.49\textwidth}
|
||||
\begin{center}
|
||||
\includegraphics[scale=1,scale=0.9]{figs/test_id31_cf_control_alpha.png}
|
||||
\end{center}
|
||||
\subcaption{\label{fig:test_id31_cf_control_alpha}Effect of a change of $\alpha$, $m = 26\,\text{kg}$}
|
||||
\end{subfigure}
|
||||
\caption{\label{fig:test_id31_cf_control_results}Measured closed-loop transfer functions. Different bandwidth can be specified for different directions using \(\omega_0\) (\subref{fig:test_id31_cf_control_dy_dz_diff}). The shape can be adjusted using parameter \(\alpha\) (\subref{fig:test_id31_cf_control_alpha}).}
|
||||
\end{figure}
|
||||
|
||||
Finally, \(\omega_0\) was gradually increased to estimate the maximum bandwidth (i.e. the best low frequency disturbance rejection) that can be achieved with this architecture.
|
||||
No payload was used for this test, and the parameter \(\omega_0\) was increased for the controllers in the \(D_y\) and \(D_z\) directions.
|
||||
A value \(\omega_0 = 2\pi \cdot 60 \,\text{rad/s}\) could be achieved.
|
||||
Measured closed-loop transfer functions are shown in Figure \ref{fig:test_id31_high_bandwidth}, indicating a reduction of disturbances in the considered direction of \(1000\) at \(1\,\text{Hz}\).
|
||||
For higher values of \(\omega_0\), the system became unstable in the vertical direction, probably because of the resonance at \(250\,\text{Hz}\) that is not well captured with the multi-body model (Figure \ref{fig:test_id31_hac_plant_effect_mass}).
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\begin{subfigure}{0.49\textwidth}
|
||||
\begin{center}
|
||||
\includegraphics[scale=1,scale=0.9]{figs/test_id31_high_bandwidth_S.png}
|
||||
\end{center}
|
||||
\subcaption{\label{fig:test_id31_high_bandwidth_S}Sensitivity}
|
||||
\end{subfigure}
|
||||
\begin{subfigure}{0.49\textwidth}
|
||||
\begin{center}
|
||||
\includegraphics[scale=1,scale=0.9]{figs/test_id31_high_bandwidth_T.png}
|
||||
\end{center}
|
||||
\subcaption{\label{fig:test_id31_high_bandwidth_T}Complementary Sensitivity}
|
||||
\end{subfigure}
|
||||
\caption{\label{fig:test_id31_high_bandwidth}Measured Closed-Loop Sensitivity (\subref{fig:test_id31_high_bandwidth_S}) and Complementary Sensitivity (\subref{fig:test_id31_high_bandwidth_T}) transfer functions for the highest test bandwidth \(\omega_0 = 2\pi\cdot 60\,\text{rad/s}\).}
|
||||
\end{figure}
|
||||
\section*{Conclusion}
|
||||
\label{ssec:test_id31_scans_conclusion}
|
||||
|
||||
@ -1104,6 +1171,7 @@ Overall, the experimental results validate the effectiveness of the developed co
|
||||
The identified limitations, primarily related to high-speed lateral scanning and heavy payload handling, provide clear directions for future improvements.
|
||||
|
||||
\begin{table}[htbp]
|
||||
\caption{\label{tab:test_id31_experiments_results_summary}Summary of the experimental results performed using the NASS on ID31. Open-loop errors are indicated on the left of the arrows. Closed-loop errors that are outside the specifications are indicated by bold number.}
|
||||
\centering
|
||||
\begin{tabularx}{\linewidth}{Xccc}
|
||||
\toprule
|
||||
@ -1132,8 +1200,6 @@ Diffraction tomography (\(6\,\text{deg/s}\), \(1\,mm/s\)) & \(\bm{53}\) & \(10\)
|
||||
\textbf{Specifications} & \(30\) & \(15\) & \(250\)\\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
\caption{\label{tab:test_id31_experiments_results_summary}Summary of the experimental results performed using the NASS on ID31. Open-loop errors are indicated on the left of the arrows. Closed-loop errors that are outside the specifications are indicated by bold number.}
|
||||
|
||||
\end{table}
|
||||
\chapter*{Conclusion}
|
||||
\label{ssec:test_id31_conclusion}
|
||||
|
Reference in New Issue
Block a user