Change tangle filenames
This commit is contained in:
parent
b7daaf18b2
commit
e3e6043810
@ -4,7 +4,7 @@ clear; close all; clc;
|
|||||||
%% Intialize Laplace variable
|
%% Intialize Laplace variable
|
||||||
s = zpk('s');
|
s = zpk('s');
|
||||||
|
|
||||||
open('active_damping/matlab/sim_nass_active_damping.slx')
|
open('nass_model.slx')
|
||||||
load('mat/conf_simulink.mat');
|
load('mat/conf_simulink.mat');
|
||||||
|
|
||||||
% Identification :ignore:
|
% Identification :ignore:
|
||||||
@ -17,11 +17,11 @@ options = linearizeOptions;
|
|||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'sim_nass_active_damping';
|
mdl = 'nass_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1;
|
||||||
@ -168,11 +168,11 @@ options = linearizeOptions;
|
|||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'sim_nass_active_damping';
|
mdl = 'nass_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1;
|
||||||
@ -318,11 +318,11 @@ options = linearizeOptions;
|
|||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'sim_nass_active_damping';
|
mdl = 'nass_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1;
|
||||||
@ -595,11 +595,11 @@ options = linearizeOptions;
|
|||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'sim_nass_active_damping';
|
mdl = 'nass_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1;
|
||||||
@ -752,11 +752,11 @@ options = linearizeOptions;
|
|||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'sim_nass_active_damping';
|
mdl = 'nass_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1;
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1;
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1;
|
||||||
|
10
matlab/dvf.m
10
matlab/dvf.m
@ -6,7 +6,7 @@ s = zpk('s');
|
|||||||
|
|
||||||
addpath('active_damping/src/');
|
addpath('active_damping/src/');
|
||||||
|
|
||||||
open('active_damping/matlab/sim_nass_active_damping.slx')
|
open('nass_model.slx')
|
||||||
|
|
||||||
load('./active_damping/mat/undamped_plants.mat', 'G_dvf');
|
load('./active_damping/mat/undamped_plants.mat', 'G_dvf');
|
||||||
load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_dvf');
|
load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_dvf');
|
||||||
@ -83,12 +83,12 @@ options = linearizeOptions;
|
|||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'sim_nass_active_damping';
|
mdl = 'nass_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
io(io_i) = linio([mdl, '/Compute Error in NASS base'], 2, 'openoutput'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1;
|
||||||
|
|
||||||
load('./active_damping/mat/cart_plants.mat', 'masses');
|
load('./active_damping/mat/cart_plants.mat', 'masses');
|
||||||
|
|
||||||
@ -213,7 +213,7 @@ initializeController('type', 'dvf', 'K', K_dvf);
|
|||||||
load('mat/conf_simulink.mat');
|
load('mat/conf_simulink.mat');
|
||||||
set_param(conf_simulink, 'StopTime', '4.5');
|
set_param(conf_simulink, 'StopTime', '4.5');
|
||||||
|
|
||||||
sim('sim_nass_active_damping');
|
sim('nass_model');
|
||||||
|
|
||||||
En_dvf = En;
|
En_dvf = En;
|
||||||
Eg_dvf = Eg;
|
Eg_dvf = Eg;
|
||||||
|
197
matlab/dvf_uniaxial.m
Normal file
197
matlab/dvf_uniaxial.m
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
%% Clear Workspace and Close figures
|
||||||
|
clear; close all; clc;
|
||||||
|
|
||||||
|
%% Intialize Laplace variable
|
||||||
|
s = zpk('s');
|
||||||
|
|
||||||
|
open('active_damping_uniaxial/matlab/sim_nano_station_id.slx')
|
||||||
|
|
||||||
|
load('./active_damping_uniaxial/mat/plants.mat', 'G');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 1, 1);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_geoph(['Vm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
|
ax2 = subplot(2, 1, 2);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_geoph(['Vm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
|
K_dvf = tf(3e4);
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 1, 1);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, abs(squeeze(freqresp(K_dvf*G.G_geoph(['Vm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
|
ax2 = subplot(2, 1, 2);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(K_dvf*G.G_geoph(['Vm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
|
initializeReferences();
|
||||||
|
initializeGround();
|
||||||
|
initializeGranite();
|
||||||
|
initializeTy();
|
||||||
|
initializeRy();
|
||||||
|
initializeRz();
|
||||||
|
initializeMicroHexapod();
|
||||||
|
initializeAxisc();
|
||||||
|
initializeMirror();
|
||||||
|
initializeNanoHexapod('actuator', 'piezo');
|
||||||
|
initializeSample('mass', 50);
|
||||||
|
|
||||||
|
K = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K', '-append');
|
||||||
|
K_iff = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K_iff', '-append');
|
||||||
|
K_rmc = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K_rmc', '-append');
|
||||||
|
K_dvf = -K_dvf*eye(6);
|
||||||
|
save('./mat/controllers.mat', 'K_dvf', '-append');
|
||||||
|
|
||||||
|
G_dvf = identifyPlant();
|
||||||
|
|
||||||
|
save('./active_damping_uniaxial/mat/plants.mat', 'G_dvf', '-append');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
subplot(2, 1, 1);
|
||||||
|
title('$D_g$ to $D$');
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / D_{g,x}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / D_{g,y}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / D_{g,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
subplot(2, 1, 2);
|
||||||
|
title('$F_s$ to $D$');
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{s,x}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{s,y}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{s,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{rz, z}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{ty, z}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{ty, x}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 2, 1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))));
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Dy', 'Fny'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), '--');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax2 = subplot(2, 2, 2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Rx', 'Mnx'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Ry', 'Mny'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Rz', 'Mnz'), freqs, 'Hz'))));
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Ry', 'Mny'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_dvf.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), '--');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [rad/(Nm)]'); xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax3 = subplot(2, 2, 3);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{n,x}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{n,y}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{n,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Dy', 'Fny'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
legend('location', 'northwest');
|
||||||
|
|
||||||
|
ax4 = subplot(2, 2, 4);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), 'DisplayName', '$\left|R_x / M_{n,x}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Ry', 'Mny'), freqs, 'Hz'))), 'DisplayName', '$\left|R_y / M_{n,y}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), 'DisplayName', '$\left|R_z / M_{n,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Ry', 'Mny'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_dvf.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
legend('location', 'northwest');
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2,ax3,ax4],'x');
|
10
matlab/iff.m
10
matlab/iff.m
@ -6,7 +6,7 @@ s = zpk('s');
|
|||||||
|
|
||||||
addpath('active_damping/src/');
|
addpath('active_damping/src/');
|
||||||
|
|
||||||
open('active_damping/matlab/sim_nass_active_damping.slx')
|
open('nass_model.slx')
|
||||||
|
|
||||||
load('./active_damping/mat/undamped_plants.mat', 'G_iff');
|
load('./active_damping/mat/undamped_plants.mat', 'G_iff');
|
||||||
load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_iff');
|
load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_iff');
|
||||||
@ -84,12 +84,12 @@ options = linearizeOptions;
|
|||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'sim_nass_active_damping';
|
mdl = 'nass_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
io(io_i) = linio([mdl, '/Compute Error in NASS base'], 2, 'openoutput'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1;
|
||||||
|
|
||||||
load('./active_damping/mat/cart_plants.mat', 'masses');
|
load('./active_damping/mat/cart_plants.mat', 'masses');
|
||||||
|
|
||||||
@ -214,7 +214,7 @@ initializeController('type', 'iff', 'K', K_iff);
|
|||||||
load('mat/conf_simulink.mat');
|
load('mat/conf_simulink.mat');
|
||||||
set_param(conf_simulink, 'StopTime', '4.5');
|
set_param(conf_simulink, 'StopTime', '4.5');
|
||||||
|
|
||||||
sim('sim_nass_active_damping');
|
sim('nass_model');
|
||||||
|
|
||||||
En_iff = En;
|
En_iff = En;
|
||||||
Eg_iff = Eg;
|
Eg_iff = Eg;
|
||||||
|
212
matlab/iff_uniaxial.m
Normal file
212
matlab/iff_uniaxial.m
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
%% Clear Workspace and Close figures
|
||||||
|
clear; close all; clc;
|
||||||
|
|
||||||
|
%% Intialize Laplace variable
|
||||||
|
s = zpk('s');
|
||||||
|
|
||||||
|
open('active_damping_uniaxial/matlab/sim_nano_station_id.slx')
|
||||||
|
|
||||||
|
load('./active_damping_uniaxial/mat/plants.mat', 'G');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 1, 1);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_iff(['Fm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
|
ax2 = subplot(2, 1, 2);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_iff(['Fm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
|
K_iff = -1000/s;
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 1, 1);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, abs(squeeze(freqresp(K_iff*G.G_iff(['Fm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [N/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
|
ax2 = subplot(2, 1, 2);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(K_iff*G.G_iff(['Fm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
|
initializeReferences();
|
||||||
|
initializeGround();
|
||||||
|
initializeGranite();
|
||||||
|
initializeTy();
|
||||||
|
initializeRy();
|
||||||
|
initializeRz();
|
||||||
|
initializeMicroHexapod();
|
||||||
|
initializeAxisc();
|
||||||
|
initializeMirror();
|
||||||
|
initializeNanoHexapod('actuator', 'piezo');
|
||||||
|
initializeSample('mass', 50);
|
||||||
|
|
||||||
|
K = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K', '-append');
|
||||||
|
K_iff = -K_iff*eye(6);
|
||||||
|
save('./mat/controllers.mat', 'K_iff', '-append');
|
||||||
|
K_rmc = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K_rmc', '-append');
|
||||||
|
K_dvf = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K_dvf', '-append');
|
||||||
|
|
||||||
|
G_iff = identifyPlant();
|
||||||
|
|
||||||
|
save('./active_damping_uniaxial/mat/plants.mat', 'G_iff', '-append');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
subplot(2, 1, 1);
|
||||||
|
title('$D_g$ to $D$');
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / D_{g,x}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / D_{g,y}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / D_{g,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
subplot(2, 1, 2);
|
||||||
|
title('$F_s$ to $D$');
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{s,x}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{s,y}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{s,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{rz, z}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{ty, z}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{ty, x}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(minreal(prescale(G_iff.G_dist('Dz', 'Frzz'), {2*pi, 2*pi*1e3})), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(minreal(G_iff.G_dist('Dz', 'Ftyz')), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(minreal(G_iff.G_dist('Dx', 'Ftyx')), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 2, 1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))));
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_cart('Dy', 'Fny'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), '--');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax2 = subplot(2, 2, 2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Rx', 'Mnx'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Ry', 'Mny'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Rz', 'Mnz'), freqs, 'Hz'))));
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_cart('Ry', 'Mny'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), '--');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [rad/(Nm)]'); xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax3 = subplot(2, 2, 3);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{n,x}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{n,y}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{n,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_iff.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_iff.G_cart('Dy', 'Fny'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_iff.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
legend('location', 'northwest');
|
||||||
|
|
||||||
|
ax4 = subplot(2, 2, 4);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), 'DisplayName', '$\left|R_x / M_{n,x}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Ry', 'Mny'), freqs, 'Hz'))), 'DisplayName', '$\left|R_y / M_{n,y}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), 'DisplayName', '$\left|R_z / M_{n,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_iff.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_iff.G_cart('Ry', 'Mny'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_iff.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
legend('location', 'northwest');
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2,ax3,ax4],'x');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
for ix = 1:6
|
||||||
|
for iy = 1:6
|
||||||
|
subplot(6, 6, (ix-1)*6 + iy);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart(ix, iy), freqs, 'Hz'))), 'k-');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_iff.G_cart(ix, iy), freqs, 'Hz'))), 'k--');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylim([1e-12, 1e-5]);
|
||||||
|
end
|
||||||
|
end
|
@ -6,7 +6,7 @@ s = zpk('s');
|
|||||||
|
|
||||||
addpath('active_damping/src/');
|
addpath('active_damping/src/');
|
||||||
|
|
||||||
open('active_damping/matlab/sim_nass_active_damping.slx')
|
open('nass_model.slx')
|
||||||
|
|
||||||
load('./active_damping/mat/undamped_plants.mat', 'G_ine');
|
load('./active_damping/mat/undamped_plants.mat', 'G_ine');
|
||||||
load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_ine');
|
load('./active_damping/mat/plants_variable.mat', 'masses', 'Gm_ine');
|
||||||
@ -83,12 +83,12 @@ options = linearizeOptions;
|
|||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'sim_nass_active_damping';
|
mdl = 'nass_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
io(io_i) = linio([mdl, '/Compute Error in NASS base'], 2, 'openoutput'); io_i = io_i + 1;
|
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'output', [], 'En'); io_i = io_i + 1;
|
||||||
|
|
||||||
load('./active_damping/mat/cart_plants.mat', 'masses');
|
load('./active_damping/mat/cart_plants.mat', 'masses');
|
||||||
|
|
||||||
|
197
matlab/rmc_uniaxial.m
Normal file
197
matlab/rmc_uniaxial.m
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
%% Clear Workspace and Close figures
|
||||||
|
clear; close all; clc;
|
||||||
|
|
||||||
|
%% Intialize Laplace variable
|
||||||
|
s = zpk('s');
|
||||||
|
|
||||||
|
open('active_damping_uniaxial/matlab/sim_nano_station_id.slx')
|
||||||
|
|
||||||
|
load('./active_damping_uniaxial/mat/plants.mat', 'G');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 1, 1);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dleg(['Dm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
|
ax2 = subplot(2, 1, 2);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_dleg(['Dm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
|
K_rmc = s*50000/(1 + s/2/pi/10000);
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 1, 1);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, abs(squeeze(freqresp(K_rmc*G.G_dleg(['Dm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
|
ax2 = subplot(2, 1, 2);
|
||||||
|
hold on;
|
||||||
|
for i=1:6
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(K_rmc*G.G_dleg(['Dm', num2str(i)], ['F', num2str(i)]), freqs, 'Hz'))));
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
|
initializeReferences();
|
||||||
|
initializeGround();
|
||||||
|
initializeGranite();
|
||||||
|
initializeTy();
|
||||||
|
initializeRy();
|
||||||
|
initializeRz();
|
||||||
|
initializeMicroHexapod();
|
||||||
|
initializeAxisc();
|
||||||
|
initializeMirror();
|
||||||
|
initializeNanoHexapod('actuator', 'piezo');
|
||||||
|
initializeSample('mass', 50);
|
||||||
|
|
||||||
|
K = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K', '-append');
|
||||||
|
K_iff = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K_iff', '-append');
|
||||||
|
K_rmc = -K_rmc*eye(6);
|
||||||
|
save('./mat/controllers.mat', 'K_rmc', '-append');
|
||||||
|
K_dvf = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K_dvf', '-append');
|
||||||
|
|
||||||
|
G_rmc = identifyPlant();
|
||||||
|
|
||||||
|
save('./active_damping_uniaxial/mat/plants.mat', 'G_rmc', '-append');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
subplot(2, 1, 1);
|
||||||
|
title('$D_g$ to $D$');
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / D_{g,x}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / D_{g,y}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / D_{g,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'southeast');
|
||||||
|
|
||||||
|
subplot(2, 1, 2);
|
||||||
|
title('$F_s$ to $D$');
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{s,x}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{s,y}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{s,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{rz, z}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{ty, z}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{ty, x}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 2, 1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))));
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_cart('Dy', 'Fny'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), '--');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax2 = subplot(2, 2, 2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Rx', 'Mnx'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Ry', 'Mny'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Rz', 'Mnz'), freqs, 'Hz'))));
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_cart('Ry', 'Mny'), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_rmc.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), '--');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [rad/(Nm)]'); xlabel('Frequency [Hz]');
|
||||||
|
|
||||||
|
ax3 = subplot(2, 2, 3);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{n,x}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{n,y}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{n,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_rmc.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_rmc.G_cart('Dy', 'Fny'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_rmc.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
legend('location', 'northwest');
|
||||||
|
|
||||||
|
ax4 = subplot(2, 2, 4);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), 'DisplayName', '$\left|R_x / M_{n,x}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Ry', 'Mny'), freqs, 'Hz'))), 'DisplayName', '$\left|R_y / M_{n,y}\right|$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), 'DisplayName', '$\left|R_z / M_{n,z}\right|$');
|
||||||
|
set(gca,'ColorOrderIndex',1);
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_rmc.G_cart('Rx', 'Mnx'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_rmc.G_cart('Ry', 'Mny'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_rmc.G_cart('Rz', 'Mnz'), freqs, 'Hz'))), '--', 'HandleVisibility', 'off');
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
legend('location', 'northwest');
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2,ax3,ax4],'x');
|
@ -6,7 +6,7 @@ s = zpk('s');
|
|||||||
|
|
||||||
addpath('active_damping/src/');
|
addpath('active_damping/src/');
|
||||||
|
|
||||||
open('active_damping/matlab/sim_nass_active_damping.slx')
|
open('nass_model.slx')
|
||||||
|
|
||||||
prepareLinearizeIdentification();
|
prepareLinearizeIdentification();
|
||||||
|
|
||||||
@ -15,11 +15,11 @@ options = linearizeOptions;
|
|||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'sim_nass_active_damping';
|
mdl = 'nass_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1; % Relative Motion Outputs
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Dnlm'); io_i = io_i + 1; % Relative Motion Outputs
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1; % Force Sensors
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Fnlm'); io_i = io_i + 1; % Force Sensors
|
||||||
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1; % Absolute Velocity Outputs
|
io(io_i) = linio([mdl, '/Micro-Station'], 3, 'openoutput', [], 'Vlm'); io_i = io_i + 1; % Absolute Velocity Outputs
|
||||||
@ -124,12 +124,12 @@ options = linearizeOptions;
|
|||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'sim_nass_active_damping';
|
mdl = 'nass_model';
|
||||||
|
|
||||||
%% Input/Output definition
|
%% Input/Output definition
|
||||||
clear io; io_i = 1;
|
clear io; io_i = 1;
|
||||||
io(io_i) = linio([mdl, '/Fnl'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
io(io_i) = linio([mdl, '/Controller'], 1, 'openinput'); io_i = io_i + 1; % Actuator Inputs
|
||||||
io(io_i) = linio([mdl, '/Compute Error in NASS base'], 2, 'openoutput'); io_i = io_i + 1; % Metrology Outputs
|
io(io_i) = linio([mdl, '/Tracking Error'], 1, 'openoutput', [], 'En'); io_i = io_i + 1; % Metrology Outputs
|
||||||
|
|
||||||
masses = [1, 10, 50]; % [kg]
|
masses = [1, 10, 50]; % [kg]
|
||||||
|
|
||||||
@ -234,7 +234,7 @@ prepareTomographyExperiment();
|
|||||||
load('mat/conf_simulink.mat');
|
load('mat/conf_simulink.mat');
|
||||||
set_param(conf_simulink, 'StopTime', '4.5');
|
set_param(conf_simulink, 'StopTime', '4.5');
|
||||||
|
|
||||||
sim('sim_nass_active_damping');
|
sim('nass_model');
|
||||||
|
|
||||||
save('./active_damping/mat/tomo_exp.mat', 'En', 'Eg', '-append');
|
save('./active_damping/mat/tomo_exp.mat', 'En', 'Eg', '-append');
|
||||||
|
|
||||||
|
94
matlab/undamped_system_uniaxial.m
Normal file
94
matlab/undamped_system_uniaxial.m
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
%% Clear Workspace and Close figures
|
||||||
|
clear; close all; clc;
|
||||||
|
|
||||||
|
%% Intialize Laplace variable
|
||||||
|
s = zpk('s');
|
||||||
|
|
||||||
|
open('active_damping_uniaxial/matlab/sim_nano_station_id.slx')
|
||||||
|
|
||||||
|
initializeReferences();
|
||||||
|
initializeGround();
|
||||||
|
initializeGranite();
|
||||||
|
initializeTy();
|
||||||
|
initializeRy();
|
||||||
|
initializeRz();
|
||||||
|
initializeMicroHexapod();
|
||||||
|
initializeAxisc();
|
||||||
|
initializeMirror();
|
||||||
|
initializeNanoHexapod('actuator', 'piezo');
|
||||||
|
initializeSample('mass', 50);
|
||||||
|
|
||||||
|
K = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K', '-append');
|
||||||
|
K_iff = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K_iff', '-append');
|
||||||
|
K_rmc = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K_rmc', '-append');
|
||||||
|
K_dvf = tf(zeros(6));
|
||||||
|
save('./mat/controllers.mat', 'K_dvf', '-append');
|
||||||
|
|
||||||
|
G = identifyPlant();
|
||||||
|
|
||||||
|
save('./active_damping_uniaxial/mat/plants.mat', 'G', '-append');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
subplot(2, 1, 1);
|
||||||
|
title('$D_g$ to $D$');
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dx', 'Dgx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / D_{g,x}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dy', 'Dgy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / D_{g,y}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_gm('Dz', 'Dgz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / D_{g,z}\right|$');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/m]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'southeast');
|
||||||
|
|
||||||
|
subplot(2, 1, 2);
|
||||||
|
title('$F_s$ to $D$');
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dx', 'Fsx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{s,x}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dy', 'Fsy'), freqs, 'Hz'))), 'DisplayName', '$\left|D_y / F_{s,y}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_fs('Dz', 'Fsz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{s,z}\right|$');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Frzz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{rz, z}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dz', 'Ftyz'), freqs, 'Hz'))), 'DisplayName', '$\left|D_z / F_{ty, z}\right|$');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_dist('Dx', 'Ftyx'), freqs, 'Hz'))), 'DisplayName', '$\left|D_x / F_{ty, x}\right|$');
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]');
|
||||||
|
legend('location', 'northeast');
|
||||||
|
|
||||||
|
freqs = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
|
||||||
|
ax1 = subplot(2, 1, 1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))));
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]'); set(gca, 'XTickLabel',[]);
|
||||||
|
|
||||||
|
ax2 = subplot(2, 1, 2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dx', 'Fnx'), freqs, 'Hz'))), 'DisplayName', '$D_x / F_x$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dy', 'Fny'), freqs, 'Hz'))), 'DisplayName', '$D_y / F_y$');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G.G_cart('Dz', 'Fnz'), freqs, 'Hz'))), 'DisplayName', '$D_z / F_z$');
|
||||||
|
hold off;
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin');
|
||||||
|
ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
legend('location', 'southwest');
|
||||||
|
|
||||||
|
linkaxes([ax1,ax2],'x');
|
@ -65,7 +65,7 @@ For each of the active damping technique, we:
|
|||||||
|
|
||||||
* Undamped System
|
* Undamped System
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:matlab+: :tangle matlab/undamped_system.m
|
:header-args:matlab+: :tangle ../matlab/undamped_system.m
|
||||||
:header-args:matlab+: :comments none :mkdirp yes
|
:header-args:matlab+: :comments none :mkdirp yes
|
||||||
:END:
|
:END:
|
||||||
<<sec:undamped_system>>
|
<<sec:undamped_system>>
|
||||||
@ -508,7 +508,7 @@ We load the results of tomography experiments.
|
|||||||
|
|
||||||
* Variability of the system dynamics for Active Damping
|
* Variability of the system dynamics for Active Damping
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:matlab+: :tangle matlab/act_damp_variability_plant.m
|
:header-args:matlab+: :tangle ../matlab/act_damp_variability_plant.m
|
||||||
:header-args:matlab+: :comments org :mkdirp yes
|
:header-args:matlab+: :comments org :mkdirp yes
|
||||||
:END:
|
:END:
|
||||||
<<sec:act_damp_variability_plant>>
|
<<sec:act_damp_variability_plant>>
|
||||||
@ -1660,7 +1660,7 @@ Also, for the Inertial Sensor, a RHP zero may appear when the spindle is rotatin
|
|||||||
|
|
||||||
* Integral Force Feedback
|
* Integral Force Feedback
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:matlab+: :tangle matlab/iff.m
|
:header-args:matlab+: :tangle ../matlab/iff.m
|
||||||
:header-args:matlab+: :comments none :mkdirp yes
|
:header-args:matlab+: :comments none :mkdirp yes
|
||||||
:END:
|
:END:
|
||||||
<<sec:iff>>
|
<<sec:iff>>
|
||||||
@ -2149,7 +2149,7 @@ Integral Force Feedback using a force sensor:
|
|||||||
|
|
||||||
* Direct Velocity Feedback
|
* Direct Velocity Feedback
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:matlab+: :tangle matlab/dvf.m
|
:header-args:matlab+: :tangle ../matlab/dvf.m
|
||||||
:header-args:matlab+: :comments none :mkdirp yes
|
:header-args:matlab+: :comments none :mkdirp yes
|
||||||
:END:
|
:END:
|
||||||
<<sec:dvf>>
|
<<sec:dvf>>
|
||||||
@ -2627,7 +2627,7 @@ Direct Velocity Feedback using a relative motion sensor:
|
|||||||
|
|
||||||
* Inertial Control
|
* Inertial Control
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:matlab+: :tangle matlab/ine.m
|
:header-args:matlab+: :tangle ../matlab/ine.m
|
||||||
:header-args:matlab+: :comments none :mkdirp yes
|
:header-args:matlab+: :comments none :mkdirp yes
|
||||||
:END:
|
:END:
|
||||||
<<sec:ine>>
|
<<sec:ine>>
|
||||||
|
@ -60,7 +60,7 @@ The disturbances are:
|
|||||||
|
|
||||||
* Undamped System
|
* Undamped System
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:matlab+: :tangle matlab/undamped_system.m
|
:header-args:matlab+: :tangle ../matlab/undamped_system_uniaxial.m
|
||||||
:header-args:matlab+: :comments none :mkdirp yes
|
:header-args:matlab+: :comments none :mkdirp yes
|
||||||
:END:
|
:END:
|
||||||
<<sec:undamped_system>>
|
<<sec:undamped_system>>
|
||||||
@ -244,7 +244,7 @@ The "plant" (transfer function from forces applied by the nano-hexapod to the me
|
|||||||
|
|
||||||
* Integral Force Feedback
|
* Integral Force Feedback
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:matlab+: :tangle matlab/iff.m
|
:header-args:matlab+: :tangle ../matlab/iff_uniaxial.m
|
||||||
:header-args:matlab+: :comments none :mkdirp yes
|
:header-args:matlab+: :comments none :mkdirp yes
|
||||||
:END:
|
:END:
|
||||||
<<sec:iff>>
|
<<sec:iff>>
|
||||||
@ -788,7 +788,7 @@ Integral Force Feedback:
|
|||||||
|
|
||||||
* Relative Motion Control
|
* Relative Motion Control
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:matlab+: :tangle matlab/rmc.m
|
:header-args:matlab+: :tangle ../matlab/rmc_uniaxial.m
|
||||||
:header-args:matlab+: :comments none :mkdirp yes
|
:header-args:matlab+: :comments none :mkdirp yes
|
||||||
:END:
|
:END:
|
||||||
<<sec:rmc>>
|
<<sec:rmc>>
|
||||||
@ -1286,7 +1286,7 @@ Relative Motion Control:
|
|||||||
|
|
||||||
* Direct Velocity Feedback
|
* Direct Velocity Feedback
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:matlab+: :tangle matlab/dvf.m
|
:header-args:matlab+: :tangle ../matlab/dvf_uniaxial.m
|
||||||
:header-args:matlab+: :comments none :mkdirp yes
|
:header-args:matlab+: :comments none :mkdirp yes
|
||||||
:END:
|
:END:
|
||||||
<<sec:dvf>>
|
<<sec:dvf>>
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#+PROPERTY: header-args:matlab+ :exports both
|
#+PROPERTY: header-args:matlab+ :exports both
|
||||||
#+PROPERTY: header-args:matlab+ :eval no-export
|
#+PROPERTY: header-args:matlab+ :eval no-export
|
||||||
#+PROPERTY: header-args:matlab+ :output-dir figs
|
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||||
#+PROPERTY: header-args:matlab+ :tangle matlab/modal_frf_coh.m
|
#+PROPERTY: header-args:matlab+ :tangle no
|
||||||
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||||||
|
|
||||||
#+PROPERTY: header-args:shell :eval no-export
|
#+PROPERTY: header-args:shell :eval no-export
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#+PROPERTY: header-args:matlab+ :exports both
|
#+PROPERTY: header-args:matlab+ :exports both
|
||||||
#+PROPERTY: header-args:matlab+ :eval no-export
|
#+PROPERTY: header-args:matlab+ :eval no-export
|
||||||
#+PROPERTY: header-args:matlab+ :output-dir figs
|
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||||
#+PROPERTY: header-args:matlab+ :tangle matlab/tomo_exp.m
|
#+PROPERTY: header-args:matlab+ :tangle no
|
||||||
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||||||
|
|
||||||
#+PROPERTY: header-args:shell :eval no-export
|
#+PROPERTY: header-args:shell :eval no-export
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#+PROPERTY: header-args:matlab+ :exports both
|
#+PROPERTY: header-args:matlab+ :exports both
|
||||||
#+PROPERTY: header-args:matlab+ :eval no-export
|
#+PROPERTY: header-args:matlab+ :eval no-export
|
||||||
#+PROPERTY: header-args:matlab+ :output-dir figs
|
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||||
#+PROPERTY: header-args:matlab+ :tangle matlab/modal_frf_coh.m
|
#+PROPERTY: header-args:matlab+ :tangle ../matlab/identification.m
|
||||||
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||||||
|
|
||||||
#+PROPERTY: header-args:shell :eval no-export
|
#+PROPERTY: header-args:shell :eval no-export
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#+PROPERTY: header-args:matlab+ :exports both
|
#+PROPERTY: header-args:matlab+ :exports both
|
||||||
#+PROPERTY: header-args:matlab+ :eval no-export
|
#+PROPERTY: header-args:matlab+ :eval no-export
|
||||||
#+PROPERTY: header-args:matlab+ :output-dir figs
|
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||||
#+PROPERTY: header-args:matlab+ :tangle matlab/nass_simscape.m
|
#+PROPERTY: header-args:matlab+ :tangle no
|
||||||
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||||||
|
|
||||||
#+PROPERTY: header-args:shell :eval no-export
|
#+PROPERTY: header-args:shell :eval no-export
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#+PROPERTY: header-args:matlab+ :exports both
|
#+PROPERTY: header-args:matlab+ :exports both
|
||||||
#+PROPERTY: header-args:matlab+ :eval no-export
|
#+PROPERTY: header-args:matlab+ :eval no-export
|
||||||
#+PROPERTY: header-args:matlab+ :output-dir figs
|
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||||
#+PROPERTY: header-args:matlab+ :tangle matlab/modal_frf_coh.m
|
#+PROPERTY: header-args:matlab+ :tangle no
|
||||||
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||||||
|
|
||||||
#+PROPERTY: header-args:shell :eval no-export
|
#+PROPERTY: header-args:shell :eval no-export
|
||||||
|
398
org/matlab/modal_frf_coh.m
Normal file
398
org/matlab/modal_frf_coh.m
Normal file
@ -0,0 +1,398 @@
|
|||||||
|
%% Clear Workspace and Close figures
|
||||||
|
clear; close all; clc;
|
||||||
|
|
||||||
|
%% Intialize Laplace variable
|
||||||
|
s = zpk('s');
|
||||||
|
|
||||||
|
% Simscape Model
|
||||||
|
% The simulink file for the identification is =sim_micro_station_id.slx=.
|
||||||
|
|
||||||
|
open('identification/matlab/sim_micro_station_id.slx')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% We load the configuration and we set a small =StopTime=.
|
||||||
|
|
||||||
|
load('mat/conf_simulink.mat');
|
||||||
|
set_param(conf_simulink, 'StopTime', '0.5');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% We initialize all the stages.
|
||||||
|
|
||||||
|
initializeGround();
|
||||||
|
initializeGranite();
|
||||||
|
initializeTy();
|
||||||
|
initializeRy();
|
||||||
|
initializeRz();
|
||||||
|
initializeMicroHexapod();
|
||||||
|
initializeAxisc();
|
||||||
|
initializeMirror();
|
||||||
|
initializeNanoHexapod('actuator', 'piezo');
|
||||||
|
initializeSample('mass', 50);
|
||||||
|
|
||||||
|
% Compute the transfer functions
|
||||||
|
% We first define some parameters for the identification.
|
||||||
|
|
||||||
|
%% Options for Linearized
|
||||||
|
options = linearizeOptions;
|
||||||
|
options.SampleTime = 0;
|
||||||
|
|
||||||
|
%% Name of the Simulink File
|
||||||
|
mdl = 'sim_micro_station_id';
|
||||||
|
|
||||||
|
%% Micro-Hexapod
|
||||||
|
% Input/Output definition
|
||||||
|
io(1) = linio([mdl, '/Micro-Station/Fm_ext'],1,'openinput');
|
||||||
|
io(2) = linio([mdl, '/Micro-Station/Fg_ext'],1,'openinput');
|
||||||
|
io(3) = linio([mdl, '/Micro-Station/Dm_inertial'],1,'output');
|
||||||
|
io(4) = linio([mdl, '/Micro-Station/Ty_inertial'],1,'output');
|
||||||
|
io(5) = linio([mdl, '/Micro-Station/Ry_inertial'],1,'output');
|
||||||
|
io(6) = linio([mdl, '/Micro-Station/Dg_inertial'],1,'output');
|
||||||
|
|
||||||
|
% Run the linearization
|
||||||
|
G_ms = linearize(mdl, io, 0);
|
||||||
|
|
||||||
|
% Input/Output names
|
||||||
|
G_ms.InputName = {'Fmx', 'Fmy', 'Fmz',...
|
||||||
|
'Fgx', 'Fgy', 'Fgz'};
|
||||||
|
G_ms.OutputName = {'Dmx', 'Dmy', 'Dmz', ...
|
||||||
|
'Tyx', 'Tyy', 'Tyz', ...
|
||||||
|
'Ryx', 'Ryy', 'Ryz', ...
|
||||||
|
'Dgx', 'Dgy', 'Dgz'};
|
||||||
|
|
||||||
|
%% Save the obtained transfer functions
|
||||||
|
save('./mat/id_micro_station.mat', 'G_ms');
|
||||||
|
|
||||||
|
%% Clear Workspace and Close figures
|
||||||
|
clear; close all; clc;
|
||||||
|
|
||||||
|
%% Intialize Laplace variable
|
||||||
|
s = zpk('s');
|
||||||
|
|
||||||
|
% Simscape Model
|
||||||
|
% The simulink file for the analysis is =sim_micro_station_modal_analysis.slx=.
|
||||||
|
|
||||||
|
open('identification/matlab/sim_micro_station_modal_analysis.slx')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% We load the configuration and we set a small =StopTime=.
|
||||||
|
|
||||||
|
load('mat/conf_simulink.mat');
|
||||||
|
set_param(conf_simulink, 'StopTime', '0.5');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% We initialize all the stages.
|
||||||
|
|
||||||
|
initializeGround();
|
||||||
|
initializeGranite();
|
||||||
|
initializeTy();
|
||||||
|
initializeRy();
|
||||||
|
initializeRz();
|
||||||
|
initializeMicroHexapod();
|
||||||
|
initializeAxisc();
|
||||||
|
initializeMirror();
|
||||||
|
initializeNanoHexapod('actuator', 'piezo');
|
||||||
|
initializeSample('mass', 50);
|
||||||
|
|
||||||
|
% Identification
|
||||||
|
|
||||||
|
%% Options for Linearized
|
||||||
|
options = linearizeOptions;
|
||||||
|
options.SampleTime = 0;
|
||||||
|
|
||||||
|
%% Name of the Simulink File
|
||||||
|
mdl = 'sim_micro_station_modal_analysis';
|
||||||
|
|
||||||
|
%% Micro-Hexapod
|
||||||
|
% Input/Output definition
|
||||||
|
io(1) = linio([mdl, '/Micro-Station/F_hammer'],1,'openinput');
|
||||||
|
io(2) = linio([mdl, '/Micro-Station/acc9'],1,'output');
|
||||||
|
io(3) = linio([mdl, '/Micro-Station/acc10'],1,'output');
|
||||||
|
io(4) = linio([mdl, '/Micro-Station/acc11'],1,'output');
|
||||||
|
io(5) = linio([mdl, '/Micro-Station/acc12'],1,'output');
|
||||||
|
|
||||||
|
% Run the linearization
|
||||||
|
G_ms = linearize(mdl, io, 0);
|
||||||
|
|
||||||
|
% Input/Output names
|
||||||
|
G_ms.InputName = {'Fx', 'Fy', 'Fz'};
|
||||||
|
G_ms.OutputName = {'x9', 'y9', 'z9', ...
|
||||||
|
'x10', 'y10', 'z10', ...
|
||||||
|
'x11', 'y11', 'z11', ...
|
||||||
|
'x12', 'y12', 'z12'};
|
||||||
|
|
||||||
|
% Plot Results
|
||||||
|
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_ms('x9', 'Fx'), freqs, 'Hz'))));
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]');
|
||||||
|
hold off;
|
||||||
|
|
||||||
|
% Compare with measurements
|
||||||
|
|
||||||
|
load('../meas/modal-analysis/mat/frf_coh_matrices.mat', 'FRFs', 'COHs', 'freqs');
|
||||||
|
|
||||||
|
dirs = {'x', 'y', 'z'};
|
||||||
|
|
||||||
|
n_acc = 9;
|
||||||
|
n_dir = 1; % x, y, z
|
||||||
|
n_exc = 1; % x, y, z
|
||||||
|
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(FRFs(3*(n_acc-1) + n_dir, n_exc, :)))./((2*pi*freqs).^2)');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_ms([dirs{n_dir}, num2str(n_acc)], ['F', dirs{n_dir}]), freqs, 'Hz'))));
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]');
|
||||||
|
hold off;
|
||||||
|
|
||||||
|
%% Clear Workspace and Close figures
|
||||||
|
clear; close all; clc;
|
||||||
|
|
||||||
|
%% Intialize Laplace variable
|
||||||
|
s = zpk('s');
|
||||||
|
|
||||||
|
% Prepare the Simulation
|
||||||
|
|
||||||
|
open('nass_model.slx')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% We load the configuration.
|
||||||
|
|
||||||
|
load('mat/conf_simulink.mat');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% We set a small =StopTime=.
|
||||||
|
|
||||||
|
set_param(conf_simulink, 'StopTime', '0.5');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% We initialize all the stages.
|
||||||
|
|
||||||
|
initializeGround( 'type', 'rigid');
|
||||||
|
initializeGranite( 'type', 'modal-analysis');
|
||||||
|
initializeTy( 'type', 'modal-analysis');
|
||||||
|
initializeRy( 'type', 'modal-analysis');
|
||||||
|
initializeRz( 'type', 'modal-analysis');
|
||||||
|
initializeMicroHexapod('type', 'modal-analysis');
|
||||||
|
initializeAxisc( 'type', 'flexible');
|
||||||
|
|
||||||
|
initializeMirror( 'type', 'none');
|
||||||
|
initializeNanoHexapod( 'type', 'none');
|
||||||
|
initializeSample( 'type', 'none');
|
||||||
|
|
||||||
|
initializeController( 'type', 'open-loop');
|
||||||
|
|
||||||
|
initializeLoggingConfiguration('log', 'none');
|
||||||
|
|
||||||
|
initializeReferences();
|
||||||
|
initializeDisturbances('enable', false);
|
||||||
|
|
||||||
|
% Estimate the position of the CoM of each solid and compare with the one took for the Measurement Analysis
|
||||||
|
% Thanks to the [[https://fr.mathworks.com/help/physmod/sm/ref/inertiasensor.html][Inertia Sensor]] simscape block, it is possible to estimate the position of the Center of Mass of a solid body with respect to a defined frame.
|
||||||
|
|
||||||
|
|
||||||
|
sim('nass_model')
|
||||||
|
|
||||||
|
% Create a frame at the CoM of each solid body
|
||||||
|
% Now we use one =inertiasensor= block connected on each solid body that measured the center of mass of this solid with respect to the same connected frame.
|
||||||
|
|
||||||
|
% We do that in order to position an accelerometer on the Simscape model at this particular point.
|
||||||
|
|
||||||
|
|
||||||
|
open('identification/matlab/sim_micro_station_com_estimation.slx')
|
||||||
|
|
||||||
|
sim('sim_micro_station_com_estimation')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% #+RESULTS:
|
||||||
|
% | | granite bot | granite top | ty | ry | rz | hexa |
|
||||||
|
% |--------+-------------+-------------+-------+--------+-------+-------|
|
||||||
|
% | X [mm] | 0.0 | 51.7 | 0.9 | -0.1 | 0.0 | -0.0 |
|
||||||
|
% | Y [mm] | 0.0 | 753.2 | 0.7 | 5.2 | -0.0 | 0.1 |
|
||||||
|
% | Z [mm] | -250.0 | 22.9 | -17.1 | -146.5 | -23.2 | -47.1 |
|
||||||
|
|
||||||
|
% We now same this for further use:
|
||||||
|
|
||||||
|
granite_bot_com = granite_bot_com.Data(end, :)';
|
||||||
|
granite_top_com = granite_top_com.Data(end, :)';
|
||||||
|
ty_com = ty_com.Data(end, :)';
|
||||||
|
ry_com = ry_com.Data(end, :)';
|
||||||
|
rz_com = rz_com.Data(end, :)';
|
||||||
|
hexa_com = hexa_com.Data(end, :)';
|
||||||
|
|
||||||
|
save('mat/solids_com.mat', 'granite_bot_com', 'granite_top_com', 'ty_com', 'ry_com', 'rz_com', 'hexa_com');
|
||||||
|
|
||||||
|
% Identification of the dynamics of the Simscape Model
|
||||||
|
% We now use a new Simscape Model where 6DoF inertial sensors are located at the Center of Mass of each solid body.
|
||||||
|
|
||||||
|
|
||||||
|
% load('mat/solids_com.mat', 'granite_bot_com', 'granite_top_com', 'ty_com', 'ry_com', 'rz_com', 'hexa_com');
|
||||||
|
|
||||||
|
open('nass_model.slx')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% We use the =linearize= function in order to estimate the dynamics from forces applied on the Translation stage at the same position used for the real modal analysis to the inertial sensors.
|
||||||
|
|
||||||
|
%% Options for Linearized
|
||||||
|
options = linearizeOptions;
|
||||||
|
options.SampleTime = 0;
|
||||||
|
|
||||||
|
%% Name of the Simulink File
|
||||||
|
mdl = 'nass_model';
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
io(io_i) = linio([mdl, '/Micro-Station/Translation Stage/Modal Analysis/F_hammer'], 1, 'openinput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/Micro-Station/Granite/Modal Analysis/accelerometer'], 1, 'openoutput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/Micro-Station/Translation Stage/Modal Analysis/accelerometer'], 1, 'openoutput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/Micro-Station/Tilt Stage/Modal Analysis/accelerometer'], 1, 'openoutput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/Micro-Station/Spindle/Modal Analysis/accelerometer'], 1, 'openoutput'); io_i = io_i + 1;
|
||||||
|
io(io_i) = linio([mdl, '/Micro-Station/Micro Hexapod/Modal Analysis/accelerometer'], 1, 'openoutput'); io_i = io_i + 1;
|
||||||
|
|
||||||
|
% Run the linearization
|
||||||
|
G_ms = linearize(mdl, io, 0);
|
||||||
|
|
||||||
|
%% Input/Output definition
|
||||||
|
clear io; io_i = 1;
|
||||||
|
G_ms.InputName = {'Fx', 'Fy', 'Fz'};
|
||||||
|
G_ms.OutputName = {'gtop_x', 'gtop_y', 'gtop_z', 'gtop_rx', 'gtop_ry', 'gtop_rz', ...
|
||||||
|
'ty_x', 'ty_y', 'ty_z', 'ty_rx', 'ty_ry', 'ty_rz', ...
|
||||||
|
'ry_x', 'ry_y', 'ry_z', 'ry_rx', 'ry_ry', 'ry_rz', ...
|
||||||
|
'rz_x', 'rz_y', 'rz_z', 'rz_rx', 'rz_ry', 'rz_rz', ...
|
||||||
|
'hexa_x', 'hexa_y', 'hexa_z', 'hexa_rx', 'hexa_ry', 'hexa_rz'};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% The output of =G_ms= is the acceleration of each solid body.
|
||||||
|
% In order to obtain a displacement, we divide the obtained transfer function by $1/s^{2}$;
|
||||||
|
|
||||||
|
G_ms = G_ms/s^2;
|
||||||
|
|
||||||
|
% Compare with measurements
|
||||||
|
% We now load the Frequency Response Functions measurements during the Modal Analysis (accessible [[file:../../meas/modal-analysis/index.org][here]]).
|
||||||
|
|
||||||
|
|
||||||
|
load('../meas/modal-analysis/mat/frf_coh_matrices.mat', 'freqs');
|
||||||
|
load('../meas/modal-analysis/mat/frf_com.mat', 'FRFs_CoM');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% We then compare the measurements with the identified transfer functions using the Simscape Model.
|
||||||
|
|
||||||
|
|
||||||
|
dirs = {'x', 'y', 'z', 'rx', 'ry', 'rz'};
|
||||||
|
stages = {'gbot', 'gtop', 'ty', 'ry', 'rz', 'hexa'}
|
||||||
|
|
||||||
|
n_stg = 3;
|
||||||
|
n_dir = 6; % x, y, z, Rx, Ry, Rz
|
||||||
|
n_exc = 2; % x, y, z
|
||||||
|
|
||||||
|
f = logspace(0, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(FRFs_CoM(6*(n_stg-1) + n_dir, n_exc, :)))./((2*pi*freqs).^2)');
|
||||||
|
plot(f, abs(squeeze(freqresp(G_ms([stages{n_stg}, '_', dirs{n_dir}], ['F', dirs{n_exc}]), f, 'Hz'))));
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]');
|
||||||
|
hold off;
|
||||||
|
xlim([1, 200]);
|
||||||
|
|
||||||
|
dirs = {'x', 'y', 'z', 'rx', 'ry', 'rz'};
|
||||||
|
stages = {'gtop', 'ty', 'ry', 'rz', 'hexa'}
|
||||||
|
|
||||||
|
f = logspace(1, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
for n_stg = 1:2
|
||||||
|
for n_dir = 1:3
|
||||||
|
subplot(3, 2, (n_dir-1)*2 + n_stg);
|
||||||
|
title(['F ', dirs{n_dir}, ' to ', stages{n_stg}, ' ', dirs{n_dir}]);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(FRFs_CoM(6*(n_stg) + n_dir, n_dir, :)))./((2*pi*freqs).^2)');
|
||||||
|
plot(f, abs(squeeze(freqresp(G_ms([stages{n_stg}, '_', dirs{n_dir}], ['F', dirs{n_dir}]), f, 'Hz'))));
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]');
|
||||||
|
if n_dir == 3
|
||||||
|
xlabel('Frequency [Hz]');
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
xlim([10, 1000]);
|
||||||
|
ylim([1e-12, 1e-6]);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% #+NAME: fig:identification_comp_bot_stages
|
||||||
|
% #+CAPTION: caption ([[./figs/identification_comp_bot_stages.png][png]], [[./figs/identification_comp_bot_stages.pdf][pdf]])
|
||||||
|
% [[file:figs/identification_comp_bot_stages.png]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
dirs = {'x', 'y', 'z', 'rx', 'ry', 'rz'};
|
||||||
|
stages = {'ry', 'rz', 'hexa'}
|
||||||
|
|
||||||
|
f = logspace(1, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
for n_stg = 1:2
|
||||||
|
for n_dir = 1:3
|
||||||
|
subplot(3, 2, (n_dir-1)*2 + n_stg);
|
||||||
|
title(['F ', dirs{n_dir}, ' to ', stages{n_stg}, ' ', dirs{n_dir}]);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(FRFs_CoM(6*(n_stg+2) + n_dir, n_dir, :)))./((2*pi*freqs).^2)');
|
||||||
|
plot(f, abs(squeeze(freqresp(G_ms([stages{n_stg}, '_', dirs{n_dir}], ['F', dirs{n_dir}]), f, 'Hz'))));
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]');
|
||||||
|
if n_dir == 3
|
||||||
|
xlabel('Frequency [Hz]');
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
xlim([10, 1000]);
|
||||||
|
ylim([1e-12, 1e-6]);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% #+NAME: fig:identification_comp_mid_stages
|
||||||
|
% #+CAPTION: caption ([[./figs/identification_comp_mid_stages.png][png]], [[./figs/identification_comp_mid_stages.pdf][pdf]])
|
||||||
|
% [[file:figs/identification_comp_mid_stages.png]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
dirs = {'x', 'y', 'z', 'rx', 'ry', 'rz'};
|
||||||
|
stages = {'hexa'}
|
||||||
|
|
||||||
|
f = logspace(1, 3, 1000);
|
||||||
|
|
||||||
|
figure;
|
||||||
|
for n_stg = 1
|
||||||
|
for n_dir = 1:3
|
||||||
|
subplot(3, 1, (n_dir-1) + n_stg);
|
||||||
|
title(['F ', dirs{n_dir}, ' to ', stages{n_stg}, ' ', dirs{n_dir}]);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(FRFs_CoM(6*(n_stg+4) + n_dir, n_dir, :)))./((2*pi*freqs).^2)');
|
||||||
|
plot(f, abs(squeeze(freqresp(G_ms([stages{n_stg}, '_', dirs{n_dir}], ['F', dirs{n_dir}]), f, 'Hz'))));
|
||||||
|
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
|
||||||
|
ylabel('Amplitude [m/N]');
|
||||||
|
if n_dir == 3
|
||||||
|
xlabel('Frequency [Hz]');
|
||||||
|
end
|
||||||
|
hold off;
|
||||||
|
xlim([10, 1000]);
|
||||||
|
ylim([1e-12, 1e-6]);
|
||||||
|
end
|
||||||
|
end
|
27
org/src/prepareLinearizeIdentification.m
Normal file
27
org/src/prepareLinearizeIdentification.m
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
function [] = prepareLinearizeIdentification(args)
|
||||||
|
|
||||||
|
arguments
|
||||||
|
args.nass_actuator char {mustBeMember(args.nass_actuator,{'piezo', 'lorentz'})} = 'piezo'
|
||||||
|
args.sample_mass (1,1) double {mustBeNumeric, mustBePositive} = 50 % [kg]
|
||||||
|
end
|
||||||
|
|
||||||
|
initializeGround();
|
||||||
|
initializeGranite();
|
||||||
|
initializeTy();
|
||||||
|
initializeRy();
|
||||||
|
initializeRz();
|
||||||
|
initializeMicroHexapod();
|
||||||
|
initializeAxisc();
|
||||||
|
initializeMirror();
|
||||||
|
|
||||||
|
initializeNanoHexapod('actuator', args.nass_actuator);
|
||||||
|
initializeSample('mass', args.sample_mass);
|
||||||
|
|
||||||
|
initializeReferences();
|
||||||
|
initializeDisturbances('enable', false);
|
||||||
|
|
||||||
|
initializeController('type', 'open-loop');
|
||||||
|
|
||||||
|
initializeSimscapeConfiguration('gravity', true);
|
||||||
|
|
||||||
|
initializeLoggingConfiguration('log', 'none');
|
29
org/src/prepareTomographyExperiment.m
Normal file
29
org/src/prepareTomographyExperiment.m
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
function [] = prepareTomographyExperiment(args)
|
||||||
|
|
||||||
|
arguments
|
||||||
|
args.nass_actuator char {mustBeMember(args.nass_actuator,{'piezo', 'lorentz'})} = 'piezo'
|
||||||
|
args.sample_mass (1,1) double {mustBeNumeric, mustBePositive} = 50 % [kg]
|
||||||
|
args.Rz_period (1,1) double {mustBeNumeric, mustBePositive} = 1 % [s]
|
||||||
|
end
|
||||||
|
|
||||||
|
initializeGround();
|
||||||
|
initializeGranite();
|
||||||
|
initializeTy();
|
||||||
|
initializeRy();
|
||||||
|
initializeRz();
|
||||||
|
initializeMicroHexapod();
|
||||||
|
initializeAxisc();
|
||||||
|
initializeMirror();
|
||||||
|
|
||||||
|
initializeNanoHexapod('actuator', args.nass_actuator);
|
||||||
|
initializeSample('mass', args.sample_mass);
|
||||||
|
|
||||||
|
initializeReferences('Rz_type', 'rotating', 'Rz_period', args.Rz_period);
|
||||||
|
|
||||||
|
initializeDisturbances();
|
||||||
|
|
||||||
|
initializeController('type', 'open-loop');
|
||||||
|
|
||||||
|
initializeSimscapeConfiguration('gravity', true);
|
||||||
|
|
||||||
|
initializeLoggingConfiguration('log', 'all');
|
@ -25,7 +25,7 @@
|
|||||||
#+PROPERTY: header-args:matlab+ :exports both
|
#+PROPERTY: header-args:matlab+ :exports both
|
||||||
#+PROPERTY: header-args:matlab+ :eval no-export
|
#+PROPERTY: header-args:matlab+ :eval no-export
|
||||||
#+PROPERTY: header-args:matlab+ :output-dir figs
|
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||||
#+PROPERTY: header-args:matlab+ :tangle matlab/modal_frf_coh.m
|
#+PROPERTY: header-args:matlab+ :tangle no
|
||||||
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
#+PROPERTY: header-args:matlab+ :mkdirp yes
|
||||||
|
|
||||||
#+PROPERTY: header-args:shell :eval no-export
|
#+PROPERTY: header-args:shell :eval no-export
|
||||||
|
Loading…
Reference in New Issue
Block a user