[WIP] Change inputs.mat elements
Create new identification simulink
This commit is contained in:
parent
782129a31d
commit
14259c7e67
BIN
Assemblage.slx
BIN
Assemblage.slx
Binary file not shown.
BIN
Micro_Station.slx
Normal file
BIN
Micro_Station.slx
Normal file
Binary file not shown.
9
config.m
9
config.m
@ -1,12 +1,3 @@
|
|||||||
%% Add folders to Matlab Path
|
|
||||||
% addpath('./analysis/');
|
|
||||||
% addpath('./control/');
|
|
||||||
% addpath('./identification/');
|
|
||||||
% addpath('./initialize/');
|
|
||||||
% addpath('./src/');
|
|
||||||
% addpath('./stewart-simscape/');
|
|
||||||
% addpath('./active_damping/');
|
|
||||||
|
|
||||||
%%
|
%%
|
||||||
freqs = logspace(-1, 3, 1000);
|
freqs = logspace(-1, 3, 1000);
|
||||||
save_fig = false;
|
save_fig = false;
|
||||||
|
@ -11,21 +11,27 @@ options = linearizeOptions;
|
|||||||
options.SampleTime = 0;
|
options.SampleTime = 0;
|
||||||
|
|
||||||
%% Name of the Simulink File
|
%% Name of the Simulink File
|
||||||
mdl = 'sim_micro_station';
|
mdl = 'simscape_id_micro_station';
|
||||||
|
|
||||||
%% Micro-Hexapod
|
%% Micro-Hexapod
|
||||||
% Input/Output definition
|
% Input/Output definition
|
||||||
io(1) = linio([mdl, '/Micro-Station/Fm_ext'],1,'openinput');
|
io(1) = linio([mdl, '/Micro-Station/Fm_ext'],1,'openinput');
|
||||||
io(2) = linio([mdl, '/Micro-Station/Fg_ext'],1,'openinput');
|
io(2) = linio([mdl, '/Micro-Station/Fg_ext'],1,'openinput');
|
||||||
io(3) = linio([mdl, '/Micro-Station/Dm_inertial'],1,'output');
|
io(3) = linio([mdl, '/Micro-Station/Dm_inertial'],1,'output');
|
||||||
io(4) = linio([mdl, '/Micro-Station/Dg_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
|
% Run the linearization
|
||||||
G_ms = linearize(mdl, io, 0);
|
G_ms = linearize(mdl, io, 0);
|
||||||
|
|
||||||
% Input/Output names
|
% Input/Output names
|
||||||
G_ms.InputName = {'Fmx', 'Fmy', 'Fmz', 'Fgx', 'Fgy', 'Fgz'};
|
G_ms.InputName = {'Fmx', 'Fmy', 'Fmz',...
|
||||||
G_ms.OutputName = {'Dmx', 'Dmy', 'Dmz', 'Dgx', 'Dgy', 'Dgz'};
|
'Fgx', 'Fgy', 'Fgz'};
|
||||||
|
G_ms.OutputName = {'Dmx', 'Dmy', 'Dmz', ...
|
||||||
|
'Tyx', 'Tyy', 'Tyz', ...
|
||||||
|
'Ryx', 'Ryy', 'Ryz', ...
|
||||||
|
'Dgx', 'Dgy', 'Dgz'};
|
||||||
|
|
||||||
%% Save the obtained transfer functions
|
%% Save the obtained transfer functions
|
||||||
save('./mat/id_micro_station.mat', 'G_ms');
|
save('./mat/id_micro_station.mat', 'G_ms');
|
||||||
|
@ -23,7 +23,7 @@ figure;
|
|||||||
% Amplitude
|
% Amplitude
|
||||||
ax1 = subaxis(2,1,1);
|
ax1 = subaxis(2,1,1);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(G_ms('Dgz', 'Fgz'), freqs, 'Hz'))));
|
plot(freqs, abs(squeeze(freqresp(G_ms('Dgx', 'Fgx'), freqs, 'Hz'))));
|
||||||
plot(freqs, abs(squeeze(freqresp(meas_sys('Dmx', 'Fmx'), freqs, 'Hz'))), '.');
|
plot(freqs, abs(squeeze(freqresp(meas_sys('Dmx', 'Fmx'), freqs, 'Hz'))), '.');
|
||||||
set(gca,'xscale','log'); set(gca,'yscale','log');
|
set(gca,'xscale','log'); set(gca,'yscale','log');
|
||||||
ylabel('Amplitude [m/N]');
|
ylabel('Amplitude [m/N]');
|
||||||
@ -50,7 +50,7 @@ figure;
|
|||||||
% Amplitude
|
% Amplitude
|
||||||
ax1 = subaxis(2,1,1);
|
ax1 = subaxis(2,1,1);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(G_ms('Dmz', 'Fmz'), freqs, 'Hz'))));
|
plot(freqs, abs(squeeze(freqresp(G_ms('Dmx', 'Fmx'), freqs, 'Hz'))));
|
||||||
plot(freqs, abs(squeeze(freqresp(meas_sys('Dhx', 'Fhx'), freqs, 'Hz'))), '.');
|
plot(freqs, abs(squeeze(freqresp(meas_sys('Dhx', 'Fhx'), freqs, 'Hz'))), '.');
|
||||||
set(gca,'xscale','log'); set(gca,'yscale','log');
|
set(gca,'xscale','log'); set(gca,'yscale','log');
|
||||||
ylabel('Amplitude [m/N]');
|
ylabel('Amplitude [m/N]');
|
||||||
@ -60,7 +60,7 @@ hold off;
|
|||||||
% Phase
|
% Phase
|
||||||
ax2 = subaxis(2,1,2);
|
ax2 = subaxis(2,1,2);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms('Dmz', 'Fmz'), freqs, 'Hz'))));
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms('Dmx', 'Fmx'), freqs, 'Hz'))));
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(meas_sys('Dhx', 'Fhx'), freqs, 'Hz'))), '.');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(meas_sys('Dhx', 'Fhx'), freqs, 'Hz'))), '.');
|
||||||
set(gca,'xscale','log');
|
set(gca,'xscale','log');
|
||||||
ylim([-180, 180]);
|
ylim([-180, 180]);
|
||||||
@ -77,7 +77,7 @@ figure;
|
|||||||
% Amplitude
|
% Amplitude
|
||||||
ax1 = subaxis(2,1,1);
|
ax1 = subaxis(2,1,1);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, abs(squeeze(freqresp(G_ms('Dmz', 'Fgz'), freqs, 'Hz'))));
|
plot(freqs, abs(squeeze(freqresp(G_ms('Dmx', 'Fgx'), freqs, 'Hz'))));
|
||||||
plot(freqs, abs(squeeze(freqresp(meas_sys('Dhx', 'Fmx'), freqs, 'Hz'))), '.');
|
plot(freqs, abs(squeeze(freqresp(meas_sys('Dhx', 'Fmx'), freqs, 'Hz'))), '.');
|
||||||
set(gca,'xscale','log'); set(gca,'yscale','log');
|
set(gca,'xscale','log'); set(gca,'yscale','log');
|
||||||
ylabel('Amplitude [m/N]');
|
ylabel('Amplitude [m/N]');
|
||||||
@ -87,7 +87,7 @@ hold off;
|
|||||||
% Phase
|
% Phase
|
||||||
ax2 = subaxis(2,1,2);
|
ax2 = subaxis(2,1,2);
|
||||||
hold on;
|
hold on;
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms('Dmz', 'Fgz'), freqs, 'Hz'))));
|
plot(freqs, 180/pi*angle(squeeze(freqresp(G_ms('Dmx', 'Fgx'), freqs, 'Hz'))));
|
||||||
plot(freqs, 180/pi*angle(squeeze(freqresp(meas_sys('Dhx', 'Fmx'), freqs, 'Hz'))), '.');
|
plot(freqs, 180/pi*angle(squeeze(freqresp(meas_sys('Dhx', 'Fmx'), freqs, 'Hz'))), '.');
|
||||||
set(gca,'xscale','log');
|
set(gca,'xscale','log');
|
||||||
ylim([-180, 180]);
|
ylim([-180, 180]);
|
||||||
|
Binary file not shown.
BIN
identification/simscape_id_micro_station.slx
Normal file
BIN
identification/simscape_id_micro_station.slx
Normal file
Binary file not shown.
11
init_data.m
11
init_data.m
@ -3,16 +3,16 @@ clear; close all; clc;
|
|||||||
|
|
||||||
%% Initialize simulation configuration
|
%% Initialize simulation configuration
|
||||||
opts_sim = struct(...
|
opts_sim = struct(...
|
||||||
'Tsim', 10 ...
|
'Tsim', 5 ...
|
||||||
);
|
);
|
||||||
|
|
||||||
initializeSimConf(opts_sim);
|
initializeSimConf(opts_sim);
|
||||||
|
|
||||||
%% Initialize Inputs
|
%% Initialize Inputs
|
||||||
opts_inputs = struct(...
|
opts_inputs = struct(...
|
||||||
'ground_motion', false, ...
|
'Dw', true, ...
|
||||||
'ry', false, ...
|
'ry', false, ...
|
||||||
'rz', false ...
|
'Rz', true ...
|
||||||
);
|
);
|
||||||
|
|
||||||
initializeInputs(opts_inputs);
|
initializeInputs(opts_inputs);
|
||||||
@ -50,11 +50,6 @@ initializeMirror(struct('shape', 'spherical'));
|
|||||||
%% Initialize Sample
|
%% Initialize Sample
|
||||||
initializeSample(struct('mass', 20));
|
initializeSample(struct('mass', 20));
|
||||||
|
|
||||||
%% Additionnal parameters
|
|
||||||
d_granite_sample = 0.80073; % [m] Z-offset from the top of the granite to the point of interest
|
|
||||||
|
|
||||||
save('./mat/simscape_data.mat', 'd_granite_sample');
|
|
||||||
|
|
||||||
%% Controllers
|
%% Controllers
|
||||||
K = tf(zeros(6));
|
K = tf(zeros(6));
|
||||||
save('./mat/controller.mat', 'K');
|
save('./mat/controller.mat', 'K');
|
||||||
|
@ -6,9 +6,6 @@ load('./mat/sim_conf.mat', 'sim_conf');
|
|||||||
%% Load SolidWorks Data
|
%% Load SolidWorks Data
|
||||||
load('./mat/solids.mat', 'solids');
|
load('./mat/solids.mat', 'solids');
|
||||||
|
|
||||||
%% Load more data
|
|
||||||
load('./mat/simscape_data.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', 'ground', 'granite', 'ty', 'ry', 'rz', 'micro_hexapod', 'axisc', 'nano_hexapod', 'mirror', 'sample');
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
function [] = initializeAxisc()
|
function [axisc] = initializeAxisc()
|
||||||
%%
|
%%
|
||||||
axisc = struct();
|
axisc = struct();
|
||||||
|
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
function [] = initializeGround()
|
function [ground] = initializeGround()
|
||||||
%%
|
%%
|
||||||
ground = struct();
|
ground = struct();
|
||||||
|
|
||||||
ground.shape = [2, 2, 0.5]; % m
|
ground.shape = [2, 2, 0.5]; % [m]
|
||||||
|
ground.density = 2800; % [kg/m3]
|
||||||
|
ground.color = [0.5, 0.5, 0.5];
|
||||||
|
|
||||||
%% Save
|
%% Save
|
||||||
save('./mat/stages.mat', 'ground', '-append');
|
save('./mat/stages.mat', 'ground', '-append');
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
function [inputs] = initializeInputs(opts_param)
|
function [inputs] = initializeInputs(opts_param)
|
||||||
%% Default values for opts
|
%% Default values for opts
|
||||||
opts = struct('setpoint', false, ...
|
opts = struct('setpoint', false, ...
|
||||||
'ground_motion', false, ...
|
'Dw', false, ...
|
||||||
'ty', false, ...
|
'ty', false, ...
|
||||||
'ry', false, ...
|
'ry', false, ...
|
||||||
'rz', false, ... % If numerical value, rpm speed of the spindle
|
'Rz', false, ...
|
||||||
'u_hexa', false, ...
|
'u_hexa', false, ...
|
||||||
'mass', false, ...
|
'mass', false, ...
|
||||||
'n_hexa', false ...
|
'n_hexa', false ...
|
||||||
);
|
);
|
||||||
|
|
||||||
%% Populate opts with input parameters
|
%% Populate opts with input parameters
|
||||||
@ -27,19 +27,19 @@ function [inputs] = initializeInputs(opts_param)
|
|||||||
inputs = struct();
|
inputs = struct();
|
||||||
|
|
||||||
%% Ground motion
|
%% Ground motion
|
||||||
if islogical(opts.ground_motion) && opts.ground_motion == true
|
if islogical(opts.Dw) && opts.Dw == true
|
||||||
load('./mat/weight_Wxg.mat', 'Wxg');
|
load('./mat/weight_Wxg.mat', 'Wxg');
|
||||||
ground_motion = 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);
|
||||||
ground_motion(:, 1) = lsim(Wxg, ground_motion(:, 1), time_vector);
|
Dw(:, 1) = lsim(Wxg, Dw(:, 1), time_vector);
|
||||||
ground_motion(:, 2) = lsim(Wxg, ground_motion(:, 2), time_vector);
|
Dw(:, 2) = lsim(Wxg, Dw(:, 2), time_vector);
|
||||||
ground_motion(:, 3) = lsim(Wxg, ground_motion(:, 3), time_vector);
|
Dw(:, 3) = lsim(Wxg, Dw(:, 3), time_vector);
|
||||||
elseif islogical(opts.ground_motion) && opts.ground_motion == false
|
elseif islogical(opts.Dw) && opts.Dw == false
|
||||||
ground_motion = zeros(length(time_vector), 3);
|
Dw = zeros(length(time_vector), 3);
|
||||||
else
|
else
|
||||||
ground_motion = opts.ground_motion;
|
Dw = opts.Dw;
|
||||||
end
|
end
|
||||||
|
|
||||||
inputs.ground_motion = timeseries(ground_motion, time_vector);
|
inputs.Dw = timeseries(Dw, time_vector);
|
||||||
|
|
||||||
%% Translation stage [m]
|
%% Translation stage [m]
|
||||||
if islogical(opts.ty) && opts.ty == true
|
if islogical(opts.ty) && opts.ty == true
|
||||||
@ -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
|
||||||
@ -89,15 +89,15 @@ function [inputs] = initializeInputs(opts_param)
|
|||||||
|
|
||||||
%% Center of gravity compensation
|
%% Center of gravity compensation
|
||||||
if islogical(opts.mass) && opts.setpoint == true
|
if islogical(opts.mass) && opts.setpoint == true
|
||||||
axisc = zeros(length(time_vector), 2);
|
Rm = zeros(length(time_vector), 2);
|
||||||
elseif islogical(opts.mass) && opts.setpoint == false
|
elseif islogical(opts.mass) && opts.setpoint == false
|
||||||
axisc = zeros(length(time_vector), 2);
|
Rm = zeros(length(time_vector), 2);
|
||||||
axisc(:, 2) = pi*ones(length(time_vector), 1);
|
Rm(:, 2) = pi*ones(length(time_vector), 1);
|
||||||
else
|
else
|
||||||
axisc = opts.mass;
|
Rm = opts.mass;
|
||||||
end
|
end
|
||||||
|
|
||||||
inputs.axisc = timeseries(axisc, time_vector);
|
inputs.Rm = timeseries(Rm, time_vector);
|
||||||
|
|
||||||
%% Nano Hexapod
|
%% Nano Hexapod
|
||||||
if islogical(opts.n_hexa) && opts.setpoint == true
|
if islogical(opts.n_hexa) && opts.setpoint == true
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
function [] = initializeRy()
|
function [ry] = initializeRy()
|
||||||
%%
|
%%
|
||||||
ry = struct();
|
ry = struct();
|
||||||
|
|
||||||
ry.m = 200; % [kg]
|
ry.m = 200; % [kg]
|
||||||
|
|
||||||
|
ry.k.tilt = 1e4; % Rotation stiffness around y [N*m/deg]
|
||||||
|
|
||||||
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]
|
||||||
ry.k.rrad = 238e6/4; % Stiffness in the side direction [N/m]
|
ry.k.rrad = 238e6/4; % Stiffness in the side direction [N/m]
|
||||||
ry.k.tilt = 1e4 ; % Rotation stiffness around y [N*m/deg]
|
|
||||||
|
|
||||||
ry.c.h = 10*(1/5)*sqrt(ry.k.h/ry.m);
|
ry.c.h = 10*(1/5)*sqrt(ry.k.h/ry.m);
|
||||||
ry.c.rad = 10*(1/5)*sqrt(ry.k.rad/ry.m);
|
ry.c.rad = 10*(1/5)*sqrt(ry.k.rad/ry.m);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
function [] = initializeRz()
|
function [rz] = initializeRz()
|
||||||
%%
|
%%
|
||||||
rz = struct();
|
rz = struct();
|
||||||
|
|
||||||
@ -6,8 +6,8 @@ function [] = initializeRz()
|
|||||||
|
|
||||||
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.tilt = 1e2; % TODO [N*m/deg]
|
|
||||||
rz.k.rot = 1e2; % Rotational Stiffness [N*m/deg]
|
rz.k.rot = 1e2; % 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);
|
rz.c.ax = 10*(1/5)*sqrt(rz.k.ax/rz.m);
|
||||||
rz.c.rad = 10*(1/5)*sqrt(rz.k.rad/rz.m);
|
rz.c.rad = 10*(1/5)*sqrt(rz.k.rad/rz.m);
|
||||||
|
@ -4,8 +4,8 @@ function [ty] = initializeTy()
|
|||||||
|
|
||||||
ty.m = 250; % [kg]
|
ty.m = 250; % [kg]
|
||||||
|
|
||||||
ty.k.ax = 1e7/4; % Axial Stiffness for each of the 4 guidance (y) [N/m]
|
ty.k.ax = 1e7/4; % Axial Stiffness for each of the 4 guidance (y) [N/m]
|
||||||
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);
|
||||||
ty.c.rad = 100*(1/5)*sqrt(ty.k.rad/ty.m);
|
ty.c.rad = 100*(1/5)*sqrt(ty.k.rad/ty.m);
|
||||||
|
BIN
mat/K_iff.mat
BIN
mat/K_iff.mat
Binary file not shown.
BIN
mat/config.mat
BIN
mat/config.mat
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
mat/inputs.mat
BIN
mat/inputs.mat
Binary file not shown.
BIN
mat/sim_conf.mat
BIN
mat/sim_conf.mat
Binary file not shown.
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.
BIN
micro_station_test.slx
Normal file
BIN
micro_station_test.slx
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user