34 KiB
Determination of the optimal nano-hexapod's stiffness
Introduction ignore
As shown before, many parameters other than the nano-hexapod itself do influence the plant dynamics:
- The micro-station compliance (studied here)
- The payload mass and dynamical properties (studied here and here)
- The experimental conditions, mainly the spindle rotation speed (studied here)
As seen before, the stiffness of the nano-hexapod greatly influence the effect of such parameters.
We wish here to see if we can determine an optimal stiffness of the nano-hexapod such that:
- Section sec:spindle_rotation_speed: the change of its dynamics due to the spindle rotation speed is acceptable
- Section sec:micro_station_compliance: the support compliance dynamics is not much present in the nano-hexapod dynamics
- Section sec:payload_impedance: the change of payload impedance has acceptable effect on the plant dynamics
The overall goal is to design a nano-hexapod that will allow the highest possible control bandwidth.
Spindle Rotation Speed
<<sec:spindle_rotation_speed>>
Introduction ignore
Initialization
We initialize all the stages with the default parameters.
initializeGround();
initializeGranite();
initializeTy();
initializeRy();
initializeRz();
initializeMicroHexapod();
initializeAxisc();
initializeMirror();
The worst case scenario is a rotation speed of 60rpm with a payload mass of 1Kg.
initializeSample('mass', 10);
We don't include gravity nor disturbances in this model as it adds complexity to the simulations and does not alter the obtained dynamics.
initializeSimscapeConfiguration('gravity', false);
initializeDisturbances('enable', false);
We set the controller type to Open-Loop, and we do not need to log any signal.
initializeController('type', 'stabilizing');
initializeLoggingConfiguration('log', 'none');
Identification when not rotating
We set the range of stiffness that we want to use.
Ks = logspace(3,9,7)
initializeReferences();
Gk_iff = {zeros(length(Ks))};
Gk_dvf = {zeros(length(Ks))};
Gk_err = {zeros(length(Ks))};
for i = 1:length(Ks)
initializeNanoHexapod('k', Ks(i));
%% Run the linearization
G = linearize(mdl, io);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6', ...
'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
Gk_iff(i) = {minreal(G({'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
Gk_dvf(i) = {minreal(G({'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
Jinvt = tf(inv(nano_hexapod.J)');
Jinvt.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
Jinvt.OutputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
Gk_err(i) = {-minreal(G({'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))*Jinvt};
end
Identification when rotating at maximum speed
Rz_rpm = 60;
initializeReferences('Rz_type', 'rotating', ...
'Rz_period', 60/Rz_rpm, ... % Rotation period [s]
'Rz_amplitude', -0.2*(2*pi*Rz_rpm/60)); % Angle offset [rad]
load('mat/nass_references.mat', 'Rz'); % We load the reference for the Spindle
[~, i_end] = min(abs(Rz.signals.values)); % Obtain the indice where the spindle angle is zero
t_sim = Rz.time(i_end); % Simulation time before identification [s]
k_sta = -1e8;
Gk_wz_iff = {zeros(length(Ks))};
Gk_wz_dvf = {zeros(length(Ks))};
Gk_wz_err = {zeros(length(Ks))};
for i = 1:length(Ks)
initializeNanoHexapod('k', Ks(i));
%% Run the linearization
G = linearize(mdl, io, t_sim);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6', ...
'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
Gk_wz_iff(i) = {minreal(G({'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
Gk_wz_dvf(i) = {minreal(G({'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
Jinvt = tf(inv(nano_hexapod.J)');
Jinvt.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
Jinvt.OutputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
Gk_wz_err(i) = {-minreal(G({'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))*Jinvt};
end
save('mat/optimal_stiffness_Gk_wz.mat', 'Ks', ...
'Gk_iff', 'Gk_dvf', 'Gk_err', ...
'Gk_wz_iff', 'Gk_wz_dvf', 'Gk_wz_err');
Change of dynamics
Change of dynamics for decentralized IFF control.
Change of dynamics from $F_x$ to $D_x$.
Change of dynamics from $F_z$ to $D_z$.
Change of coupling
Change of coupling from $F_x$ to $D_y$ when not rotating and when rotating at 60rpm.
Comparison of the coupling from $F_x$ to $D_y$ when rotating at 60rpm to the direct term $F_x$ to $D_x$.
Conclusion ignore
The leg stiffness should be at higher than $k_i = 10^4\ [N/m]$ such that the main resonance frequency does not shift too much when rotating. For the coupling, it is more difficult to conclude about the minimum required leg stiffness.
Note that we can use very soft nano-hexapod if we limit the spindle rotating speed.
Micro-Station Compliance Effect
<<sec:micro_station_compliance>>
Introduction ignore
- take the 6dof compliance of the micro-station
- simple model + uncertainty
Conclusion ignore
Payload "Impedance" Effect
<<sec:payload_impedance>>
Introduction ignore
Initialization
We initialize all the stages with the default parameters.
initializeGround();
initializeGranite();
initializeTy();
initializeRy();
initializeRz();
initializeMicroHexapod();
initializeAxisc();
initializeMirror();
We don't include gravity nor disturbances in this model as it adds complexity to the simulations and does not alter the obtained dynamics.
initializeSimscapeConfiguration('gravity', false);
initializeDisturbances('enable', false);
We set the controller type to Open-Loop, and we do not need to log any signal.
initializeController('type', 'stabilizing');
initializeLoggingConfiguration('log', 'none');
Change of payload dynamics
- Change of mass: from 1kg to 50kg
- Change of resonance frequency: from 50Hz to 500Hz
- The damping ratio of the payload is fixed to $\xi = 0.2$
initializeReferences();
Ks = logspace(3,9,7) % [N/m]
Ms = [1, 20, 50]; % [Kg]
Gm_iff = {zeros(length(Ks), length(Ms))};
Gm_dvf = {zeros(length(Ks), length(Ms))};
Gm_err = {zeros(length(Ks), length(Ms))};
for i = 1:length(Ks)
for j = 1:length(Ms)
initializeNanoHexapod('k', Ks(i));
initializeSample('mass', Ms(j), 'freq', 100*ones(6,1));
G = linearize(mdl, io);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6', ...
'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
Gm_iff(i,j) = {minreal(G({'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
Gm_dvf(i,j) = {minreal(G({'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
Jinvt = tf(inv(nano_hexapod.J)');
Jinvt.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
Jinvt.OutputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
Gm_err(i,j) = {-minreal(G({'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))*Jinvt};
end
end
Fs = [50, 200, 500]; % [Hz]
Gf_iff = {zeros(length(Ks), length(Fs))};
Gf_dvf = {zeros(length(Ks), length(Fs))};
Gf_err = {zeros(length(Ks), length(Fs))};
for i = 1:length(Ks)
for j = 1:length(Fs)
initializeNanoHexapod('k', Ks(i));
initializeSample('mass', 20, 'freq', Fs(j)*ones(6,1));
G = linearize(mdl, io);
G.InputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
G.OutputName = {'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6', ...
'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6', ...
'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'};
Gf_iff(i,j) = {minreal(G({'Fnlm1', 'Fnlm2', 'Fnlm3', 'Fnlm4', 'Fnlm5', 'Fnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
Gf_dvf(i,j) = {minreal(G({'Dnlm1', 'Dnlm2', 'Dnlm3', 'Dnlm4', 'Dnlm5', 'Dnlm6'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))};
Jinvt = tf(inv(nano_hexapod.J)');
Jinvt.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
Jinvt.OutputName = {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'};
Gf_err(i,j) = {-minreal(G({'Ex', 'Ey', 'Ez', 'Erx', 'Ery', 'Erz'}, {'Fnl1', 'Fnl2', 'Fnl3', 'Fnl4', 'Fnl5', 'Fnl6'}))*Jinvt};
end
end
save('mat/optimal_stiffness_Gm_Gf.mat', 'Ks', 'Ms', 'Fs', ...
'Gm_iff', 'Gm_dvf', 'Gm_err', ...
'Gf_iff', 'Gf_dvf', 'Gf_err');
Plots
Change of optimal gain for decentralized control
For each payload, compute the optimal gain for the IFF control. The optimal value corresponds to critical damping to all the 6 modes of the nano-hexapod.
load('mat/optimal_stiffness_Gm_Gf.mat');
Change of Mass
Change of payload resonance frequency
Change of dynamics for the primary controller
For each stiffness, plot the total spread of dynamics.
load('mat/optimal_stiffness_Gm_Gf.mat');
Frequency variation
Same payload mass, but different stiffness resulting in different resonance frequency.
All curves
X direction
Z direction: We can see two mass lines for the soft nano-hexapod:
- The first mass line corresponds to $\frac{1}{(m_n + m_p)s^2}$ where $m_p = 20\ [kg]$ is the mass of the payload and $m_n = 15\ [Kg]$ is the mass of the nano-hexapod top platform and attached mirror
- The second mass line corresponds to $\frac{1}{m_n s^2}$
Mass variation
All mixed, X direction
All mixed, Z direction
Z direction
Total variation
Total change of dynamics due to change of the payload:
- mass from 1kg to 50kg
- main resonance from 50Hz to 500Hz
For a soft nano-hexapod
For a stiff nano-hexapod