diff --git a/.SimulinkProject/Root.type.Files/experiment_tomography.type.File.xml b/.SimulinkProject/Root.type.Files/experiment_tomography.type.File.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/.SimulinkProject/Root.type.Files/experiment_tomography.type.File.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/1.type.DIR_SIGNIFIER.xml b/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/1.type.DIR_SIGNIFIER.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/1.type.DIR_SIGNIFIER.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/matlab.type.File.xml b/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/matlab.type.File.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/matlab.type.File.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/matlab.type.File/1.type.DIR_SIGNIFIER.xml b/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/matlab.type.File/1.type.DIR_SIGNIFIER.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/matlab.type.File/1.type.DIR_SIGNIFIER.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/matlab.type.File/sim_nano_station_tomo.slx.type.File.xml b/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/matlab.type.File/sim_nano_station_tomo.slx.type.File.xml new file mode 100644 index 0000000..80b5b16 --- /dev/null +++ b/.SimulinkProject/Root.type.Files/experiment_tomography.type.File/matlab.type.File/sim_nano_station_tomo.slx.type.File.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.SimulinkProject/Root.type.Files/positioning_error.type.File.xml b/.SimulinkProject/Root.type.Files/positioning_error.type.File.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/.SimulinkProject/Root.type.Files/positioning_error.type.File.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.SimulinkProject/Root.type.Files/positioning_error.type.File/1.type.DIR_SIGNIFIER.xml b/.SimulinkProject/Root.type.Files/positioning_error.type.File/1.type.DIR_SIGNIFIER.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/.SimulinkProject/Root.type.Files/positioning_error.type.File/1.type.DIR_SIGNIFIER.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.SimulinkProject/Root.type.Files/positioning_error.type.File/matlab.type.File.xml b/.SimulinkProject/Root.type.Files/positioning_error.type.File/matlab.type.File.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/.SimulinkProject/Root.type.Files/positioning_error.type.File/matlab.type.File.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.SimulinkProject/Root.type.Files/positioning_error.type.File/matlab.type.File/1.type.DIR_SIGNIFIER.xml b/.SimulinkProject/Root.type.Files/positioning_error.type.File/matlab.type.File/1.type.DIR_SIGNIFIER.xml new file mode 100644 index 0000000..1c0844e --- /dev/null +++ b/.SimulinkProject/Root.type.Files/positioning_error.type.File/matlab.type.File/1.type.DIR_SIGNIFIER.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.SimulinkProject/Root.type.Files/positioning_error.type.File/matlab.type.File/sim_nano_station_metrology.slx.type.File.xml b/.SimulinkProject/Root.type.Files/positioning_error.type.File/matlab.type.File/sim_nano_station_metrology.slx.type.File.xml new file mode 100644 index 0000000..80b5b16 --- /dev/null +++ b/.SimulinkProject/Root.type.Files/positioning_error.type.File/matlab.type.File/sim_nano_station_metrology.slx.type.File.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/active_damping/index.org b/active_damping/index.org index 3b541de..37d3a3b 100644 --- a/active_damping/index.org +++ b/active_damping/index.org @@ -97,7 +97,7 @@ The performance of this undamped system will be compared with the damped system #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_id.slx' + open('active_damping/matlab/sim_nano_station_id.slx') #+end_src ** Init @@ -462,7 +462,7 @@ And the closed loop system is computed below. #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_id.slx' + open('active_damping/matlab/sim_nano_station_id.slx') #+end_src ** Control Design @@ -1001,7 +1001,7 @@ And the closed loop system is computed below. #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_id.slx' + open('active_damping/matlab/sim_nano_station_id.slx') #+end_src ** Control Design @@ -1514,7 +1514,7 @@ The obtained sensitivity to disturbances is shown in figure [[fig:dvf_1dof_sensi #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_id.slx' + open('active_damping/matlab/sim_nano_station_id.slx') #+end_src ** Control Design diff --git a/simscape/sim_nano_station_id.slx b/active_damping/matlab/sim_nano_station_id.slx similarity index 100% rename from simscape/sim_nano_station_id.slx rename to active_damping/matlab/sim_nano_station_id.slx diff --git a/disturbances/index.org b/disturbances/index.org index afaee94..265b7a5 100644 --- a/disturbances/index.org +++ b/disturbances/index.org @@ -25,7 +25,7 @@ #+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 matlab/modal_frf_coh.m +#+PROPERTY: header-args:matlab+ :tangle no #+PROPERTY: header-args:matlab+ :mkdirp yes #+PROPERTY: header-args:shell :eval no-export @@ -184,7 +184,7 @@ This file is divided in the following sections: #+end_src #+begin_src matlab - open 'simscape/sim_micro_station_disturbances.slx' + open('disturbances/matlab/sim_micro_station_disturbances.slx') #+end_src * Identification diff --git a/disturbances/matlab/modal_frf_coh.m b/disturbances/matlab/modal_frf_coh.m deleted file mode 100644 index 6884b57..0000000 --- a/disturbances/matlab/modal_frf_coh.m +++ /dev/null @@ -1,343 +0,0 @@ -%% Clear Workspace and Close figures -clear; close all; clc; - -%% Intialize Laplace variable -s = zpk('s'); - -open 'simscape/sim_micro_station_disturbances.slx' - -% Identification -% <> - -% The transfer functions from the disturbance forces to the relative velocity of the hexapod with respect to the granite are computed using the Simscape Model representing the experimental setup with the code below. - - -%% Options for Linearized -options = linearizeOptions; -options.SampleTime = 0; - -%% Name of the Simulink File -mdl = 'sim_micro_station_disturbances'; - -%% Micro-Hexapod -% Input/Output definition -io(1) = linio([mdl, '/Dw'], 1, 'input'); % Ground Motion -io(2) = linio([mdl, '/Fty'], 1, 'input'); % Parasitic force Ty -io(3) = linio([mdl, '/Frz'], 1, 'input'); % Parasitic force Rz -io(4) = linio([mdl, '/Dgm'], 1, 'output'); % Absolute motion - Granite -io(5) = linio([mdl, '/Dhm'], 1, 'output'); % Absolute Motion - Hexapod -io(6) = linio([mdl, '/Vm'], 1, 'output'); % Relative Velocity hexapod/granite - -% Run the linearization -G = linearize(mdl, io, 0); - -% Input/Output names -G.InputName = {'Dw', 'Fty', 'Frz'}; -G.OutputName = {'Dgm', 'Dhm', 'Vm'}; - -% Sensitivity to Disturbances -% <> - - -freqs = logspace(0, 3, 1000); - -figure; -title('$D_w$ to $D$'); -hold on; -plot(freqs, abs(squeeze(freqresp(G('Vm', 'Dw')/s, freqs, 'Hz'))), 'k-'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]'); - - - -% #+NAME: fig:sensitivity_dist_gm -% #+CAPTION: Sensitivity to Ground Motion ([[./figs/sensitivity_dist_gm.png][png]], [[./figs/sensitivity_dist_gm.pdf][pdf]]) -% [[file:figs/sensitivity_dist_gm.png]] - - - -freqs = logspace(0, 3, 1000); - -figure; -title('$F_{ty}$ to $D$'); -hold on; -plot(freqs, abs(squeeze(freqresp(G('Vm', 'Fty')/s, freqs, 'Hz'))), 'k-'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); - - - -% #+NAME: fig:sensitivity_dist_fty -% #+CAPTION: Sensitivity to vertical forces applied by the Ty stage ([[./figs/sensitivity_dist_fty.png][png]], [[./figs/sensitivity_dist_fty.pdf][pdf]]) -% [[file:figs/sensitivity_dist_fty.png]] - - - -freqs = logspace(0, 3, 1000); - -figure; -title('$F_{rz}$ to $D$'); -hold on; -plot(freqs, abs(squeeze(freqresp(G('Vm', 'Frz')/s, freqs, 'Hz'))), 'k-'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); - -% Power Spectral Density of the effect of the disturbances -% <> -% The PSD of the relative velocity between the hexapod and the marble in $[(m/s)^2/Hz]$ are loaded for the following sources of disturbance: -% - Slip Ring Rotation -% - Scan of the translation stage (effect in the vertical direction and in the horizontal direction) - -% Also, the Ground Motion is measured. - - -gm = load('./disturbances/mat/psd_gm.mat', 'f', 'psd_gm', 'psd_gv'); -rz = load('./disturbances/mat/pxsp_r.mat', 'f', 'pxsp_r'); -tyz = load('./disturbances/mat/pxz_ty_r.mat', 'f', 'pxz_ty_r'); -tyx = load('./disturbances/mat/pxe_ty_r.mat', 'f', 'pxe_ty_r'); - -gm.f = gm.f(2:end); -rz.f = rz.f(2:end); -tyz.f = tyz.f(2:end); -tyx.f = tyx.f(2:end); - -gm.psd_gm = gm.psd_gm(2:end); % PSD of Ground Motion [m^2/Hz] -gm.psd_gv = gm.psd_gv(2:end); % PSD of Ground Velocity [(m/s)^2/Hz] -rz.pxsp_r = rz.pxsp_r(2:end); % PSD of Relative Velocity [(m/s)^2/Hz] -tyz.pxz_ty_r = tyz.pxz_ty_r(2:end); % PSD of Relative Velocity [(m/s)^2/Hz] -tyx.pxe_ty_r = tyx.pxe_ty_r(2:end); % PSD of Relative Velocity [(m/s)^2/Hz] - - - -% We now compute the relative velocity between the hexapod and the granite due to ground motion. - -gm.psd_rv = gm.psd_gm.*abs(squeeze(freqresp(G('Vm', 'Dw'), gm.f, 'Hz'))).^2; - - - -% The Power Spectral Density of the relative motion/velocity of the hexapod with respect to the granite are shown in figures [[fig:dist_effect_relative_velocity]] and [[fig:dist_effect_relative_motion]]. - -% The Cumulative Amplitude Spectrum of the relative motion is shown in figure [[fig:dist_effect_relative_motion_cas]]. - - -figure; -hold on; -plot(gm.f, sqrt(gm.psd_rv), 'DisplayName', 'Ground Motion'); -plot(tyz.f, sqrt(tyz.pxz_ty_r), 'DisplayName', 'Ty'); -plot(rz.f, sqrt(rz.pxsp_r), 'DisplayName', 'Rz'); -hold off; -set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log'); -xlabel('Frequency [Hz]'); ylabel('ASD of the measured velocity $\left[\frac{m/s}{\sqrt{Hz}}\right]$') -legend('Location', 'southwest'); -xlim([2, 500]); - - - -% #+NAME: fig:dist_effect_relative_velocity -% #+CAPTION: Amplitude Spectral Density of the relative velocity of the hexapod with respect to the granite due to different sources of perturbation ([[./figs/dist_effect_relative_velocity.png][png]], [[./figs/dist_effect_relative_velocity.pdf][pdf]]) -% [[file:figs/dist_effect_relative_velocity.png]] - - - -figure; -hold on; -plot(gm.f, sqrt(gm.psd_rv)./(2*pi*gm.f), 'DisplayName', 'Ground Motion'); -plot(tyz.f, sqrt(tyz.pxz_ty_r)./(2*pi*tyz.f), 'DisplayName', 'Ty'); -plot(rz.f, sqrt(rz.pxsp_r)./(2*pi*rz.f), 'DisplayName', 'Rz'); -hold off; -set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log'); -xlabel('Frequency [Hz]'); ylabel('ASD of the displacement $\left[\frac{m}{\sqrt{Hz}}\right]$') -legend('Location', 'southwest'); -xlim([2, 500]); - - - -% #+NAME: fig:dist_effect_relative_motion -% #+CAPTION: Amplitude Spectral Density of the relative displacement of the hexapod with respect to the granite due to different sources of perturbation ([[./figs/dist_effect_relative_motion.png][png]], [[./figs/dist_effect_relative_motion.pdf][pdf]]) -% [[file:figs/dist_effect_relative_motion.png]] - - -figure; -hold on; -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(gm.psd_rv./((2*pi*gm.f).^2))))), 'DisplayName', 'Ground Motion'); -plot(tyz.f, flip(sqrt(-cumtrapz(flip(tyz.f), flip(tyz.pxz_ty_r./((2*pi*tyz.f).^2))))), 'DisplayName', 'Ty'); -plot(rz.f, flip(sqrt(-cumtrapz(flip(rz.f), flip(rz.pxsp_r./((2*pi*rz.f).^2))))), 'DisplayName', 'Rz'); -hold off; -set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log'); -xlabel('Frequency [Hz]'); ylabel('CAS of the relative displacement $[m]$') -legend('Location', 'southwest'); -xlim([2, 500]); ylim([1e-11, 1e-6]); - -% Compute the Power Spectral Density of the disturbance force -% <> - -% Now, from the extracted transfer functions from the disturbance force to the relative motion of the hexapod with respect to the granite (section [[sec:sensitivity_disturbances]]) and from the measured PSD of the relative motion (section [[sec:psd_dist]]), we can compute the PSD of the disturbance force. - - -rz.psd_f = rz.pxsp_r./abs(squeeze(freqresp(G('Vm', 'Frz'), rz.f, 'Hz'))).^2; -tyz.psd_f = tyz.pxz_ty_r./abs(squeeze(freqresp(G('Vm', 'Fty'), tyz.f, 'Hz'))).^2; - -figure; -hold on; -set(gca,'ColorOrderIndex',2); -plot(tyz.f, sqrt(tyz.psd_f), 'DisplayName', 'F - Ty'); -plot(rz.f, sqrt(rz.psd_f), 'DisplayName', 'F - Rz'); -hold off; -set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log'); -xlabel('Frequency [Hz]'); ylabel('ASD of the disturbance force $\left[\frac{F}{\sqrt{Hz}}\right]$') -legend('Location', 'southwest'); -xlim([2, 500]); - -% Noise Budget -% <> - -% Now, from the compute spectral density of the disturbance sources, we can compute the resulting relative motion of the Hexapod with respect to the granite using the model. -% We should verify that this is coherent with the measurements. - - -% Power Spectral Density of the relative Displacement -psd_gm_d = gm.psd_gm.*abs(squeeze(freqresp(G('Vm', 'Dw')/s, gm.f, 'Hz'))).^2; -psd_ty_d = tyz.psd_f.*abs(squeeze(freqresp(G('Vm', 'Fty')/s, tyz.f, 'Hz'))).^2; -psd_rz_d = rz.psd_f.*abs(squeeze(freqresp(G('Vm', 'Frz')/s, rz.f, 'Hz'))).^2; - -figure; -hold on; -plot(gm.f, sqrt(psd_gm_d), 'DisplayName', 'Ground Motion'); -plot(tyz.f, sqrt(psd_ty_d), 'DisplayName', 'Ty'); -plot(rz.f, sqrt(psd_rz_d), 'DisplayName', 'Rz'); -plot(rz.f, sqrt(psd_gm_d + psd_ty_d + psd_rz_d), 'k--', 'DisplayName', 'tot'); -hold off; -set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log'); -xlabel('Frequency [Hz]'); ylabel('ASD of the relative motion $\left[\frac{m}{\sqrt{Hz}}\right]$') -legend('Location', 'southwest'); -xlim([2, 500]); - - - -% #+NAME: fig:psd_effect_dist_verif -% #+CAPTION: Computed Effect of the disturbances on the relative displacement hexapod/granite ([[./figs/psd_effect_dist_verif.png][png]], [[./figs/psd_effect_dist_verif.pdf][pdf]]) -% [[file:figs/psd_effect_dist_verif.png]] - - - -figure; -hold on; -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_gm_d)))), 'DisplayName', 'Ground Motion'); -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_ty_d)))), 'DisplayName', 'Ty'); -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_rz_d)))), 'DisplayName', 'Rz'); -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_gm_d + psd_ty_d + psd_rz_d)))), 'k-', 'DisplayName', 'tot'); -hold off; -set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Cumulative Amplitude Spectrum [m]') -legend('location', 'northeast'); -xlim([2, 500]); ylim([1e-11, 1e-6]); - -% Approximation -% We approximate the PSD of the disturbance with the following transfer functions. - -G_ty = 0.1*(s+634.3)*(s+283.7)/((s+2*pi)*(s+2*pi)); -G_rz = 0.5*(s+418.8)*(s+36.51)*(s^2 + 110.9*s + 3.375e04)/((s+0.7324)*(s+0.546)*(s^2 + 0.6462*s + 2.391e04)); -G_gm = 0.002*(s^2 + 3.169*s + 27.74)/(s*(s+32.73)*(s+8.829)*(s+7.983)^2); - - - -% We compute the effect of these approximate disturbances on $D$. - -% Power Spectral Density of the relative Displacement -psd_gm_s = abs(squeeze(freqresp(G_gm*G('Vm', 'Dw')/s, gm.f, 'Hz'))).^2; -psd_ty_s = abs(squeeze(freqresp(G_ty*G('Vm', 'Fty')/s, gm.f, 'Hz'))).^2; -psd_rz_s = abs(squeeze(freqresp(G_rz*G('Vm', 'Frz')/s, gm.f, 'Hz'))).^2; - -figure; -ax1 = subplot(1, 2, 1); -hold on; -set(gca,'ColorOrderIndex',2); -plot(gm.f, sqrt(psd_ty_d), 'DisplayName', 'F - Ty'); -plot(gm.f, sqrt(psd_rz_d), 'DisplayName', 'F - Rz'); -set(gca,'ColorOrderIndex',2); -plot(gm.f, sqrt(psd_ty_s), '--', 'HandleVisibility', 'off'); -plot(gm.f, sqrt(psd_rz_s), '--', 'HandleVisibility', 'off'); -hold off; -set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log'); -xlabel('Frequency [Hz]'); ylabel('ASD of the disturbance force $\left[\frac{F}{\sqrt{Hz}}\right]$') -legend('Location', 'southwest'); -xlim([2, 500]); - -ax2 = subplot(1, 2, 2); -hold on; -plot(gm.f, sqrt(psd_gm_d), 'DisplayName', 'D - Gm'); -set(gca,'ColorOrderIndex',1); -plot(gm.f, sqrt(psd_gm_s), '--', 'HandleVisibility', 'off'); -hold off; -set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log'); -xlabel('Frequency [Hz]'); ylabel('ASD of the ground displacement $\left[\frac{m}{\sqrt{Hz}}\right]$') -legend('Location', 'southwest'); -xlim([2, 500]); - - - -% #+NAME: fig:estimate_spectral_density_disturbances -% #+CAPTION: Estimated spectral density of the disturbances ([[./figs/estimate_spectral_density_disturbances.png][png]], [[./figs/estimate_spectral_density_disturbances.pdf][pdf]]) -% [[file:figs/estimate_spectral_density_disturbances.png]] - - -figure; -hold on; -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_gm_d)))), 'DisplayName', 'Gm'); -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_ty_d)))), 'DisplayName', 'Ty'); -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_rz_d)))), 'DisplayName', 'Rz'); -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_gm_d + psd_ty_d + psd_rz_d)))), 'k-', 'DisplayName', 'tot'); -set(gca,'ColorOrderIndex',1); -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_gm_s)))), '--', 'HandleVisibility', 'off'); -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_ty_s)))), '--', 'HandleVisibility', 'off'); -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_rz_s)))), '--', 'HandleVisibility', 'off'); -plot(gm.f, flip(sqrt(-cumtrapz(flip(gm.f), flip(psd_gm_s + psd_ty_s + psd_rz_s)))), 'k--', 'HandleVisibility', 'off'); -hold off; -set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Cumulative Amplitude Spectrum [m]') -legend('location', 'northeast'); -xlim([2, 500]); ylim([1e-11, 1e-6]); - -% Save -% The PSD of the disturbance force are now saved for further noise budgeting when control is applied (the mat file is accessible [[file:mat/dist_psd.mat][here]]). - - -dist_f = struct(); - -dist_f.f = gm.f; % Frequency Vector [Hz] - -dist_f.psd_gm = gm.psd_gm; % Power Spectral Density of the Ground Motion [m^2/Hz] -dist_f.psd_ty = tyz.psd_f; % Power Spectral Density of the force induced by the Ty stage in the Z direction [N^2/Hz] -dist_f.psd_rz = rz.psd_f; % Power Spectral Density of the force induced by the Rz stage in the Z direction [N^2/Hz] - -dist_f.G_gm = G_ty; -dist_f.G_ty = G_rz; -dist_f.G_rz = G_gm; - -save('./disturbances/mat/dist_psd.mat', 'dist_f'); - -% Display Obtained Disturbances - -initDisturbances(); -load('./mat/nass_disturbances.mat', 'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_z', 'Fd', 'Ts', 't'); - -figure; -hold on; -plot(t, Dwx, 'DisplayName', 'Dw x'); -plot(t, Dwy, 'DisplayName', 'Dw y'); -plot(t, Dwz, 'DisplayName', 'Dw z'); -hold off; -xlabel('Time [s]'); ylabel('Amplitude [m]'); -legend('location', 'north east'); - -figure; -hold on; -plot(t, Fty_x, 'DisplayName', 'Ty x'); -plot(t, Fty_z, 'DisplayName', 'Ty z'); -plot(t, Frz_z, 'DisplayName', 'Rz z'); -hold off; -xlabel('Time [s]'); ylabel('Force [N]'); -legend('location', 'north east'); diff --git a/simscape/sim_micro_station_disturbances.slx b/disturbances/matlab/sim_micro_station_disturbances.slx similarity index 100% rename from simscape/sim_micro_station_disturbances.slx rename to disturbances/matlab/sim_micro_station_disturbances.slx diff --git a/experiment_tomography/index.org b/experiment_tomography/index.org index aa6b98d..da072a1 100644 --- a/experiment_tomography/index.org +++ b/experiment_tomography/index.org @@ -55,7 +55,7 @@ #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_tomo.slx' + open('experiment_tomography/matlab/sim_nano_station_tomo.slx') #+end_src * Initialize Experiment diff --git a/simscape/sim_nano_station_tomo.slx b/experiment_tomography/matlab/sim_nano_station_tomo.slx similarity index 100% rename from simscape/sim_nano_station_tomo.slx rename to experiment_tomography/matlab/sim_nano_station_tomo.slx diff --git a/functions/index.html b/functions/index.html index 75fb670..e81b1a2 100644 --- a/functions/index.html +++ b/functions/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Matlab Functions used for the NASS Project @@ -258,34 +258,33 @@ for the JavaScript code in this tag.

Table of Contents

-
-

1 Functions

+
+

1 Functions

- +

-
-

1.1 computePsdDispl

+
+

1.1 computePsdDispl

- +

@@ -321,11 +320,11 @@ This Matlab function is accessible here.

-
-

1.2 computeSetpoint

+
+

1.2 computeSetpoint

- +

@@ -397,11 +396,11 @@ setpoint( -

1.3 converErrorBasis

+
+

1.3 converErrorBasis

- +

@@ -539,11 +538,11 @@ error_nass = [dx; dy; dz; th

-
-

1.4 generateDiagPidControl

+
+

1.4 generateDiagPidControl

- +

@@ -574,11 +573,11 @@ This Matlab function is accessible her

-
-

1.5 identifyPlant

+
+

1.5 identifyPlant

- +

@@ -670,84 +669,11 @@ This Matlab function is accessible here.

-
-

1.6 runSimulation

+
+

1.6 Inverse Kinematics of the Hexapod

- -

- -

-This Matlab function is accessible here. -

- -
-
function [] = runSimulation(sys_name, sys_mass, ctrl_type, act_damp)
-    %% Load the controller and save it for the simulation
-    if strcmp(ctrl_type, 'cl') && strcmp(act_damp, 'none')
-      K_obj = load('./mat/K_fb.mat');
-      K = K_obj.(sprintf('K_%s_%s', sys_mass, sys_name)); %#ok
-      save('./mat/controllers.mat', 'K');
-    elseif strcmp(ctrl_type, 'cl') && strcmp(act_damp, 'iff')
-      K_obj = load('./mat/K_fb_iff.mat');
-      K = K_obj.(sprintf('K_%s_%s_iff', sys_mass, sys_name)); %#ok
-      save('./mat/controllers.mat', 'K');
-    elseif strcmp(ctrl_type, 'ol')
-      K = tf(zeros(6)); %#ok
-      save('./mat/controllers.mat', 'K');
-    else
-      error('ctrl_type should be cl or ol');
-    end
-
-    %% Active Damping
-    if strcmp(act_damp, 'iff')
-      K_iff_crit = load('./mat/K_iff_crit.mat');
-      K_iff = K_iff_crit.(sprintf('K_iff_%s_%s', sys_mass, sys_name)); %#ok
-      save('./mat/controllers.mat', 'K_iff', '-append');
-    elseif strcmp(act_damp, 'none')
-      K_iff = tf(zeros(6)); %#ok
-      save('./mat/controllers.mat', 'K_iff', '-append');
-    end
-
-    %%
-    if strcmp(sys_name, 'pz')
-      initializeNanoHexapod(struct('actuator', 'piezo'));
-    elseif strcmp(sys_name, 'vc')
-      initializeNanoHexapod(struct('actuator', 'lorentz'));
-    else
-      error('sys_name should be pz or vc');
-    end
-
-    if strcmp(sys_mass, 'light')
-      initializeSample(struct('mass', 1));
-    elseif strcmp(sys_mass, 'heavy')
-      initializeSample(struct('mass', 50));
-    else
-      error('sys_mass should be light or heavy');
-    end
-
-    %% Run the simulation
-    sim('sim_nano_station_ctrl.slx');
-
-    %% Split the Dsample matrix into vectors
-    [Dx, Dy, Dz, Rx, Ry, Rz] = matSplit(Es.Data, 1); %#ok
-    time = Dsample.Time; %#ok
-
-    %% Save the result
-    filename = sprintf('sim_%s_%s_%s_%s', sys_mass, sys_name, ctrl_type, act_damp);
-    save(sprintf('./mat/%s.mat', filename), ...
-        'time', 'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz', 'K');
-end
-
-
-
-
- -
-

1.7 Inverse Kinematics of the Hexapod

-
-

- +

@@ -779,11 +705,11 @@ This Matlab function is accessible here

-
-

1.8 computeReferencePose

-
+
+

1.7 computeReferencePose

+

- +

@@ -876,7 +802,7 @@ This Matlab function is accessible here

Author: Dehaeze Thomas

-

Created: 2019-12-11 mer. 17:33

+

Created: 2019-12-12 jeu. 11:25

Validate

diff --git a/functions/index.org b/functions/index.org index 93f7dc7..07299a0 100644 --- a/functions/index.org +++ b/functions/index.org @@ -407,74 +407,6 @@ This Matlab function is accessible [[file:../src/identifyPlant.m][here]]. end #+end_src -** runSimulation -:PROPERTIES: -:header-args:matlab+: :tangle ../src/runSimulation.m -:header-args:matlab+: :comments none :mkdirp yes :eval no -:END: -<> - -This Matlab function is accessible [[file:../src/runSimulation.m][here]]. - -#+begin_src matlab - function [] = runSimulation(sys_name, sys_mass, ctrl_type, act_damp) - %% Load the controller and save it for the simulation - if strcmp(ctrl_type, 'cl') && strcmp(act_damp, 'none') - K_obj = load('./mat/K_fb.mat'); - K = K_obj.(sprintf('K_%s_%s', sys_mass, sys_name)); %#ok - save('./mat/controllers.mat', 'K'); - elseif strcmp(ctrl_type, 'cl') && strcmp(act_damp, 'iff') - K_obj = load('./mat/K_fb_iff.mat'); - K = K_obj.(sprintf('K_%s_%s_iff', sys_mass, sys_name)); %#ok - save('./mat/controllers.mat', 'K'); - elseif strcmp(ctrl_type, 'ol') - K = tf(zeros(6)); %#ok - save('./mat/controllers.mat', 'K'); - else - error('ctrl_type should be cl or ol'); - end - - %% Active Damping - if strcmp(act_damp, 'iff') - K_iff_crit = load('./mat/K_iff_crit.mat'); - K_iff = K_iff_crit.(sprintf('K_iff_%s_%s', sys_mass, sys_name)); %#ok - save('./mat/controllers.mat', 'K_iff', '-append'); - elseif strcmp(act_damp, 'none') - K_iff = tf(zeros(6)); %#ok - save('./mat/controllers.mat', 'K_iff', '-append'); - end - - %% - if strcmp(sys_name, 'pz') - initializeNanoHexapod(struct('actuator', 'piezo')); - elseif strcmp(sys_name, 'vc') - initializeNanoHexapod(struct('actuator', 'lorentz')); - else - error('sys_name should be pz or vc'); - end - - if strcmp(sys_mass, 'light') - initializeSample(struct('mass', 1)); - elseif strcmp(sys_mass, 'heavy') - initializeSample(struct('mass', 50)); - else - error('sys_mass should be light or heavy'); - end - - %% Run the simulation - sim('sim_nano_station_ctrl.slx'); - - %% Split the Dsample matrix into vectors - [Dx, Dy, Dz, Rx, Ry, Rz] = matSplit(Es.Data, 1); %#ok - time = Dsample.Time; %#ok - - %% Save the result - filename = sprintf('sim_%s_%s_%s_%s', sys_mass, sys_name, ctrl_type, act_damp); - save(sprintf('./mat/%s.mat', filename), ... - 'time', 'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz', 'K'); - end -#+end_src - ** Inverse Kinematics of the Hexapod :PROPERTIES: :header-args:matlab+: :tangle ../src/inverseKinematicsHexapod.m diff --git a/identification/index.org b/identification/index.org index 6f047c9..3f5a0ac 100644 --- a/identification/index.org +++ b/identification/index.org @@ -77,7 +77,7 @@ We first define some parameters for the identification. The simulink file for the identification is =sim_micro_station_id.slx=. #+begin_src matlab - open 'simscape/sim_micro_station_id.slx' + open('identification/matlab/sim_micro_station_id.slx') #+end_src #+begin_src matlab @@ -140,7 +140,7 @@ save('./mat/id_micro_station.mat', 'G_ms'); ** Simscape Model #+begin_src matlab - open 'simscape/sim_micro_station_modal_analysis.slx' + open('identification/matlab/sim_micro_station_modal_analysis.slx') #+end_src #+begin_src matlab @@ -230,7 +230,9 @@ hold off; initializeAxisc(); #+end_src -** Center of Mass of each solid body +** TODO Center of Mass of each solid body +- [ ] Verify that this is coherent with the simscape and with the measurements + | | granite bot | granite top | ty | ry | rz | hexa | |--------+-------------+-------------+------+------+------+------| @@ -239,7 +241,7 @@ hold off; | Z [mm] | -1251 | -778 | -600 | -628 | -580 | -319 | #+begin_src matlab - open 'simscape/sim_micro_station_modal_analysis_com.slx' + open('identification/matlab/sim_micro_station_modal_analysis_com.slx') #+end_src ** Simscape Model @@ -409,22 +411,8 @@ hold off; #+CAPTION: caption ([[./figs/identification_comp_top_stages.png][png]], [[./figs/identification_comp_top_stages.pdf][pdf]]) [[file:figs/identification_comp_top_stages.png]] -* ZIP file containing the data and matlab files :ignore: -#+begin_src bash :exports none :results none - if [ matlab/identification_micro_station.m -nt data/identification_micro_station.zip ]; then - cp matlab/identification_micro_station.m identification_micro_station.m; - zip data/identification_micro_station \ - mat/data.mat \ - identification_micro_station.m - rm identification_micro_station.m; - fi -#+end_src - -#+begin_note - All the files (data and Matlab scripts) are accessible [[file:data/identification_micro_station.zip][here]]. -#+end_note - -* Matlab Init :noexport:ignore: +* Other analysis +** 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 @@ -433,15 +421,14 @@ hold off; <> #+end_src -* Identification of the micro-station #+begin_src matlab simulinkproject('../'); #+end_src #+begin_src matlab - open sim_micro_station_id.slx + open('identification/matlab/sim_micro_station_id.slx') #+end_src -* Plot the obtained transfer functions -* Compare with the modal measurements -* Modal Identification of the micro station +** Plot the obtained transfer functions +** Compare with the modal measurements +** Modal Identification of the micro station diff --git a/simscape/sim_micro_station_id.slx b/identification/matlab/sim_micro_station_id.slx similarity index 100% rename from simscape/sim_micro_station_id.slx rename to identification/matlab/sim_micro_station_id.slx diff --git a/simscape/sim_micro_station_modal_analysis.slx b/identification/matlab/sim_micro_station_modal_analysis.slx similarity index 100% rename from simscape/sim_micro_station_modal_analysis.slx rename to identification/matlab/sim_micro_station_modal_analysis.slx diff --git a/simscape/sim_micro_station_modal_analysis_com.slx b/identification/matlab/sim_micro_station_modal_analysis_com.slx similarity index 100% rename from simscape/sim_micro_station_modal_analysis_com.slx rename to identification/matlab/sim_micro_station_modal_analysis_com.slx diff --git a/kinematics/index.org b/kinematics/index.org index f94096a..30baca8 100644 --- a/kinematics/index.org +++ b/kinematics/index.org @@ -147,7 +147,7 @@ Otherwise, when the limbs' lengths derived yield complex numbers, then the posit **** Matlab Implementation We open the Simulink file. #+begin_src matlab - open 'simscape/hexapod_tests.slx' + open('kinematics/matlab/hexapod_tests.slx') #+end_src We load the configuration and set a small =StopTime=. @@ -182,7 +182,7 @@ We define the wanted position/orientation of the Hexapod under study. We run the simulation. #+begin_src matlab - sim('simscape/hexapod_tests.slx') + sim('hexapod_tests.slx') #+end_src And we verify that we indeed succeed to go to the wanted position. diff --git a/simscape/hexapod_tests.slx b/kinematics/matlab/hexapod_tests.slx similarity index 100% rename from simscape/hexapod_tests.slx rename to kinematics/matlab/hexapod_tests.slx diff --git a/positioning_error/index.org b/positioning_error/index.org index 4b4efb1..2192af8 100644 --- a/positioning_error/index.org +++ b/positioning_error/index.org @@ -96,7 +96,7 @@ The goal here is to perfectly move the station and verify that there is no misma #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_metrology.slx' + open('positioning_error/matlab/sim_nano_station_metrology.slx') #+end_src ** Prepare the Simulation @@ -160,7 +160,7 @@ No position error for now (perfect positioning). And we run the simulation. #+begin_src matlab - sim('simscape/sim_nano_station_metrology.slx'); + sim('sim_nano_station_metrology.slx'); #+end_src ** Verify that the pose of the sample is the same as the computed one @@ -246,7 +246,7 @@ We want to verify that we are able to measure this positioning error and convert #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_metrology.slx' + open('positioning_error/matlab/sim_nano_station_metrology.slx') #+end_src ** Prepare the Simulation @@ -308,7 +308,7 @@ Now we introduce some positioning error. And we run the simulation. #+begin_src matlab - sim('simscape/sim_nano_station_metrology.slx'); + sim('sim_nano_station_metrology.slx'); #+end_src ** Compute the wanted pose of the sample in the NASS Base from the metrology and the reference @@ -407,7 +407,7 @@ We now keep the wanted pose but we impose a displacement of the nano hexapod cor And we run the simulation. #+begin_src matlab - sim('simscape/sim_nano_station_metrology.slx'); + sim('sim_nano_station_metrology.slx'); #+end_src We keep the old computed computed reference pose ${}^W\bm{T}_r$ even though we have change the nano hexapod reference, but this is not a real wanted reference but rather a adaptation to reject the positioning errors. @@ -497,7 +497,7 @@ Thus: #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_metrology.slx' + open('positioning_error/matlab/sim_nano_station_metrology.slx') #+end_src ** Wanted Position of the Sample with respect to the Granite diff --git a/simscape/sim_nano_station_metrology.slx b/positioning_error/matlab/sim_nano_station_metrology.slx similarity index 100% rename from simscape/sim_nano_station_metrology.slx rename to positioning_error/matlab/sim_nano_station_metrology.slx diff --git a/src/runSimulation.m b/src/runSimulation.m deleted file mode 100644 index 51a1b53..0000000 --- a/src/runSimulation.m +++ /dev/null @@ -1,56 +0,0 @@ -function [] = runSimulation(sys_name, sys_mass, ctrl_type, act_damp) - %% Load the controller and save it for the simulation - if strcmp(ctrl_type, 'cl') && strcmp(act_damp, 'none') - K_obj = load('./mat/K_fb.mat'); - K = K_obj.(sprintf('K_%s_%s', sys_mass, sys_name)); %#ok - save('./mat/controllers.mat', 'K'); - elseif strcmp(ctrl_type, 'cl') && strcmp(act_damp, 'iff') - K_obj = load('./mat/K_fb_iff.mat'); - K = K_obj.(sprintf('K_%s_%s_iff', sys_mass, sys_name)); %#ok - save('./mat/controllers.mat', 'K'); - elseif strcmp(ctrl_type, 'ol') - K = tf(zeros(6)); %#ok - save('./mat/controllers.mat', 'K'); - else - error('ctrl_type should be cl or ol'); - end - - %% Active Damping - if strcmp(act_damp, 'iff') - K_iff_crit = load('./mat/K_iff_crit.mat'); - K_iff = K_iff_crit.(sprintf('K_iff_%s_%s', sys_mass, sys_name)); %#ok - save('./mat/controllers.mat', 'K_iff', '-append'); - elseif strcmp(act_damp, 'none') - K_iff = tf(zeros(6)); %#ok - save('./mat/controllers.mat', 'K_iff', '-append'); - end - - %% - if strcmp(sys_name, 'pz') - initializeNanoHexapod(struct('actuator', 'piezo')); - elseif strcmp(sys_name, 'vc') - initializeNanoHexapod(struct('actuator', 'lorentz')); - else - error('sys_name should be pz or vc'); - end - - if strcmp(sys_mass, 'light') - initializeSample(struct('mass', 1)); - elseif strcmp(sys_mass, 'heavy') - initializeSample(struct('mass', 50)); - else - error('sys_mass should be light or heavy'); - end - - %% Run the simulation - sim('sim_nano_station_ctrl.slx'); - - %% Split the Dsample matrix into vectors - [Dx, Dy, Dz, Rx, Ry, Rz] = matSplit(Es.Data, 1); %#ok - time = Dsample.Time; %#ok - - %% Save the result - filename = sprintf('sim_%s_%s_%s_%s', sys_mass, sys_name, ctrl_type, act_damp); - save(sprintf('./mat/%s.mat', filename), ... - 'time', 'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz', 'K'); -end diff --git a/uniaxial/index.org b/uniaxial/index.org index 074d1c3..b8e0551 100644 --- a/uniaxial/index.org +++ b/uniaxial/index.org @@ -643,7 +643,7 @@ Let's start by study the undamped system. #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_uniaxial.slx' + open('uniaxial/matlab/sim_nano_station_uniaxial.slx') #+end_src ** Init @@ -1075,7 +1075,7 @@ It corresponds to the plant to control. #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_uniaxial.slx' + open('uniaxial/matlab/sim_nano_station_uniaxial.slx') #+end_src ** Control Design @@ -1501,7 +1501,7 @@ In the Relative Motion Control (RMC), a derivative feedback is applied between t #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_uniaxial.slx' + open('uniaxial/matlab/sim_nano_station_uniaxial.slx') #+end_src ** Control Design @@ -1936,7 +1936,7 @@ In the Relative Motion Control (RMC), a feedback is applied between the measured #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_uniaxial.slx' + open('uniaxial/matlab/sim_nano_station_uniaxial.slx') #+end_src ** Control Design @@ -2236,7 +2236,7 @@ The model used for the Cedrat actuator is shown in figure [[fig:cedrat_schematic #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_uniaxial_cedrat.slx' + open('uniaxial/matlab/sim_nano_station_uniaxial_cedrat.slx') #+end_src ** Identification @@ -2573,7 +2573,7 @@ All the controllers are set to 0. #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_uniaxial.slx' + open('uniaxial/matlab/sim_nano_station_uniaxial.slx') #+end_src ** Load the plants @@ -2831,7 +2831,7 @@ It is important to note that the effect of direct forces applied to the sample a #+end_src #+begin_src matlab - open 'simscape/sim_nano_station_uniaxial.slx' + open('uniaxial/matlab/sim_nano_station_uniaxial.slx') #+end_src ** Init diff --git a/simscape/sim_nano_station_uniaxial.slx b/uniaxial/matlab/sim_nano_station_uniaxial.slx similarity index 100% rename from simscape/sim_nano_station_uniaxial.slx rename to uniaxial/matlab/sim_nano_station_uniaxial.slx diff --git a/simscape/sim_nano_station_uniaxial_cedrat.slx b/uniaxial/matlab/sim_nano_station_uniaxial_cedrat.slx similarity index 100% rename from simscape/sim_nano_station_uniaxial_cedrat.slx rename to uniaxial/matlab/sim_nano_station_uniaxial_cedrat.slx diff --git a/simscape/sim_nano_station_uniaxial_cedrat_bis.slx b/uniaxial/matlab/sim_nano_station_uniaxial_cedrat_bis.slx similarity index 100% rename from simscape/sim_nano_station_uniaxial_cedrat_bis.slx rename to uniaxial/matlab/sim_nano_station_uniaxial_cedrat_bis.slx