diff --git a/matlab/nano_hexapod/apa300ml_flexible.slx b/matlab/nano_hexapod/apa300ml_flexible.slx index 06c2cc6..81f0720 100644 Binary files a/matlab/nano_hexapod/apa300ml_flexible.slx and b/matlab/nano_hexapod/apa300ml_flexible.slx differ diff --git a/matlab/nano_hexapod/nano_hexapod_left_strut.slx b/matlab/nano_hexapod/nano_hexapod_left_strut.slx index 8247038..91fdbaa 100644 Binary files a/matlab/nano_hexapod/nano_hexapod_left_strut.slx and b/matlab/nano_hexapod/nano_hexapod_left_strut.slx differ diff --git a/matlab/nano_hexapod/nano_hexapod_right_strut.slx b/matlab/nano_hexapod/nano_hexapod_right_strut.slx index 38855a8..2ff3acb 100644 Binary files a/matlab/nano_hexapod/nano_hexapod_right_strut.slx and b/matlab/nano_hexapod/nano_hexapod_right_strut.slx differ diff --git a/matlab/nano_hexapod/nano_hexapod_subsystem.slx b/matlab/nano_hexapod/nano_hexapod_subsystem.slx index 75eab3b..90583fd 100644 Binary files a/matlab/nano_hexapod/nano_hexapod_subsystem.slx and b/matlab/nano_hexapod/nano_hexapod_subsystem.slx differ diff --git a/org/nano_hexapod.org b/org/nano_hexapod.org index 945a97d..1a030cc 100644 --- a/org/nano_hexapod.org +++ b/org/nano_hexapod.org @@ -3436,28 +3436,32 @@ function [nano_hexapod] = initializeNanoHexapodFinal(args) arguments %% Bottom Flexible Joints args.flex_bot_type char {mustBeMember(args.flex_bot_type,{'2dof', '3dof', '4dof', 'flexible'})} = '4dof' - args.flex_bot_kRx (6,1) double {mustBeNumeric} = ones(6,1)*3.5 % X bending stiffness [Nm/rad] - args.flex_bot_kRy (6,1) double {mustBeNumeric} = ones(6,1)*3.5 % Y bending stiffness [Nm/rad] + args.flex_bot_kRx (6,1) double {mustBeNumeric} = ones(6,1)*5 % X bending stiffness [Nm/rad] + args.flex_bot_kRy (6,1) double {mustBeNumeric} = ones(6,1)*5 % Y bending stiffness [Nm/rad] args.flex_bot_kRz (6,1) double {mustBeNumeric} = ones(6,1)*260 % Torsionnal stiffness [Nm/rad] - args.flex_bot_kz (6,1) double {mustBeNumeric} = ones(6,1)*8e7 % Axial Stiffness [N/m] - args.flex_bot_cRx (6,1) double {mustBeNumeric} = ones(6,1)*0 % X bending Damping [Nm/(rad/s)] - args.flex_bot_cRy (6,1) double {mustBeNumeric} = ones(6,1)*0 % Y bending Damping [Nm/(rad/s)] - args.flex_bot_cRz (6,1) double {mustBeNumeric} = ones(6,1)*0 % Torsionnal Damping [Nm/(rad/s)] - args.flex_bot_cz (6,1) double {mustBeNumeric} = ones(6,1)*0 % Axial Damping [N/(m/s)] + args.flex_bot_kz (6,1) double {mustBeNumeric} = ones(6,1)*7e7 % Axial Stiffness [N/m] + args.flex_bot_cRx (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % X bending Damping [Nm/(rad/s)] + args.flex_bot_cRy (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Y bending Damping [Nm/(rad/s)] + args.flex_bot_cRz (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Torsionnal Damping [Nm/(rad/s)] + args.flex_bot_cz (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Axial Damping [N/(m/s)] + %% Top Flexible Joints args.flex_top_type char {mustBeMember(args.flex_top_type,{'2dof', '3dof', '4dof', 'flexible'})} = '4dof' - args.flex_top_kRx (6,1) double {mustBeNumeric} = ones(6,1)*3.5 % X bending stiffness [Nm/rad] - args.flex_top_kRy (6,1) double {mustBeNumeric} = ones(6,1)*3.5 % Y bending stiffness [Nm/rad] + args.flex_top_kRx (6,1) double {mustBeNumeric} = ones(6,1)*5 % X bending stiffness [Nm/rad] + args.flex_top_kRy (6,1) double {mustBeNumeric} = ones(6,1)*5 % Y bending stiffness [Nm/rad] args.flex_top_kRz (6,1) double {mustBeNumeric} = ones(6,1)*260 % Torsionnal stiffness [Nm/rad] - args.flex_top_kz (6,1) double {mustBeNumeric} = ones(6,1)*8e7 % Axial Stiffness [N/m] - args.flex_top_cRx (6,1) double {mustBeNumeric} = ones(6,1)*0 % X bending Damping [Nm/(rad/s)] - args.flex_top_cRy (6,1) double {mustBeNumeric} = ones(6,1)*0 % Y bending Damping [Nm/(rad/s)] - args.flex_top_cRz (6,1) double {mustBeNumeric} = ones(6,1)*0 % Torsionnal Damping [Nm/(rad/s)] - args.flex_top_cz (6,1) double {mustBeNumeric} = ones(6,1)*0 % Axial Damping [N/(m/s)] + args.flex_top_kz (6,1) double {mustBeNumeric} = ones(6,1)*7e7 % Axial Stiffness [N/m] + args.flex_top_cRx (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % X bending Damping [Nm/(rad/s)] + args.flex_top_cRy (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Y bending Damping [Nm/(rad/s)] + args.flex_top_cRz (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Torsionnal Damping [Nm/(rad/s)] + args.flex_top_cz (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Axial Damping [N/(m/s)] + %% Jacobian - Location of frame {A} and {B} args.MO_B (1,1) double {mustBeNumeric} = 150e-3 % Height of {B} w.r.t. {M} [m] + %% Relative Motion Sensor args.motion_sensor_type char {mustBeMember(args.motion_sensor_type,{'struts', 'plates'})} = 'struts' + %% Actuators args.actuator_type char {mustBeMember(args.actuator_type,{'2dof', 'flexible frame', 'flexible'})} = 'flexible' args.actuator_Ga (6,1) double {mustBeNumeric} = zeros(6,1) % Actuator gain [N/V] @@ -3473,10 +3477,13 @@ arguments % For Flexible Frame args.actuator_ks (6,1) double {mustBeNumeric} = ones(6,1)*235e6 % Stiffness of one stack [N/m] args.actuator_cs (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % Stiffness of one stack [N/m] + % Misalignment + args.actuator_d_align (6,3) double {mustBeNumeric} = zeros(6,3) % [m] args.actuator_xi (1,1) double {mustBeNumeric} = 0.01 % Damping Ratio + %% Controller - args.controller_type char {mustBeMember(args.controller_type,{'none', 'iff', 'dvf'})} = 'none' + args.controller_type char {mustBeMember(args.controller_type,{'none', 'iff', 'dvf', 'hac-iff-struts'})} = 'none' end #+end_src @@ -3613,36 +3620,39 @@ else end #+end_src -2dof -#+begin_src matlab -nano_hexapod.actuator.k = args.actuator_k; % [N/m] -nano_hexapod.actuator.ke = args.actuator_ke; % [N/m] -nano_hexapod.actuator.ka = args.actuator_ka; % [N/m] - -nano_hexapod.actuator.c = args.actuator_c; % [N/(m/s)] -nano_hexapod.actuator.ce = args.actuator_ce; % [N/(m/s)] -nano_hexapod.actuator.ca = args.actuator_ca; % [N/(m/s)] - -nano_hexapod.actuator.Leq = args.actuator_Leq; % [m] -#+end_src - -Flexible frame and fully flexible +Mechanical characteristics: #+begin_src matlab switch args.actuator_type + case '2dof' + nano_hexapod.actuator.k = args.actuator_k; % [N/m] + nano_hexapod.actuator.ke = args.actuator_ke; % [N/m] + nano_hexapod.actuator.ka = args.actuator_ka; % [N/m] + + nano_hexapod.actuator.c = args.actuator_c; % [N/(m/s)] + nano_hexapod.actuator.ce = args.actuator_ce; % [N/(m/s)] + nano_hexapod.actuator.ca = args.actuator_ca; % [N/(m/s)] + + nano_hexapod.actuator.Leq = args.actuator_Leq; % [m] + case 'flexible frame' nano_hexapod.actuator.K = readmatrix('APA300ML_b_mat_K.CSV'); % Stiffness Matrix nano_hexapod.actuator.M = readmatrix('APA300ML_b_mat_M.CSV'); % Mass Matrix nano_hexapod.actuator.P = extractNodes('APA300ML_b_out_nodes_3D.txt'); % Node coordinates [m] + + nano_hexapod.actuator.ks = args.actuator_ks; % Stiffness of one stack [N/m] + nano_hexapod.actuator.cs = args.actuator_cs; % Damping of one stack [N/m] + nano_hexapod.actuator.xi = args.actuator_xi; % Damping ratio + case 'flexible' nano_hexapod.actuator.K = readmatrix('full_APA300ML_K.CSV'); % Stiffness Matrix nano_hexapod.actuator.M = readmatrix('full_APA300ML_M.CSV'); % Mass Matrix nano_hexapod.actuator.P = extractNodes('full_APA300ML_out_nodes_3D.txt'); % Node coordiantes [m] + + nano_hexapod.actuator.d_align = args.actuator_d_align; % Misalignment + nano_hexapod.actuator.xi = args.actuator_xi; % Damping ratio + end -nano_hexapod.actuator.xi = args.actuator_xi; % Damping ratio - -nano_hexapod.actuator.ks = args.actuator_ks; % Stiffness of one stack [N/m] -nano_hexapod.actuator.cs = args.actuator_cs; % Damping of one stack [N/m] #+end_src ** Geometry @@ -3744,6 +3754,8 @@ switch args.controller_type nano_hexapod.controller.type = 2; case 'dvf' nano_hexapod.controller.type = 3; + case 'hac-iff-struts' + nano_hexapod.controller.type = 4; end #+end_src diff --git a/src/initializeNanoHexapodFinal.m b/src/initializeNanoHexapodFinal.m index 9100c98..149324f 100644 --- a/src/initializeNanoHexapodFinal.m +++ b/src/initializeNanoHexapodFinal.m @@ -3,28 +3,32 @@ function [nano_hexapod] = initializeNanoHexapodFinal(args) arguments %% Bottom Flexible Joints args.flex_bot_type char {mustBeMember(args.flex_bot_type,{'2dof', '3dof', '4dof', 'flexible'})} = '4dof' - args.flex_bot_kRx (6,1) double {mustBeNumeric} = ones(6,1)*3.5 % X bending stiffness [Nm/rad] - args.flex_bot_kRy (6,1) double {mustBeNumeric} = ones(6,1)*3.5 % Y bending stiffness [Nm/rad] + args.flex_bot_kRx (6,1) double {mustBeNumeric} = ones(6,1)*5 % X bending stiffness [Nm/rad] + args.flex_bot_kRy (6,1) double {mustBeNumeric} = ones(6,1)*5 % Y bending stiffness [Nm/rad] args.flex_bot_kRz (6,1) double {mustBeNumeric} = ones(6,1)*260 % Torsionnal stiffness [Nm/rad] - args.flex_bot_kz (6,1) double {mustBeNumeric} = ones(6,1)*8e7 % Axial Stiffness [N/m] - args.flex_bot_cRx (6,1) double {mustBeNumeric} = ones(6,1)*0 % X bending Damping [Nm/(rad/s)] - args.flex_bot_cRy (6,1) double {mustBeNumeric} = ones(6,1)*0 % Y bending Damping [Nm/(rad/s)] - args.flex_bot_cRz (6,1) double {mustBeNumeric} = ones(6,1)*0 % Torsionnal Damping [Nm/(rad/s)] - args.flex_bot_cz (6,1) double {mustBeNumeric} = ones(6,1)*0 % Axial Damping [N/(m/s)] + args.flex_bot_kz (6,1) double {mustBeNumeric} = ones(6,1)*7e7 % Axial Stiffness [N/m] + args.flex_bot_cRx (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % X bending Damping [Nm/(rad/s)] + args.flex_bot_cRy (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Y bending Damping [Nm/(rad/s)] + args.flex_bot_cRz (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Torsionnal Damping [Nm/(rad/s)] + args.flex_bot_cz (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Axial Damping [N/(m/s)] + %% Top Flexible Joints args.flex_top_type char {mustBeMember(args.flex_top_type,{'2dof', '3dof', '4dof', 'flexible'})} = '4dof' - args.flex_top_kRx (6,1) double {mustBeNumeric} = ones(6,1)*3.5 % X bending stiffness [Nm/rad] - args.flex_top_kRy (6,1) double {mustBeNumeric} = ones(6,1)*3.5 % Y bending stiffness [Nm/rad] + args.flex_top_kRx (6,1) double {mustBeNumeric} = ones(6,1)*5 % X bending stiffness [Nm/rad] + args.flex_top_kRy (6,1) double {mustBeNumeric} = ones(6,1)*5 % Y bending stiffness [Nm/rad] args.flex_top_kRz (6,1) double {mustBeNumeric} = ones(6,1)*260 % Torsionnal stiffness [Nm/rad] - args.flex_top_kz (6,1) double {mustBeNumeric} = ones(6,1)*8e7 % Axial Stiffness [N/m] - args.flex_top_cRx (6,1) double {mustBeNumeric} = ones(6,1)*0 % X bending Damping [Nm/(rad/s)] - args.flex_top_cRy (6,1) double {mustBeNumeric} = ones(6,1)*0 % Y bending Damping [Nm/(rad/s)] - args.flex_top_cRz (6,1) double {mustBeNumeric} = ones(6,1)*0 % Torsionnal Damping [Nm/(rad/s)] - args.flex_top_cz (6,1) double {mustBeNumeric} = ones(6,1)*0 % Axial Damping [N/(m/s)] + args.flex_top_kz (6,1) double {mustBeNumeric} = ones(6,1)*7e7 % Axial Stiffness [N/m] + args.flex_top_cRx (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % X bending Damping [Nm/(rad/s)] + args.flex_top_cRy (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Y bending Damping [Nm/(rad/s)] + args.flex_top_cRz (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Torsionnal Damping [Nm/(rad/s)] + args.flex_top_cz (6,1) double {mustBeNumeric} = ones(6,1)*0.001 % Axial Damping [N/(m/s)] + %% Jacobian - Location of frame {A} and {B} args.MO_B (1,1) double {mustBeNumeric} = 150e-3 % Height of {B} w.r.t. {M} [m] + %% Relative Motion Sensor args.motion_sensor_type char {mustBeMember(args.motion_sensor_type,{'struts', 'plates'})} = 'struts' + %% Actuators args.actuator_type char {mustBeMember(args.actuator_type,{'2dof', 'flexible frame', 'flexible'})} = 'flexible' args.actuator_Ga (6,1) double {mustBeNumeric} = zeros(6,1) % Actuator gain [N/V] @@ -40,10 +44,13 @@ arguments % For Flexible Frame args.actuator_ks (6,1) double {mustBeNumeric} = ones(6,1)*235e6 % Stiffness of one stack [N/m] args.actuator_cs (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % Stiffness of one stack [N/m] + % Misalignment + args.actuator_d_align (6,3) double {mustBeNumeric} = zeros(6,3) % [m] args.actuator_xi (1,1) double {mustBeNumeric} = 0.01 % Damping Ratio + %% Controller - args.controller_type char {mustBeMember(args.controller_type,{'none', 'iff', 'dvf'})} = 'none' + args.controller_type char {mustBeMember(args.controller_type,{'none', 'iff', 'dvf', 'hac-iff-struts'})} = 'none' end nano_hexapod = struct(); @@ -142,32 +149,37 @@ else nano_hexapod.actuator.Gs = args.actuator_Gs; % Sensor gain [V/m] end -nano_hexapod.actuator.k = args.actuator_k; % [N/m] -nano_hexapod.actuator.ke = args.actuator_ke; % [N/m] -nano_hexapod.actuator.ka = args.actuator_ka; % [N/m] - -nano_hexapod.actuator.c = args.actuator_c; % [N/(m/s)] -nano_hexapod.actuator.ce = args.actuator_ce; % [N/(m/s)] -nano_hexapod.actuator.ca = args.actuator_ca; % [N/(m/s)] - -nano_hexapod.actuator.Leq = args.actuator_Leq; % [m] - switch args.actuator_type + case '2dof' + nano_hexapod.actuator.k = args.actuator_k; % [N/m] + nano_hexapod.actuator.ke = args.actuator_ke; % [N/m] + nano_hexapod.actuator.ka = args.actuator_ka; % [N/m] + + nano_hexapod.actuator.c = args.actuator_c; % [N/(m/s)] + nano_hexapod.actuator.ce = args.actuator_ce; % [N/(m/s)] + nano_hexapod.actuator.ca = args.actuator_ca; % [N/(m/s)] + + nano_hexapod.actuator.Leq = args.actuator_Leq; % [m] + case 'flexible frame' nano_hexapod.actuator.K = readmatrix('APA300ML_b_mat_K.CSV'); % Stiffness Matrix nano_hexapod.actuator.M = readmatrix('APA300ML_b_mat_M.CSV'); % Mass Matrix nano_hexapod.actuator.P = extractNodes('APA300ML_b_out_nodes_3D.txt'); % Node coordinates [m] + + nano_hexapod.actuator.ks = args.actuator_ks; % Stiffness of one stack [N/m] + nano_hexapod.actuator.cs = args.actuator_cs; % Damping of one stack [N/m] + nano_hexapod.actuator.xi = args.actuator_xi; % Damping ratio + case 'flexible' nano_hexapod.actuator.K = readmatrix('full_APA300ML_K.CSV'); % Stiffness Matrix nano_hexapod.actuator.M = readmatrix('full_APA300ML_M.CSV'); % Mass Matrix nano_hexapod.actuator.P = extractNodes('full_APA300ML_out_nodes_3D.txt'); % Node coordiantes [m] + + nano_hexapod.actuator.d_align = args.actuator_d_align; % Misalignment + nano_hexapod.actuator.xi = args.actuator_xi; % Damping ratio + end -nano_hexapod.actuator.xi = args.actuator_xi; % Damping ratio - -nano_hexapod.actuator.ks = args.actuator_ks; % Stiffness of one stack [N/m] -nano_hexapod.actuator.cs = args.actuator_cs; % Damping of one stack [N/m] - nano_hexapod.geometry = struct(); Fa = [[-86.05, -74.78, 22.49], @@ -224,6 +236,8 @@ switch args.controller_type nano_hexapod.controller.type = 2; case 'dvf' nano_hexapod.controller.type = 3; + case 'hac-iff-struts' + nano_hexapod.controller.type = 4; end if nargout == 0