From 647b36034207d2bbe8537ed71b95e00d7cb69e18 Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Wed, 13 Nov 2024 11:52:49 +0100 Subject: [PATCH] Update beam height (remove 25mm to match the experiments) --- matlab/src/initializeGranite.m | 85 +-- matlab/src/initializeGround.m | 61 +- matlab/src/initializeMicroHexapod.m | 207 +++---- matlab/src/initializeRy.m | 103 ++-- matlab/src/initializeRz.m | 84 +-- matlab/src/initializeTy.m | 132 ++--- matlab/ustation_simscape.slx | Bin 161735 -> 161688 bytes simscape-micro-station.org | 853 ++++++++++++---------------- 8 files changed, 690 insertions(+), 835 deletions(-) diff --git a/matlab/src/initializeGranite.m b/matlab/src/initializeGranite.m index 35b79d3..2cd4b86 100644 --- a/matlab/src/initializeGranite.m +++ b/matlab/src/initializeGranite.m @@ -1,45 +1,48 @@ - function [granite] = initializeGranite(args) +function [granite] = initializeGranite(args) - arguments - args.type char {mustBeMember(args.type,{'rigid', 'flexible', 'none'})} = 'flexible' - args.density (1,1) double {mustBeNumeric, mustBeNonnegative} = 2800 % Density [kg/m3] - args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = [5e9; 5e9; 5e9; 2.5e7; 2.5e7; 1e7] % [N/m] - args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = [4.0e5; 1.1e5; 9.0e5; 2e4; 2e4; 1e4] % [N/(m/s)] - args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m] - args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m] - args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m] - args.sample_pos (1,1) double {mustBeNumeric} = 0.8 % Height of the measurment point [m] - end - - granite = struct(); - - switch args.type - case 'none' - granite.type = 0; - case 'rigid' - granite.type = 1; - case 'flexible' - granite.type = 2; - end - - granite.density = args.density; % [kg/m3] - granite.STEP = 'granite.STEP'; - - granite.sample_pos = args.sample_pos; % [m] - - granite.K = args.K; % [N/m] - granite.C = args.C; % [N/(m/s)] - -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'granite', '-append'); - else - save('mat/nass_model_stages.mat', 'granite'); + arguments + args.type char {mustBeMember(args.type,{'rigid', 'flexible', 'none'})} = 'flexible' + args.density (1,1) double {mustBeNumeric, mustBeNonnegative} = 2800 % Density [kg/m3] + args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = [5e9; 5e9; 5e9; 2.5e7; 2.5e7; 1e7] % [N/m] + args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = [4.0e5; 1.1e5; 9.0e5; 2e4; 2e4; 1e4] % [N/(m/s)] + args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m] + args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m] + args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m] + args.sample_pos (1,1) double {mustBeNumeric} = 0.775 % Height of the measurment point [m] end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'granite', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'granite'); + + granite = struct(); + + switch args.type + case 'none' + granite.type = 0; + case 'rigid' + granite.type = 1; + case 'flexible' + granite.type = 2; end + + granite.density = args.density; % [kg/m3] + granite.STEP = 'granite.STEP'; + + % Z-offset for the initial position of the sample with respect to the granite top surface. + granite.sample_pos = args.sample_pos; % [m] + + granite.K = args.K; % [N/m] + granite.C = args.C; % [N/(m/s)] + + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'granite', '-append'); + else + save('mat/nass_model_stages.mat', 'granite'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'granite', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'granite'); + end + end + end diff --git a/matlab/src/initializeGround.m b/matlab/src/initializeGround.m index 9b16197..f679a90 100644 --- a/matlab/src/initializeGround.m +++ b/matlab/src/initializeGround.m @@ -1,34 +1,35 @@ - function [ground] = initializeGround(args) +function [ground] = initializeGround(args) - arguments - args.type char {mustBeMember(args.type,{'none', 'rigid'})} = 'rigid' - args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1) % Rotation point for the ground motion [m] - end - - ground = struct(); - - switch args.type - case 'none' - ground.type = 0; - case 'rigid' - ground.type = 1; - end - - ground.shape = [2, 2, 0.5]; % [m] - ground.density = 2800; % [kg/m3] - - ground.rot_point = args.rot_point; - -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'ground', '-append'); - else - save('mat/nass_model_stages.mat', 'ground'); + arguments + args.type char {mustBeMember(args.type,{'none', 'rigid'})} = 'rigid' + args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1) % Rotation point for the ground motion [m] end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'ground', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'ground'); + + ground = struct(); + + switch args.type + case 'none' + ground.type = 0; + case 'rigid' + ground.type = 1; + end + + ground.shape = [2, 2, 0.5]; % [m] + ground.density = 2800; % [kg/m3] + + ground.rot_point = args.rot_point; + + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'ground', '-append'); + else + save('mat/nass_model_stages.mat', 'ground'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'ground', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'ground'); + end end end diff --git a/matlab/src/initializeMicroHexapod.m b/matlab/src/initializeMicroHexapod.m index 5a9bc90..4c8619d 100644 --- a/matlab/src/initializeMicroHexapod.m +++ b/matlab/src/initializeMicroHexapod.m @@ -1,107 +1,108 @@ - function [micro_hexapod] = initializeMicroHexapod(args) +function [micro_hexapod] = initializeMicroHexapod(args) - arguments - args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' - % initializeFramesPositions - args.H (1,1) double {mustBeNumeric, mustBePositive} = 350e-3 - args.MO_B (1,1) double {mustBeNumeric} = 270e-3 - % generateGeneralConfiguration - args.FH (1,1) double {mustBeNumeric, mustBePositive} = 50e-3 - args.FR (1,1) double {mustBeNumeric, mustBePositive} = 175.5e-3 - args.FTh (6,1) double {mustBeNumeric} = [-10, 10, 120-10, 120+10, 240-10, 240+10]*(pi/180) - args.MH (1,1) double {mustBeNumeric, mustBePositive} = 45e-3 - args.MR (1,1) double {mustBeNumeric, mustBePositive} = 118e-3 - args.MTh (6,1) double {mustBeNumeric} = [-60+10, 60-10, 60+10, 180-10, 180+10, -60-10]*(pi/180) - % initializeStrutDynamics - args.Ki (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e7*ones(6,1) - args.Ci (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.4e3*ones(6,1) - % initializeCylindricalPlatforms - args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 10 - args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 26e-3 - args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 207.5e-3 - args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 10 - args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 26e-3 - args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 150e-3 - % initializeCylindricalStruts - args.Fsm (1,1) double {mustBeNumeric, mustBePositive} = 1 - args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 100e-3 - args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 25e-3 - args.Msm (1,1) double {mustBeNumeric, mustBePositive} = 1 - args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 100e-3 - args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 25e-3 - % inverseKinematics - args.AP (3,1) double {mustBeNumeric} = zeros(3,1) - args.ARB (3,3) double {mustBeNumeric} = eye(3) - end - - stewart = initializeStewartPlatform(); - - stewart = initializeFramesPositions(stewart, ... - 'H', args.H, ... - 'MO_B', args.MO_B); - - stewart = generateGeneralConfiguration(stewart, ... - 'FH', args.FH, ... - 'FR', args.FR, ... - 'FTh', args.FTh, ... - 'MH', args.MH, ... - 'MR', args.MR, ... - 'MTh', args.MTh); - - stewart = computeJointsPose(stewart); - - stewart = initializeStrutDynamics(stewart, ... - 'K', args.Ki, ... - 'C', args.Ci); - - stewart = initializeJointDynamics(stewart, ... - 'type_F', 'universal_p', ... - 'type_M', 'spherical_p'); - - stewart = initializeCylindricalPlatforms(stewart, ... - 'Fpm', args.Fpm, ... - 'Fph', args.Fph, ... - 'Fpr', args.Fpr, ... - 'Mpm', args.Mpm, ... - 'Mph', args.Mph, ... - 'Mpr', args.Mpr); - - stewart = initializeCylindricalStruts(stewart, ... - 'Fsm', args.Fsm, ... - 'Fsh', args.Fsh, ... - 'Fsr', args.Fsr, ... - 'Msm', args.Msm, ... - 'Msh', args.Msh, ... - 'Msr', args.Msr); - - stewart = computeJacobian(stewart); - - stewart = initializeStewartPose(stewart, ... - 'AP', args.AP, ... - 'ARB', args.ARB); - - stewart = initializeInertialSensor(stewart, 'type', 'none'); - - switch args.type - case 'none' - stewart.type = 0; - case 'rigid' - stewart.type = 1; - case 'flexible' - stewart.type = 2; - end - -micro_hexapod = stewart; -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'micro_hexapod', '-append'); - else - save('mat/nass_model_stages.mat', 'micro_hexapod'); + arguments + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' + % initializeFramesPositions + args.H (1,1) double {mustBeNumeric, mustBePositive} = 350e-3 + args.MO_B (1,1) double {mustBeNumeric} = 270e-3 + % generateGeneralConfiguration + args.FH (1,1) double {mustBeNumeric, mustBePositive} = 50e-3 + args.FR (1,1) double {mustBeNumeric, mustBePositive} = 175.5e-3 + args.FTh (6,1) double {mustBeNumeric} = [-10, 10, 120-10, 120+10, 240-10, 240+10]*(pi/180) + args.MH (1,1) double {mustBeNumeric, mustBePositive} = 45e-3 + args.MR (1,1) double {mustBeNumeric, mustBePositive} = 118e-3 + args.MTh (6,1) double {mustBeNumeric} = [-60+10, 60-10, 60+10, 180-10, 180+10, -60-10]*(pi/180) + % initializeStrutDynamics + args.Ki (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e7*ones(6,1) + args.Ci (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.4e3*ones(6,1) + % initializeCylindricalPlatforms + args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 10 + args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 26e-3 + args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 207.5e-3 + args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 10 + args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 26e-3 + args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 150e-3 + % initializeCylindricalStruts + args.Fsm (1,1) double {mustBeNumeric, mustBePositive} = 1 + args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 100e-3 + args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 25e-3 + args.Msm (1,1) double {mustBeNumeric, mustBePositive} = 1 + args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 100e-3 + args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 25e-3 + % inverseKinematics + args.AP (3,1) double {mustBeNumeric} = zeros(3,1) + args.ARB (3,3) double {mustBeNumeric} = eye(3) end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'micro_hexapod', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'micro_hexapod'); + + stewart = initializeStewartPlatform(); + + stewart = initializeFramesPositions(stewart, ... + 'H', args.H, ... + 'MO_B', args.MO_B); + + stewart = generateGeneralConfiguration(stewart, ... + 'FH', args.FH, ... + 'FR', args.FR, ... + 'FTh', args.FTh, ... + 'MH', args.MH, ... + 'MR', args.MR, ... + 'MTh', args.MTh); + + stewart = computeJointsPose(stewart); + + stewart = initializeStrutDynamics(stewart, ... + 'K', args.Ki, ... + 'C', args.Ci); + + stewart = initializeJointDynamics(stewart, ... + 'type_F', 'universal_p', ... + 'type_M', 'spherical_p'); + + stewart = initializeCylindricalPlatforms(stewart, ... + 'Fpm', args.Fpm, ... + 'Fph', args.Fph, ... + 'Fpr', args.Fpr, ... + 'Mpm', args.Mpm, ... + 'Mph', args.Mph, ... + 'Mpr', args.Mpr); + + stewart = initializeCylindricalStruts(stewart, ... + 'Fsm', args.Fsm, ... + 'Fsh', args.Fsh, ... + 'Fsr', args.Fsr, ... + 'Msm', args.Msm, ... + 'Msh', args.Msh, ... + 'Msr', args.Msr); + + stewart = computeJacobian(stewart); + + stewart = initializeStewartPose(stewart, ... + 'AP', args.AP, ... + 'ARB', args.ARB); + + stewart = initializeInertialSensor(stewart, 'type', 'none'); + + switch args.type + case 'none' + stewart.type = 0; + case 'rigid' + stewart.type = 1; + case 'flexible' + stewart.type = 2; + end + + micro_hexapod = stewart; + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'micro_hexapod', '-append'); + else + save('mat/nass_model_stages.mat', 'micro_hexapod'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'micro_hexapod', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'micro_hexapod'); + end end end diff --git a/matlab/src/initializeRy.m b/matlab/src/initializeRy.m index ec1510b..a5275b2 100644 --- a/matlab/src/initializeRy.m +++ b/matlab/src/initializeRy.m @@ -1,54 +1,57 @@ - function [ry] = initializeRy(args) +function [ry] = initializeRy(args) - arguments - args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' - args.Ry_init (1,1) double {mustBeNumeric} = 0 - end - - ry = struct(); - - switch args.type - case 'none' - ry.type = 0; - case 'rigid' - ry.type = 1; - case 'flexible' - ry.type = 2; - end - - % Ry - Guide for the tilt stage - ry.guide.density = 7800; % [kg/m3] - ry.guide.STEP = 'Tilt_Guide.STEP'; - - % Ry - Rotor of the motor - ry.rotor.density = 2400; % [kg/m3] - ry.rotor.STEP = 'Tilt_Motor_Axis.STEP'; - - % Ry - Motor - ry.motor.density = 3200; % [kg/m3] - ry.motor.STEP = 'Tilt_Motor.STEP'; - - % Ry - Plateau Tilt - ry.stage.density = 7800; % [kg/m3] - ry.stage.STEP = 'Tilt_Stage.STEP'; - - ry.z_offset = 0.58178; % [m] - - ry.Ry_init = args.Ry_init; % [rad] - - ry.K = [3.8e8; 4e8; 3.8e8; 1.2e8; 6e4; 1.2e8]; - ry.C = [1e5; 1e5; 1e5; 3e4; 1e3; 3e4]; - -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'ry', '-append'); - else - save('mat/nass_model_stages.mat', 'ry'); + arguments + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' + args.Ry_init (1,1) double {mustBeNumeric} = 0 end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'ry', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'ry'); + + ry = struct(); + + switch args.type + case 'none' + ry.type = 0; + case 'rigid' + ry.type = 1; + case 'flexible' + ry.type = 2; end + + % Ry - Guide for the tilt stage + ry.guide.density = 7800; % [kg/m3] + ry.guide.STEP = 'Tilt_Guide.STEP'; + + % Ry - Rotor of the motor + ry.rotor.density = 2400; % [kg/m3] + ry.rotor.STEP = 'Tilt_Motor_Axis.STEP'; + + % Ry - Motor + ry.motor.density = 3200; % [kg/m3] + ry.motor.STEP = 'Tilt_Motor.STEP'; + + % Ry - Plateau Tilt + ry.stage.density = 7800; % [kg/m3] + ry.stage.STEP = 'Tilt_Stage.STEP'; + + % Z-Offset so that the center of rotation matches the sample center; + ry.z_offset = 0.58178; % [m] + + ry.Ry_init = args.Ry_init; % [rad] + + ry.K = [3.8e8; 4e8; 3.8e8; 1.2e8; 6e4; 1.2e8]; + ry.C = [1e5; 1e5; 1e5; 3e4; 1e3; 3e4]; + + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'ry', '-append'); + else + save('mat/nass_model_stages.mat', 'ry'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'ry', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'ry'); + end + end + end diff --git a/matlab/src/initializeRz.m b/matlab/src/initializeRz.m index 98d863b..97bf4cf 100644 --- a/matlab/src/initializeRz.m +++ b/matlab/src/initializeRz.m @@ -1,45 +1,47 @@ - function [rz] = initializeRz(args) +function [rz] = initializeRz(args) - arguments - args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' - end - - rz = struct(); - - switch args.type - case 'none' - rz.type = 0; - case 'rigid' - rz.type = 1; - case 'flexible' - rz.type = 2; - end - - % Spindle - Slip Ring - rz.slipring.density = 7800; % [kg/m3] - rz.slipring.STEP = 'Spindle_Slip_Ring.STEP'; - - % Spindle - Rotor - rz.rotor.density = 7800; % [kg/m3] - rz.rotor.STEP = 'Spindle_Rotor.STEP'; - - % Spindle - Stator - rz.stator.density = 7800; % [kg/m3] - rz.stator.STEP = 'Spindle_Stator.STEP'; - - rz.K = [7e8; 7e8; 2e9; 1e7; 1e7; 1e7]; - rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4]; - -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'rz', '-append'); - else - save('mat/nass_model_stages.mat', 'rz'); + arguments + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'rz', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'rz'); + + rz = struct(); + + switch args.type + case 'none' + rz.type = 0; + case 'rigid' + rz.type = 1; + case 'flexible' + rz.type = 2; end + + % Spindle - Slip Ring + rz.slipring.density = 7800; % [kg/m3] + rz.slipring.STEP = 'Spindle_Slip_Ring.STEP'; + + % Spindle - Rotor + rz.rotor.density = 7800; % [kg/m3] + rz.rotor.STEP = 'Spindle_Rotor.STEP'; + + % Spindle - Stator + rz.stator.density = 7800; % [kg/m3] + rz.stator.STEP = 'Spindle_Stator.STEP'; + + rz.K = [7e8; 7e8; 2e9; 1e7; 1e7; 1e7]; + rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4]; + + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'rz', '-append'); + else + save('mat/nass_model_stages.mat', 'rz'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'rz', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'rz'); + end + end + end diff --git a/matlab/src/initializeTy.m b/matlab/src/initializeTy.m index 6730f9b..8f6f81e 100644 --- a/matlab/src/initializeTy.m +++ b/matlab/src/initializeTy.m @@ -1,69 +1,71 @@ - function [ty] = initializeTy(args) +function [ty] = initializeTy(args) - arguments - args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' - end - - ty = struct(); - - switch args.type - case 'none' - ty.type = 0; - case 'rigid' - ty.type = 1; - case 'flexible' - ty.type = 2; - end - - % Ty Granite frame - ty.granite_frame.density = 7800; % [kg/m3] => 43kg - ty.granite_frame.STEP = 'Ty_Granite_Frame.STEP'; - - % Guide Translation Ty - ty.guide.density = 7800; % [kg/m3] => 76kg - ty.guide.STEP = 'Ty_Guide.STEP'; - - % Ty - Guide_Translation12 - ty.guide12.density = 7800; % [kg/m3] - ty.guide12.STEP = 'Ty_Guide_12.STEP'; - - % Ty - Guide_Translation11 - ty.guide11.density = 7800; % [kg/m3] - ty.guide11.STEP = 'Ty_Guide_11.STEP'; - - % Ty - Guide_Translation22 - ty.guide22.density = 7800; % [kg/m3] - ty.guide22.STEP = 'Ty_Guide_22.STEP'; - - % Ty - Guide_Translation21 - ty.guide21.density = 7800; % [kg/m3] - ty.guide21.STEP = 'Ty_Guide_21.STEP'; - - % Ty - Plateau translation - ty.frame.density = 7800; % [kg/m3] - ty.frame.STEP = 'Ty_Stage.STEP'; - - % Ty Stator Part - ty.stator.density = 5400; % [kg/m3] - ty.stator.STEP = 'Ty_Motor_Stator.STEP'; - - % Ty Rotor Part - ty.rotor.density = 5400; % [kg/m3] - ty.rotor.STEP = 'Ty_Motor_Rotor.STEP'; - - ty.K = [2e8; 1e8; 2e8; 6e7; 9e7; 6e7]; % [N/m, N*m/rad] - ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 1e4]; % [N/(m/s), N*m/(rad/s)] - -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'ty', '-append'); - else - save('mat/nass_model_stages.mat', 'ty'); + arguments + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'ty', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'ty'); + + ty = struct(); + + switch args.type + case 'none' + ty.type = 0; + case 'rigid' + ty.type = 1; + case 'flexible' + ty.type = 2; end + + % Ty Granite frame + ty.granite_frame.density = 7800; % [kg/m3] => 43kg + ty.granite_frame.STEP = 'Ty_Granite_Frame.STEP'; + + % Guide Translation Ty + ty.guide.density = 7800; % [kg/m3] => 76kg + ty.guide.STEP = 'Ty_Guide.STEP'; + + % Ty - Guide_Translation12 + ty.guide12.density = 7800; % [kg/m3] + ty.guide12.STEP = 'Ty_Guide_12.STEP'; + + % Ty - Guide_Translation11 + ty.guide11.density = 7800; % [kg/m3] + ty.guide11.STEP = 'Ty_Guide_11.STEP'; + + % Ty - Guide_Translation22 + ty.guide22.density = 7800; % [kg/m3] + ty.guide22.STEP = 'Ty_Guide_22.STEP'; + + % Ty - Guide_Translation21 + ty.guide21.density = 7800; % [kg/m3] + ty.guide21.STEP = 'Ty_Guide_21.STEP'; + + % Ty - Plateau translation + ty.frame.density = 7800; % [kg/m3] + ty.frame.STEP = 'Ty_Stage.STEP'; + + % Ty Stator Part + ty.stator.density = 5400; % [kg/m3] + ty.stator.STEP = 'Ty_Motor_Stator.STEP'; + + % Ty Rotor Part + ty.rotor.density = 5400; % [kg/m3] + ty.rotor.STEP = 'Ty_Motor_Rotor.STEP'; + + ty.K = [2e8; 1e8; 2e8; 6e7; 9e7; 6e7]; % [N/m, N*m/rad] + ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 1e4]; % [N/(m/s), N*m/(rad/s)] + + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'ty', '-append'); + else + save('mat/nass_model_stages.mat', 'ty'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'ty', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'ty'); + end + end + end diff --git a/matlab/ustation_simscape.slx b/matlab/ustation_simscape.slx index 7d260d63c294c0ac43025d86381880218454328f..af3cc85a4528804227090de165d14f9fa1afde71 100644 GIT binary patch delta 30299 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 H8Rq{0rt#;6 delta 30400 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 diff --git a/simscape-micro-station.org b/simscape-micro-station.org index 42a60be..9b04c9c 100644 --- a/simscape-micro-station.org +++ b/simscape-micro-station.org @@ -3202,549 +3202,392 @@ function [xc,yc,R,a] = circlefit(x,y) ** Initialize Micro-Station Stages *** =initializeGround=: Ground -:PROPERTIES: -:header-args:matlab+: :tangle matlab/src/initializeGround.m -:header-args:matlab+: :comments none :mkdirp yes :eval no -:END: +#+begin_src matlab :tangle matlab/src/initializeGround.m :comments none :mkdirp yes :eval no +function [ground] = initializeGround(args) -**** Function description -#+begin_src matlab - function [ground] = initializeGround(args) -#+end_src - -**** Optional Parameters -#+begin_src matlab - arguments - args.type char {mustBeMember(args.type,{'none', 'rigid'})} = 'rigid' - args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1) % Rotation point for the ground motion [m] - end -#+end_src - -**** Structure initialization -First, we initialize the =granite= structure. -#+begin_src matlab - ground = struct(); -#+end_src - -**** Add Type -#+begin_src matlab - switch args.type - case 'none' - ground.type = 0; - case 'rigid' - ground.type = 1; - end -#+end_src - -**** Ground Solid properties -We set the shape and density of the ground solid element. -#+begin_src matlab - ground.shape = [2, 2, 0.5]; % [m] - ground.density = 2800; % [kg/m3] -#+end_src - -**** Rotation Point - -#+begin_src matlab - ground.rot_point = args.rot_point; -#+end_src - -**** Save the Structure -#+begin_src matlab -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'ground', '-append'); - else - save('mat/nass_model_stages.mat', 'ground'); + arguments + args.type char {mustBeMember(args.type,{'none', 'rigid'})} = 'rigid' + args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1) % Rotation point for the ground motion [m] end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'ground', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'ground'); + + ground = struct(); + + switch args.type + case 'none' + ground.type = 0; + case 'rigid' + ground.type = 1; + end + + ground.shape = [2, 2, 0.5]; % [m] + ground.density = 2800; % [kg/m3] + + ground.rot_point = args.rot_point; + + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'ground', '-append'); + else + save('mat/nass_model_stages.mat', 'ground'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'ground', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'ground'); + end end end #+end_src *** =initializeGranite=: Granite -:PROPERTIES: -:header-args:matlab+: :tangle matlab/src/initializeGranite.m -:header-args:matlab+: :comments none :mkdirp yes :eval no -:END: +#+begin_src matlab :tangle matlab/src/initializeGranite.m :comments none :mkdirp yes :eval no +function [granite] = initializeGranite(args) -**** Function description -#+begin_src matlab - function [granite] = initializeGranite(args) -#+end_src - -**** Optional Parameters -#+begin_src matlab - arguments - args.type char {mustBeMember(args.type,{'rigid', 'flexible', 'none'})} = 'flexible' - args.density (1,1) double {mustBeNumeric, mustBeNonnegative} = 2800 % Density [kg/m3] - args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = [5e9; 5e9; 5e9; 2.5e7; 2.5e7; 1e7] % [N/m] - args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = [4.0e5; 1.1e5; 9.0e5; 2e4; 2e4; 1e4] % [N/(m/s)] - args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m] - args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m] - args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m] - args.sample_pos (1,1) double {mustBeNumeric} = 0.8 % Height of the measurment point [m] - end -#+end_src - -**** Structure initialization -First, we initialize the =granite= structure. -#+begin_src matlab - granite = struct(); -#+end_src - -**** Add Granite Type -#+begin_src matlab - switch args.type - case 'none' - granite.type = 0; - case 'rigid' - granite.type = 1; - case 'flexible' - granite.type = 2; - end -#+end_src - -**** Material and Geometry - -Properties of the Material and link to the geometry of the granite. -#+begin_src matlab - granite.density = args.density; % [kg/m3] - granite.STEP = 'granite.STEP'; -#+end_src - -Z-offset for the initial position of the sample with respect to the granite top surface. -#+begin_src matlab - granite.sample_pos = args.sample_pos; % [m] -#+end_src - -**** Stiffness and Damping properties - -#+begin_src matlab - granite.K = args.K; % [N/m] - granite.C = args.C; % [N/(m/s)] -#+end_src - -**** Save the Structure -#+begin_src matlab -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'granite', '-append'); - else - save('mat/nass_model_stages.mat', 'granite'); + arguments + args.type char {mustBeMember(args.type,{'rigid', 'flexible', 'none'})} = 'flexible' + args.density (1,1) double {mustBeNumeric, mustBeNonnegative} = 2800 % Density [kg/m3] + args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = [5e9; 5e9; 5e9; 2.5e7; 2.5e7; 1e7] % [N/m] + args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = [4.0e5; 1.1e5; 9.0e5; 2e4; 2e4; 1e4] % [N/(m/s)] + args.x0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the X direction [m] + args.y0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Y direction [m] + args.z0 (1,1) double {mustBeNumeric} = 0 % Rest position of the Joint in the Z direction [m] + args.sample_pos (1,1) double {mustBeNumeric} = 0.775 % Height of the measurment point [m] end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'granite', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'granite'); + + granite = struct(); + + switch args.type + case 'none' + granite.type = 0; + case 'rigid' + granite.type = 1; + case 'flexible' + granite.type = 2; end + + granite.density = args.density; % [kg/m3] + granite.STEP = 'granite.STEP'; + + % Z-offset for the initial position of the sample with respect to the granite top surface. + granite.sample_pos = args.sample_pos; % [m] + + granite.K = args.K; % [N/m] + granite.C = args.C; % [N/(m/s)] + + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'granite', '-append'); + else + save('mat/nass_model_stages.mat', 'granite'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'granite', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'granite'); + end + end + end #+end_src *** =initializeTy=: Translation Stage -:PROPERTIES: -:header-args:matlab+: :tangle matlab/src/initializeTy.m -:header-args:matlab+: :comments none :mkdirp yes :eval no -:END: +#+begin_src matlab :tangle matlab/src/initializeTy.m :comments none :mkdirp yes :eval no +function [ty] = initializeTy(args) -**** Function description -#+begin_src matlab - function [ty] = initializeTy(args) -#+end_src - -**** Optional Parameters -#+begin_src matlab - arguments - args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' - end -#+end_src - -**** Structure initialization -First, we initialize the =ty= structure. -#+begin_src matlab - ty = struct(); -#+end_src - -**** Add Translation Stage Type -#+begin_src matlab - switch args.type - case 'none' - ty.type = 0; - case 'rigid' - ty.type = 1; - case 'flexible' - ty.type = 2; - end -#+end_src - -**** Material and Geometry -Define the density of the materials as well as the geometry (STEP files). -#+begin_src matlab - % Ty Granite frame - ty.granite_frame.density = 7800; % [kg/m3] => 43kg - ty.granite_frame.STEP = 'Ty_Granite_Frame.STEP'; - - % Guide Translation Ty - ty.guide.density = 7800; % [kg/m3] => 76kg - ty.guide.STEP = 'Ty_Guide.STEP'; - - % Ty - Guide_Translation12 - ty.guide12.density = 7800; % [kg/m3] - ty.guide12.STEP = 'Ty_Guide_12.STEP'; - - % Ty - Guide_Translation11 - ty.guide11.density = 7800; % [kg/m3] - ty.guide11.STEP = 'Ty_Guide_11.STEP'; - - % Ty - Guide_Translation22 - ty.guide22.density = 7800; % [kg/m3] - ty.guide22.STEP = 'Ty_Guide_22.STEP'; - - % Ty - Guide_Translation21 - ty.guide21.density = 7800; % [kg/m3] - ty.guide21.STEP = 'Ty_Guide_21.STEP'; - - % Ty - Plateau translation - ty.frame.density = 7800; % [kg/m3] - ty.frame.STEP = 'Ty_Stage.STEP'; - - % Ty Stator Part - ty.stator.density = 5400; % [kg/m3] - ty.stator.STEP = 'Ty_Motor_Stator.STEP'; - - % Ty Rotor Part - ty.rotor.density = 5400; % [kg/m3] - ty.rotor.STEP = 'Ty_Motor_Rotor.STEP'; -#+end_src - -**** Stiffness and Damping properties - -#+begin_src matlab - ty.K = [2e8; 1e8; 2e8; 6e7; 9e7; 6e7]; % [N/m, N*m/rad] - ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 1e4]; % [N/(m/s), N*m/(rad/s)] -#+end_src - -**** Save the Structure -#+begin_src matlab -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'ty', '-append'); - else - save('mat/nass_model_stages.mat', 'ty'); + arguments + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'ty', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'ty'); + + ty = struct(); + + switch args.type + case 'none' + ty.type = 0; + case 'rigid' + ty.type = 1; + case 'flexible' + ty.type = 2; end + + % Ty Granite frame + ty.granite_frame.density = 7800; % [kg/m3] => 43kg + ty.granite_frame.STEP = 'Ty_Granite_Frame.STEP'; + + % Guide Translation Ty + ty.guide.density = 7800; % [kg/m3] => 76kg + ty.guide.STEP = 'Ty_Guide.STEP'; + + % Ty - Guide_Translation12 + ty.guide12.density = 7800; % [kg/m3] + ty.guide12.STEP = 'Ty_Guide_12.STEP'; + + % Ty - Guide_Translation11 + ty.guide11.density = 7800; % [kg/m3] + ty.guide11.STEP = 'Ty_Guide_11.STEP'; + + % Ty - Guide_Translation22 + ty.guide22.density = 7800; % [kg/m3] + ty.guide22.STEP = 'Ty_Guide_22.STEP'; + + % Ty - Guide_Translation21 + ty.guide21.density = 7800; % [kg/m3] + ty.guide21.STEP = 'Ty_Guide_21.STEP'; + + % Ty - Plateau translation + ty.frame.density = 7800; % [kg/m3] + ty.frame.STEP = 'Ty_Stage.STEP'; + + % Ty Stator Part + ty.stator.density = 5400; % [kg/m3] + ty.stator.STEP = 'Ty_Motor_Stator.STEP'; + + % Ty Rotor Part + ty.rotor.density = 5400; % [kg/m3] + ty.rotor.STEP = 'Ty_Motor_Rotor.STEP'; + + ty.K = [2e8; 1e8; 2e8; 6e7; 9e7; 6e7]; % [N/m, N*m/rad] + ty.C = [8e4; 5e4; 8e4; 2e4; 3e4; 1e4]; % [N/(m/s), N*m/(rad/s)] + + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'ty', '-append'); + else + save('mat/nass_model_stages.mat', 'ty'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'ty', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'ty'); + end + end + end #+end_src *** =initializeRy=: Tilt Stage -:PROPERTIES: -:header-args:matlab+: :tangle matlab/src/initializeRy.m -:header-args:matlab+: :comments none :mkdirp yes :eval no -:END: +#+begin_src matlab :tangle matlab/src/initializeRy.m :comments none :mkdirp yes :eval no +function [ry] = initializeRy(args) -**** Function description -#+begin_src matlab - function [ry] = initializeRy(args) -#+end_src - -**** Optional Parameters -#+begin_src matlab - arguments - args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' - args.Ry_init (1,1) double {mustBeNumeric} = 0 - end -#+end_src - -**** Structure initialization -First, we initialize the =ry= structure. -#+begin_src matlab - ry = struct(); -#+end_src - - -**** Add Tilt Type -#+begin_src matlab - switch args.type - case 'none' - ry.type = 0; - case 'rigid' - ry.type = 1; - case 'flexible' - ry.type = 2; - end -#+end_src - -**** Material and Geometry -Properties of the Material and link to the geometry of the Tilt stage. -#+begin_src matlab - % Ry - Guide for the tilt stage - ry.guide.density = 7800; % [kg/m3] - ry.guide.STEP = 'Tilt_Guide.STEP'; - - % Ry - Rotor of the motor - ry.rotor.density = 2400; % [kg/m3] - ry.rotor.STEP = 'Tilt_Motor_Axis.STEP'; - - % Ry - Motor - ry.motor.density = 3200; % [kg/m3] - ry.motor.STEP = 'Tilt_Motor.STEP'; - - % Ry - Plateau Tilt - ry.stage.density = 7800; % [kg/m3] - ry.stage.STEP = 'Tilt_Stage.STEP'; -#+end_src - -Z-Offset so that the center of rotation matches the sample center; -#+begin_src matlab - ry.z_offset = 0.58178; % [m] -#+end_src - -#+begin_src matlab - ry.Ry_init = args.Ry_init; % [rad] -#+end_src - -**** Stiffness and Damping properties - -#+begin_src matlab - ry.K = [3.8e8; 4e8; 3.8e8; 1.2e8; 6e4; 1.2e8]; - ry.C = [1e5; 1e5; 1e5; 3e4; 1e3; 3e4]; -#+end_src - -**** Save the Structure -#+begin_src matlab -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'ry', '-append'); - else - save('mat/nass_model_stages.mat', 'ry'); + arguments + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' + args.Ry_init (1,1) double {mustBeNumeric} = 0 end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'ry', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'ry'); + + ry = struct(); + + switch args.type + case 'none' + ry.type = 0; + case 'rigid' + ry.type = 1; + case 'flexible' + ry.type = 2; end + + % Ry - Guide for the tilt stage + ry.guide.density = 7800; % [kg/m3] + ry.guide.STEP = 'Tilt_Guide.STEP'; + + % Ry - Rotor of the motor + ry.rotor.density = 2400; % [kg/m3] + ry.rotor.STEP = 'Tilt_Motor_Axis.STEP'; + + % Ry - Motor + ry.motor.density = 3200; % [kg/m3] + ry.motor.STEP = 'Tilt_Motor.STEP'; + + % Ry - Plateau Tilt + ry.stage.density = 7800; % [kg/m3] + ry.stage.STEP = 'Tilt_Stage.STEP'; + + % Z-Offset so that the center of rotation matches the sample center; + ry.z_offset = 0.58178; % [m] + + ry.Ry_init = args.Ry_init; % [rad] + + ry.K = [3.8e8; 4e8; 3.8e8; 1.2e8; 6e4; 1.2e8]; + ry.C = [1e5; 1e5; 1e5; 3e4; 1e3; 3e4]; + + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'ry', '-append'); + else + save('mat/nass_model_stages.mat', 'ry'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'ry', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'ry'); + end + end + end #+end_src *** =initializeRz=: Spindle -:PROPERTIES: -:header-args:matlab+: :tangle matlab/src/initializeRz.m -:header-args:matlab+: :comments none :mkdirp yes :eval no -:END: +#+begin_src matlab :tangle matlab/src/initializeRz.m :comments none :mkdirp yes :eval no +function [rz] = initializeRz(args) -**** Function description -#+begin_src matlab - function [rz] = initializeRz(args) -#+end_src - -**** Optional Parameters -#+begin_src matlab - arguments - args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' - end -#+end_src - -**** Structure initialization -First, we initialize the =rz= structure. -#+begin_src matlab - rz = struct(); -#+end_src - -**** Add Spindle Type -#+begin_src matlab - switch args.type - case 'none' - rz.type = 0; - case 'rigid' - rz.type = 1; - case 'flexible' - rz.type = 2; - end -#+end_src - -**** Material and Geometry - -Properties of the Material and link to the geometry of the spindle. -#+begin_src matlab - % Spindle - Slip Ring - rz.slipring.density = 7800; % [kg/m3] - rz.slipring.STEP = 'Spindle_Slip_Ring.STEP'; - - % Spindle - Rotor - rz.rotor.density = 7800; % [kg/m3] - rz.rotor.STEP = 'Spindle_Rotor.STEP'; - - % Spindle - Stator - rz.stator.density = 7800; % [kg/m3] - rz.stator.STEP = 'Spindle_Stator.STEP'; -#+end_src - -**** Stiffness and Damping properties - -#+begin_src matlab - rz.K = [7e8; 7e8; 2e9; 1e7; 1e7; 1e7]; - rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4]; -#+end_src - -**** Save the Structure -#+begin_src matlab -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'rz', '-append'); - else - save('mat/nass_model_stages.mat', 'rz'); + arguments + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'rz', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'rz'); + + rz = struct(); + + switch args.type + case 'none' + rz.type = 0; + case 'rigid' + rz.type = 1; + case 'flexible' + rz.type = 2; end + + % Spindle - Slip Ring + rz.slipring.density = 7800; % [kg/m3] + rz.slipring.STEP = 'Spindle_Slip_Ring.STEP'; + + % Spindle - Rotor + rz.rotor.density = 7800; % [kg/m3] + rz.rotor.STEP = 'Spindle_Rotor.STEP'; + + % Spindle - Stator + rz.stator.density = 7800; % [kg/m3] + rz.stator.STEP = 'Spindle_Stator.STEP'; + + rz.K = [7e8; 7e8; 2e9; 1e7; 1e7; 1e7]; + rz.C = [4e4; 4e4; 7e4; 1e4; 1e4; 1e4]; + + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'rz', '-append'); + else + save('mat/nass_model_stages.mat', 'rz'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'rz', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'rz'); + end + end + end #+end_src *** =initializeMicroHexapod=: Micro Hexapod -:PROPERTIES: -:header-args:matlab+: :tangle matlab/src/initializeMicroHexapod.m -:header-args:matlab+: :comments none :mkdirp yes :eval no -:END: -**** Function description -#+begin_src matlab - function [micro_hexapod] = initializeMicroHexapod(args) -#+end_src +#+begin_src matlab :tangle matlab/src/initializeMicroHexapod.m :comments none :mkdirp yes :eval no +function [micro_hexapod] = initializeMicroHexapod(args) -**** Optional Parameters -#+begin_src matlab - arguments - args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' - % initializeFramesPositions - args.H (1,1) double {mustBeNumeric, mustBePositive} = 350e-3 - args.MO_B (1,1) double {mustBeNumeric} = 270e-3 - % generateGeneralConfiguration - args.FH (1,1) double {mustBeNumeric, mustBePositive} = 50e-3 - args.FR (1,1) double {mustBeNumeric, mustBePositive} = 175.5e-3 - args.FTh (6,1) double {mustBeNumeric} = [-10, 10, 120-10, 120+10, 240-10, 240+10]*(pi/180) - args.MH (1,1) double {mustBeNumeric, mustBePositive} = 45e-3 - args.MR (1,1) double {mustBeNumeric, mustBePositive} = 118e-3 - args.MTh (6,1) double {mustBeNumeric} = [-60+10, 60-10, 60+10, 180-10, 180+10, -60-10]*(pi/180) - % initializeStrutDynamics - args.Ki (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e7*ones(6,1) - args.Ci (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.4e3*ones(6,1) - % initializeCylindricalPlatforms - args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 10 - args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 26e-3 - args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 207.5e-3 - args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 10 - args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 26e-3 - args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 150e-3 - % initializeCylindricalStruts - args.Fsm (1,1) double {mustBeNumeric, mustBePositive} = 1 - args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 100e-3 - args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 25e-3 - args.Msm (1,1) double {mustBeNumeric, mustBePositive} = 1 - args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 100e-3 - args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 25e-3 - % inverseKinematics - args.AP (3,1) double {mustBeNumeric} = zeros(3,1) - args.ARB (3,3) double {mustBeNumeric} = eye(3) - end -#+end_src - -**** Function content -#+begin_src matlab - stewart = initializeStewartPlatform(); - - stewart = initializeFramesPositions(stewart, ... - 'H', args.H, ... - 'MO_B', args.MO_B); - - stewart = generateGeneralConfiguration(stewart, ... - 'FH', args.FH, ... - 'FR', args.FR, ... - 'FTh', args.FTh, ... - 'MH', args.MH, ... - 'MR', args.MR, ... - 'MTh', args.MTh); - - stewart = computeJointsPose(stewart); -#+end_src - -#+begin_src matlab - stewart = initializeStrutDynamics(stewart, ... - 'K', args.Ki, ... - 'C', args.Ci); - - stewart = initializeJointDynamics(stewart, ... - 'type_F', 'universal_p', ... - 'type_M', 'spherical_p'); -#+end_src - -#+begin_src matlab - stewart = initializeCylindricalPlatforms(stewart, ... - 'Fpm', args.Fpm, ... - 'Fph', args.Fph, ... - 'Fpr', args.Fpr, ... - 'Mpm', args.Mpm, ... - 'Mph', args.Mph, ... - 'Mpr', args.Mpr); - - stewart = initializeCylindricalStruts(stewart, ... - 'Fsm', args.Fsm, ... - 'Fsh', args.Fsh, ... - 'Fsr', args.Fsr, ... - 'Msm', args.Msm, ... - 'Msh', args.Msh, ... - 'Msr', args.Msr); - - stewart = computeJacobian(stewart); - - stewart = initializeStewartPose(stewart, ... - 'AP', args.AP, ... - 'ARB', args.ARB); -#+end_src - -#+begin_src matlab - stewart = initializeInertialSensor(stewart, 'type', 'none'); -#+end_src - -**** Add Type -#+begin_src matlab - switch args.type - case 'none' - stewart.type = 0; - case 'rigid' - stewart.type = 1; - case 'flexible' - stewart.type = 2; - end -#+end_src - -**** Save the Structure -#+begin_src matlab -micro_hexapod = stewart; -if exist('./mat', 'dir') - if exist('./mat/nass_model_stages.mat', 'file') - save('mat/nass_model_stages.mat', 'micro_hexapod', '-append'); - else - save('mat/nass_model_stages.mat', 'micro_hexapod'); + arguments + args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'flexible' + % initializeFramesPositions + args.H (1,1) double {mustBeNumeric, mustBePositive} = 350e-3 + args.MO_B (1,1) double {mustBeNumeric} = 270e-3 + % generateGeneralConfiguration + args.FH (1,1) double {mustBeNumeric, mustBePositive} = 50e-3 + args.FR (1,1) double {mustBeNumeric, mustBePositive} = 175.5e-3 + args.FTh (6,1) double {mustBeNumeric} = [-10, 10, 120-10, 120+10, 240-10, 240+10]*(pi/180) + args.MH (1,1) double {mustBeNumeric, mustBePositive} = 45e-3 + args.MR (1,1) double {mustBeNumeric, mustBePositive} = 118e-3 + args.MTh (6,1) double {mustBeNumeric} = [-60+10, 60-10, 60+10, 180-10, 180+10, -60-10]*(pi/180) + % initializeStrutDynamics + args.Ki (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e7*ones(6,1) + args.Ci (6,1) double {mustBeNumeric, mustBeNonnegative} = 1.4e3*ones(6,1) + % initializeCylindricalPlatforms + args.Fpm (1,1) double {mustBeNumeric, mustBePositive} = 10 + args.Fph (1,1) double {mustBeNumeric, mustBePositive} = 26e-3 + args.Fpr (1,1) double {mustBeNumeric, mustBePositive} = 207.5e-3 + args.Mpm (1,1) double {mustBeNumeric, mustBePositive} = 10 + args.Mph (1,1) double {mustBeNumeric, mustBePositive} = 26e-3 + args.Mpr (1,1) double {mustBeNumeric, mustBePositive} = 150e-3 + % initializeCylindricalStruts + args.Fsm (1,1) double {mustBeNumeric, mustBePositive} = 1 + args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 100e-3 + args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 25e-3 + args.Msm (1,1) double {mustBeNumeric, mustBePositive} = 1 + args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 100e-3 + args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 25e-3 + % inverseKinematics + args.AP (3,1) double {mustBeNumeric} = zeros(3,1) + args.ARB (3,3) double {mustBeNumeric} = eye(3) end -elseif exist('./matlab', 'dir') - if exist('./matlab/mat/nass_model_stages.mat', 'file') - save('matlab/mat/nass_model_stages.mat', 'micro_hexapod', '-append'); - else - save('matlab/mat/nass_model_stages.mat', 'micro_hexapod'); + + stewart = initializeStewartPlatform(); + + stewart = initializeFramesPositions(stewart, ... + 'H', args.H, ... + 'MO_B', args.MO_B); + + stewart = generateGeneralConfiguration(stewart, ... + 'FH', args.FH, ... + 'FR', args.FR, ... + 'FTh', args.FTh, ... + 'MH', args.MH, ... + 'MR', args.MR, ... + 'MTh', args.MTh); + + stewart = computeJointsPose(stewart); + + stewart = initializeStrutDynamics(stewart, ... + 'K', args.Ki, ... + 'C', args.Ci); + + stewart = initializeJointDynamics(stewart, ... + 'type_F', 'universal_p', ... + 'type_M', 'spherical_p'); + + stewart = initializeCylindricalPlatforms(stewart, ... + 'Fpm', args.Fpm, ... + 'Fph', args.Fph, ... + 'Fpr', args.Fpr, ... + 'Mpm', args.Mpm, ... + 'Mph', args.Mph, ... + 'Mpr', args.Mpr); + + stewart = initializeCylindricalStruts(stewart, ... + 'Fsm', args.Fsm, ... + 'Fsh', args.Fsh, ... + 'Fsr', args.Fsr, ... + 'Msm', args.Msm, ... + 'Msh', args.Msh, ... + 'Msr', args.Msr); + + stewart = computeJacobian(stewart); + + stewart = initializeStewartPose(stewart, ... + 'AP', args.AP, ... + 'ARB', args.ARB); + + stewart = initializeInertialSensor(stewart, 'type', 'none'); + + switch args.type + case 'none' + stewart.type = 0; + case 'rigid' + stewart.type = 1; + case 'flexible' + stewart.type = 2; + end + + micro_hexapod = stewart; + if exist('./mat', 'dir') + if exist('./mat/nass_model_stages.mat', 'file') + save('mat/nass_model_stages.mat', 'micro_hexapod', '-append'); + else + save('mat/nass_model_stages.mat', 'micro_hexapod'); + end + elseif exist('./matlab', 'dir') + if exist('./matlab/mat/nass_model_stages.mat', 'file') + save('matlab/mat/nass_model_stages.mat', 'micro_hexapod', '-append'); + else + save('matlab/mat/nass_model_stages.mat', 'micro_hexapod'); + end end end #+end_src