Add metrology element (change of base, computation of error)
Lot's of new things: - try to use less .mat files - computation of setpoint and error in the cartesian frame fixed to the granite - change of base to have the errors w.r.t. the NASS base - add script to plot setpoint, position and error
This commit is contained in:
parent
baedb9b571
commit
7575aee987
@ -5,7 +5,7 @@ clear; close all; clc;
|
|||||||
load('./mat/G_xg_to_d.mat', 'G_xg_to_d');
|
load('./mat/G_xg_to_d.mat', 'G_xg_to_d');
|
||||||
|
|
||||||
%% Load shape of the perturbation
|
%% Load shape of the perturbation
|
||||||
load('./mat/weight_Wxg.mat', 'Wxg');
|
load('./mat/perturbations.mat', 'Wxg');
|
||||||
|
|
||||||
%% Effect of the perturbation on the output
|
%% Effect of the perturbation on the output
|
||||||
freqs = logspace(-1, 3, 1000);
|
freqs = logspace(-1, 3, 1000);
|
||||||
|
@ -5,7 +5,7 @@ clear; close all; clc;
|
|||||||
load('./mat/Gd_ol_cl.mat', 'Gd_ol_20', 'Gd_cl_20');
|
load('./mat/Gd_ol_cl.mat', 'Gd_ol_20', 'Gd_cl_20');
|
||||||
|
|
||||||
%%
|
%%
|
||||||
load('./mat/weight_Wxg.mat', 'Wxg')
|
load('./mat/perturbations.mat', 'Wxg')
|
||||||
|
|
||||||
%%
|
%%
|
||||||
load('./mat/G_gm_to_dh.mat', 'G_gm_to_dh')
|
load('./mat/G_gm_to_dh.mat', 'G_gm_to_dh')
|
||||||
@ -44,5 +44,3 @@ set(gca, 'XScale', 'log');
|
|||||||
% set(gca, 'YScale', 'log');
|
% set(gca, 'YScale', 'log');
|
||||||
xlabel('Frequency [Hz]'); ylabel('CAS [m]');
|
xlabel('Frequency [Hz]'); ylabel('CAS [m]');
|
||||||
hold off;
|
hold off;
|
||||||
|
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ exportFig('gm_control_psd_y', 'normal-normal')
|
|||||||
|
|
||||||
%% Compare OL and CL - PSD
|
%% Compare OL and CL - PSD
|
||||||
load('./mat/G_xg_to_d.mat', 'G_xg_to_d');
|
load('./mat/G_xg_to_d.mat', 'G_xg_to_d');
|
||||||
load('./mat/weight_Wxg.mat', 'Wxg');
|
load('./mat/perturbations.mat', 'Wxg');
|
||||||
load('./mat/T_S.mat', 'S', 'T');
|
load('./mat/T_S.mat', 'S', 'T');
|
||||||
|
|
||||||
freqs = logspace(-1, 3, 1000);
|
freqs = logspace(-1, 3, 1000);
|
||||||
|
BIN
Assemblage.slx
BIN
Assemblage.slx
Binary file not shown.
@ -9,12 +9,12 @@ initializeSample(struct('mass', 1));
|
|||||||
|
|
||||||
initializeNanoHexapod(struct('actuator', 'lorentz'));
|
initializeNanoHexapod(struct('actuator', 'lorentz'));
|
||||||
K_iff = K_iff_light_vc; %#ok
|
K_iff = K_iff_light_vc; %#ok
|
||||||
save('./mat/K_iff.mat', 'K_iff');
|
save('./mat/controllers.mat', 'K_iff');
|
||||||
G_iff_light_vc = identifyPlant();
|
G_iff_light_vc = identifyPlant();
|
||||||
|
|
||||||
initializeNanoHexapod(struct('actuator', 'piezo'));
|
initializeNanoHexapod(struct('actuator', 'piezo'));
|
||||||
K_iff = K_iff_light_pz; %#ok
|
K_iff = K_iff_light_pz; %#ok
|
||||||
save('./mat/K_iff.mat', 'K_iff');
|
save('./mat/controllers.mat', 'K_iff');
|
||||||
G_iff_light_pz = identifyPlant();
|
G_iff_light_pz = identifyPlant();
|
||||||
|
|
||||||
%% Heavy Sample
|
%% Heavy Sample
|
||||||
@ -22,12 +22,12 @@ initializeSample(struct('mass', 50));
|
|||||||
|
|
||||||
initializeNanoHexapod(struct('actuator', 'lorentz'));
|
initializeNanoHexapod(struct('actuator', 'lorentz'));
|
||||||
K_iff = K_iff_heavy_vc; %#ok
|
K_iff = K_iff_heavy_vc; %#ok
|
||||||
save('./mat/K_iff.mat', 'K_iff');
|
save('./mat/controllers.mat', 'K_iff');
|
||||||
G_iff_heavy_vc = identifyPlant();
|
G_iff_heavy_vc = identifyPlant();
|
||||||
|
|
||||||
initializeNanoHexapod(struct('actuator', 'piezo'));
|
initializeNanoHexapod(struct('actuator', 'piezo'));
|
||||||
K_iff = K_iff_heavy_pz;
|
K_iff = K_iff_heavy_pz;
|
||||||
save('./mat/K_iff.mat', 'K_iff');
|
save('./mat/controllers.mat', 'K_iff', '-append');
|
||||||
G_iff_heavy_pz = identifyPlant();
|
G_iff_heavy_pz = identifyPlant();
|
||||||
|
|
||||||
%% Save the obtained transfer functions
|
%% Save the obtained transfer functions
|
||||||
|
Binary file not shown.
50
demonstration/error_NASS.m
Normal file
50
demonstration/error_NASS.m
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
%% Plot all 6 errors expressed in the NASS base
|
||||||
|
figure;
|
||||||
|
|
||||||
|
%% Tx
|
||||||
|
subaxis(2, 3, 1);
|
||||||
|
hold on;
|
||||||
|
plot(error_nass.Time, error_nass.Data(:, 1), 'k-', 'DisplayName', '$\epsilon_x$');
|
||||||
|
legend();
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Position (m)');
|
||||||
|
|
||||||
|
%% Ty
|
||||||
|
subaxis(2, 3, 2);
|
||||||
|
hold on;
|
||||||
|
plot(error_nass.Time, error_nass.Data(:, 2), 'k-', 'DisplayName', '$\epsilon_y$');
|
||||||
|
legend();
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Position (m)');
|
||||||
|
|
||||||
|
%% Tz
|
||||||
|
subaxis(2, 3, 3);
|
||||||
|
hold on;
|
||||||
|
plot(error_nass.Time, error_nass.Data(:, 3), 'k-', 'DisplayName', '$\epsilon_z$');
|
||||||
|
legend();
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Position (m)');
|
||||||
|
|
||||||
|
%% Rx
|
||||||
|
subaxis(2, 3, 4);
|
||||||
|
hold on;
|
||||||
|
plot(error_nass.Time, error_nass.Data(:, 4), 'k-', 'DisplayName', '$\epsilon_{\theta_x}$');
|
||||||
|
legend();
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Rotation (rad)');
|
||||||
|
|
||||||
|
%% Ry
|
||||||
|
subaxis(2, 3, 5);
|
||||||
|
hold on;
|
||||||
|
plot(error_nass.Time, error_nass.Data(:, 5), 'k-', 'DisplayName', '$\epsilon_{\theta_y}$');
|
||||||
|
legend();
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Rotation (rad)');
|
||||||
|
|
||||||
|
%% Rz
|
||||||
|
subaxis(2, 3, 6);
|
||||||
|
hold on;
|
||||||
|
plot(error_nass.Time, error_nass.Data(:, 6), 'k-', 'DisplayName', '$\epsilon_{\theta_z}$');
|
||||||
|
legend();
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Rotation (rad)');
|
@ -3,7 +3,7 @@ clear; close all; clc;
|
|||||||
|
|
||||||
%% Initialize simulation configuration
|
%% Initialize simulation configuration
|
||||||
opts_sim = struct(...
|
opts_sim = struct(...
|
||||||
'Tsim', 2 ...
|
'Tsim', 1 ...
|
||||||
);
|
);
|
||||||
|
|
||||||
initializeSimConf(opts_sim);
|
initializeSimConf(opts_sim);
|
||||||
@ -14,19 +14,22 @@ load('./mat/sim_conf.mat', 'sim_conf')
|
|||||||
time_vector = 0:sim_conf.Ts:sim_conf.Tsim;
|
time_vector = 0:sim_conf.Ts:sim_conf.Tsim;
|
||||||
|
|
||||||
% Translation Stage
|
% Translation Stage
|
||||||
ty = 0*ones(length(time_vector), 1);
|
ty = 0.05*ones(length(time_vector), 1);
|
||||||
|
|
||||||
% Tilt Stage
|
% Tilt Stage
|
||||||
ry = 2*pi*(3/360)*ones(length(time_vector), 1);
|
ry = 2*pi*(3/360)*ones(length(time_vector), 1);
|
||||||
|
% ry = 2*pi*(3/360)*sin(2*pi*time_vector);
|
||||||
|
|
||||||
% Spindle
|
% Spindle
|
||||||
rz = 2*pi*1*(time_vector);
|
rz = 2*pi*1*(time_vector);
|
||||||
|
% rz = 2*pi*(190/360)*ones(length(time_vector), 1);
|
||||||
|
|
||||||
% Micro Hexapod
|
% Micro Hexapod
|
||||||
u_hexa = zeros(length(time_vector), 6);
|
u_hexa = zeros(length(time_vector), 6);
|
||||||
|
|
||||||
% Gravity Compensator system
|
% Gravity Compensator system
|
||||||
mass = zeros(length(time_vector), 2);
|
mass = zeros(length(time_vector), 2);
|
||||||
|
mass(:, 2) = pi;
|
||||||
|
|
||||||
opts_inputs = struct(...
|
opts_inputs = struct(...
|
||||||
'ty', ty, ...
|
'ty', ty, ...
|
||||||
|
56
demonstration/setpoint_vs_position.m
Normal file
56
demonstration/setpoint_vs_position.m
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
%%
|
||||||
|
figure;
|
||||||
|
|
||||||
|
%% Tx
|
||||||
|
subaxis(2, 3, 1);
|
||||||
|
hold on;
|
||||||
|
plot(pos.Time, pos.Data(:, 1), 'k-');
|
||||||
|
plot(setpoint.Time, setpoint.Data(:, 1), 'k--');
|
||||||
|
legend({'x - pos', 'x - setpoint'});
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Position (m)');
|
||||||
|
|
||||||
|
%% Ty
|
||||||
|
subaxis(2, 3, 2);
|
||||||
|
hold on;
|
||||||
|
plot(pos.Time, pos.Data(:, 2), 'k-');
|
||||||
|
plot(setpoint.Time, setpoint.Data(:, 2), 'k--');
|
||||||
|
legend({'y - pos', 'y - setpoint'});
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Position (m)');
|
||||||
|
|
||||||
|
%% Tz
|
||||||
|
subaxis(2, 3, 3);
|
||||||
|
hold on;
|
||||||
|
plot(pos.Time, pos.Data(:, 3), 'k-');
|
||||||
|
plot(setpoint.Time, setpoint.Data(:, 3), 'k--');
|
||||||
|
legend({'z - pos', 'z - setpoint'});
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Position (m)');
|
||||||
|
|
||||||
|
%% Rx
|
||||||
|
subaxis(2, 3, 4);
|
||||||
|
hold on;
|
||||||
|
plot(pos.Time, pos.Data(:, 4), 'k-');
|
||||||
|
plot(setpoint.Time, setpoint.Data(:, 4), 'k--');
|
||||||
|
legend({'$\theta_x$ - pos', '$\theta_x$ - setpoint'});
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Rotation (rad)');
|
||||||
|
|
||||||
|
%% Ry
|
||||||
|
subaxis(2, 3, 5);
|
||||||
|
hold on;
|
||||||
|
plot(pos.Time, pos.Data(:, 5), 'k-');
|
||||||
|
plot(setpoint.Time, setpoint.Data(:, 5), 'k--');
|
||||||
|
legend({'$\theta_y$ - pos', '$\theta_y$ - setpoint'});
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Rotation (rad)');
|
||||||
|
|
||||||
|
%% Rz
|
||||||
|
subaxis(2, 3, 6);
|
||||||
|
hold on;
|
||||||
|
plot(pos.Time, pos.Data(:, 6), 'k-');
|
||||||
|
plot(setpoint.Time, setpoint.Data(:, 6), 'k--');
|
||||||
|
legend({'$\theta_z$ - pos', '$\theta_z$ - setpoint'});
|
||||||
|
hold off;
|
||||||
|
xlabel('Time (s)'); ylabel('Rotation (rad)');
|
55
identification/id_flexible_rigid.m
Normal file
55
identification/id_flexible_rigid.m
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
%% Script Description
|
||||||
|
% Determine if we take into account the flexibilities,
|
||||||
|
% does that changes a lot
|
||||||
|
|
||||||
|
%%
|
||||||
|
clear; close all; clc;
|
||||||
|
|
||||||
|
%% Initialize all the stage by default
|
||||||
|
run init_data.m
|
||||||
|
|
||||||
|
%% Options for Linearized
|
||||||
|
options = linearizeOptions;
|
||||||
|
options.SampleTime = 0;
|
||||||
|
|
||||||
|
%% Name of the Simulink File
|
||||||
|
mdl = 'simscape_id_micro_station';
|
||||||
|
|
||||||
|
%% 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
|
||||||
|
initializeTy();
|
||||||
|
|
||||||
|
G_ms_flexible = linearize(mdl, io, 0);
|
||||||
|
|
||||||
|
% Input/Output names
|
||||||
|
G_ms_flexible.InputName = {'Fmx', 'Fmy', 'Fmz',...
|
||||||
|
'Fgx', 'Fgy', 'Fgz'};
|
||||||
|
G_ms_flexible.OutputName = {'Dmx', 'Dmy', 'Dmz', ...
|
||||||
|
'Tyx', 'Tyy', 'Tyz', ...
|
||||||
|
'Ryx', 'Ryy', 'Ryz', ...
|
||||||
|
'Dgx', 'Dgy', 'Dgz'};
|
||||||
|
|
||||||
|
%% Run the linearization
|
||||||
|
initializeTy(struct('rigid', true));
|
||||||
|
|
||||||
|
G_ms_ty_rigid = linearize(mdl, io, 0);
|
||||||
|
|
||||||
|
% Input/Output names
|
||||||
|
G_ms_ty_rigid.InputName = {'Fmx', 'Fmy', 'Fmz',...
|
||||||
|
'Fgx', 'Fgy', 'Fgz'};
|
||||||
|
G_ms_ty_rigid.OutputName = {'Dmx', 'Dmy', 'Dmz', ...
|
||||||
|
'Tyx', 'Tyy', 'Tyz', ...
|
||||||
|
'Ryx', 'Ryy', 'Ryz', ...
|
||||||
|
'Dgx', 'Dgy', 'Dgz'};
|
||||||
|
|
||||||
|
%% Save the obtained transfer functions
|
||||||
|
save('./mat/id_micro_station_flexibility.mat', 'G_ms_flexible', 'G_ms_ty_rigid');
|
99
identification/id_flexible_rigid_plots.m
Normal file
99
identification/id_flexible_rigid_plots.m
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
%% Script Description
|
||||||
|
% Determine if we take into account the flexibilities,
|
||||||
|
% does that changes a lot
|
||||||
|
|
||||||
|
%%
|
||||||
|
clear; close all; clc;
|
||||||
|
|
||||||
|
%% Load Configuration file
|
||||||
|
load('./mat/config.mat', 'save_fig', 'freqs');
|
||||||
|
|
||||||
|
%% Load the obtained transfer functions
|
||||||
|
load('./mat/id_micro_station_flexibility.mat', 'G_ms_flexible', 'G_ms_ty_rigid');
|
||||||
|
|
||||||
|
%% Get Measurement Object
|
||||||
|
load('2018_01_12.mat', 'm_object');
|
||||||
|
|
||||||
|
% Get Measurements Data
|
||||||
|
opts = struct('freq_min', 10, 'est_backend', 'idfrd');
|
||||||
|
meas_sys = getDynamicTFs(m_object, 'marble', 'hexa', {{'tx', 'tx'},{'ty', 'ty'},{'tz', 'tz'}}, opts);
|
||||||
|
|
||||||
|
%%
|
||||||
|
dir = 'y';
|
||||||
|
|
||||||
|
figure;
|
||||||
|
% Amplitude
|
||||||
|
ax1 = subaxis(2,1,1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_ms_flexible(['Dg' dir], ['Fg' dir]), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_ms_ty_rigid(['Dg' dir], ['Fg' dir]), freqs, 'Hz'))), '--');
|
||||||
|
set(gca,'xscale','log'); set(gca,'yscale','log');
|
||||||
|
ylabel('Amplitude [m/N]');
|
||||||
|
set(gca, 'XTickLabel',[]);
|
||||||
|
legend({'Flexible', 'Ty - Rigid'});
|
||||||
|
hold off;
|
||||||
|
% Phase
|
||||||
|
ax2 = subaxis(2,1,2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms_flexible(['Dg' dir], ['Fg' dir]), freqs, 'Hz'))));
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms_ty_rigid(['Dg' dir], ['Fg' dir]), freqs, 'Hz'))), '--');
|
||||||
|
set(gca,'xscale','log');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
|
hold off;
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
|
%%
|
||||||
|
dir = 'y';
|
||||||
|
|
||||||
|
figure;
|
||||||
|
% Amplitude
|
||||||
|
ax1 = subaxis(2,1,1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_ms_flexible(['Dm' dir], ['Fm' dir]), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_ms_ty_rigid(['Dm' dir], ['Fm' dir]), freqs, 'Hz'))), '--');
|
||||||
|
set(gca,'xscale','log'); set(gca,'yscale','log');
|
||||||
|
ylabel('Amplitude [m/N]');
|
||||||
|
set(gca, 'XTickLabel',[]);
|
||||||
|
legend({'Flexible', 'Ty - Rigid'});
|
||||||
|
hold off;
|
||||||
|
% Phase
|
||||||
|
ax2 = subaxis(2,1,2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms_flexible(['Dm' dir], ['Fm' dir]), freqs, 'Hz'))));
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms_ty_rigid(['Dm' dir], ['Fm' dir]), freqs, 'Hz'))), '--');
|
||||||
|
set(gca,'xscale','log');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
|
hold off;
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
|
%%
|
||||||
|
dir = 'z';
|
||||||
|
|
||||||
|
figure;
|
||||||
|
% Amplitude
|
||||||
|
ax1 = subaxis(2,1,1);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_ms_flexible(['Dg' dir], ['Fm' dir]), freqs, 'Hz'))));
|
||||||
|
plot(freqs, abs(squeeze(freqresp(G_ms_ty_rigid(['Dg' dir], ['Fm' dir]), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, abs(squeeze(freqresp(meas_sys(['Dm' dir], ['Fh' dir]), freqs, 'Hz'))), '.');
|
||||||
|
set(gca,'xscale','log'); set(gca,'yscale','log');
|
||||||
|
ylabel('Amplitude [m/N]');
|
||||||
|
set(gca, 'XTickLabel',[]);
|
||||||
|
legend({'Flexible', 'Ty - Rigid'});
|
||||||
|
hold off;
|
||||||
|
% Phase
|
||||||
|
ax2 = subaxis(2,1,2);
|
||||||
|
hold on;
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms_flexible(['Dg' dir], ['Fm' dir]), freqs, 'Hz'))));
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms_ty_rigid(['Dg' dir], ['Fm' dir]), freqs, 'Hz'))), '--');
|
||||||
|
plot(freqs, 180/pi*angle(squeeze(freqresp(meas_sys(['Dm' dir], ['Fh' dir]), freqs, 'Hz'))), '.');
|
||||||
|
set(gca,'xscale','log');
|
||||||
|
ylim([-180, 180]);
|
||||||
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
|
hold off;
|
||||||
|
linkaxes([ax1,ax2],'x');
|
@ -16,85 +16,90 @@ load('2018_01_12.mat', 'm_object');
|
|||||||
|
|
||||||
%% Get Measurements Data
|
%% Get Measurements Data
|
||||||
opts = struct('freq_min', 10, 'est_backend', 'idfrd');
|
opts = struct('freq_min', 10, 'est_backend', 'idfrd');
|
||||||
meas_sys = getDynamicTFs(m_object, 'marble', 'hexa', {'tx', 'tx'}, opts);
|
meas_sys = getDynamicTFs(m_object, 'marble', 'hexa', {{'tx', 'tx'},{'ty', 'ty'},{'tz', 'tz'}}, opts);
|
||||||
|
|
||||||
%% Granite to Granite
|
%% Granite to Granite
|
||||||
figure;
|
for dir = 'xyz'
|
||||||
% Amplitude
|
figure;
|
||||||
ax1 = subaxis(2,1,1);
|
% Amplitude
|
||||||
hold on;
|
ax1 = subaxis(2,1,1);
|
||||||
plot(freqs, abs(squeeze(freqresp(G_ms('Dgx', 'Fgx'), freqs, 'Hz'))));
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(meas_sys('Dmx', 'Fmx'), freqs, 'Hz'))), '.');
|
plot(freqs, abs(squeeze(freqresp(G_ms(['Dg' dir], ['Fg' dir]), freqs, 'Hz'))));
|
||||||
set(gca,'xscale','log'); set(gca,'yscale','log');
|
plot(freqs, abs(squeeze(freqresp(meas_sys(['Dm' dir], ['Fm' dir]), freqs, 'Hz'))), '.');
|
||||||
ylabel('Amplitude [m/N]');
|
set(gca,'xscale','log'); set(gca,'yscale','log');
|
||||||
set(gca, 'XTickLabel',[]);
|
ylabel('Amplitude [m/N]');
|
||||||
legend({'Model', 'Meas.'});
|
set(gca, 'XTickLabel',[]);
|
||||||
hold off;
|
legend({'Model', 'Meas.'});
|
||||||
% Phase
|
hold off;
|
||||||
ax2 = subaxis(2,1,2);
|
% Phase
|
||||||
hold on;
|
ax2 = subaxis(2,1,2);
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms('Dgz', 'Fgz'), freqs, 'Hz'))));
|
hold on;
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(meas_sys('Dmx', 'Fmx'), freqs, 'Hz'))), '.');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms(['Dg' dir], ['Fg' dir]), freqs, 'Hz'))));
|
||||||
set(gca,'xscale','log');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(meas_sys(['Dm' dir], ['Fm' dir]), freqs, 'Hz'))), '.');
|
||||||
ylim([-180, 180]);
|
set(gca,'xscale','log');
|
||||||
yticks([-180, -90, 0, 90, 180]);
|
ylim([-180, 180]);
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
hold off;
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
|
hold off;
|
||||||
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
if save_fig; exportFig(['comp_meas_g_g_' dir], 'normal-normal', struct('path', 'identification')); end
|
||||||
|
end
|
||||||
if save_fig; exportFig('comp_meas_g_g', 'normal-normal', struct('path', 'identification')); end
|
|
||||||
|
|
||||||
%% Hexapod to Hexapod
|
%% Hexapod to Hexapod
|
||||||
figure;
|
for dir = 'xyz'
|
||||||
% Amplitude
|
figure;
|
||||||
ax1 = subaxis(2,1,1);
|
% Amplitude
|
||||||
hold on;
|
ax1 = subaxis(2,1,1);
|
||||||
plot(freqs, abs(squeeze(freqresp(G_ms('Dmx', 'Fmx'), freqs, 'Hz'))));
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(meas_sys('Dhx', 'Fhx'), freqs, 'Hz'))), '.');
|
plot(freqs, abs(squeeze(freqresp(G_ms(['Dm' dir], ['Fm' dir]), freqs, 'Hz'))));
|
||||||
set(gca,'xscale','log'); set(gca,'yscale','log');
|
plot(freqs, abs(squeeze(freqresp(meas_sys(['Dh' dir], ['Fh' dir]), freqs, 'Hz'))), '.');
|
||||||
ylabel('Amplitude [m/N]');
|
set(gca,'xscale','log'); set(gca,'yscale','log');
|
||||||
set(gca, 'XTickLabel',[]);
|
ylabel('Amplitude [m/N]');
|
||||||
legend({'Model', 'Meas.'});
|
set(gca, 'XTickLabel',[]);
|
||||||
hold off;
|
legend({'Model', 'Meas.'});
|
||||||
% Phase
|
hold off;
|
||||||
ax2 = subaxis(2,1,2);
|
% Phase
|
||||||
hold on;
|
ax2 = subaxis(2,1,2);
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms('Dmx', 'Fmx'), freqs, 'Hz'))));
|
hold on;
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(meas_sys('Dhx', 'Fhx'), freqs, 'Hz'))), '.');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms(['Dm' dir], ['Fm' dir]), freqs, 'Hz'))));
|
||||||
set(gca,'xscale','log');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(meas_sys(['Dh' dir], ['Fh' dir]), freqs, 'Hz'))), '.');
|
||||||
ylim([-180, 180]);
|
set(gca,'xscale','log');
|
||||||
yticks([-180, -90, 0, 90, 180]);
|
ylim([-180, 180]);
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
hold off;
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
|
hold off;
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
if save_fig; exportFig('comp_meas_m_m', 'normal-normal', struct('path', 'identification')); end
|
if save_fig; exportFig(['comp_meas_m_m_' dir], 'normal-normal', struct('path', 'identification')); end
|
||||||
|
end
|
||||||
|
|
||||||
%% Hexapod to Granite
|
%% Hexapod to Granite
|
||||||
figure;
|
for dir = 'xyz'
|
||||||
% Amplitude
|
figure;
|
||||||
ax1 = subaxis(2,1,1);
|
% Amplitude
|
||||||
hold on;
|
ax1 = subaxis(2,1,1);
|
||||||
plot(freqs, abs(squeeze(freqresp(G_ms('Dmx', 'Fgx'), freqs, 'Hz'))));
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(meas_sys('Dhx', 'Fmx'), freqs, 'Hz'))), '.');
|
plot(freqs, abs(squeeze(freqresp(G_ms(['Dm' dir], ['Fg' dir]), freqs, 'Hz'))));
|
||||||
set(gca,'xscale','log'); set(gca,'yscale','log');
|
plot(freqs, abs(squeeze(freqresp(meas_sys(['Dh' dir], ['Fm' dir]), freqs, 'Hz'))), '.');
|
||||||
ylabel('Amplitude [m/N]');
|
set(gca,'xscale','log'); set(gca,'yscale','log');
|
||||||
set(gca, 'XTickLabel',[]);
|
ylabel('Amplitude [m/N]');
|
||||||
legend({'Model', 'Meas.'});
|
set(gca, 'XTickLabel',[]);
|
||||||
hold off;
|
legend({'Model', 'Meas.'});
|
||||||
% Phase
|
hold off;
|
||||||
ax2 = subaxis(2,1,2);
|
% Phase
|
||||||
hold on;
|
ax2 = subaxis(2,1,2);
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms('Dmx', 'Fgx'), freqs, 'Hz'))));
|
hold on;
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(meas_sys('Dhx', 'Fmx'), freqs, 'Hz'))), '.');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms(['Dm' dir], ['Fg' dir]), freqs, 'Hz'))));
|
||||||
set(gca,'xscale','log');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(meas_sys(['Dh' dir], ['Fm' dir]), freqs, 'Hz'))), '.');
|
||||||
ylim([-180, 180]);
|
set(gca,'xscale','log');
|
||||||
yticks([-180, -90, 0, 90, 180]);
|
ylim([-180, 180]);
|
||||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
yticks([-180, -90, 0, 90, 180]);
|
||||||
hold off;
|
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||||
|
hold off;
|
||||||
|
|
||||||
linkaxes([ax1,ax2],'x');
|
linkaxes([ax1,ax2],'x');
|
||||||
|
|
||||||
if save_fig; exportFig('comp_meas_m_g', 'normal-normal', struct('path', 'identification')); end
|
if save_fig; exportFig(['comp_meas_m_g_' dir], 'normal-normal', struct('path', 'identification')); end
|
||||||
|
end
|
||||||
|
@ -3,7 +3,7 @@ clear; close all; clc;
|
|||||||
|
|
||||||
%%
|
%%
|
||||||
K_iff = tf(zeros(6));
|
K_iff = tf(zeros(6));
|
||||||
save('./mat/K_iff.mat', 'K_iff');
|
save('./mat/controllers.mat', 'K_iff', '-append');
|
||||||
|
|
||||||
%% Light Sample
|
%% Light Sample
|
||||||
initializeSample(struct('mass', 1));
|
initializeSample(struct('mass', 1));
|
||||||
|
Binary file not shown.
@ -52,6 +52,7 @@ initializeSample(struct('mass', 20));
|
|||||||
|
|
||||||
%% Controllers
|
%% Controllers
|
||||||
K = tf(zeros(6));
|
K = tf(zeros(6));
|
||||||
save('./mat/controller.mat', 'K');
|
|
||||||
K_iff = tf(zeros(6));
|
K_iff = tf(zeros(6));
|
||||||
save('./mat/K_iff.mat', 'K_iff');
|
|
||||||
|
save('./mat/controllers.mat', 'K', 'K_iff');
|
||||||
|
@ -9,9 +9,8 @@ Wxg = 1e-5*(s/(2e2)^(1/3) + 2*pi*0.1)^3/(s + 2*pi*0.1)^3;
|
|||||||
Wxg = Wxg*(s/(0.5e6)^(1/3) + 2*pi*10)^3/(s + 2*pi*10)^3;
|
Wxg = Wxg*(s/(0.5e6)^(1/3) + 2*pi*10)^3/(s + 2*pi*10)^3;
|
||||||
Wxg = Wxg/(1+s/(2*pi*2000));
|
Wxg = Wxg/(1+s/(2*pi*2000));
|
||||||
|
|
||||||
save('./mat/weight_Wxg.mat', 'Wxg');
|
|
||||||
|
|
||||||
%% Sensor Noise
|
%% Sensor Noise
|
||||||
Wn = tf(1e-12);
|
Wn = tf(1e-12);
|
||||||
|
|
||||||
save('./mat/weight_Wn.mat', 'Wn');
|
%% Save Weights
|
||||||
|
save('./mat/perturbations.mat', 'Wxg', 'Wn');
|
@ -1,17 +1,17 @@
|
|||||||
%% Script that is run just before
|
%% Script that is run just before
|
||||||
% the simulation is started
|
% the simulation is started
|
||||||
% Load all the data used for the simulation
|
|
||||||
load('./mat/sim_conf.mat', 'sim_conf');
|
%% Load all the data used for the simulation
|
||||||
|
load('./mat/sim_conf.mat');
|
||||||
|
|
||||||
%% Load SolidWorks Data
|
%% Load SolidWorks Data
|
||||||
load('./mat/solids.mat', 'solids');
|
load('./mat/solids.mat');
|
||||||
|
|
||||||
%% Load data of each stage
|
%% Load data of each stage
|
||||||
load('./mat/stages.mat', 'ground', 'granite', 'ty', 'ry', 'rz', 'micro_hexapod', 'axisc', 'nano_hexapod', 'mirror', 'sample');
|
load('./mat/stages.mat');
|
||||||
|
|
||||||
%% Load Signals Applied to the system
|
%% Load Signals Applied to the system
|
||||||
load('./mat/inputs.mat', 'inputs');
|
load('./mat/inputs.mat');
|
||||||
|
|
||||||
%% Load Controller
|
%% Load Controller
|
||||||
load('./mat/controller.mat', 'K');
|
load('./mat/controllers.mat');
|
||||||
load('./mat/K_iff.mat', 'K_iff');
|
|
||||||
|
@ -28,7 +28,7 @@ function [inputs] = initializeInputs(opts_param)
|
|||||||
|
|
||||||
%% Ground motion
|
%% Ground motion
|
||||||
if islogical(opts.Dw) && opts.Dw == true
|
if islogical(opts.Dw) && opts.Dw == true
|
||||||
load('./mat/weight_Wxg.mat', 'Wxg');
|
load('./mat/perturbations.mat', 'Wxg');
|
||||||
Dw = 1/sqrt(2)*100*random('norm', 0, 1, length(time_vector), 3);
|
Dw = 1/sqrt(2)*100*random('norm', 0, 1, length(time_vector), 3);
|
||||||
Dw(:, 1) = lsim(Wxg, Dw(:, 1), time_vector);
|
Dw(:, 1) = lsim(Wxg, Dw(:, 1), time_vector);
|
||||||
Dw(:, 2) = lsim(Wxg, Dw(:, 2), time_vector);
|
Dw(:, 2) = lsim(Wxg, Dw(:, 2), time_vector);
|
||||||
@ -64,17 +64,17 @@ function [inputs] = initializeInputs(opts_param)
|
|||||||
inputs.ry = timeseries(ry, time_vector);
|
inputs.ry = timeseries(ry, time_vector);
|
||||||
|
|
||||||
%% Spindle [rad]
|
%% Spindle [rad]
|
||||||
if islogical(opts.Rz) && opts.Rz == true
|
if islogical(opts.rz) && opts.rz == true
|
||||||
Rz = 2*pi*0.5*time_vector;
|
rz = 2*pi*0.5*time_vector;
|
||||||
elseif islogical(opts.Rz) && opts.Rz == false
|
elseif islogical(opts.rz) && opts.rz == false
|
||||||
Rz = zeros(length(time_vector), 1);
|
rz = zeros(length(time_vector), 1);
|
||||||
elseif isnumeric(opts.Rz) && length(opts.Rz) == 1
|
elseif isnumeric(opts.rz) && length(opts.rz) == 1
|
||||||
Rz = 2*pi*(opts.Rz/60)*time_vector;
|
rz = 2*pi*(opts.rz/60)*time_vector;
|
||||||
else
|
else
|
||||||
Rz = opts.Rz;
|
rz = opts.rz;
|
||||||
end
|
end
|
||||||
|
|
||||||
inputs.Rz = timeseries(Rz, time_vector);
|
inputs.rz = timeseries(rz, time_vector);
|
||||||
|
|
||||||
%% Micro Hexapod
|
%% Micro Hexapod
|
||||||
if islogical(opts.u_hexa) && opts.setpoint == true
|
if islogical(opts.u_hexa) && opts.setpoint == true
|
||||||
@ -85,19 +85,19 @@ function [inputs] = initializeInputs(opts_param)
|
|||||||
u_hexa = opts.u_hexa;
|
u_hexa = opts.u_hexa;
|
||||||
end
|
end
|
||||||
|
|
||||||
inputs.micro_hexapod = timeseries(u_hexa, time_vector);
|
inputs.u_hexa = timeseries(u_hexa, time_vector);
|
||||||
|
|
||||||
%% Center of gravity compensation
|
%% Center of gravity compensation
|
||||||
if islogical(opts.mass) && opts.setpoint == true
|
if islogical(opts.mass) && opts.setpoint == true
|
||||||
Rm = zeros(length(time_vector), 2);
|
axisc = zeros(length(time_vector), 2);
|
||||||
elseif islogical(opts.mass) && opts.setpoint == false
|
elseif islogical(opts.mass) && opts.setpoint == false
|
||||||
Rm = zeros(length(time_vector), 2);
|
axisc = zeros(length(time_vector), 2);
|
||||||
Rm(:, 2) = pi*ones(length(time_vector), 1);
|
axisc(:, 2) = pi*ones(length(time_vector), 1);
|
||||||
else
|
else
|
||||||
Rm = opts.mass;
|
axisc = opts.mass;
|
||||||
end
|
end
|
||||||
|
|
||||||
inputs.Rm = timeseries(Rm, time_vector);
|
inputs.axisc = timeseries(axisc, time_vector);
|
||||||
|
|
||||||
%% Nano Hexapod
|
%% Nano Hexapod
|
||||||
if islogical(opts.n_hexa) && opts.setpoint == true
|
if islogical(opts.n_hexa) && opts.setpoint == true
|
||||||
@ -108,7 +108,7 @@ function [inputs] = initializeInputs(opts_param)
|
|||||||
n_hexa = opts.n_hexa;
|
n_hexa = opts.n_hexa;
|
||||||
end
|
end
|
||||||
|
|
||||||
inputs.nano_hexapod = timeseries(n_hexa, time_vector);
|
inputs.n_hexa = timeseries(n_hexa, time_vector);
|
||||||
|
|
||||||
%% Set point [m, rad]
|
%% Set point [m, rad]
|
||||||
if islogical(opts.setpoint) && opts.setpoint == true
|
if islogical(opts.setpoint) && opts.setpoint == true
|
||||||
|
@ -12,9 +12,9 @@ function [] = initializeMicroHexapod(opts_param)
|
|||||||
%% Stewart Object
|
%% Stewart Object
|
||||||
micro_hexapod = struct();
|
micro_hexapod = struct();
|
||||||
micro_hexapod.h = 350; % Total height of the platform [mm]
|
micro_hexapod.h = 350; % Total height of the platform [mm]
|
||||||
micro_hexapod.jacobian = 265; % Point where the Jacobian is computed => Center of rotation [mm]
|
micro_hexapod.jacobian = 265; % Distance from the top platform to the Jacobian point [mm]
|
||||||
|
|
||||||
%% Bottom Plate
|
%% Bottom Plate - Mechanical Design
|
||||||
BP = struct();
|
BP = struct();
|
||||||
|
|
||||||
BP.rad.int = 110; % Internal Radius [mm]
|
BP.rad.int = 110; % Internal Radius [mm]
|
||||||
@ -26,7 +26,7 @@ function [] = initializeMicroHexapod(opts_param)
|
|||||||
BP.color = [0.6 0.6 0.6]; % Color [rgb]
|
BP.color = [0.6 0.6 0.6]; % Color [rgb]
|
||||||
BP.shape = [BP.rad.int BP.thickness; BP.rad.int 0; BP.rad.ext 0; BP.rad.ext BP.thickness];
|
BP.shape = [BP.rad.int BP.thickness; BP.rad.int 0; BP.rad.ext 0; BP.rad.ext BP.thickness];
|
||||||
|
|
||||||
%% Top Plate
|
%% Top Plate - Mechanical Design
|
||||||
TP = struct();
|
TP = struct();
|
||||||
|
|
||||||
TP.rad.int = 82; % Internal Radius [mm]
|
TP.rad.int = 82; % Internal Radius [mm]
|
||||||
@ -38,7 +38,7 @@ function [] = initializeMicroHexapod(opts_param)
|
|||||||
TP.color = [0.6 0.6 0.6]; % Color [rgb]
|
TP.color = [0.6 0.6 0.6]; % Color [rgb]
|
||||||
TP.shape = [TP.rad.int TP.thickness; TP.rad.int 0; TP.rad.ext 0; TP.rad.ext TP.thickness];
|
TP.shape = [TP.rad.int TP.thickness; TP.rad.int 0; TP.rad.ext 0; TP.rad.ext TP.thickness];
|
||||||
|
|
||||||
%% Leg
|
%% Struts
|
||||||
Leg = struct();
|
Leg = struct();
|
||||||
|
|
||||||
Leg.stroke = 10e-3; % Maximum Stroke of each leg [m]
|
Leg.stroke = 10e-3; % Maximum Stroke of each leg [m]
|
||||||
|
@ -1,10 +1,24 @@
|
|||||||
function [ry] = initializeRy()
|
function [ry] = initializeRy(opts_param)
|
||||||
|
%% Default values for opts
|
||||||
|
opts = struct('rigid', false);
|
||||||
|
|
||||||
|
%% Populate opts with input parameters
|
||||||
|
if exist('opts_param','var')
|
||||||
|
for opt = fieldnames(opts_param)'
|
||||||
|
opts.(opt{1}) = opts_param.(opt{1});
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
%%
|
%%
|
||||||
ry = struct();
|
ry = struct();
|
||||||
|
|
||||||
ry.m = 200; % [kg]
|
ry.m = 200; % [kg]
|
||||||
|
|
||||||
ry.k.tilt = 1e4; % Rotation stiffness around y [N*m/deg]
|
if opts.rigid
|
||||||
|
ry.k.tilt = 1e10; % Rotation stiffness around y [N*m/deg]
|
||||||
|
else
|
||||||
|
ry.k.tilt = 1e4; % Rotation stiffness around y [N*m/deg]
|
||||||
|
end
|
||||||
|
|
||||||
ry.k.h = 357e6/4; % Stiffness in the direction of the guidance [N/m]
|
ry.k.h = 357e6/4; % Stiffness in the direction of the guidance [N/m]
|
||||||
ry.k.rad = 555e6/4; % Stiffness in the top direction [N/m]
|
ry.k.rad = 555e6/4; % Stiffness in the top direction [N/m]
|
||||||
|
@ -1,18 +1,36 @@
|
|||||||
function [rz] = initializeRz()
|
function [rz] = initializeRz(opts_param)
|
||||||
|
%% Default values for opts
|
||||||
|
opts = struct('rigid', false);
|
||||||
|
|
||||||
|
%% Populate opts with input parameters
|
||||||
|
if exist('opts_param','var')
|
||||||
|
for opt = fieldnames(opts_param)'
|
||||||
|
opts.(opt{1}) = opts_param.(opt{1});
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
%%
|
%%
|
||||||
rz = struct();
|
rz = struct();
|
||||||
|
|
||||||
|
% Estimated mass of the mooving part
|
||||||
rz.m = 250; % [kg]
|
rz.m = 250; % [kg]
|
||||||
|
|
||||||
|
% Estimated stiffnesses
|
||||||
rz.k.ax = 2e9; % Axial Stiffness [N/m]
|
rz.k.ax = 2e9; % Axial Stiffness [N/m]
|
||||||
rz.k.rad = 7e8; % Radial Stiffness [N/m]
|
rz.k.rad = 7e8; % Radial Stiffness [N/m]
|
||||||
rz.k.rot = 1e2; % Rotational Stiffness [N*m/deg]
|
rz.k.rot = 100e6*2*pi/360; % Rotational Stiffness [N*m/deg]
|
||||||
rz.k.tilt = 1e2; % TODO [N*m/deg]
|
|
||||||
|
|
||||||
rz.c.ax = 10*(1/5)*sqrt(rz.k.ax/rz.m);
|
if opts.rigid
|
||||||
rz.c.rad = 10*(1/5)*sqrt(rz.k.rad/rz.m);
|
rz.k.tilt = 1e10; % Vertical Rotational Stiffness [N*m/deg]
|
||||||
rz.c.tilt = 100*(1/1)*sqrt(rz.k.tilt/rz.m);
|
else
|
||||||
rz.c.rot = 100*(1/1)*sqrt(rz.k.rot/rz.m);
|
rz.k.tilt = 1e2; % TODO what value should I put? [N*m/deg]
|
||||||
|
end
|
||||||
|
|
||||||
|
% TODO
|
||||||
|
rz.c.ax = 2*sqrt(rz.k.ax/rz.m);
|
||||||
|
rz.c.rad = 2*sqrt(rz.k.rad/rz.m);
|
||||||
|
rz.c.tilt = 100*sqrt(rz.k.tilt/rz.m);
|
||||||
|
rz.c.rot = 100*sqrt(rz.k.rot/rz.m);
|
||||||
|
|
||||||
%% Save
|
%% Save
|
||||||
save('./mat/stages.mat', 'rz', '-append');
|
save('./mat/stages.mat', 'rz', '-append');
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
function [] = initializeSample(opts_param)
|
function [] = initializeSample(opts_param)
|
||||||
%% Default values for opts
|
%% Default values for opts
|
||||||
sample = struct('radius', 100,...
|
sample = struct('radius', 100, ...
|
||||||
'height', 300,...
|
'height', 300, ...
|
||||||
'mass', 50,...
|
'mass', 50, ...
|
||||||
'offset', 0,...
|
'offset', 0, ...
|
||||||
'color', [0.45, 0.45, 0.45] ...
|
'color', [0.45, 0.45, 0.45] ...
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -1,10 +1,24 @@
|
|||||||
function [ty] = initializeTy()
|
function [ty] = initializeTy(opts_param)
|
||||||
|
%% Default values for opts
|
||||||
|
opts = struct('rigid', false);
|
||||||
|
|
||||||
|
%% Populate opts with input parameters
|
||||||
|
if exist('opts_param','var')
|
||||||
|
for opt = fieldnames(opts_param)'
|
||||||
|
opts.(opt{1}) = opts_param.(opt{1});
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
%%
|
%%
|
||||||
ty = struct();
|
ty = struct();
|
||||||
|
|
||||||
ty.m = 250; % [kg]
|
ty.m = 250; % [kg]
|
||||||
|
|
||||||
ty.k.ax = 1e7/4; % Axial Stiffness for each of the 4 guidance (y) [N/m]
|
if opts.rigid
|
||||||
|
ty.k.ax = 1e10; % Axial Stiffness for each of the 4 guidance (y) [N/m]
|
||||||
|
else
|
||||||
|
ty.k.ax = 1e7/4; % Axial Stiffness for each of the 4 guidance (y) [N/m]
|
||||||
|
end
|
||||||
ty.k.rad = 9e9/4; % Radial Stiffness for each of the 4 guidance (x-z) [N/m]
|
ty.k.rad = 9e9/4; % Radial Stiffness for each of the 4 guidance (x-z) [N/m]
|
||||||
|
|
||||||
ty.c.ax = 100*(1/5)*sqrt(ty.k.ax/ty.m);
|
ty.c.ax = 100*(1/5)*sqrt(ty.k.ax/ty.m);
|
||||||
|
BIN
mat/config.mat
BIN
mat/config.mat
Binary file not shown.
BIN
mat/controllers.mat
Normal file
BIN
mat/controllers.mat
Normal file
Binary file not shown.
Binary file not shown.
BIN
mat/id_micro_station_flexibility.mat
Normal file
BIN
mat/id_micro_station_flexibility.mat
Normal file
Binary file not shown.
BIN
mat/inputs.mat
BIN
mat/inputs.mat
Binary file not shown.
BIN
mat/perturbations.mat
Normal file
BIN
mat/perturbations.mat
Normal file
Binary file not shown.
BIN
mat/sim_conf.mat
BIN
mat/sim_conf.mat
Binary file not shown.
BIN
mat/solids.mat
BIN
mat/solids.mat
Binary file not shown.
BIN
mat/stages.mat
BIN
mat/stages.mat
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -19,10 +19,10 @@ function [] = runSimulation(sys_name, sys_mass, ctrl_type, act_damp)
|
|||||||
if strcmp(act_damp, 'iff')
|
if strcmp(act_damp, 'iff')
|
||||||
K_iff_crit = load('./mat/K_iff_crit.mat');
|
K_iff_crit = load('./mat/K_iff_crit.mat');
|
||||||
K_iff = K_iff_crit.(sprintf('K_iff_%s_%s', sys_mass, sys_name)); %#ok
|
K_iff = K_iff_crit.(sprintf('K_iff_%s_%s', sys_mass, sys_name)); %#ok
|
||||||
save('./mat/K_iff.mat', 'K_iff');
|
save('./mat/controllers.mat', 'K_iff', '-append');
|
||||||
elseif strcmp(act_damp, 'none')
|
elseif strcmp(act_damp, 'none')
|
||||||
K_iff = tf(zeros(6)); %#ok
|
K_iff = tf(zeros(6)); %#ok
|
||||||
save('./mat/K_iff.mat', 'K_iff');
|
save('./mat/controllers.mat', 'K_iff', '-append');
|
||||||
end
|
end
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
Loading…
Reference in New Issue
Block a user