diff --git a/matlab/nano_hexapod/nano_hexapod.slx b/matlab/nano_hexapod/nano_hexapod.slx index dc9ea6a..0db1b1e 100644 Binary files a/matlab/nano_hexapod/nano_hexapod.slx and b/matlab/nano_hexapod/nano_hexapod.slx differ diff --git a/org/nano_hexapod.org b/org/nano_hexapod.org index 40cc879..64a3ec2 100644 --- a/org/nano_hexapod.org +++ b/org/nano_hexapod.org @@ -602,18 +602,18 @@ Also, the off diagonal terms are quite small compared to the diagonal terms. The bode plot is shown in Figure [[fig:nano_hexapod_struts_2dof_iff_plant]]. #+begin_src matlab :exports none -freqs = 5*logspace(0, 2, 1000); +freqs = 2*logspace(1, 3, 1000); figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); ax1 = nexttile([2,1]); hold on; -plot(freqs, abs(squeeze(freqresp(Giff(1,1), freqs, 'Hz'))), '-', ... +plot(freqs, 20*abs(squeeze(freqresp(Giff(1,1), freqs, 'Hz'))), '-', ... 'DisplayName', '$F_{m,i}/\tau_i$') for i = 1:6 set(gca,'ColorOrderIndex',1); - plot(freqs, abs(squeeze(freqresp(Giff(i,i), freqs, 'Hz'))), '-', ... + plot(freqs, 20*abs(squeeze(freqresp(Giff(i,i), freqs, 'Hz'))), '-', ... 'HandleVisibility', 'off'); end % Off diagonal terms @@ -1502,6 +1502,10 @@ exportFig('figs/nano_hexapod_iff_root_locus.pdf', 'width', 'wide', 'height', 'ta #+RESULTS: [[file:figs/nano_hexapod_iff_root_locus.png]] +#+begin_question +Are the zeros shown in the Root Locus (Figure [[fig:nano_hexapod_iff_root_locus]]) are the poles of the nano-hexapod when the active part of the strut ($k_e$ and $k_a$) is removed? +This will be checked in the next section. +#+end_question The obtained controller is then: #+begin_src matlab @@ -1553,6 +1557,41 @@ exportFig('figs/nano_hexapod_iff_loop_gain.pdf', 'width', 'wide', 'height', 'tal #+RESULTS: [[file:figs/nano_hexapod_iff_loop_gain.png]] +** Frequency of the zeros of the IFF plant +In order to find the zeros of the IFF plant, the hexapod is initialized with quasi null actuator stiffness and the system is identified. + +#+begin_src matlab +n_hexapod = initializeNanoHexapodFinal('flex_bot_type', '4dof', ... + 'flex_top_type', '4dof', ... + 'motion_sensor_type', 'struts', ... + 'actuator_type', '2dof', ... + 'actuator_ke', ones(6,1)*1e-1, ... + 'actuator_ka', ones(6,1)*1e-1); + +Giff_z = linearize(mdl, io, 0.0, options); +Giff_z.InputName = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; +Giff_z.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'}; +#+end_src + +Then, we can look at the frequency of the poles. +#+begin_src matlab :results value replace :exports results :tangle no +G_z = pole(Giff_z); +ans = sort(imag(G_z(imag(G_z)>0))) +#+end_src + +#+name: tab:iff_frequency_zero +#+caption: Frequency of the poles corresponding to the IFF zeros (Hz). +#+attr_latex: :environment tabularx :width 0.2\linewidth :align c +#+attr_latex: :center t :booktabs t :float t +| 50.750 | +| 51.483 | +| 117.94 | +| 157.79 | +| 197.21 | +| 198.47 | + +And we indeed find the frequency of the zeros for the IFF plant. + ** Effect of IFF on the plant <> @@ -3421,15 +3460,15 @@ arguments 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} = ones(6,1)*1 % Actuator gain [N/V] - args.actuator_Gs (6,1) double {mustBeNumeric} = ones(6,1)*1 % Sensor gain [V/m] + args.actuator_Ga (6,1) double {mustBeNumeric} = zeros(6,1) % Actuator gain [N/V] + args.actuator_Gs (6,1) double {mustBeNumeric} = zeros(6,1) % Sensor gain [V/m] % For 2DoF args.actuator_k (6,1) double {mustBeNumeric} = ones(6,1)*0.35e6 % [N/m] args.actuator_ke (6,1) double {mustBeNumeric} = ones(6,1)*1.5e6 % [N/m] args.actuator_ka (6,1) double {mustBeNumeric} = ones(6,1)*43e6 % [N/m] - args.actuator_c (6,1) double {mustBeNumeric} = ones(6,1)*3e1 % [N/(m/s)] - args.actuator_ce (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % [N/(m/s)] - args.actuator_ca (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % [N/(m/s)] + args.actuator_c (6,1) double {mustBeNumeric} = ones(6,1)*3e0 % [N/(m/s)] + args.actuator_ce (6,1) double {mustBeNumeric} = ones(6,1)*1e0 % [N/(m/s)] + args.actuator_ca (6,1) double {mustBeNumeric} = ones(6,1)*1e0 % [N/(m/s)] args.actuator_Leq (6,1) double {mustBeNumeric} = ones(6,1)*0.056 % [m] % For Flexible Frame args.actuator_ks (6,1) double {mustBeNumeric} = ones(6,1)*235e6 % Stiffness of one stack [N/m] @@ -3545,8 +3584,33 @@ end #+end_src #+begin_src matlab -nano_hexapod.actuator.Ga = args.actuator_Ga; % Actuator gain [N/V] -nano_hexapod.actuator.Gs = args.actuator_Gs; % Sensor gain [V/m] +%% Actuator gain [N/V] +if all(args.actuator_Ga == 0) + switch args.actuator_type + case '2dof' + nano_hexapod.actuator.Ga = ones(6,1)*(-46.4); + case 'flexible frame' + nano_hexapod.actuator.Ga = ones(6,1); % TODO + case 'flexible' + nano_hexapod.actuator.Ga = ones(6,1)*23.4; + end +else + nano_hexapod.actuator.Ga = args.actuator_Ga; % Actuator gain [N/V] +end + +%% Sensor gain [V/m] +if all(args.actuator_Gs == 0) + switch args.actuator_type + case '2dof' + nano_hexapod.actuator.Gs = ones(6,1)*0.098; + case 'flexible frame' + nano_hexapod.actuator.Gs = ones(6,1); % TODO + case 'flexible' + nano_hexapod.actuator.Gs = ones(6,1)*(-4674824); + end +else + nano_hexapod.actuator.Gs = args.actuator_Gs; % Sensor gain [V/m] +end #+end_src 2dof diff --git a/src/initializeNanoHexapodFinal.m b/src/initializeNanoHexapodFinal.m index 5a1e2ea..d3dd46f 100644 --- a/src/initializeNanoHexapodFinal.m +++ b/src/initializeNanoHexapodFinal.m @@ -27,20 +27,20 @@ arguments 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} = ones(6,1)*1 % Actuator gain [N/V] - args.actuator_Gs (6,1) double {mustBeNumeric} = ones(6,1)*1 % Sensor gain [V/m] - % For 2DoF + args.actuator_Ga (6,1) double {mustBeNumeric} = zeros(6,1) % Actuator gain [N/V] + args.actuator_Gs (6,1) double {mustBeNumeric} = zeros(6,1) % Sensor gain [V/m] + % For 2DoF args.actuator_k (6,1) double {mustBeNumeric} = ones(6,1)*0.35e6 % [N/m] args.actuator_ke (6,1) double {mustBeNumeric} = ones(6,1)*1.5e6 % [N/m] args.actuator_ka (6,1) double {mustBeNumeric} = ones(6,1)*43e6 % [N/m] - args.actuator_c (6,1) double {mustBeNumeric} = ones(6,1)*3e1 % [N/(m/s)] - args.actuator_ce (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % [N/(m/s)] - args.actuator_ca (6,1) double {mustBeNumeric} = ones(6,1)*1e1 % [N/(m/s)] + args.actuator_c (6,1) double {mustBeNumeric} = ones(6,1)*3e0 % [N/(m/s)] + args.actuator_ce (6,1) double {mustBeNumeric} = ones(6,1)*1e0 % [N/(m/s)] + args.actuator_ca (6,1) double {mustBeNumeric} = ones(6,1)*1e0 % [N/(m/s)] args.actuator_Leq (6,1) double {mustBeNumeric} = ones(6,1)*0.056 % [m] - % For Flexible Frame + % 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] - % For Flexible + args.actuator_xi (1,1) double {mustBeNumeric} = 0.01 % Damping Ratio %% Controller args.controller_type char {mustBeMember(args.controller_type,{'none', 'iff', 'dvf'})} = 'none' @@ -114,8 +114,33 @@ switch args.actuator_type nano_hexapod.actuator.type = 3; end -nano_hexapod.actuator.Ga = args.actuator_Ga; % Actuator gain [N/V] -nano_hexapod.actuator.Gs = args.actuator_Gs; % Sensor gain [V/m] +%% Actuator gain [N/V] +if all(args.actuator_Ga == 0) + switch args.actuator_type + case '2dof' + nano_hexapod.actuator.Ga = ones(6,1)*(-46.4); + case 'flexible frame' + nano_hexapod.actuator.Ga = ones(6,1); % TODO + case 'flexible' + nano_hexapod.actuator.Ga = ones(6,1)*23.4; + end +else + nano_hexapod.actuator.Ga = args.actuator_Ga; % Actuator gain [N/V] +end + +%% Sensor gain [V/m] +if all(args.actuator_Gs == 0) + switch args.actuator_type + case '2dof' + nano_hexapod.actuator.Gs = ones(6,1)*0.098; + case 'flexible frame' + nano_hexapod.actuator.Gs = ones(6,1); % TODO + case 'flexible' + nano_hexapod.actuator.Gs = ones(6,1)*(-4674824); + end +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]