30 KiB
Control of the NASS with optimal stiffness
- Introduction
- Low Authority Control - Decentralized Direct Velocity Feedback
- Identification of the dynamics for the Primary controller
- Primary Control in the task space
- Primary Control in the leg space
Introduction ignore
Low Authority Control - Decentralized Direct Velocity Feedback
Introduction ignore
Initialization
We initialize all the stages with the default parameters.
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
Root Locus
Damping as function of the gain
Kdvf = 5e3*s/(1+s/2/pi/1e3)*eye(6);
Identification of the dynamics for the Primary controller
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}} \]
Then, we compute both 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} \]
and 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) \]
We identify these dynamics with and without using the DVF controller.
Identification of the undamped plant ignore
Identification of the damped plant ignore
Obtained dynamics for the Undamped plant 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
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