41 KiB
Control of the NASS with optimal stiffness
- Introduction
- Low Authority Control - Decentralized Direct Velocity Feedback
- Primary Control in the task space
- Primary Control in the leg space
Introduction ignore
Low Authority Control - Decentralized Direct Velocity Feedback
Introduction ignore
Initialization
initializeGround();
initializeGranite();
initializeTy();
initializeRy();
initializeRz();
initializeMicroHexapod();
initializeAxisc();
initializeMirror();
initializeSimscapeConfiguration();
initializeDisturbances('enable', false);
initializeLoggingConfiguration('log', 'none');
initializeController('type', 'hac-dvf');
We set the stiffness of the payload fixation:
Kp = 1e8; % [N/m]
Identification
K = tf(zeros(6));
Kdvf = tf(zeros(6));
We identify the system for the following payload masses:
Ms = [1, 10, 50];
The nano-hexapod has the following leg's stiffness and damping.
initializeNanoHexapod('k', 1e5, 'c', 2e2);
Controller Design
The obtain dynamics from actuators forces $\tau_i$ to the relative motion of the legs $d\mathcal{L}_i$ is shown in Figure fig:opt_stiff_dvf_plant for the three considered payload masses.
The Root Locus is shown in Figure fig:opt_stiff_dvf_root_locus and wee see that we have unconditional stability.
In order to choose the gain such that we obtain good damping for all the three payload masses, we plot the damping ration of the modes as a function of the gain for all three payload masses in Figure fig:opt_stiff_dvf_damping_gain.
Damping as function of the gain
Finally, we use the following controller for the Decentralized Direct Velocity Feedback:
Kdvf = 5e3*s/(1+s/2/pi/1e3)*eye(6);
Effect of the Low Authority Control on the Primary Plant
Introduction ignore
Let's identify the dynamics from actuator forces $\bm{\tau}$ to displacement as measured by the metrology $\bm{\mathcal{X}}$: \[ \bm{G}(s) = \frac{\bm{\mathcal{X}}}{\bm{\tau}} \] We do so both when the DVF is applied and when it is not applied.
Then, we compute the transfer function from forces applied by the actuators $\bm{\mathcal{F}}$ to the measured position error in the frame of the nano-hexapod $\bm{\epsilon}_{\mathcal{X}_n}$: \[ \bm{G}_\mathcal{X}(s) = \frac{\bm{\epsilon}_{\mathcal{X}_n}}{\bm{\mathcal{F}}} = \bm{G}(s) \bm{J}^{-T} \] The obtained dynamics is shown in Figure fig:opt_stiff_primary_plant_damped_X.
And we compute the transfer function from actuator forces $\bm{\tau}$ to position error of each leg $\bm{\epsilon}_\mathcal{L}$: \[ \bm{G}_\mathcal{L} = \frac{\bm{\epsilon}_\mathcal{L}}{\bm{\tau}} = \bm{J} \bm{G}(s) \] The obtained dynamics is shown in Figure fig:opt_stiff_primary_plant_damped_L.
Identification of the undamped plant ignore
Identification of the damped plant ignore
Effect of the Damping on the plant diagonal dynamics ignore
Effect of the Damping on the coupling dynamics ignore
The coupling (off diagonal elements) of $\bm{G}_\mathcal{X}$ are shown in Figure fig:opt_stiff_primary_plant_damped_coupling_X both when DVF is applied and when it is not.
The coupling does not change a lot with DVF.
The coupling in the space of the legs $\bm{G}_\mathcal{L}$ are shown in Figure fig:opt_stiff_primary_plant_damped_coupling_L. The magnitude of the coupling around the resonance of the nano-hexapod (where the coupling is the highest) is considerably reduced when DVF is applied.
Effect of the Low Authority Control on the Sensibility to Disturbances
Introduction ignore
We may now see how Decentralized Direct Velocity Feedback changes the sensibility to disturbances, namely:
- Ground motion
- Spindle and Translation stage vibrations
- Direct forces applied to the sample
To simplify the analysis, we here only consider the vertical direction, thus, we will look at the transfer functions:
- from vertical ground motion $D_{w,z}$ to the vertical position error of the sample $E_z$
- from vertical vibration forces of the spindle $F_{R_z,z}$ to $E_z$
- from vertical vibration forces of the translation stage $F_{T_y,z}$ to $E_z$
- from vertical direct forces (such as cable forces) $F_{d,z}$ to $E_z$
The norm of these transfer functions are shown in Figure fig:opt_stiff_sensibility_dist_dvf.
Identification ignore
Results ignore
Primary Control in the task space
Introduction ignore
Plant in the task space
Let's look $\bm{G}_\mathcal{X}(s)$.
Control in the task space
Kx = tf(zeros(6));
h = 2.5;
Kx(1,1) = 3e7 * ...
1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
(s/2/pi/1 + 1)/(s/2/pi/1);
Kx(2,2) = Kx(1,1);
h = 2.5;
Kx(3,3) = 3e7 * ...
1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
(s/2/pi/1 + 1)/(s/2/pi/1);
h = 1.5;
Kx(4,4) = 5e5 * ...
1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
(s/2/pi/1 + 1)/(s/2/pi/1);
Kx(5,5) = Kx(4,4);
h = 1.5;
Kx(6,6) = 5e4 * ...
1/h*(s/(2*pi*30/h) + 1)/(s/(2*pi*30*h) + 1) * ...
(s/2/pi/1 + 1)/(s/2/pi/1);
Stability
for i = 1:length(Ms)
isstable(feedback(Gm_x{i}*Kx, eye(6), -1))
end
Simulation
Primary Control in the leg space
Introduction ignore
Plant in the task space
Control in the leg space
h = 1.5;
Kl = 2e7 * eye(6) * ...
1/h*(s/(2*pi*200/h) + 1)/(s/(2*pi*200*h) + 1) * ...
1/h*(s/(2*pi*100/h) + 1)/(s/(2*pi*100*h) + 1) * ...
(s/2/pi/10 + 1)/(s/2/pi/10) * ...
1/(1 + s/2/pi/500);
for i = 1:length(Ms)
isstable(feedback(Gm_l{i}(1,1)*Kl(1,1), 1, -1))
end
Simulations
load('mat/stages.mat', 'nano_hexapod');
K = Kl*nano_hexapod.J;
initializeDisturbances('Fty_x', false, 'Fty_z', false);
initializeSimscapeConfiguration('gravity', false);
initializeLoggingConfiguration('log', 'all');
load('mat/conf_simulink.mat');
set_param(conf_simulink, 'StopTime', '2');
hac_dvf_L = {zeros(length(Ms)), 1};
for i = 1:length(Ms)
initializeSample('mass', Ms(i), 'freq', sqrt(Kp/Ms(i))/2/pi*ones(6,1));
initializeReferences('Rz_type', 'rotating', 'Rz_period', Ms(i));
sim('nass_model');
hac_dvf_L(i) = {simout};
end
save('./mat/tomo_exp_hac_dvf.mat', 'hac_dvf_L');
Results
load('./mat/experiment_tomography.mat', 'tomo_align_dist');
n_av = 4;
han_win = hanning(ceil(length(simout.Em.En.Data(:,1))/n_av));
t = simout.Em.En.Time;
Ts = t(2)-t(1);
[pxx_ol, f] = pwelch(tomo_align_dist.Em.En.Data, han_win, [], [], 1/Ts);
pxx_dvf_L = zeros(length(f), 6, length(Ms));
for i = 1:length(Ms)
[pxx, ~] = pwelch(hac_dvf_L{i}.Em.En.Data(ceil(0.2/Ts):end,:), han_win, [], [], 1/Ts);
pxx_dvf_L(:, :, i) = pxx;
end