Matlab Functions used for the NASS Project
Table of Contents
1 describeNassSetup
Function description
function [] = describeNassSetup() % describeNassSetup - % % Syntax: [] = describeNassSetup() % % Inputs: % - - % % Outputs: % - -
Simscape Configuration
load('./mat/conf_simscape.mat', 'conf_simscape');
fprintf('Simscape Configuration:\n'); if conf_simscape.type == 1 fprintf('- Gravity is included\n'); else fprintf('- Gravity is not included\n'); end fprintf('\n');
Disturbances
load('./mat/nass_disturbances.mat', 'args');
fprintf('Disturbances:\n'); if ~args.enable fprintf('- No disturbance is included\n'); else if args.Dwx && args.Dwy && args.Dwz fprintf('- Ground motion\n'); end if args.Fty_x && args.Fty_z fprintf('- Vibrations of the Translation Stage\n'); end if args.Frz_z fprintf('- Vibrations of the Spindle\n'); end end fprintf('\n');
References
load('./mat/nass_references.mat', 'args');
fprintf('Reference Tracking:\n'); fprintf('- Translation Stage:\n'); switch args.Dy_type case 'constant' fprintf(' - Constant Position\n'); fprintf(' - Dy = %.0f [mm]\n', args.Dy_amplitude*1e3); case 'triangular' fprintf(' - Triangular Path\n'); fprintf(' - Amplitude = %.0f [mm]\n', args.Dy_amplitude*1e3); fprintf(' - Period = %.0f [s]\n', args.Dy_period); case 'sinusoidal' fprintf(' - Sinusoidal Path\n'); fprintf(' - Amplitude = %.0f [mm]\n', args.Dy_amplitude*1e3); fprintf(' - Period = %.0f [s]\n', args.Dy_period); end fprintf('- Tilt Stage:\n'); switch args.Ry_type case 'constant' fprintf(' - Constant Position\n'); fprintf(' - Ry = %.0f [mm]\n', args.Ry_amplitude*1e3); case 'triangular' fprintf(' - Triangular Path\n'); fprintf(' - Amplitude = %.0f [mm]\n', args.Ry_amplitude*1e3); fprintf(' - Period = %.0f [s]\n', args.Ry_period); case 'sinusoidal' fprintf(' - Sinusoidal Path\n'); fprintf(' - Amplitude = %.0f [mm]\n', args.Ry_amplitude*1e3); fprintf(' - Period = %.0f [s]\n', args.Ry_period); end fprintf('- Spindle:\n'); switch args.Rz_type case 'constant' fprintf(' - Constant Position\n'); fprintf(' - Rz = %.0f [deg]\n', 180/pi*args.Rz_amplitude); case { 'rotating', 'rotating-not-filtered' } fprintf(' - Rotating\n'); fprintf(' - Speed = %.0f [rpm]\n', 60/args.Rz_period); end fprintf('- Micro Hexapod:\n'); switch args.Dh_type case 'constant' fprintf(' - Constant Position\n'); fprintf(' - Dh = %.0f, %.0f, %.0f [mm]\n', args.Dh_pos(1), args.Dh_pos(2), args.Dh_pos(3)); fprintf(' - Rh = %.0f, %.0f, %.0f [deg]\n', args.Dh_pos(4), args.Dh_pos(5), args.Dh_pos(6)); end fprintf('\n');
Controller
load('./mat/controller.mat', 'controller');
fprintf('Controller:\n'); fprintf('- %s\n', controller.name); fprintf('\n');
Micro-Station
load('./mat/stages.mat', 'ground', 'granite', 'ty', 'ry', 'rz', 'micro_hexapod', 'axisc');
fprintf('Micro Station:\n'); if granite.type == 1 && ... ty.type == 1 && ... ry.type == 1 && ... rz.type == 1 && ... micro_hexapod.type == 1; fprintf('- All stages are rigid\n'); elseif granite.type == 2 && ... ty.type == 2 && ... ry.type == 2 && ... rz.type == 2 && ... micro_hexapod.type == 2; fprintf('- All stages are flexible\n'); else if granite.type == 1 || granite.type == 4 fprintf('- Granite is rigid\n'); else fprintf('- Granite is flexible\n'); end if ty.type == 1 || ty.type == 4 fprintf('- Translation Stage is rigid\n'); else fprintf('- Translation Stage is flexible\n'); end if ry.type == 1 || ry.type == 4 fprintf('- Tilt Stage is rigid\n'); else fprintf('- Tilt Stage is flexible\n'); end if rz.type == 1 || rz.type == 4 fprintf('- Spindle is rigid\n'); else fprintf('- Spindle is flexible\n'); end if micro_hexapod.type == 1 || micro_hexapod.type == 4 fprintf('- Micro Hexapod is rigid\n'); else fprintf('- Micro Hexapod is flexible\n'); end end fprintf('\n');
Metrology
load('./mat/stages.mat', 'mirror');
fprintf('Reference Mirror:\n'); if mirror.type == 2; fprintf('- flexible fixation\n'); fprintf('- w = %.0f [Hz]\n', mirror.freq(1)); else fprintf('- rigidly attached to the nano-hexapod\n'); end fprintf('- m = %.0f [kg]\n', mirror.mass); fprintf('\n');
Nano Hexapod
load('./mat/stages.mat', 'nano_hexapod');
fprintf('Nano Hexapod:\n'); if nano_hexapod.type == 0; fprintf('- no included\n'); elseif nano_hexapod.type == 1 || nano_hexapod.type == 3; fprintf('- rigid\n'); elseif nano_hexapod.type == 2; fprintf('- flexible\n'); fprintf('- Ki = %.0g [N/m]\n', nano_hexapod.actuators.K(1)); end fprintf('\n');
Sample
load('./mat/stages.mat', 'sample');
fprintf('Sample:\n'); if sample.type == 0; fprintf('- no included\n'); elseif sample.type == 1 || sample.type == 3; fprintf('- rigid\n'); fprintf('- mass = %.0f [kg]\n', sample.mass); fprintf('- moment of inertia = %.2f, %.2f, %.2f [kg m2]\n', sample.inertia(1), sample.inertia(2), sample.inertia(3)); elseif sample.type == 2; fprintf('- flexible\n'); fprintf('- mass = %.0f [kg]\n', sample.mass); fprintf('- moment of inertia = %.2f, %.2f, %.2f [kg m2]\n', sample.inertia(1), sample.inertia(2), sample.inertia(3)); % fprintf('- Kt = %.0g, %.0g, %.0g [N/m]\n', sample.K(1), sample.K(2), sample.K(3)); % fprintf('- Kr = %.0g, %.0g, %.0g [Nm/rad]\n', sample.K(4), sample.K(5), sample.K(6)); fprintf('- wt(x,y,z) = %.0f, %.0f, %.0f [Hz]\n', 1/2/pi*sqrt(sample.K(1)/sample.mass), 1/2/pi*sqrt(sample.K(1)/sample.mass), 1/2/pi*sqrt(sample.K(1)/sample.mass)); fprintf('- wr(x,y,z) = %.0f, %.0f, %.0f [Hz]\n', 1/2/pi*sqrt(sample.K(4)/sample.inertia(1)), 1/2/pi*sqrt(sample.K(5)/sample.inertia(2)), 1/2/pi*sqrt(sample.K(6)/sample.inertia(3))); end fprintf('\n');
2 computeReferencePose
This Matlab function is accessible here.
function [WTr] = computeReferencePose(Dy, Ry, Rz, Dh, Dn) % computeReferencePose - Compute the homogeneous transformation matrix corresponding to the wanted pose of the sample % % Syntax: [WTr] = computeReferencePose(Dy, Ry, Rz, Dh, Dn) % % Inputs: % - Dy - Reference of the Translation Stage [m] % - Ry - Reference of the Tilt Stage [rad] % - Rz - Reference of the Spindle [rad] % - Dh - Reference of the Micro Hexapod (Pitch, Roll, Yaw angles) [m, m, m, rad, rad, rad] % - Dn - Reference of the Nano Hexapod [m, m, m, rad, rad, rad] % % Outputs: % - WTr - %% Translation Stage Rty = [1 0 0 0; 0 1 0 Dy; 0 0 1 0; 0 0 0 1]; %% Tilt Stage - Pure rotating aligned with Ob Rry = [ cos(Ry) 0 sin(Ry) 0; 0 1 0 0; -sin(Ry) 0 cos(Ry) 0; 0 0 0 1]; %% Spindle - Rotation along the Z axis Rrz = [cos(Rz) -sin(Rz) 0 0 ; sin(Rz) cos(Rz) 0 0 ; 0 0 1 0 ; 0 0 0 1 ]; %% Micro-Hexapod Rhx = [1 0 0; 0 cos(Dh(4)) -sin(Dh(4)); 0 sin(Dh(4)) cos(Dh(4))]; Rhy = [ cos(Dh(5)) 0 sin(Dh(5)); 0 1 0; -sin(Dh(5)) 0 cos(Dh(5))]; Rhz = [cos(Dh(6)) -sin(Dh(6)) 0; sin(Dh(6)) cos(Dh(6)) 0; 0 0 1]; Rh = [1 0 0 Dh(1) ; 0 1 0 Dh(2) ; 0 0 1 Dh(3) ; 0 0 0 1 ]; Rh(1:3, 1:3) = Rhz*Rhy*Rhx; %% Nano-Hexapod Rnx = [1 0 0; 0 cos(Dn(4)) -sin(Dn(4)); 0 sin(Dn(4)) cos(Dn(4))]; Rny = [ cos(Dn(5)) 0 sin(Dn(5)); 0 1 0; -sin(Dn(5)) 0 cos(Dn(5))]; Rnz = [cos(Dn(6)) -sin(Dn(6)) 0; sin(Dn(6)) cos(Dn(6)) 0; 0 0 1]; Rn = [1 0 0 Dn(1) ; 0 1 0 Dn(2) ; 0 0 1 Dn(3) ; 0 0 0 1 ]; Rn(1:3, 1:3) = Rnz*Rny*Rnx; %% Total Homogeneous transformation WTr = Rty*Rry*Rrz*Rh*Rn; end
3 Compute the Sample Position Error w.r.t. the NASS
This Matlab function is accessible here.
function [MTr] = computeSampleError(WTm, WTr) % computeSampleError - % % Syntax: [MTr] = computeSampleError(WTm, WTr) % % Inputs: % - WTm - Homoegeneous transformation that represent the % wanted pose of the sample with respect to the granite % - WTr - Homoegeneous transformation that represent the % measured pose of the sample with respect to the granite % % Outputs: % - MTr - Homoegeneous transformation that represent the % wanted pose of the sample expressed in a frame % attached to the top platform of the nano-hexapod MTr = zeros(4,4); MTr = [WTm(1:3,1:3)', -WTm(1:3,1:3)'*WTm(1:3,4) ; 0 0 0 1]*WTr; end