diff --git a/C5-test-bench-id31/mat/2023-08-21_14-09_m0_cf_inv_tustin.mat b/C5-test-bench-id31/mat/2023-08-21_14-09_m0_cf_inv_tustin.mat new file mode 100644 index 0000000..ab8aa33 --- /dev/null +++ b/C5-test-bench-id31/mat/2023-08-21_14-09_m0_cf_inv_tustin.mat @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a4a123e780c15f92edc2e1a984e700330becc50084e0b6ce6a0891a4cc0c91e +size 62402792 diff --git a/C5-test-bench-id31/mat/2023-08-21_14-19_m0_cf_inv_tustin_Dz_60Hz_a_20.mat b/C5-test-bench-id31/mat/2023-08-21_14-19_m0_cf_inv_tustin_Dz_60Hz_a_20.mat new file mode 100644 index 0000000..3b77d7b --- /dev/null +++ b/C5-test-bench-id31/mat/2023-08-21_14-19_m0_cf_inv_tustin_Dz_60Hz_a_20.mat @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ff801a576c868837d14a40ad00324b85f5f45bac09ef02c1ec177164bcc3174 +size 20801016 diff --git a/C5-test-bench-id31/mat/2023-08-21_14-20_m0_cf_inv_tustin_Dy_60Hz_a_20.mat b/C5-test-bench-id31/mat/2023-08-21_14-20_m0_cf_inv_tustin_Dy_60Hz_a_20.mat new file mode 100644 index 0000000..72ab1dc --- /dev/null +++ b/C5-test-bench-id31/mat/2023-08-21_14-20_m0_cf_inv_tustin_Dy_60Hz_a_20.mat @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d80d12651e644000920d4a4a35c887f772e3a08950ac8ad47dfd563540ae44da +size 20801016 diff --git a/C5-test-bench-id31/mat/2023-08-21_17-56_m2_cf_10Hz_a2.mat b/C5-test-bench-id31/mat/2023-08-21_17-56_m2_cf_10Hz_a2.mat new file mode 100644 index 0000000..250a314 --- /dev/null +++ b/C5-test-bench-id31/mat/2023-08-21_17-56_m2_cf_10Hz_a2.mat @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b050f97433a72d12068396016b4d0f94066409fc9ea52820eedb452b6dda8b12 +size 62402792 diff --git a/C5-test-bench-id31/mat/2023-08-21_17-58_m2_cf_10Hz_a05.mat b/C5-test-bench-id31/mat/2023-08-21_17-58_m2_cf_10Hz_a05.mat new file mode 100644 index 0000000..4f3c0b2 --- /dev/null +++ b/C5-test-bench-id31/mat/2023-08-21_17-58_m2_cf_10Hz_a05.mat @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a542998e0e81350e0377ebc350bd7df7a9fb486b2d29c3a595388e31e2eabf74 +size 62402792 diff --git a/C5-test-bench-id31/test_id31_5_experiments.m b/C5-test-bench-id31/test_id31_5_experiments.m index 8441bfc..a25a1c4 100644 --- a/C5-test-bench-id31/test_id31_5_experiments.m +++ b/C5-test-bench-id31/test_id31_5_experiments.m @@ -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