80 KiB
Determination of the optimal nano-hexapod's stiffness
- Introduction
- Spindle Rotation Speed
- Micro-Station Compliance Effect
- Payload "Impedance" Effect
- Total Change of dynamics
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
In this section, we look at the effect of the spindle rotation speed on the plant dynamics.
The rotation speed will have an effect due to the Coriolis effect.
Initialization
We initialize all the stages with the default parameters.
initializeGround();
initializeGranite();
initializeTy();
initializeRy();
initializeRz();
initializeMicroHexapod();
initializeAxisc();
initializeMirror();
We use a sample mass of 10kg.
initializeSample('mass', 10);
We don't include disturbances in this model as it adds complexity to the simulations and does not alter the obtained dynamics. We however include gravity.
initializeSimscapeConfiguration('gravity', true);
initializeDisturbances('enable', false);
initializeLoggingConfiguration('log', 'none');
initializeController();
Identification when rotating at maximum speed
We identify the dynamics for the following spindle rotation speeds Rz_rpm
:
Rz_rpm = linspace(0, 60, 6);
And for the following nano-hexapod actuator stiffness Ks
:
Ks = logspace(3,9,7); % [N/m]
Change of dynamics
We plot the change of dynamics due to the change of the spindle rotation speed (from 0rpm to 60rpm):
- Figure fig:opt_stiffness_wz_iff: from actuator force $\tau$ to force sensor $\tau_m$ (IFF plant)
- Figure fig:opt_stiffness_wz_dvf: from actuator force $\tau$ to actuator relative displacement $d\mathcal{L}$ (Decentralized positioning plant)
- Figure fig:opt_stiffness_wz_fx_dx: from force in the task space $\mathcal{F}_x$ to sample displacement $\mathcal{X}_x$ (Centralized positioning plant)
- Figure fig:opt_stiffness_wz_coupling: from force in the task space $\mathcal{F}_x$ to sample displacement $\mathcal{X}_y$ (coupling of the centralized positioning plant)
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
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
Identification of the micro-station compliance
We initialize all the stages with the default parameters.
initializeGround();
initializeGranite();
initializeTy();
initializeRy();
initializeRz();
initializeMicroHexapod('type', 'compliance');
We put nothing on top of the micro-hexapod.
initializeAxisc('type', 'none');
initializeMirror('type', 'none');
initializeNanoHexapod('type', 'none');
initializeSample('type', 'none');
And we identify the dynamics from forces/torques applied on the micro-hexapod top platform to the motion of the micro-hexapod top platform at the same point.
The diagonal element of the identified Micro-Station compliance matrix are shown in Figure fig:opt_stiff_micro_station_compliance.
<<plt-matlab>>
Identification of the dynamics with a rigid micro-station
We now identify the dynamics when the micro-station is rigid. This is equivalent of identifying the dynamics of the nano-hexapod when fixed to a rigid ground.
We also choose the sample to be rigid and to have a mass of 10kg.
initializeSample('type', 'rigid', 'mass', 10);
As before, we identify the dynamics for the following actuator stiffnesses:
Ks = logspace(3,9,7); % [N/m]
Identification of the dynamics with a flexible micro-station
We now initialize all the micro-station stages to be flexible. And we identify the dynamics of the nano-hexapod.
Obtained Dynamics
We plot the change of dynamics due to the compliance of the Micro-Station. The solid curves are corresponding to the nano-hexapod without the micro-station, and the dashed curves with the micro-station:
- Figure fig:opt_stiffness_micro_station_iff: from actuator force $\tau$ to force sensor $\tau_m$ (IFF plant)
- Figure fig:opt_stiffness_micro_station_dvf: from actuator force $\tau$ to actuator relative displacement $d\mathcal{L}$ (Decentralized positioning plant)
- Figure fig:opt_stiffness_micro_station_fx_dx: from force in the task space $\mathcal{F}_x$ to sample displacement $\mathcal{X}_x$ (Centralized positioning plant)
- Figure fig:opt_stiffness_micro_station_fz_dz: from force in the task space $\mathcal{F}_z$ to sample displacement $\mathcal{X}_z$ (Centralized positioning plant)
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
Conclusion ignore
The dynamics of the nano-hexapod is not affected by the micro-station dynamics (compliance) when the stiffness of the legs is less than $10^6\ [N/m]$. When the nano-hexapod is stiff ($k>10^7\ [N/m]$), the compliance of the micro-station appears in the primary plant.
Payload "Impedance" Effect
<<sec:payload_impedance>>
Introduction ignore
Initialization
We initialize all the stages with the default parameters.
We don't include disturbances in this model as it adds complexity to the simulations and does not alter the obtained dynamics. :exports none
initializeDisturbances('enable', false);
We set the controller type to Open-Loop, and we do not need to log any signal.
initializeSimscapeConfiguration('gravity', true);
initializeController();
initializeLoggingConfiguration('log', 'none');
initializeReferences();
Identification of the dynamics while change the payload dynamics
We make the following 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$
We identify the dynamics for the following payload masses Ms
and nano-hexapod leg's stiffnesses Ks
:
Ms = [1, 20, 50]; % [Kg]
Ks = logspace(3,9,7); % [N/m]
We then identify the dynamics for the following payload resonance frequencies Fs
:
Fs = [50, 200, 500]; % [Hz]
Change of dynamics for the primary controller
Frequency variation
We here compare the dynamics for the same payload mass, but different stiffness resulting in different resonance frequency of the payload:
- Figure fig:opt_stiffness_payload_freq_fz_dz: dynamics from a force $\mathcal{F}_z$ applied in the task space in the vertical direction to the vertical displacement of the sample $\mathcal{X}_z$ for both a very soft and a very stiff nano-hexapod.
- Figure fig:opt_stiffness_payload_freq_all: same, but for all tested nano-hexapod stiffnesses
We can see two mass lines for the soft nano-hexapod (Figure fig:opt_stiffness_payload_freq_fz_dz):
- The first mass line corresponds to $\frac{1}{(m_n + m_p)s^2}$ where $m_p = 10\ [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}$
- The zero corresponds to the resonance of the payload alone (fixed nano-hexapod's top platform)
<<plt-matlab>>
<<plt-matlab>>
Mass variation
We here compare the dynamics for different payload mass with the same resonance frequency (100Hz):
- Figure fig:opt_stiffness_payload_mass_fz_dz: dynamics from a force $\mathcal{F}_z$ applied in the task space in the vertical direction to the vertical displacement of the sample $\mathcal{X}_z$ for both a very soft and a very stiff nano-hexapod.
- Figure fig:opt_stiffness_payload_mass_all: same, but for all tested nano-hexapod stiffnesses
We can see here that for the soft nano-hexapod:
- the first resonance $\omega_n$ is changing with the mass of the payload as $\omega_n = \sqrt{\frac{k_n}{m_p + m_n}}$ with $k_p$ the stiffness of the nano-hexapod, $m_p$ the payload's mass and $m_n$ the mass of the nano-hexapod top platform
- the first mass line corresponding to $\frac{1}{(m_p + m_n)s^2}$ is changing with the payload mass
- the zero at 100Hz is not changing as it corresponds to the resonance of the payload itself
- the second mass line does not change
<<plt-matlab>>
<<plt-matlab>>
Total variation
We now plot the total change of dynamics due to change of the payload (Figures fig:opt_stiffness_payload_impedance_all_fz_dz and fig:opt_stiffness_payload_impedance_fz_dz):
- mass from 1kg to 50kg
- main resonance from 50Hz to 500Hz
<<plt-matlab>>
<<plt-matlab>>
Conclusion ignore
Total Change of dynamics
We now consider the total change of nano-hexapod dynamics due to:
Gk_wz_err
- Change of spindle rotation speedGf_err
andGm_err
- Change of payload resonanceGmf_err
andGmr_err
- Micro-Station compliance
The obtained dynamics are shown:
- Figure fig:opt_stiffness_plant_dynamics_fx_dx_k_1e3 for a stiffness $k = 10^3\ [N/m]$
- Figure fig:opt_stiffness_plant_dynamics_fx_dx_k_1e5 for a stiffness $k = 10^5\ [N/m]$
- Figure fig:opt_stiffness_plant_dynamics_fx_dx_k_1e7 for a stiffness $k = 10^7\ [N/m]$
- Figure fig:opt_stiffness_plant_dynamics_fx_dx_k_1e9 for a stiffness $k = 10^9\ [N/m]$
And finally, in Figures fig:opt_stiffness_plant_dynamics_task_space and fig:opt_stiffness_plant_dynamics_task_space_colors are shown an animation of the change of dynamics with the nano-hexapod's stiffness.
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
<<plt-matlab>>
h = figure;
filename = 'figs/opt_stiffness_plant_dynamics_task_space.gif';
for i = 1:length(Ks)
clf(h)
ax1 = subplot(2, 1, 1);
hold on;
for j = 1:length(Fs)
plot(freqs, abs(squeeze(freqresp(Gf_err{i,j}('Ex', 'Fx'), freqs, 'Hz'))), 'k-');
end
for j = 1:length(Ms)
plot(freqs, abs(squeeze(freqresp(Gm_err{i,j}('Ex', 'Fx'), freqs, 'Hz'))), 'k-');
end
for j = 1:length(Rz_rpm)
plot(freqs, abs(squeeze(freqresp(Gk_wz_err{i,j}('Ex', 'Fx'), freqs, 'Hz'))), 'k-');
end
plot(freqs, abs(squeeze(freqresp(Gmr_err{i}('Ex', 'Fx'), freqs, 'Hz'))), 'k-');
plot(freqs, abs(squeeze(freqresp(Gmf_err{i}('Ex', 'Fx'), freqs, 'Hz'))), 'k-');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ylim([1e-10, 1e-1]);
title(sprintf('$k = %.0e$ [N/m]', Ks(i)))
ax2 = subplot(2, 1, 2);
hold on;
for j = 1:length(Rz_rpm)
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gk_wz_err{i,j}('Ex', 'Fx'), freqs, 'Hz')))), 'k-');
end
for j = 1:length(Fs)
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gf_err{i,j}('Ex', 'Fx'), freqs, 'Hz')))), 'k-');
end
for j = 1:length(Ms)
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_err{i,j}('Ex', 'Fx'), freqs, 'Hz')))), 'k-');
end
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gmr_err{i}('Ex', 'Fx'), freqs, 'Hz')))), 'k-');
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gmf_err{i}('Ex', 'Fx'), freqs, 'Hz')))), 'k-');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-270, 90]);
yticks([-360:90:360]);
linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]);
set(h, 'visible', 'off');
set(h, 'pos', [0, 0, 1200, 800]);
drawnow;
% Capture the plot as an image
frame = getframe(h);
im = frame2im(frame);
[imind,cm] = rgb2ind(im,256);
% Write to the GIF File
if i == 1
imwrite(imind,cm,filename,'gif','DelayTime',1.0,'Loopcount',inf);
else
imwrite(imind,cm,filename,'gif','DelayTime',1.0,'WriteMode','append');
end
end
set(h, 'visible', 'on');
ans = filename;
h = figure;
filename = 'figs/opt_stiffness_plant_dynamics_task_space_colors.gif';
for i = 1:length(Ks)
clf(h)
ax1 = subplot(2, 1, 1);
hold on;
for j = 1:length(Fs)
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(Gf_err{i,j}('Ex', 'Fx'), freqs, 'Hz'))), '-');
end
for j = 1:length(Ms)
set(gca,'ColorOrderIndex',2);
plot(freqs, abs(squeeze(freqresp(Gm_err{i,j}('Ex', 'Fx'), freqs, 'Hz'))), '-');
end
for j = 2:length(Rz_rpm)
set(gca,'ColorOrderIndex',3);
plot(freqs, abs(squeeze(freqresp(Gk_wz_err{i,j}('Ex', 'Fx'), freqs, 'Hz'))), '-');
end
set(gca,'ColorOrderIndex',4);
plot(freqs, abs(squeeze(freqresp(Gmr_err{i}('Ex', 'Fx'), freqs, 'Hz'))), '-');
plot(freqs, abs(squeeze(freqresp(Gmf_err{i}('Ex', 'Fx'), freqs, 'Hz'))), '-');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
ylim([1e-10, 1e-1]);
title(sprintf('$k = %.0e$ [N/m]', Ks(i)))
ax2 = subplot(2, 1, 2);
hold on;
for j = 1:length(Fs)
set(gca,'ColorOrderIndex',1);
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gf_err{i,j}('Ex', 'Fx'), freqs, 'Hz')))), '-');
end
for j = 1:length(Ms)
set(gca,'ColorOrderIndex',2);
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gm_err{i,j}('Ex', 'Fx'), freqs, 'Hz')))), '-');
end
for j = 1:length(Rz_rpm)
set(gca,'ColorOrderIndex',3);
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gk_wz_err{i,j}('Ex', 'Fx'), freqs, 'Hz')))), '-');
end
set(gca,'ColorOrderIndex',4);
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gmr_err{i}('Ex', 'Fx'), freqs, 'Hz')))), '-');
plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Gmf_err{i}('Ex', 'Fx'), freqs, 'Hz')))), '-');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
ylim([-270, 90]);
yticks([-360:90:360]);
linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]);
set(h, 'visible', 'off');
set(h, 'pos', [0, 0, 1200, 800]);
drawnow;
% Capture the plot as an image
frame = getframe(h);
im = frame2im(frame);
[imind,cm] = rgb2ind(im,256);
% Write to the GIF File
if i == 1
imwrite(imind,cm,filename,'gif','DelayTime',1.0,'Loopcount',inf);
else
imwrite(imind,cm,filename,'gif','DelayTime',1.0,'WriteMode','append');
end
end
set(h, 'visible', 'on');
ans = filename;