diff --git a/docs/figs/opt_stiff_iff_root_locus.pdf b/docs/figs/opt_stiff_iff_root_locus.pdf new file mode 100644 index 0000000..c74eb50 Binary files /dev/null and b/docs/figs/opt_stiff_iff_root_locus.pdf differ diff --git a/docs/figs/opt_stiff_iff_root_locus.png b/docs/figs/opt_stiff_iff_root_locus.png new file mode 100644 index 0000000..2b0015e Binary files /dev/null and b/docs/figs/opt_stiff_iff_root_locus.png differ diff --git a/docs/figs/opt_stiff_iff_root_locus.png.png b/docs/figs/opt_stiff_iff_root_locus.png.png new file mode 100644 index 0000000..2b0015e Binary files /dev/null and b/docs/figs/opt_stiff_iff_root_locus.png.png differ diff --git a/docs/optimal_stiffness_control.html b/docs/optimal_stiffness_control.html new file mode 100644 index 0000000..0b31a6a --- /dev/null +++ b/docs/optimal_stiffness_control.html @@ -0,0 +1,362 @@ + + + + + + + + +Control of the NASS with optimal stiffness + + + + + + + + + + + + + +
+ UP + | + HOME +
+

Control of the NASS with optimal stiffness

+
+

Table of Contents

+ +
+ +
+

1 Low Authority Control - Decentralized Integral Force Feedback

+
+
+
+

1.1 Initialization

+
+

+We initialize all the stages with the default parameters. +

+
+
initializeGround();
+initializeGranite();
+initializeTy();
+initializeRy();
+initializeRz();
+initializeMicroHexapod();
+initializeAxisc();
+initializeMirror();
+
+
+ +

+We set the references that corresponds to a tomography experiment. +

+
+
initializeReferences('Rz_type', 'rotating-not-filtered', 'Rz_period', 1);
+initializeSimscapeConfiguration();
+initializeDisturbances('enable', false);
+initializeLoggingConfiguration('log', 'none');
+
+
+ +
+
initializeController('type', 'hac-iff');
+
+
+
+
+ +
+

1.2 Identification

+
+
+
Kx = tf(zeros(6));
+Kiff = tf(zeros(6));
+
+
+ +
+
Ms = [1, 10, 50];
+
+Gm_iff = {zeros(length(Ms), 1)};
+
+
+ +
+
initializeNanoHexapod('k', 1e5, 'c', 2e2);
+
+
+
+
+ +
+

1.3 Controller Design

+
+

+Root Locus +

+ +
+

opt_stiff_iff_root_locus.png +

+

Figure 1: Root Locus for the

+
+ +

+Damping as function of the gain +

+
+
+
+
+

2 Primary Control

+
+
+
+

2.1 Identification

+
+ +
+

2.2 Controller Design

+
+
+ +
+

3 Simulations

+
+
+
+

Author: Dehaeze Thomas

+

Created: 2020-04-08 mer. 17:22

+
+ + diff --git a/docs/optimal_stiffness_disturbances.html b/docs/optimal_stiffness_disturbances.html index 6ba74ed..f1f6b56 100644 --- a/docs/optimal_stiffness_disturbances.html +++ b/docs/optimal_stiffness_disturbances.html @@ -4,7 +4,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Determination of the optimal nano-hexapod’s stiffness for reducing the effect of disturbances @@ -257,7 +257,7 @@
  • 2.3. Sensitivity to Stages vibration (Filtering)
  • 2.4. Effect of Ground motion (Transmissibility).
  • 2.5. Direct Forces (Compliance).
  • -
  • 2.6. Conclusion
  • +
  • 2.6. Conclusion
  • 3. Effect of granite stiffness @@ -270,7 +270,7 @@
  • 3.2. Soft Granite
  • 3.3. Effect of the Granite transfer function
  • -
  • 3.4. Conclusion
  • +
  • 3.4. Conclusion
  • 4. Open Loop Budget Error @@ -278,7 +278,7 @@
  • 4.1. Noise Budgeting - Theory
  • 4.2. Power Spectral Densities
  • 4.3. Cumulative Amplitude Spectrum
  • -
  • 4.4. Conclusion
  • +
  • 4.4. Conclusion
  • 5. Closed Loop Budget Error @@ -287,7 +287,7 @@
  • 5.2. Reduction thanks to feedback - Required bandwidth
  • -
  • 6. Conclusion
  • +
  • 6. Conclusion
  • @@ -497,8 +497,8 @@ The effect of direct forces/torques applied on the sample (cable forces for inst -
    -

    2.6 Conclusion

    +
    +

    2.6 Conclusion

    @@ -678,8 +678,8 @@ From Figures 11 and 12, we s

    -
    -

    3.4 Conclusion

    +
    +

    3.4 Conclusion

    @@ -848,8 +848,8 @@ The black dashed line corresponds to the performance objective of a sample vibra

    -
    -

    4.4 Conclusion

    +
    +

    4.4 Conclusion

    @@ -1012,8 +1012,8 @@ The obtained required bandwidth (approximate upper and lower bounds) to obtained

    -
    -

    6 Conclusion

    +
    +

    6 Conclusion

    @@ -1021,7 +1021,7 @@ From Figure 23 and Table 1,

    • For a soft nano-hexapod (\(k < 10^4\ [N/m]\)), the required bandwidth is \(\omega_c \approx 50-100\ Hz\)
    • -
    • For a nano-hexapods with \(10^5 < k < 10^6\ [N/m]\)), the required bandwidth is \(\omega_c \approx 150-300\ Hz\)
    • +
    • For a nano-hexapods with \(10^5 < k < 10^6\ [N/m]\), the required bandwidth is \(\omega_c \approx 150-300\ Hz\)
    • For a stiff nano-hexapods (\(k > 10^7\ [N/m]\)), the required bandwidth is \(\omega_c \approx 250-500\ Hz\)
    @@ -1031,7 +1031,7 @@ From Figure 23 and Table 1,

    Author: Dehaeze Thomas

    -

    Created: 2020-04-08 mer. 12:17

    +

    Created: 2020-04-08 mer. 17:20

    diff --git a/mat/conf_log.mat b/mat/conf_log.mat index 55d5306..50c7022 100644 Binary files a/mat/conf_log.mat and b/mat/conf_log.mat differ diff --git a/mat/conf_simscape.mat b/mat/conf_simscape.mat index 89e5ee7..59a9638 100644 Binary files a/mat/conf_simscape.mat and b/mat/conf_simscape.mat differ diff --git a/mat/controller.mat b/mat/controller.mat index d4d745e..78b3c78 100644 Binary files a/mat/controller.mat and b/mat/controller.mat differ diff --git a/mat/nass_disturbances.mat b/mat/nass_disturbances.mat index cb32942..229dbce 100644 Binary files a/mat/nass_disturbances.mat and b/mat/nass_disturbances.mat differ diff --git a/mat/nass_references.mat b/mat/nass_references.mat index aef6423..7c783fc 100644 Binary files a/mat/nass_references.mat and b/mat/nass_references.mat differ diff --git a/mat/stages.mat b/mat/stages.mat index 6fc3d68..0a3a8cc 100644 Binary files a/mat/stages.mat and b/mat/stages.mat differ diff --git a/org/optimal_stiffness_control.org b/org/optimal_stiffness_control.org new file mode 100644 index 0000000..6c18e43 --- /dev/null +++ b/org/optimal_stiffness_control.org @@ -0,0 +1,779 @@ +#+TITLE: Control of the NASS with optimal stiffness +:DRAWER: +#+STARTUP: overview + +#+LANGUAGE: en +#+EMAIL: dehaeze.thomas@gmail.com +#+AUTHOR: Dehaeze Thomas + +#+HTML_LINK_HOME: ./index.html +#+HTML_LINK_UP: ./index.html + +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: + +#+HTML_MATHJAX: align: center tagside: right font: TeX + +#+PROPERTY: header-args:matlab :session *MATLAB* +#+PROPERTY: header-args:matlab+ :comments org +#+PROPERTY: header-args:matlab+ :results none +#+PROPERTY: header-args:matlab+ :exports both +#+PROPERTY: header-args:matlab+ :eval no-export +#+PROPERTY: header-args:matlab+ :output-dir figs +#+PROPERTY: header-args:matlab+ :tangle no +#+PROPERTY: header-args:matlab+ :mkdirp yes + +#+PROPERTY: header-args:shell :eval no-export + +#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/thesis/latex/org/}{config.tex}") +#+PROPERTY: header-args:latex+ :imagemagick t :fit yes +#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150 +#+PROPERTY: header-args:latex+ :imoutoptions -quality 100 +#+PROPERTY: header-args:latex+ :results file raw replace +#+PROPERTY: header-args:latex+ :buffer no +#+PROPERTY: header-args:latex+ :eval no-export +#+PROPERTY: header-args:latex+ :exports results +#+PROPERTY: header-args:latex+ :mkdirp yes +#+PROPERTY: header-args:latex+ :output-dir figs +#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png") +:END: + +* Introduction :ignore: + +* Low Authority Control - Decentralized Integral Force Feedback +** Introduction :ignore: + +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) +<> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes +<> +#+end_src + +#+begin_src matlab :tangle no + simulinkproject('../'); +#+end_src + +#+begin_src matlab + load('mat/conf_simulink.mat'); + open('nass_model.slx') +#+end_src + +** Initialization +We initialize all the stages with the default parameters. +#+begin_src matlab + initializeGround(); + initializeGranite(); + initializeTy(); + initializeRy(); + initializeRz(); + initializeMicroHexapod(); + initializeAxisc(); + initializeMirror(); +#+end_src + +We set the references that corresponds to a tomography experiment. +#+begin_src matlab + initializeReferences('Rz_type', 'rotating-not-filtered', 'Rz_period', 1); + initializeSimscapeConfiguration(); + initializeDisturbances('enable', false); + initializeLoggingConfiguration('log', 'none'); +#+end_src + +#+begin_src matlab + initializeController('type', 'hac-iff'); +#+end_src + +** Identification +#+begin_src matlab + Kx = tf(zeros(6)); + Kiff = tf(zeros(6)); +#+end_src + +#+begin_src matlab + Ms = [1, 10, 50]; + + Gm_iff = {zeros(length(Ms), 1)}; +#+end_src + +#+begin_src matlab + initializeNanoHexapod('k', 1e5, 'c', 2e2); +#+end_src + +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'nass_model'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs + io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1; % Force Sensors +#+end_src + +#+begin_src matlab :exports none + for i = 1:length(Ms) + initializeSample('mass', Ms(i), 'freq', 200*ones(6,1)); + + %% Run the linearization + G_iff = linearize(mdl, io); + G_iff.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}; + G_iff.OutputName = {'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}; + Gm_iff(i) = {G_iff}; + end +#+end_src + +** Controller Design +#+begin_src matlab :exports none + freqs = logspace(-1, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + hold on; + for i = 1:length(Ms) + plot(freqs, abs(squeeze(freqresp(Gm_iff{i}(1, 1), freqs, 'Hz')))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]); + title('Diagonal elements of the Plant'); + + ax2 = subplot(2, 1, 2); + hold on; + for i = 1:length(Ms) + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_iff{i}(1, 1), freqs, 'Hz')))), ... + 'DisplayName', sprintf('$m_p = %.0f$ [kg]', Ms(i))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-270, 90]); + yticks([-360:90:360]); + legend('location', 'northeast'); + + linkaxes([ax1,ax2],'x'); +#+end_src + +Root Locus +#+begin_src matlab :exports none :post + figure; + + gains = logspace(0, 3, 300); + + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(real(pole(Gm_iff{i})), imag(pole(Gm_iff{i})), 'x', ... + 'DisplayName', sprintf('$m_p = %.0f$ [kg]', Ms(i))); + set(gca,'ColorOrderIndex',i); + plot(real(tzero(Gm_iff{i})), imag(tzero(Gm_iff{i})), 'o', ... + 'HandleVisibility', 'off'); + for k = 1:length(gains) + set(gca,'ColorOrderIndex',i); + cl_poles = pole(feedback(Gm_iff{i}, -(gains(k)/s)*eye(6))); + plot(real(cl_poles), imag(cl_poles), '.', ... + 'HandleVisibility', 'off'); + end + end + hold off; + axis square; + xlim([-140, 10]); ylim([0, 150]); + + xlabel('Real Part'); ylabel('Imaginary Part'); + legend('location', 'northwest'); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/opt_stiff_iff_root_locus.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:opt_stiff_iff_root_locus +#+caption: Root Locus for the +#+RESULTS: +[[file:figs/opt_stiff_iff_root_locus.png]] + +Damping as function of the gain +#+begin_src matlab :exports none + c1 = [ 0 0.4470 0.7410]; % Blue + c2 = [0.8500 0.3250 0.0980]; % Orange + c3 = [0.9290 0.6940 0.1250]; % Yellow + c4 = [0.4940 0.1840 0.5560]; % Purple + c5 = [0.4660 0.6740 0.1880]; % Green + c6 = [0.3010 0.7450 0.9330]; % Light Blue + c7 = [0.6350 0.0780 0.1840]; % Red + colors = [c1; c2; c3; c4; c5; c6; c7]; + + figure; + + gains = logspace(0, 3, 100); + + hold on; + for i = 1:length(Ms) + for k = 1:length(gains) + cl_poles = pole(feedback(Gm_iff{i}, -(gains(k)/s)*eye(6))); + set(gca,'ColorOrderIndex',i); + plot(gains(k), sin(-pi/2 + angle(cl_poles)), '.', 'color', colors(i, :)); + end + end + hold off; + xlabel('IFF Gain'); ylabel('Modal Damping'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylim([0, 1]); +#+end_src + +#+begin_src matlab + Kiff = -200/s*eye(6); +#+end_src + +* Primary Control +** Introduction :ignore: + + +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) +<> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes +<> +#+end_src + +** Identification +#+begin_src matlab + Gm_x = {zeros(length(Ms), 1)}; + Gm_l = {zeros(length(Ms), 1)}; +#+end_src + +#+begin_src matlab + load('mat/stages.mat', 'nano_hexapod'); +#+end_src + +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'nass_model'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Controller'], 1, 'input'); io_i = io_i + 1; % Actuator Inputs + io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1; % Position Errror +#+end_src + +#+begin_src matlab :exports none + for i = 1:length(Ms) + initializeSample('mass', Ms(i), 'freq', 200*ones(6,1)); + + %% Run the linearization + G = linearize(mdl, io); + G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}; + G.OutputName = {'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'}; + + Gx = -G*inv(nano_hexapod.J'); + Gx.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'}; + Gm_x(i) = {Gx}; + + Gl = -nano_hexapod.J*G; + Gl.OutputName = {'E1', 'E2', 'E3', 'E4', 'E5', 'E6'}; + Gm_l(i) = {Gl}; + end +#+end_src + +** Controller in the task space +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + labels = {'$D_x/\mathcal{F}_x$', '$D_y/\mathcal{F}_y$', '$D_z/\mathcal{F}_z$', '$R_x/\mathcal{M}_x$', '$R_y/\mathcal{M}_y$', '$R_z/\mathcal{M}_z$'}; + + figure; + + ax1 = subplot(2, 2, 1); + hold on; + for i = 1:6 + plot(freqs, abs(squeeze(freqresp(Gx(i, i), freqs, 'Hz')))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + title('Diagonal elements of the Plant'); + + ax2 = subplot(2, 2, 3); + hold on; + for i = 1:6 + plot(freqs, 180/pi*angle(squeeze(freqresp(Gx(i, i), freqs, 'Hz'))), 'DisplayName', labels{i}); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + legend(); + + ax3 = subplot(2, 2, 2); + hold on; + for i = 1:5 + for j = i+1:6 + plot(freqs, abs(squeeze(freqresp(Gx(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2]); + end + end + set(gca,'ColorOrderIndex',1); + plot(freqs, abs(squeeze(freqresp(Gx(1, 1), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + title('Off-Diagonal elements of the Plant'); + + ax4 = subplot(2, 2, 4); + hold on; + for i = 1:5 + for j = i+1:6 + plot(freqs, 180/pi*angle(squeeze(freqresp(Gx(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2]); + end + end + set(gca,'ColorOrderIndex',1); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gx(1, 1), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + + linkaxes([ax1,ax2,ax3,ax4],'x'); +#+end_src + +*** Translation +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 2, 1); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(1, 1), freqs, 'Hz')))); + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(2, 2), freqs, 'Hz')))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + title('$\mathcal{X}_x/\mathcal{F}_x$, $\mathcal{X}_y/\mathcal{F}_y$') + + ax2 = subplot(2, 2, 2); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(3, 3), freqs, 'Hz')))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + title('$\mathcal{X}_z/\mathcal{F}_z$') + + ax3 = subplot(2, 2, 3); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(1, 1), freqs, 'Hz'))))); + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(2, 2), freqs, 'Hz'))))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-270, 90]); + yticks([-360:90:360]); + + ax4 = subplot(2, 2, 4); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(3, 3), freqs, 'Hz')))), ... + 'DisplayName', sprintf('$m_p = %.0f [kg]$', Ms(i))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-270, 90]); + yticks([-360:90:360]); + legend('location', 'southwest'); + + linkaxes([ax1,ax2,ax3,ax4],'x'); +#+end_src + +#+begin_src matlab + Kx = tf(zeros(6)); + + h = 1.5; + Kx(1,1) = 2e6 * ... + 1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ... + (s/2/pi/1 + 1)/(s/2/pi/1) * ... + (s/2/pi/10 + 1)/(s/2/pi/10); + + Kx(2,2) = Kx(1,1); + + h = 1.5; + Kx(3,3) = 1e7 * ... + 1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ... + (s/2/pi/1 + 1)/(s/2/pi/1) * ... + (s/2/pi/10 + 1)/(s/2/pi/10); +#+end_src + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 2, 1); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(1, 1)*Kx(1,1), freqs, 'Hz')))); + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(2, 2)*Kx(2,2), freqs, 'Hz')))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + title('$\mathcal{X}_x/\mathcal{F}_x$, $\mathcal{X}_y/\mathcal{F}_y$') + + ax2 = subplot(2, 2, 2); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(3, 3)*Kx(3,3), freqs, 'Hz')))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + title('$\mathcal{X}_z/\mathcal{F}_z$') + + ax3 = subplot(2, 2, 3); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(1, 1)*Kx(1,1), freqs, 'Hz'))))); + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(2, 2)*Kx(2,2), freqs, 'Hz'))))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-270, 90]); + yticks([-360:90:360]); + + ax4 = subplot(2, 2, 4); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(3, 3)*Kx(3,3), freqs, 'Hz')))), ... + 'DisplayName', sprintf('$m_p = %.0f [kg]$', Ms(i))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-270, 90]); + yticks([-360:90:360]); + legend('location', 'southwest'); + + linkaxes([ax1,ax2,ax3,ax4],'x'); +#+end_src + +*** Rotations +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 2, 1); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(4, 4), freqs, 'Hz')))); + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(5, 5), freqs, 'Hz')))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [rad/(N m)]'); set(gca, 'XTickLabel',[]); + title('$\mathcal{X}_{R_x}/\mathcal{M}_x$, $\mathcal{X}_{R_y}/\mathcal{M}_y$') + + ax2 = subplot(2, 2, 2); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(6, 6), freqs, 'Hz')))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [rad/(N m)]'); set(gca, 'XTickLabel',[]); + title('$\mathcal{X}_{R_z}/\mathcal{M}_z$') + + ax3 = subplot(2, 2, 3); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(4, 4), freqs, 'Hz'))))); + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(5, 5), freqs, 'Hz'))))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-270, 90]); + yticks([-360:90:360]); + + ax4 = subplot(2, 2, 4); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(6, 6), freqs, 'Hz')))), ... + 'DisplayName', sprintf('$m_p = %.0f [kg]$', Ms(i))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-270, 90]); + yticks([-360:90:360]); + legend('location', 'southwest'); + + linkaxes([ax1,ax2,ax3,ax4],'x'); +#+end_src + +#+begin_src matlab + h = 1.5; + Kx(4,4) = 1e5 * ... + 1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ... + (s/2/pi/1 + 1)/(s/2/pi/1) * ... + (s/2/pi/10 + 1)/(s/2/pi/10); + + Kx(5,5) = Kx(4,4); + + h = 1.5; + Kx(6,6) = 2e5 * ... + 1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ... + (s/2/pi/1 + 1)/(s/2/pi/1) * ... + (s/2/pi/10 + 1)/(s/2/pi/10); +#+end_src + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 2, 1); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(4, 4)*Kx(4,4), freqs, 'Hz')))); + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(5, 5)*Kx(5,5), freqs, 'Hz')))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [rad/(N m)]'); set(gca, 'XTickLabel',[]); + title('$\mathcal{X}_{R_x}/\mathcal{M}_x$, $\mathcal{X}_{R_y}/\mathcal{M}_y$') + + ax2 = subplot(2, 2, 2); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_x{i}(6, 6)*Kx(6,6), freqs, 'Hz')))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [rad/(N m)]'); set(gca, 'XTickLabel',[]); + title('$\mathcal{X}_{R_z}/\mathcal{M}_z$') + + ax3 = subplot(2, 2, 3); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(4, 4)*Kx(4,4), freqs, 'Hz'))))); + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(5, 5)*Kx(5,5), freqs, 'Hz'))))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-270, 90]); + yticks([-360:90:360]); + + ax4 = subplot(2, 2, 4); + hold on; + for i = 1:length(Ms) + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_x{i}(6, 6)*Kx(6,6), freqs, 'Hz')))), ... + 'DisplayName', sprintf('$m_p = %.0f [kg]$', Ms(i))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-270, 90]); + yticks([-360:90:360]); + legend('location', 'southwest'); + + linkaxes([ax1,ax2,ax3,ax4],'x'); +#+end_src + +*** Stability +#+begin_src matlab + for i = 1:length(Ms) + isstable(feedback(Gm_x{i}*Kx, eye(6), -1)) + end +#+end_src + +** Simulation + +** Control in the leg space +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 2, 1); + hold on; + for i = 1:6 + plot(freqs, abs(squeeze(freqresp(Gl(i, i), freqs, 'Hz')))); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + title('Diagonal elements of the Plant'); + + ax2 = subplot(2, 2, 3); + hold on; + for i = 1:6 + plot(freqs, 180/pi*angle(squeeze(freqresp(Gl(i, i), freqs, 'Hz'))), ... + 'DisplayName', sprintf('$d\\mathcal{L}_%i / \\tau_%i$', i, i)); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + legend(); + + ax3 = subplot(2, 2, 2); + hold on; + for i = 1:5 + for j = i+1:6 + plot(freqs, abs(squeeze(freqresp(Gl(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2]); + end + end + set(gca,'ColorOrderIndex',1); + plot(freqs, abs(squeeze(freqresp(Gl(1, 1), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + title('Off-Diagonal elements of the Plant'); + + ax4 = subplot(2, 2, 4); + hold on; + for i = 1:5 + for j = i+1:6 + plot(freqs, 180/pi*angle(squeeze(freqresp(Gl(i, j), freqs, 'Hz'))), 'color', [0, 0, 0, 0.2]); + end + end + set(gca,'ColorOrderIndex',1); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gl(1, 1), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + + linkaxes([ax1,ax2,ax3,ax4],'x'); +#+end_src + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + hold on; + for i = 1:length(Ms) + for j = 1:6 + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_l{i}(j, j), freqs, 'Hz')))); + end + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + title('Diagonal elements of the Plant'); + + ax2 = subplot(2, 1, 2); + hold on; + for i = 1:length(Ms) + for j = 1:6 + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gm_l{i}(j, j), freqs, 'Hz')))); + end + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + + linkaxes([ax1,ax2],'x'); +#+end_src + +#+begin_src matlab + h = 1.5; + Kl = 5e6 * eye(6) * ... + 1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ... + (s/2/pi/1 + 1)/(s/2/pi/1) * ... + (s/2/pi/10 + 1)/(s/2/pi/10); +#+end_src + +#+begin_src matlab + for i = 1:length(Ms) + isstable(feedback(Gm_l{i}(1,1)*Kl(1,1), 1, -1)) + end +#+end_src + +#+begin_src matlab :exports none + freqs = logspace(0, 3, 1000); + + figure; + + ax1 = subplot(2, 1, 1); + hold on; + for i = 1:length(Ms) + for j = 1:6 + set(gca,'ColorOrderIndex',i); + plot(freqs, abs(squeeze(freqresp(Gm_l{i}(j, j)*Kl(j,j), freqs, 'Hz')))); + end + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]); + + ax2 = subplot(2, 1, 2); + hold on; + for i = 1:length(Ms) + for j = 1:6 + set(gca,'ColorOrderIndex',i); + plot(freqs, 180/pi*angle(squeeze(freqresp(Gm_l{i}(j, j)*Kl(j,j), freqs, 'Hz')))); + end + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); + ylim([-180, 180]); + yticks([-180, -90, 0, 90, 180]); + + linkaxes([ax1,ax2],'x'); +#+end_src + + +* Simulations diff --git a/org/optimal_stiffness_disturbances.org b/org/optimal_stiffness_disturbances.org index 2b6e0a5..bc848f1 100644 --- a/org/optimal_stiffness_disturbances.org +++ b/org/optimal_stiffness_disturbances.org @@ -1240,6 +1240,6 @@ data2orgtable([wb1'; wb2'], {'Required wc with L1 [Hz]', 'Required wc with L2 [H #+begin_important From Figure [[fig:opt_stiff_req_bandwidth_K1_K2]] and Table [[tab:approx_required_wc_10nm]], we can clearly see three different results depending on the nano-hexapod stiffness: - For a soft nano-hexapod ($k < 10^4\ [N/m]$), the required bandwidth is $\omega_c \approx 50-100\ Hz$ -- For a nano-hexapods with $10^5 < k < 10^6\ [N/m]$), the required bandwidth is $\omega_c \approx 150-300\ Hz$ +- For a nano-hexapods with $10^5 < k < 10^6\ [N/m]$, the required bandwidth is $\omega_c \approx 150-300\ Hz$ - For a stiff nano-hexapods ($k > 10^7\ [N/m]$), the required bandwidth is $\omega_c \approx 250-500\ Hz$ #+end_important