Add comments in the Matlab code
This commit is contained in:
parent
48688427b6
commit
0145bcce53
@ -57,7 +57,7 @@ clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs [N]
|
||||
io(io_i) = linio([mdl, '/NASS'], 3, 'openoutput', [], 'fn'); io_i = io_i + 1; % Force Sensors [N]
|
||||
|
||||
%% Identify for multi payload masses (no rotation)
|
||||
% Identify for multi payload masses (no rotation)
|
||||
initializeReferences(); % No Spindle Rotation
|
||||
% 1kg Sample
|
||||
initializeSample('type', 'cylindrical', 'm', 1);
|
||||
@ -77,7 +77,7 @@ G_iff_m50 = linearize(mdl, io);
|
||||
G_iff_m50.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G_iff_m50.OutputName = {'fn1', 'fn2', 'fn3', 'fn4', 'fn5', 'fn6'};
|
||||
|
||||
%% Effect of Rotation
|
||||
% Effect of Rotation
|
||||
initializeReferences(...
|
||||
'Rz_type', 'rotating', ...
|
||||
'Rz_period', 1); % 360 deg/s
|
||||
@ -86,7 +86,7 @@ G_iff_m25_Rz = linearize(mdl, io, 0.1);
|
||||
G_iff_m25_Rz.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G_iff_m25_Rz.OutputName = {'fn1', 'fn2', 'fn3', 'fn4', 'fn5', 'fn6'};
|
||||
|
||||
%% Effect of Rotation - No added parallel stiffness
|
||||
% Effect of Rotation - No added parallel stiffness
|
||||
initializeSimplifiedNanoHexapod('actuator_kp', 0);
|
||||
initializeReferences(...
|
||||
'Rz_type', 'rotating', ...
|
||||
@ -183,7 +183,7 @@ xlim([f(1), f(end)]);
|
||||
|
||||
% #+name: fig:nass_iff_plant_effect_kp
|
||||
% #+caption: Effect of stiffness parallel to the force sensor on the IFF plant with $\Omega_z = 360\,\text{deg/s}$ and payload mass of 25kg. The dynamics without parallel stiffness has non-minimum phase zeros at low frequency (\subref{fig:nass_iff_plant_no_kp}). The added parallel stiffness transforms the non-minimum phase zeros to complex conjugate zeros (\subref{fig:nass_iff_plant_kp})
|
||||
% #+attr_latex: :options [htbp]
|
||||
% #+attr_latex: :options [h!tbp]
|
||||
% #+begin_figure
|
||||
% #+attr_latex: :caption \subcaption{\label{fig:nass_iff_plant_no_kp}without parallel stiffness}
|
||||
% #+attr_latex: :options {0.48\textwidth}
|
||||
@ -404,6 +404,7 @@ xlim([freqs(1), freqs(end)]);
|
||||
|
||||
% #+name: fig:nass_iff_loop_gain
|
||||
% #+caption: Loop gain for the decentralized IFF: $K_{\text{IFF}}(s) \cdot \frac{f_{mi}}{f_i}(s)$
|
||||
% #+attr_latex: :options [h!tbp]
|
||||
% #+RESULTS:
|
||||
% [[file:figs/nass_iff_loop_gain.png]]
|
||||
|
@ -1,23 +0,0 @@
|
||||
%% Clear Workspace and Close figures
|
||||
clear; close all; clc;
|
||||
|
||||
%% Intialize Laplace variable
|
||||
s = zpk('s');
|
||||
|
||||
%% Path for functions, data and scripts
|
||||
addpath('./mat/'); % Path for Data
|
||||
addpath('./src/'); % Path for functions
|
||||
addpath('./STEPS/'); % Path for STEPS
|
||||
addpath('./subsystems/'); % Path for Subsystems Simulink files
|
||||
|
||||
%% Data directory
|
||||
data_dir = './mat/';
|
||||
|
||||
% Simulink Model name
|
||||
mdl = 'nass_model';
|
||||
|
||||
%% Colors for the figures
|
||||
colors = colororder;
|
||||
|
||||
%% Frequency Vector [Hz]
|
||||
freqs = logspace(0, 3, 1000);
|
@ -23,6 +23,20 @@ colors = colororder;
|
||||
freqs = logspace(0, 3, 1000);
|
||||
|
||||
% HAC Plant
|
||||
% <<ssec:nass_hac_plant>>
|
||||
|
||||
% The plant dynamics from force inputs $\bm{f}$ to the strut errors $\bm{\epsilon}_{\mathcal{L}}$ were first extracted from the multi-body model without implementation of the decentralized IFF.
|
||||
% The influence of spindle rotation on plant dynamics was investigated, with results presented in Figure ref:fig:nass_undamped_plant_effect_Wz.
|
||||
% While rotational motion introduces coupling effects at low frequencies, these remain minimal at operational velocities, owing to the high stiffness characteristics of the nano-hexapod assembly.
|
||||
|
||||
% Payload mass emerged as a significant parameter affecting system behavior, as illustrated in Figure ref:fig:nass_undamped_plant_effect_mass.
|
||||
% As expected, increasing payload mass was found to decrease resonance frequencies while amplifying coupling at low frequency.
|
||||
% These mass-dependent dynamic changes present considerable challenges for control system design, particularly for configurations with high payload masses.
|
||||
|
||||
% Additional operational parameters were systematically evaluated, including the $R_y$ tilt angle, $R_z$ spindle position, and micro-hexapod position.
|
||||
% These factors were found to exert negligible influence on the plant dynamics, attributable to the effective mechanical decoupling achieved between the plant and micro-station dynamics.
|
||||
% This decoupling characteristic ensures consistent performance across various operational configurations.
|
||||
% This also validates the developed control kinematics.
|
||||
|
||||
|
||||
%% Identify the IFF plant dynamics using the Simscape model
|
||||
@ -49,7 +63,7 @@ clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/Controller'], 1, 'input'); io_i = io_i + 1; % Actuator Inputs [N]
|
||||
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'openoutput', [], 'EdL'); io_i = io_i + 1; % Strut errors [m]
|
||||
|
||||
%% Identify HAC Plant without using IFF
|
||||
% Identify HAC Plant without using IFF
|
||||
initializeSample('type', 'cylindrical', 'm', 1);
|
||||
G_m1 = linearize(mdl, io);
|
||||
G_m1.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
@ -65,7 +79,7 @@ G_m50 = linearize(mdl, io);
|
||||
G_m50.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G_m50.OutputName = {'l1', 'l2', 'l3', 'l4', 'l5', 'l6'};
|
||||
|
||||
%% Effect of Rotation
|
||||
% Effect of Rotation
|
||||
initializeSample('type', 'cylindrical', 'm', 1);
|
||||
initializeReferences(...
|
||||
'Rz_type', 'rotating', ...
|
||||
@ -75,19 +89,7 @@ G_m1_Rz = linearize(mdl, io, 0.1);
|
||||
G_m1_Rz.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G_m1_Rz.OutputName = {'l1', 'l2', 'l3', 'l4', 'l5', 'l6'};
|
||||
|
||||
|
||||
|
||||
% - Effect of rotation: ref:fig:nass_undamped_plant_effect_Wz
|
||||
% Add some coupling at low frequency, but still small at the considered velocity.
|
||||
% This is thanks to the relatively stiff nano-hexapod (CF rotating model)
|
||||
% - Effect of payload mass:
|
||||
% Decrease resonance frequencies
|
||||
% Increase coupling: ref:fig:nass_undamped_plant_effect_mass
|
||||
% => control challenge for high payload masses
|
||||
% - Other effects such as: Ry tilt angle, Rz spindle position, micro-hexapod position are found to have negligible effect on the plant dynamics.
|
||||
% This is thanks to the fact the the plant dynamics is well decoupled from the micro-station dynamics.
|
||||
|
||||
|
||||
%% Effect of rotation on the HAC plant
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
@ -137,6 +139,7 @@ yticks([-180:45:180]);
|
||||
linkaxes([ax1,ax2],'x');
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
|
||||
%% Effect of payload's mass on the HAC plant
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
@ -193,7 +196,7 @@ xlim([freqs(1), freqs(end)]);
|
||||
|
||||
% #+name: fig:nass_undamped_plant_effect
|
||||
% #+caption: Effect of the Spindle's rotational velocity on the positioning plant (\subref{fig:nass_undamped_plant_effect_Wz}) and effect of the payload's mass on the positioning plant (\subref{fig:nass_undamped_plant_effect_mass})
|
||||
% #+attr_latex: :options [htbp]
|
||||
% #+attr_latex: :options [h!tbp]
|
||||
% #+begin_figure
|
||||
% #+attr_latex: :caption \subcaption{\label{fig:nass_undamped_plant_effect_Wz}Effect of rotational velocity $\Omega_z$}
|
||||
% #+attr_latex: :options {0.48\textwidth}
|
||||
@ -209,16 +212,19 @@ xlim([freqs(1), freqs(end)]);
|
||||
% #+end_subfigure
|
||||
% #+end_figure
|
||||
|
||||
% The Decentralized Integral Force Feedback was implemented in the multi-body model, and transfer functions from force inputs $\bm{f}^\prime$ of the damped plant to the strut errors $\bm{\epsilon}_{\mathcal{L}}$ were extracted from this model.
|
||||
|
||||
% - Effect of IFF on the plant ref:fig:nass_comp_undamped_damped_plant_m1
|
||||
% Modes are well damped
|
||||
% Small coupling increase at low frequency
|
||||
% - Benefits of using IFF ref:fig:nass_hac_plants
|
||||
% with added damping, the set of plants to be controlled (with payloads from 1kg to 50kg) is more easily controlled.
|
||||
% Between 10 and 50Hz, the plant dynamics does not vary a lot with the frequency, whereas without active damping, it would be impossible to design a robust controller with bandwidth above 10Hz that is robust to the change of payload
|
||||
% The effectiveness of IFF implementation was first evaluated with a $1\,\text{kg}$ payload, as demonstrated in Figure ref:fig:nass_comp_undamped_damped_plant_m1.
|
||||
% The results indicate successful damping of the nano-hexapod resonance modes, though a minor increase in low-frequency coupling was observed.
|
||||
% This trade-off was considered acceptable given the overall improvement in system behavior.
|
||||
|
||||
% The benefits of IFF implementation were further assessed across the full range of payload configurations, with results presented in Figure ref:fig:nass_hac_plants.
|
||||
% For all tested payloads ($1\,\text{kg}$, $25\,\text{kg}$ and $50\,\text{kg}$), decentralized IFF significantly damped the nano-hexapod modes and therefore simplified the system dynamics.
|
||||
% More importantly, is the fact that in the vicinity of the wanted high authority control bandwidth (i.e. between $10\,\text{Hz}$ and $50\,\text{Hz}$), the damped dynamics (shown in red) exhibited minimal gain and phase variations with frequency.
|
||||
% For the undamped system (shown in blue), achieving robust control with bandwidth above 10Hz while maintaining stability across different payload masses would be practically unfeasible.
|
||||
|
||||
|
||||
%% Identify HAC Plant without using IFF
|
||||
%% Identify HAC Plant with IFF
|
||||
initializeReferences(); % No Spindle Rotation
|
||||
initializeController('type', 'iff'); % Implemented IFF controller
|
||||
load('nass_K_iff.mat', 'Kiff'); % Load designed IFF controller
|
||||
@ -246,15 +252,16 @@ if not(isstable(G_hac_m1) && isstable(G_hac_m25) && isstable(G_hac_m50))
|
||||
warning('One of HAC plant is not stable')
|
||||
end
|
||||
|
||||
%% Comparison of the OL plant and the plant with IFF - 1kg payload
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_m1( 1,1), freqs, 'Hz'))), 'color', colors(1,:), ...
|
||||
'DisplayName', '$\epsilon_{\mathcal{L}i}/f_i$, OL')
|
||||
'DisplayName', '$\epsilon_{\mathcal{L}i}/f_i$ - OL')
|
||||
plot(freqs, abs(squeeze(freqresp(G_hac_m1(1,1), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'DisplayName', '$\epsilon_{\mathcal{L}i}/f_i$, with IFF')
|
||||
'DisplayName', '$\epsilon_{\mathcal{L}i}/f_i$ - IFF')
|
||||
for i = 1:5
|
||||
for j = i+1:6
|
||||
plot(freqs, abs(squeeze(freqresp(G_m1(i,j), freqs, 'Hz'))), 'color', [colors(1,:), 0.2], ...
|
||||
@ -272,7 +279,7 @@ end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||
ylim([1e-10, 2e-5]);
|
||||
ylim([1e-10, 5e-5]);
|
||||
leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 15;
|
||||
|
||||
@ -297,8 +304,8 @@ tiledlayout(3, 1, 'TileSpacing', 'compact', 'Padding', 'None');
|
||||
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_m1( 1,1), freqs, 'Hz'))), 'color', [colors(1,:), 0.5], 'DisplayName', 'Undamped - $\epsilon\mathcal{L}_i/f_i$');
|
||||
plot(freqs, abs(squeeze(freqresp(G_hac_m1(1,1), freqs, 'Hz'))), 'color', [colors(2,:), 0.5], 'DisplayName', 'Damped - $\epsilon\mathcal{L}_i/f_i^\prime$');
|
||||
plot(freqs, abs(squeeze(freqresp(G_m1( 1,1), freqs, 'Hz'))), 'color', [colors(1,:), 0.5], 'DisplayName', '$\epsilon\mathcal{L}_i/f_i$ - OL');
|
||||
plot(freqs, abs(squeeze(freqresp(G_hac_m1(1,1), freqs, 'Hz'))), 'color', [colors(2,:), 0.5], 'DisplayName', '$\epsilon\mathcal{L}_i/f_i^\prime$ - IFF');
|
||||
for i = 1:6
|
||||
plot(freqs, abs(squeeze(freqresp(G_m1( i,i), freqs, 'Hz'))), 'color', [colors(1,:), 0.5], 'HandleVisibility', 'off');
|
||||
plot(freqs, abs(squeeze(freqresp(G_m25(i,i), freqs, 'Hz'))), 'color', [colors(1,:), 0.5], 'HandleVisibility', 'off');
|
||||
@ -314,7 +321,7 @@ set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||
leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 15;
|
||||
% ylim([1e-8, 1e-4]);
|
||||
ylim([1e-10, 5e-5]);
|
||||
|
||||
ax2 = nexttile;
|
||||
hold on;
|
||||
@ -338,10 +345,32 @@ yticks([-180:45:180]);
|
||||
linkaxes([ax1,ax2],'x');
|
||||
% xlim([1, 5e2]);
|
||||
|
||||
% Effect of micro-station compliance
|
||||
|
||||
% Micro-Station complex dynamics has almost no effect on the plant dynamics (Figure ref:fig:nass_effect_ustation_compliance):
|
||||
% - adds some alternating poles and zeros above 100Hz, which should not be an issue for control
|
||||
|
||||
% #+name: fig:nass_hac_plant
|
||||
% #+caption: Effect of Decentralized Integral Force Feedback on the positioning plant for a $1\,\text{kg}$ sample mass (\subref{fig:nass_undamped_plant_effect_Wz}). Direct terms of the positioning plants for all considered payloads are shown in (\subref{fig:nass_undamped_plant_effect_mass}).
|
||||
% #+attr_latex: :options [h!tbp]
|
||||
% #+begin_figure
|
||||
% #+attr_latex: :caption \subcaption{\label{fig:nass_comp_undamped_damped_plant_m1}Effect of IFF - $m = 1\,\text{kg}$}
|
||||
% #+attr_latex: :options {0.48\textwidth}
|
||||
% #+begin_subfigure
|
||||
% #+attr_latex: :width 0.95\linewidth
|
||||
% [[file:figs/nass_comp_undamped_damped_plant_m1.png]]
|
||||
% #+end_subfigure
|
||||
% #+attr_latex: :caption \subcaption{\label{fig:nass_hac_plants}Effect of IFF on the set of plants to control}
|
||||
% #+attr_latex: :options {0.48\textwidth}
|
||||
% #+begin_subfigure
|
||||
% #+attr_latex: :width 0.95\linewidth
|
||||
% [[file:figs/nass_hac_plants.png]]
|
||||
% #+end_subfigure
|
||||
% #+end_figure
|
||||
|
||||
% The coupling between the nano-hexapod and micro-station was evaluated through comparative analysis of plant dynamics under two mounting conditions.
|
||||
% In the first configuration, the nano-hexapod was mounted on an ideally rigid support, while in the second configuration, it was installed on the micro-station with finite compliance.
|
||||
|
||||
% As illustrated in Figure ref:fig:nass_effect_ustation_compliance, the complex dynamics of the micro-station were found to have little impact on the plant dynamics.
|
||||
% The only observable difference manifests as alternating poles and zeros above 100Hz, a frequency range sufficiently beyond the control bandwidth to avoid interference with system performance.
|
||||
% This finding confirms effective dynamic decoupling between the nano-hexapod and the supporting micro-station structure.
|
||||
|
||||
|
||||
%% Identify plant with "rigid" micro-station
|
||||
@ -374,9 +403,9 @@ tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
ax1 = nexttile([2,1]);
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(G_m25_rigid( 1,1), freqs, 'Hz'))), 'color', colors(1,:), ...
|
||||
'DisplayName', '$\epsilon_{\mathcal{L}i}/f_i$, OL')
|
||||
'DisplayName', '$\epsilon_{\mathcal{L}i}/f_i$ - Rigid support')
|
||||
plot(freqs, abs(squeeze(freqresp(G_m25(1,1), freqs, 'Hz'))), 'color', colors(2,:), ...
|
||||
'DisplayName', '$\epsilon_{\mathcal{L}i}/f_i$, with IFF')
|
||||
'DisplayName', '$\epsilon_{\mathcal{L}i}/f_i$ - $\mu$-station support')
|
||||
for i = 1:5
|
||||
for j = i+1:6
|
||||
plot(freqs, abs(squeeze(freqresp(G_m25_rigid(i,j), freqs, 'Hz'))), 'color', [colors(1,:), 0.2], ...
|
||||
@ -394,7 +423,7 @@ end
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||
ylim([1e-10, 2e-5]);
|
||||
ylim([1e-10, 5e-5]);
|
||||
leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 15;
|
||||
|
||||
@ -413,23 +442,21 @@ yticks([-180:45:180]);
|
||||
linkaxes([ax1,ax2],'x');
|
||||
xlim([freqs(1), freqs(end)]);
|
||||
|
||||
% Higher or lower nano-hexapod stiffness?
|
||||
% Effect of Nano-Hexapod Stiffness on System Dynamics
|
||||
% <<ssec:nass_hac_stiffness>>
|
||||
|
||||
% *Goal*: confirm the analysis with simpler models (uniaxial and 3DoF) that a nano-hexapod stiffness of $\approx 1\,N/\mu m$ should give better performances than a very stiff or very soft nano-hexapod.
|
||||
% The influence of nano-hexapod stiffness was investigated to validate earlier findings from simplified uniaxial and three-degree-of-freedom (3DoF) models.
|
||||
% These models suggested that a moderate stiffness of approximately $1\,N/\mu m$ would provide better performance compared to either very stiff or very soft configurations.
|
||||
|
||||
% - *Stiff nano-hexapod*:
|
||||
% uniaxial model: high nano-hexapod stiffness induce coupling between the nano-hexapod and the micro-station dynamics.
|
||||
% considering the complex dynamics of the micro-station as shown by the modal analysis, that would result in a complex system to control
|
||||
% To show that, a nano-hexapod with actuator stiffness equal to 100N/um is initialized, payload of 25kg.
|
||||
% The dynamics from $\bm{f}$ to $\bm{\epsilon}_{\mathcal{L}}$ is identified and compared to the case where the micro-station is infinitely rigid (figure ref:fig:nass_stiff_nano_hexapod_coupling_ustation):
|
||||
% - Coupling induced by the micro-station: much more complex and difficult to model / predict
|
||||
% - Similar to what was predicted using the uniaxial model
|
||||
% - *Soft nano-hexapod*:
|
||||
% Nano-hexapod with stiffness of 0.01N/um is initialized, payload of 25kg.
|
||||
% Dynamics is identified with no spindle rotation, and with spindle rotation of 36deg/s and 360deg/s (Figure ref:fig:nass_soft_nano_hexapod_effect_Wz)
|
||||
% - Rotation as huge effect on the dynamics: unstable for high rotational velocities, added coupling due to gyroscopic effects, and change of resonance frequencies as a function of the rotational velocity
|
||||
% - Simple 3DoF rotating model is helpful to understand the complex effect of the rotation => similar conclusion
|
||||
% - Say that controlling the frame of the struts is not adapted with a soft nano-hexapod, but we should rather control in the frame matching the center of mass of the payload, but we would still obtain large coupling and change of dynamics due to gyroscopic effects.
|
||||
% For the stiff nano-hexapod analysis, a system with actuator stiffness of $100\,N/\mu m$ was simulated with a $25\,\text{kg}$ payload.
|
||||
% The transfer function from $\bm{f}$ to $\bm{\epsilon}_{\mathcal{L}}$ was evaluated under two conditions: mounting on an infinitely rigid base and mounting on the micro-station.
|
||||
% As shown in Figure ref:fig:nass_stiff_nano_hexapod_coupling_ustation, significant coupling was observed between the nano-hexapod and micro-station dynamics.
|
||||
% This coupling introduces complex behavior that proves difficult to model and predict accurately, corroborating the predictions of the simplified uniaxial model.
|
||||
|
||||
% The soft nano-hexapod configuration was evaluated using a stiffness of $0.01\,N/\mu m$ with a $25\,\text{kg}$ payload.
|
||||
% Dynamic response was characterized at three rotational velocities: 0, 36, and 360 deg/s.
|
||||
% Figure ref:fig:nass_soft_nano_hexapod_effect_Wz demonstrates that rotation substantially impacts system dynamics, manifesting as instability at high rotational velocities, increased coupling from gyroscopic effects, and rotation-dependent resonance frequencies.
|
||||
% The current approach of controlling the motion in the strut frame proves inadequate for soft nano-hexapods; but even shifting control to the payload's center of mass frame would not overcome the substantial coupling and dynamic variations induced by gyroscopic effects.
|
||||
|
||||
|
||||
%% Identify Dynamics with a Stiff nano-hexapod (100N/um)
|
||||
@ -461,7 +488,7 @@ G_m25_pz = linearize(mdl, io);
|
||||
G_m25_pz.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G_m25_pz.OutputName = {'l1', 'l2', 'l3', 'l4', 'l5', 'l6'};
|
||||
|
||||
%% Compare with Nano-Hexapod alone (rigid micro-station)
|
||||
% Compare with Nano-Hexapod alone (rigid micro-station)
|
||||
initializeGround('type', 'rigid');
|
||||
initializeGranite('type', 'rigid');
|
||||
initializeTy('type', 'rigid');
|
||||
@ -625,12 +652,10 @@ linkaxes([ax1,ax2],'x');
|
||||
xlim([f(1), f(end)]);
|
||||
|
||||
% Controller design
|
||||
% <<ssec:nass_hac_controller>>
|
||||
|
||||
% In this section, a high authority controller is design such that:
|
||||
% - it is robust to the change of payload mass (i.e. is should be stable for all the damped plants of Figure ref:fig:nass_hac_plants)
|
||||
% - it has reasonably high bandwidth to give good performances (here 10Hz)
|
||||
|
||||
% eqref:eq:nass_robust_hac
|
||||
% A high authority controller was designed to meet two key requirements: stable for all payload masses (i.e. for all the damped plants of Figure ref:fig:nass_hac_plants), and achievement of sufficient bandwidth (targeted at 10Hz) for high performance operation.
|
||||
% The controller structure is defined in Equation eqref:eq:nass_robust_hac, incorporating an integrator term for low frequency performance, a lead compensator for phase margin improvement, and a low-pass filter for robustness against high frequency modes.
|
||||
|
||||
% \begin{equation}\label{eq:nass_robust_hac}
|
||||
% K_{\text{HAC}}(s) = g_0 \cdot \underbrace{\frac{\omega_c}{s}}_{\text{int}} \cdot \underbrace{\frac{1}{\sqrt{\alpha}}\frac{1 + \frac{s}{\omega_c/\sqrt{\alpha}}}{1 + \frac{s}{\omega_c\sqrt{\alpha}}}}_{\text{lead}} \cdot \underbrace{\frac{1}{1 + \frac{s}{\omega_0}}}_{\text{LPF}}, \quad \left( \omega_c = 2\pi10\,\text{rad/s},\ \alpha = 2,\ \omega_0 = 2\pi80\,\text{rad/s} \right)
|
||||
@ -666,10 +691,9 @@ save('./mat/nass_K_hac.mat', 'Khac');
|
||||
|
||||
|
||||
|
||||
% - "Decentralized" Loop Gain:
|
||||
% Bandwidth around 10Hz
|
||||
% - Characteristic Loci:
|
||||
% Stable for all payloads with acceptable stability margins
|
||||
% The controller's performance was evaluated through two complementary analyses.
|
||||
% First, the decentralized loop gain, shown in Figure ref:fig:nass_hac_loop_gain, confirms the achievement of the desired 10Hz bandwidth.
|
||||
% Second, the characteristic loci analysis presented in Figure ref:fig:nass_hac_loci demonstrates robustness for all payload masses, with adequate stability margins maintained throughout the operating envelope.
|
||||
|
||||
|
||||
%% "Diagonal" loop gain for the High Authority Controller
|
||||
@ -782,144 +806,22 @@ xlim([-1.8, 0.2]); ylim([-1, 1]);
|
||||
leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 15;
|
||||
|
||||
% TODO Sensitivity to disturbances :noexport:
|
||||
|
||||
% - Compute transfer functions from spindle vertical error to sample vertical error with HAC-IFF
|
||||
% Compare without the NASS, and with just IFF
|
||||
% - Same for horizontal
|
||||
|
||||
|
||||
% Initialize each Simscape model elements
|
||||
initializeGround();
|
||||
initializeGranite();
|
||||
initializeTy();
|
||||
initializeRy();
|
||||
initializeRz();
|
||||
initializeMicroHexapod();
|
||||
initializeSimplifiedNanoHexapod();
|
||||
initializeSample('type', 'cylindrical', 'm', 1);
|
||||
|
||||
% Initial Simscape Configuration
|
||||
initializeSimscapeConfiguration('gravity', false);
|
||||
initializeDisturbances('enable', false);
|
||||
initializeLoggingConfiguration('log', 'none');
|
||||
initializeController('type', 'open-loop');
|
||||
initializeReferences();
|
||||
|
||||
% Input/Output definition
|
||||
clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Frz_y'); io_i = io_i + 1; % Spindle Lateral Vibration [N]
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Frz_z'); io_i = io_i + 1; % Spindle Vertical Vibration [N]
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Fdy_z'); io_i = io_i + 1; % Vertical Ground Motion [m]
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwy'); io_i = io_i + 1; % Vertical Ground Motion [m]
|
||||
io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'Dwz'); io_i = io_i + 1; % Vertical Ground Motion [m]
|
||||
io(io_i) = linio([mdl, '/NASS'], 2, 'output', [], 'y'); io_i = io_i + 1; % Lateral Displacement [m]
|
||||
io(io_i) = linio([mdl, '/NASS'], 2, 'output', [], 'z'); io_i = io_i + 1; % Vertical Displacement [m]
|
||||
|
||||
Gd_ol = linearize(mdl, io);
|
||||
Gd_ol.InputName = {'Frz_y', 'Frz_z', 'Fdy_z', 'Dwy', 'Dwz'};
|
||||
Gd_ol.OutputName = {'Dy', 'Dz'};
|
||||
|
||||
initializeController('type', 'iff'); % Implemented IFF controller
|
||||
load('nass_K_iff.mat', 'Kiff'); % Load designed IFF controller
|
||||
|
||||
Gd_iff = linearize(mdl, io);
|
||||
Gd_iff.InputName = {'Frz_y', 'Frz_z', 'Fdy_z', 'Dwy', 'Dwz'};
|
||||
Gd_iff.OutputName = {'Dy', 'Dz'};
|
||||
|
||||
initializeController('type', 'hac-iff'); % Implemented IFF controller
|
||||
load('nass_K_hac.mat', 'Khac'); % Load designed HAC controller
|
||||
|
||||
Gd_hac_iff = linearize(mdl, io);
|
||||
Gd_hac_iff.InputName = {'Frz_y', 'Frz_z', 'Fdy_z', 'Dwy', 'Dwz'};
|
||||
Gd_hac_iff.OutputName = {'Dy', 'Dz'};
|
||||
|
||||
dist = load('ustation_disturbance_psd.mat');
|
||||
|
||||
|
||||
|
||||
% Spindle, lateral:
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_ol( 'Dy', 'Frz_y'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_iff('Dy', 'Frz_y'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_hac_iff('Dy', 'Frz_y'), freqs, 'Hz'))));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude $D_z/F_{R_z,z}$ [m/N]'); xlabel('Frequency [Hz]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
xlim([1, 500]);
|
||||
|
||||
|
||||
|
||||
% Spindle, vertical:
|
||||
|
||||
freqs = logspace(-1,3,1000);
|
||||
figure;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_ol( 'Dz', 'Frz_z'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_iff('Dz', 'Frz_z'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_hac_iff('Dz', 'Frz_z'), freqs, 'Hz'))));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude $D_z/F_{R_z,z}$ [m/N]'); xlabel('Frequency [Hz]');
|
||||
|
||||
|
||||
|
||||
% Ground motion, vertical:
|
||||
|
||||
freqs = logspace(-1,3,1000);
|
||||
figure;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_ol( 'Dz', 'Dwz'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_iff('Dz', 'Dwz'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_hac_iff('Dz', 'Dwz'), freqs, 'Hz'))));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude $D_z/F_{R_z,z}$ [m/N]'); xlabel('Frequency [Hz]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
% xlim([1, 500]);
|
||||
|
||||
|
||||
|
||||
% Ground motion, lateral:
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_ol( 'Dy', 'Dwy'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_iff('Dy', 'Dwy'), freqs, 'Hz'))));
|
||||
plot(freqs, abs(squeeze(freqresp(Gd_hac_iff('Dy', 'Dwy'), freqs, 'Hz'))));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('Amplitude $D_y/F_{R_z,z}$ [m/N]'); xlabel('Frequency [Hz]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
xlim([1, 500]);
|
||||
|
||||
|
||||
|
||||
% Noise Budget:
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(dist.gm_dist.f, sqrt(flip(-cumtrapz(flip(dist.gm_dist.f), flip(dist.gm_dist.pxx_y.*abs(squeeze(freqresp(Gd_ol( 'Dy', 'Dwy'), dist.gm_dist.f, 'Hz'))).^2)))));
|
||||
plot(dist.gm_dist.f, sqrt(flip(-cumtrapz(flip(dist.gm_dist.f), flip(dist.gm_dist.pxx_y.*abs(squeeze(freqresp(Gd_iff( 'Dy', 'Dwy'), dist.gm_dist.f, 'Hz'))).^2)))));
|
||||
hold off;
|
||||
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||
ylabel('ASD [m/sqrt(Hz)]'); xlabel('Frequency [Hz]');
|
||||
xticks([1e0, 1e1, 1e2]);
|
||||
xlim([1, 500]);
|
||||
|
||||
% Tomography experiment
|
||||
% <<ssec:nass_hac_tomography>>
|
||||
|
||||
% - Validation of concept with tomography scans at the highest rotational velocity of $\Omega_z = 360\,\text{deg/s}$
|
||||
% - Compare obtained results with the smallest beam size that is expected with future beamline upgrade: 200nm (horizontal size) x 100nm (vertical size)
|
||||
% - Take into account the two main sources of disturbances: ground motion, spindle vibrations
|
||||
% Other noise sources are not taken into account here as they will be optimized latter (detail design phase): measurement noise, electrical noise for DAC and voltage amplifiers, ...
|
||||
% The Nano Active Stabilization System concept was validated through time-domain simulations of scientific experiments, with particular focus on tomography scanning due to its demanding performance requirements.
|
||||
% Simulations were conducted at the maximum operational rotational velocity of $\Omega_z = 360\,\text{deg/s}$ to evaluate system performance under the most challenging conditions.
|
||||
|
||||
% The open-loop errors and the closed-loop errors for the tomography scan with the light sample $1\,kg$ are shown in Figure ref:fig:nass_tomo_1kg_60rpm.
|
||||
% Performance metrics were established based on anticipated future beamline specifications, which specify a beam size of 200nm (horizontal) × 100nm (vertical).
|
||||
% The primary requirement stipulates that the point of interest must remain within these beam dimensions throughout operation.
|
||||
% The simulation incorporated two principal disturbance sources: ground motion and spindle vibrations.
|
||||
% Additional noise sources, including measurement noise and electrical noise from DAC and voltage amplifiers, were not included in this analysis as these parameters will be optimized during the detailed design phase.
|
||||
|
||||
% Figure ref:fig:nass_tomo_1kg_60rpm presents a comparative analysis of positioning errors under both open-loop and closed-loop conditions for a lightweight sample configuration (1kg).
|
||||
% The results demonstrate the system's capability to maintain position within the specified beam dimensions, validating the fundamental concept of the stabilization system.
|
||||
|
||||
|
||||
%% Simulation of tomography experiments
|
||||
% Sample is not centered with the rotation axis
|
||||
% This is done by offsetfing the micro-hexapod by 0.9um
|
||||
P_micro_hexapod = [0.9e-6; 0; 0]; % [m]
|
||||
@ -980,16 +882,6 @@ initializeSample('type', 'cylindrical', 'm', 50);
|
||||
sim(mdl);
|
||||
exp_tomo_cl_m50 = simout;
|
||||
|
||||
% Slower tomography for high payload mass
|
||||
% initializeReferences(...
|
||||
% 'Rz_type', 'rotating', ...
|
||||
% 'Rz_period', 10, ... % 36deg/s
|
||||
% 'Dh_pos', [P_micro_hexapod; 0; 0; 0]);
|
||||
% initializeSample('type', 'cylindrical', 'm', 50);
|
||||
% set_param(mdl, 'StopTime', '5');
|
||||
% sim(mdl);
|
||||
% exp_tomo_cl_m50_slow = simout;
|
||||
|
||||
%% Simulation of tomography experiment - 1kg payload - 360deg/s - XY errors
|
||||
figure;
|
||||
hold on;
|
||||
@ -1004,7 +896,7 @@ yticks([-2:1:2]);
|
||||
leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
leg.ItemTokenSize(1) = 15;
|
||||
|
||||
%% Simulation of tomography experiment - no payload, 30rpm - YZ errors
|
||||
%% Simulation of tomography experiment - 1kg payload - 360deg/s - YZ errors
|
||||
figure;
|
||||
tiledlayout(2, 1, 'TileSpacing', 'compact', 'Padding', 'None');
|
||||
|
||||
@ -1039,7 +931,7 @@ leg.ItemTokenSize(1) = 15;
|
||||
|
||||
% #+name: fig:nass_tomo_1kg_60rpm
|
||||
% #+caption: Position error of the sample in the XY (\subref{fig:nass_tomo_1kg_60rpm_xy}) and YZ (\subref{fig:nass_tomo_1kg_60rpm_yz}) planes during a simulation of a tomography experiment at $360\,\text{deg/s}$. 1kg payload is placed on top of the nano-hexapod.
|
||||
% #+attr_latex: :options [htbp]
|
||||
% #+attr_latex: :options [h!tbp]
|
||||
% #+begin_figure
|
||||
% #+attr_latex: :caption \subcaption{\label{fig:nass_tomo_1kg_60rpm_xy}XY plane}
|
||||
% #+attr_latex: :options {0.48\textwidth}
|
||||
@ -1055,11 +947,15 @@ leg.ItemTokenSize(1) = 15;
|
||||
% #+end_subfigure
|
||||
% #+end_figure
|
||||
|
||||
% - Effect of payload mass (Figure ref:fig:nass_tomography_hac_iff):
|
||||
% Worse performance for high masses, as expected from the control analysis, but still acceptable considering that the rotational velocity of 360deg/s is only used for light payloads.
|
||||
% The robustness of the NASS to payload mass variation was evaluated through additional tomography scan simulations with 25kg and 50kg payloads, complementing the initial 1kg test case.
|
||||
% As illustrated in Figure ref:fig:nass_tomography_hac_iff, system performance exhibits some degradation with increasing payload mass, aligning with predictions from the control analysis.
|
||||
% While the positioning accuracy for heavier payloads is outside the specified limits, it remains within acceptable bounds for typical operating conditions.
|
||||
|
||||
% It should be noted that the maximum rotational velocity of 360deg/s is primarily intended for lightweight payload applications.
|
||||
% For higher mass configurations, rotational velocities are foreseen to be below 36deg/s.
|
||||
|
||||
|
||||
%% Simulation of tomography experiment - no payload, 30rpm - YZ errors
|
||||
%% Simulation of tomography experiment - 1kg payload - 360deg/s - YZ errors
|
||||
figure;
|
||||
tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'None');
|
||||
|
||||
@ -1074,7 +970,7 @@ axis equal
|
||||
xlim([-200, 200]); ylim([-100, 100]);
|
||||
xticks([-200:50:200]); yticks([-100:50:100]);
|
||||
|
||||
%% Simulation of tomography experiment - no payload, 30rpm - YZ errors
|
||||
%% Simulation of tomography experiment - 25kg payload - 360deg/s - YZ errors
|
||||
figure;
|
||||
tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'None');
|
||||
|
||||
@ -1089,7 +985,7 @@ axis equal
|
||||
xlim([-200, 200]); ylim([-100, 100]);
|
||||
xticks([-200:50:200]); yticks([-100:50:100]);
|
||||
|
||||
%% Simulation of tomography experiment - no payload, 30rpm - YZ errors
|
||||
%% Simulation of tomography experiment - 50kg payload - 360deg/s - YZ errors
|
||||
figure;
|
||||
tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'None');
|
||||
|
@ -277,15 +277,18 @@ J_L_to_X = inv(nano_hexapod.geometry.J);
|
||||
- [ ] matlab/mat/nass_references.mat
|
||||
- [ ] matlab/mat/nass_stages.mat
|
||||
|
||||
** TODO [#B] Check all figures
|
||||
** DONE [#B] Check all figures
|
||||
CLOSED: [2025-02-18 Tue 10:53]
|
||||
|
||||
- [ ] Caption
|
||||
- [ ] Units
|
||||
- [ ] Legend
|
||||
|
||||
** TODO [#B] Check all matlab files
|
||||
** DONE [#B] Check all matlab files
|
||||
CLOSED: [2025-02-18 Tue 10:58] SCHEDULED: <2025-02-18 Tue>
|
||||
|
||||
** TODO [#B] Check if things are compatible to results of uniaxial model
|
||||
** DONE [#B] Check if things are compatible to results of uniaxial model
|
||||
CLOSED: [2025-02-18 Tue 10:53]
|
||||
|
||||
** DONE [#C] Check if it would be interesting to show soft/stiff nano-hexapod plants
|
||||
CLOSED: [2025-02-17 Mon 18:26]
|
||||
@ -579,9 +582,6 @@ This chapter marks the conclusion of the conceptual design phase, with simulatio
|
||||
The findings presented here establish a solid foundation for subsequent detailed design and experimental validation phases.
|
||||
|
||||
* Control Kinematics
|
||||
:PROPERTIES:
|
||||
:HEADER-ARGS:matlab+: :tangle matlab/nass_1_kinematics.m
|
||||
:END:
|
||||
<<sec:nass_kinematics>>
|
||||
** Introduction :ignore:
|
||||
|
||||
@ -602,31 +602,6 @@ Finally, it determines the sample pose error and maps these errors to the nano-h
|
||||
|
||||
The complete control architecture is detailed in Section ref:ssec:nass_control_architecture.
|
||||
|
||||
** Matlab Init :noexport:ignore:
|
||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||
<<matlab-dir>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results silent :noweb yes
|
||||
<<matlab-init>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :tangle no :noweb yes
|
||||
<<m-init-path>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :eval no :noweb yes
|
||||
<<m-init-path-tangle>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :noweb yes
|
||||
<<m-init-simscape>>
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :noweb yes
|
||||
<<m-init-other>>
|
||||
#+end_src
|
||||
|
||||
** Micro Station Kinematics
|
||||
<<ssec:nass_ustation_kinematics>>
|
||||
|
||||
@ -810,7 +785,7 @@ Then, the high authority controller uses the computed errors in the frame of the
|
||||
#+end_src
|
||||
|
||||
#+name: fig:nass_control_architecture
|
||||
#+caption: The physical systems are shown in blue, the control kinematics in red, the decentralized Integral Force Feedback in yellow and the centralized High Authority Controller in green.
|
||||
#+caption: Control architecture for the NASS. Physical systems are shown in blue, control kinematics elements in red, decentralized Integral Force Feedback controller in yellow and centralized High Authority controller in green.
|
||||
#+attr_latex: :options [h!tbp]
|
||||
#+attr_latex: :width \linewidth
|
||||
#+RESULTS:
|
||||
@ -818,7 +793,7 @@ Then, the high authority controller uses the computed errors in the frame of the
|
||||
|
||||
* Decentralized Active Damping
|
||||
:PROPERTIES:
|
||||
:HEADER-ARGS:matlab+: :tangle matlab/nass_2_active_damping.m
|
||||
:HEADER-ARGS:matlab+: :tangle matlab/nass_1_active_damping.m
|
||||
:END:
|
||||
<<sec:nass_active_damping>>
|
||||
** Introduction :ignore:
|
||||
@ -888,7 +863,7 @@ clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs [N]
|
||||
io(io_i) = linio([mdl, '/NASS'], 3, 'openoutput', [], 'fn'); io_i = io_i + 1; % Force Sensors [N]
|
||||
|
||||
%% Identify for multi payload masses (no rotation)
|
||||
% Identify for multi payload masses (no rotation)
|
||||
initializeReferences(); % No Spindle Rotation
|
||||
% 1kg Sample
|
||||
initializeSample('type', 'cylindrical', 'm', 1);
|
||||
@ -908,7 +883,7 @@ G_iff_m50 = linearize(mdl, io);
|
||||
G_iff_m50.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G_iff_m50.OutputName = {'fn1', 'fn2', 'fn3', 'fn4', 'fn5', 'fn6'};
|
||||
|
||||
%% Effect of Rotation
|
||||
% Effect of Rotation
|
||||
initializeReferences(...
|
||||
'Rz_type', 'rotating', ...
|
||||
'Rz_period', 1); % 360 deg/s
|
||||
@ -917,7 +892,7 @@ G_iff_m25_Rz = linearize(mdl, io, 0.1);
|
||||
G_iff_m25_Rz.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G_iff_m25_Rz.OutputName = {'fn1', 'fn2', 'fn3', 'fn4', 'fn5', 'fn6'};
|
||||
|
||||
%% Effect of Rotation - No added parallel stiffness
|
||||
% Effect of Rotation - No added parallel stiffness
|
||||
initializeSimplifiedNanoHexapod('actuator_kp', 0);
|
||||
initializeReferences(...
|
||||
'Rz_type', 'rotating', ...
|
||||
@ -1443,7 +1418,7 @@ exportFig('figs/nass_iff_root_locus_50kg.pdf', 'width', 'third', 'height', 'norm
|
||||
|
||||
* Centralized Active Vibration Control
|
||||
:PROPERTIES:
|
||||
:HEADER-ARGS:matlab+: :tangle matlab/nass_3_hac.m
|
||||
:HEADER-ARGS:matlab+: :tangle matlab/nass_2_hac.m
|
||||
:END:
|
||||
<<sec:nass_hac>>
|
||||
** Introduction :ignore:
|
||||
@ -1526,7 +1501,7 @@ clear io; io_i = 1;
|
||||
io(io_i) = linio([mdl, '/Controller'], 1, 'input'); io_i = io_i + 1; % Actuator Inputs [N]
|
||||
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'openoutput', [], 'EdL'); io_i = io_i + 1; % Strut errors [m]
|
||||
|
||||
%% Identify HAC Plant without using IFF
|
||||
% Identify HAC Plant without using IFF
|
||||
initializeSample('type', 'cylindrical', 'm', 1);
|
||||
G_m1 = linearize(mdl, io);
|
||||
G_m1.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
@ -1542,7 +1517,7 @@ G_m50 = linearize(mdl, io);
|
||||
G_m50.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G_m50.OutputName = {'l1', 'l2', 'l3', 'l4', 'l5', 'l6'};
|
||||
|
||||
%% Effect of Rotation
|
||||
% Effect of Rotation
|
||||
initializeSample('type', 'cylindrical', 'm', 1);
|
||||
initializeReferences(...
|
||||
'Rz_type', 'rotating', ...
|
||||
@ -1554,6 +1529,7 @@ G_m1_Rz.OutputName = {'l1', 'l2', 'l3', 'l4', 'l5', 'l6'};
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Effect of rotation on the HAC plant
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
@ -1609,6 +1585,7 @@ exportFig('figs/nass_undamped_plant_effect_Wz.pdf', 'width', 'half', 'height', 6
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Effect of payload's mass on the HAC plant
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
@ -1696,7 +1673,7 @@ More importantly, is the fact that in the vicinity of the wanted high authority
|
||||
For the undamped system (shown in blue), achieving robust control with bandwidth above 10Hz while maintaining stability across different payload masses would be practically unfeasible.
|
||||
|
||||
#+begin_src matlab
|
||||
%% Identify HAC Plant without using IFF
|
||||
%% Identify HAC Plant with IFF
|
||||
initializeReferences(); % No Spindle Rotation
|
||||
initializeController('type', 'iff'); % Implemented IFF controller
|
||||
load('nass_K_iff.mat', 'Kiff'); % Load designed IFF controller
|
||||
@ -1726,6 +1703,7 @@ end
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Comparison of the OL plant and the plant with IFF - 1kg payload
|
||||
figure;
|
||||
tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
|
||||
|
||||
@ -1830,7 +1808,7 @@ exportFig('figs/nass_hac_plants.pdf', 'width', 'half', 'height', 600);
|
||||
#+end_src
|
||||
|
||||
#+name: fig:nass_hac_plant
|
||||
#+caption: Effect of the Spindle's rotational velocity on the positioning plant (\subref{fig:nass_undamped_plant_effect_Wz}) and effect of the payload's mass on the positioning plant (\subref{fig:nass_undamped_plant_effect_mass})
|
||||
#+caption: Effect of Decentralized Integral Force Feedback on the positioning plant for a $1\,\text{kg}$ sample mass (\subref{fig:nass_undamped_plant_effect_Wz}). Direct terms of the positioning plants for all considered payloads are shown in (\subref{fig:nass_undamped_plant_effect_mass}).
|
||||
#+attr_latex: :options [h!tbp]
|
||||
#+begin_figure
|
||||
#+attr_latex: :caption \subcaption{\label{fig:nass_comp_undamped_damped_plant_m1}Effect of IFF - $m = 1\,\text{kg}$}
|
||||
@ -1983,7 +1961,7 @@ G_m25_pz = linearize(mdl, io);
|
||||
G_m25_pz.InputName = {'f1', 'f2', 'f3', 'f4', 'f5', 'f6'};
|
||||
G_m25_pz.OutputName = {'l1', 'l2', 'l3', 'l4', 'l5', 'l6'};
|
||||
|
||||
%% Compare with Nano-Hexapod alone (rigid micro-station)
|
||||
% Compare with Nano-Hexapod alone (rigid micro-station)
|
||||
initializeGround('type', 'rigid');
|
||||
initializeGranite('type', 'rigid');
|
||||
initializeTy('type', 'rigid');
|
||||
@ -2162,16 +2140,16 @@ exportFig('figs/nass_soft_nano_hexapod_effect_Wz.pdf', 'width', 'half', 'height'
|
||||
#+end_src
|
||||
|
||||
#+name: fig:nass_soft_stiff_hexapod
|
||||
#+caption: Plant dynamics of a stiff ($k_a = 100\,N/\mu m$) nano-hexapod (\subref{fig:nass_stiff_nano_hexapod_coupling_ustation}) and of a soft ($k_a = 0.01\,N/\mu m$) nano-hexapod (\subref{fig:nass_soft_nano_hexapod_effect_Wz})
|
||||
#+caption: Coupling between a stiff nano-hexapod ($k_a = 100\,N/\mu m$) and the micro-station (\subref{fig:nass_stiff_nano_hexapod_coupling_ustation}). Large effect of the spindle rotational velocity for a compliance ($k_a = 0.01\,N/\mu m$) nano-hexapod (\subref{fig:nass_soft_nano_hexapod_effect_Wz})
|
||||
#+attr_latex: :options [h!tbp]
|
||||
#+begin_figure
|
||||
#+attr_latex: :caption \subcaption{\label{fig:nass_stiff_nano_hexapod_coupling_ustation}Stiff nano-hexapod - Coupling with the micro-station}
|
||||
#+attr_latex: :caption \subcaption{\label{fig:nass_stiff_nano_hexapod_coupling_ustation}$k_a = 100\,N/\mu m$ - Coupling with the micro-station}
|
||||
#+attr_latex: :options {0.48\textwidth}
|
||||
#+begin_subfigure
|
||||
#+attr_latex: :width 0.95\linewidth
|
||||
[[file:figs/nass_stiff_nano_hexapod_coupling_ustation.png]]
|
||||
#+end_subfigure
|
||||
#+attr_latex: :caption \subcaption{\label{fig:nass_soft_nano_hexapod_effect_Wz}Soft nano-hexapod - Effect of Spindle rotational velocity}
|
||||
#+attr_latex: :caption \subcaption{\label{fig:nass_soft_nano_hexapod_effect_Wz}$k_a = 0.01\,N/\mu m$ - Effect of Spindle rotation}
|
||||
#+attr_latex: :options {0.48\textwidth}
|
||||
#+begin_subfigure
|
||||
#+attr_latex: :width 0.95\linewidth
|
||||
@ -2384,6 +2362,7 @@ Figure ref:fig:nass_tomo_1kg_60rpm presents a comparative analysis of positionin
|
||||
The results demonstrate the system's capability to maintain position within the specified beam dimensions, validating the fundamental concept of the stabilization system.
|
||||
|
||||
#+begin_src matlab
|
||||
%% Simulation of tomography experiments
|
||||
% Sample is not centered with the rotation axis
|
||||
% This is done by offsetfing the micro-hexapod by 0.9um
|
||||
P_micro_hexapod = [0.9e-6; 0; 0]; % [m]
|
||||
@ -2443,16 +2422,6 @@ exp_tomo_cl_m25 = simout;
|
||||
initializeSample('type', 'cylindrical', 'm', 50);
|
||||
sim(mdl);
|
||||
exp_tomo_cl_m50 = simout;
|
||||
|
||||
% Slower tomography for high payload mass
|
||||
% initializeReferences(...
|
||||
% 'Rz_type', 'rotating', ...
|
||||
% 'Rz_period', 10, ... % 36deg/s
|
||||
% 'Dh_pos', [P_micro_hexapod; 0; 0; 0]);
|
||||
% initializeSample('type', 'cylindrical', 'm', 50);
|
||||
% set_param(mdl, 'StopTime', '5');
|
||||
% sim(mdl);
|
||||
% exp_tomo_cl_m50_slow = simout;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
@ -2476,7 +2445,7 @@ exportFig('figs/nass_tomo_1kg_60rpm_xy.pdf', 'width', 'half', 'height', 'normal'
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Simulation of tomography experiment - no payload, 30rpm - YZ errors
|
||||
%% Simulation of tomography experiment - 1kg payload - 360deg/s - YZ errors
|
||||
figure;
|
||||
tiledlayout(2, 1, 'TileSpacing', 'compact', 'Padding', 'None');
|
||||
|
||||
@ -2538,7 +2507,7 @@ It should be noted that the maximum rotational velocity of 360deg/s is primarily
|
||||
For higher mass configurations, rotational velocities are foreseen to be below 36deg/s.
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Simulation of tomography experiment - no payload, 30rpm - YZ errors
|
||||
%% Simulation of tomography experiment - 1kg payload - 360deg/s - YZ errors
|
||||
figure;
|
||||
tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'None');
|
||||
|
||||
@ -2559,7 +2528,7 @@ exportFig('figs/nass_tomography_hac_iff_m1.pdf', 'width', 'third', 'height', 'no
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Simulation of tomography experiment - no payload, 30rpm - YZ errors
|
||||
%% Simulation of tomography experiment - 25kg payload - 360deg/s - YZ errors
|
||||
figure;
|
||||
tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'None');
|
||||
|
||||
@ -2580,7 +2549,7 @@ exportFig('figs/nass_tomography_hac_iff_m25.pdf', 'width', 'third', 'height', 'n
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :exports none :results none
|
||||
%% Simulation of tomography experiment - no payload, 30rpm - YZ errors
|
||||
%% Simulation of tomography experiment - 50kg payload - 360deg/s - YZ errors
|
||||
figure;
|
||||
tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'None');
|
||||
|
||||
|
Binary file not shown.
@ -1,4 +1,4 @@
|
||||
% Created 2025-02-18 Tue 10:43
|
||||
% Created 2025-02-18 Tue 10:53
|
||||
% Intended LaTeX compiler: pdflatex
|
||||
\documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt}
|
||||
|
||||
@ -182,7 +182,7 @@ Then, the high authority controller uses the computed errors in the frame of the
|
||||
\begin{figure}[htbp]
|
||||
\centering
|
||||
\includegraphics[h!tbp,width=\linewidth]{figs/nass_control_architecture.png}
|
||||
\caption{\label{fig:nass_control_architecture}The physical systems are shown in blue, the control kinematics in red, the decentralized Integral Force Feedback in yellow and the centralized High Authority Controller in green.}
|
||||
\caption{\label{fig:nass_control_architecture}Control architecture for the NASS. Physical systems are shown in blue, control kinematics elements in red, decentralized Integral Force Feedback controller in yellow and centralized High Authority controller in green.}
|
||||
\end{figure}
|
||||
|
||||
\chapter{Decentralized Active Damping}
|
||||
@ -361,7 +361,7 @@ For the undamped system (shown in blue), achieving robust control with bandwidth
|
||||
\end{center}
|
||||
\subcaption{\label{fig:nass_hac_plants}Effect of IFF on the set of plants to control}
|
||||
\end{subfigure}
|
||||
\caption{\label{fig:nass_hac_plant}Effect of the Spindle's rotational velocity on the positioning plant (\subref{fig:nass_undamped_plant_effect_Wz}) and effect of the payload's mass on the positioning plant (\subref{fig:nass_undamped_plant_effect_mass})}
|
||||
\caption{\label{fig:nass_hac_plant}Effect of Decentralized Integral Force Feedback on the positioning plant for a \(1\,\text{kg}\) sample mass (\subref{fig:nass_undamped_plant_effect_Wz}). Direct terms of the positioning plants for all considered payloads are shown in (\subref{fig:nass_undamped_plant_effect_mass}).}
|
||||
\end{figure}
|
||||
|
||||
The coupling between the nano-hexapod and micro-station was evaluated through comparative analysis of plant dynamics under two mounting conditions.
|
||||
@ -398,15 +398,15 @@ The current approach of controlling the motion in the strut frame proves inadequ
|
||||
\begin{center}
|
||||
\includegraphics[scale=1,width=0.95\linewidth]{figs/nass_stiff_nano_hexapod_coupling_ustation.png}
|
||||
\end{center}
|
||||
\subcaption{\label{fig:nass_stiff_nano_hexapod_coupling_ustation}Stiff nano-hexapod - Coupling with the micro-station}
|
||||
\subcaption{\label{fig:nass_stiff_nano_hexapod_coupling_ustation}$k_a = 100\,N/\mu m$ - Coupling with the micro-station}
|
||||
\end{subfigure}
|
||||
\begin{subfigure}{0.48\textwidth}
|
||||
\begin{center}
|
||||
\includegraphics[scale=1,width=0.95\linewidth]{figs/nass_soft_nano_hexapod_effect_Wz.png}
|
||||
\end{center}
|
||||
\subcaption{\label{fig:nass_soft_nano_hexapod_effect_Wz}Soft nano-hexapod - Effect of Spindle rotational velocity}
|
||||
\subcaption{\label{fig:nass_soft_nano_hexapod_effect_Wz}$k_a = 0.01\,N/\mu m$ - Effect of Spindle rotation}
|
||||
\end{subfigure}
|
||||
\caption{\label{fig:nass_soft_stiff_hexapod}Plant dynamics of a stiff (\(k_a = 100\,N/\mu m\)) nano-hexapod (\subref{fig:nass_stiff_nano_hexapod_coupling_ustation}) and of a soft (\(k_a = 0.01\,N/\mu m\)) nano-hexapod (\subref{fig:nass_soft_nano_hexapod_effect_Wz})}
|
||||
\caption{\label{fig:nass_soft_stiff_hexapod}Coupling between a stiff nano-hexapod (\(k_a = 100\,N/\mu m\)) and the micro-station (\subref{fig:nass_stiff_nano_hexapod_coupling_ustation}). Large effect of the spindle rotational velocity for a compliance (\(k_a = 0.01\,N/\mu m\)) nano-hexapod (\subref{fig:nass_soft_nano_hexapod_effect_Wz})}
|
||||
\end{figure}
|
||||
|
||||
\section{Controller design}
|
||||
|
Loading…
x
Reference in New Issue
Block a user