Update sensor/actuator constants
This commit is contained in:
parent
2a6e6bab27
commit
90d6582c7c
Binary file not shown.
@ -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
|
||||
<<sec:iff_effect_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
|
||||
|
@ -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]
|
||||
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]
|
||||
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]
|
||||
|
Loading…
Reference in New Issue
Block a user