Compare commits
4 Commits
d02aca0547
...
merged
Author | SHA1 | Date | |
---|---|---|---|
3ea609f7ce | |||
6e9f050efe | |||
9436d48cc1 | |||
6c1b878bb8 |
18
figs/inkscape/convert_svg.sh
Executable file
@@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Directory containing SVG files
|
||||
INPUT_DIR="."
|
||||
|
||||
# Loop through all SVG files in the directory
|
||||
for svg_file in "$INPUT_DIR"/*.svg; do
|
||||
# Check if there are SVG files in the directory
|
||||
if [ -f "$svg_file" ]; then
|
||||
# Output PDF file name
|
||||
pdf_file="../${svg_file%.svg}.pdf"
|
||||
png_file="../${svg_file%.svg}"
|
||||
|
||||
# Convert SVG to PDF using Inkscape
|
||||
inkscape "$svg_file" --export-filename="$pdf_file" && \
|
||||
pdftocairo -png -singlefile -cropbox "$pdf_file" "$png_file"
|
||||
fi
|
||||
done
|
Before Width: | Height: | Size: 338 KiB After Width: | Height: | Size: 338 KiB |
Before Width: | Height: | Size: 241 KiB After Width: | Height: | Size: 241 KiB |
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB |
Before Width: | Height: | Size: 229 KiB After Width: | Height: | Size: 229 KiB |
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 162 KiB |
Before Width: | Height: | Size: 321 KiB After Width: | Height: | Size: 321 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 265 KiB After Width: | Height: | Size: 265 KiB |
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 435 KiB After Width: | Height: | Size: 435 KiB |
Before Width: | Height: | Size: 194 KiB After Width: | Height: | Size: 194 KiB |
@@ -221,6 +221,19 @@ i_iff_hpf_md = i_iff_hpf_md(end)+1;
|
||||
i_iff_hpf_pz = find(opt_iff_hpf_xi_pz > 0.95*max(opt_iff_hpf_xi_pz));
|
||||
i_iff_hpf_pz = i_iff_hpf_pz(end)+1;
|
||||
|
||||
%% Define the obtained controllers
|
||||
Kiff_hpf_vc = Kiff*opt_iff_hpf_gain_vc(i_iff_hpf_vc);
|
||||
Kiff_hpf_vc.InputName = {'fu', 'fv'};
|
||||
Kiff_hpf_vc.OutputName = {'Fu', 'Fv'};
|
||||
|
||||
Kiff_hpf_md = Kiff*opt_iff_hpf_gain_md(i_iff_hpf_md);
|
||||
Kiff_hpf_md.InputName = {'fu', 'fv'};
|
||||
Kiff_hpf_md.OutputName = {'Fu', 'Fv'};
|
||||
|
||||
Kiff_hpf_pz = Kiff*opt_iff_hpf_gain_pz(i_iff_hpf_pz);
|
||||
Kiff_hpf_pz.InputName = {'fu', 'fv'};
|
||||
Kiff_hpf_pz.OutputName = {'Fu', 'Fv'};
|
||||
|
||||
%% Optimal modified IFF parameters that yields maximum simultaneous damping
|
||||
figure;
|
||||
yyaxis left
|
||||
@@ -303,9 +316,9 @@ mn = 15; % Nano-Hexapod mass [kg]
|
||||
ms = 1; % Sample Mass [kg]
|
||||
|
||||
%% IFF Controller
|
||||
Kiff_vc = 1/(s + 0.1*sqrt(1e4/(mn+ms)))*eye(2); % IFF
|
||||
Kiff_md = 1/(s + 0.1*sqrt(1e6/(mn+ms)))*eye(2); % IFF
|
||||
Kiff_pz = 1/(s + 0.1*sqrt(1e8/(mn+ms)))*eye(2); % IFF
|
||||
Kiff_vc = 1/(s + 0.1*sqrt(1e4/(mn+ms)))*eye(2); % IFF - VC
|
||||
Kiff_md = 1/(s + 0.1*sqrt(1e6/(mn+ms)))*eye(2); % IFF - MD
|
||||
Kiff_pz = 1/(s + 0.1*sqrt(1e8/(mn+ms)))*eye(2); % IFF - PZ
|
||||
|
||||
%% General Configuration
|
||||
model_config = struct();
|
||||
@@ -397,6 +410,19 @@ end
|
||||
[~, i_kp_md] = min(abs(kps_md - 1e4));
|
||||
[~, i_kp_pz] = min(abs(kps_pz - 1e6));
|
||||
|
||||
%% Define the obtained controllers
|
||||
Kiff_kp_vc = Kiff_vc*opt_iff_kp_gain_vc(i_kp_vc);
|
||||
Kiff_kp_vc.InputName = {'fu', 'fv'};
|
||||
Kiff_kp_vc.OutputName = {'Fu', 'Fv'};
|
||||
|
||||
Kiff_kp_md = Kiff_md*opt_iff_kp_gain_md(i_kp_md);
|
||||
Kiff_kp_md.InputName = {'fu', 'fv'};
|
||||
Kiff_kp_md.OutputName = {'Fu', 'Fv'};
|
||||
|
||||
Kiff_kp_pz = Kiff_pz*opt_iff_kp_gain_pz(i_kp_pz);
|
||||
Kiff_kp_pz.InputName = {'fu', 'fv'};
|
||||
Kiff_kp_pz.OutputName = {'Fu', 'Fv'};
|
||||
|
||||
%% Identify plants with choosen Parallel stiffnesses
|
||||
model_config.Tuv_type = "parallel_k"; % Default: 2DoF stage
|
||||
|
||||
|
@@ -209,7 +209,7 @@ hold off;
|
||||
yticks(-360:90:360);
|
||||
ylim([ -200, 20]);
|
||||
|
||||
linkaxes([ax,ax2],'x');
|
||||
linkaxes([ax1,ax2],'x');
|
||||
xlim([freqs_vc(1), freqs_vc(end)]);
|
||||
xticks([1e-1, 1e0, 1e1]);
|
||||
|
||||
@@ -465,6 +465,4 @@ xticks([1e-1, 1e0, 1e1, 1e2, 1e3]);
|
||||
xtickangle(0)
|
||||
ldg = legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
ldg.ItemTokenSize = [20, 1];
|
||||
|
||||
linkaxes([ax1,ax2,ax3], 'y')
|
||||
ylim([1e-8, 1e-2])
|
||||
|
@@ -899,7 +899,7 @@ The decentralized acrshort:iff controller $\bm{K}_F$ corresponds to a diagonal c
|
||||
\end{equation}
|
||||
|
||||
To determine how the acrshort:iff controller affects the poles of the closed-loop system, a Root Locus plot (Figure ref:fig:rotating_root_locus_iff_pure_int) is constructed as follows: the poles of the closed-loop system are drawn in the complex plane as the controller gain $g$ varies from $0$ to $\infty$ for the two controllers $K_{F}$ simultaneously.
|
||||
As explained in cite:preumont08_trans_zeros_struc_contr_with,skogestad07_multiv_feedb_contr, the closed-loop poles start at the open-loop poles (shown by $\tikz[baseline=-0.6ex] \node[cross out, draw=black, minimum size=1ex, line width=2pt, inner sep=0pt, outer sep=0pt] at (0, 0){};$) for $g = 0$ and coincide with the transmission zeros (shown by $\tikz[baseline=-0.6ex] \draw[line width=2pt, inner sep=0pt, outer sep=0pt] (0,0) circle[radius=3pt];$) as $g \to \infty$.
|
||||
As explained in cite:preumont08_trans_zeros_struc_contr_with,skogestad07_multiv_feedb_contr, the closed-loop poles start at the open-loop poles (shown by crosses) for $g = 0$ and coincide with the transmission zeros (shown by circles) as $g \to \infty$.
|
||||
|
||||
Whereas collocated IFF is usually associated with unconditional stability cite:preumont91_activ, this property is lost due to gyroscopic effects as soon as the rotation velocity becomes non-null.
|
||||
This can be seen in the Root Locus plot (Figure ref:fig:rotating_root_locus_iff_pure_int) where poles corresponding to the controller are bound to the right half plane implying closed-loop system instability.
|
||||
@@ -2853,7 +2853,7 @@ exportFig('figs/rotating_nano_hexapod_dynamics_pz.pdf', 'width', 'third', 'heigh
|
||||
#+end_subfigure
|
||||
#+end_figure
|
||||
|
||||
** Optimal IFF with a High-Pass Filter
|
||||
** Optimal IFF with a High-Pass Filter
|
||||
Integral Force Feedback with an added high-pass filter is applied to the three nano-hexapods.
|
||||
First, the parameters ($\omega_i$ and $g$) of the IFF controller that yield the best simultaneous damping are determined from Figure ref:fig:rotating_iff_hpf_nass_optimal_gain.
|
||||
The IFF parameters are chosen as follows:
|
||||
@@ -2912,6 +2912,21 @@ i_iff_hpf_pz = find(opt_iff_hpf_xi_pz > 0.95*max(opt_iff_hpf_xi_pz));
|
||||
i_iff_hpf_pz = i_iff_hpf_pz(end)+1;
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
%% Define the obtained controllers
|
||||
Kiff_hpf_vc = Kiff*opt_iff_hpf_gain_vc(i_iff_hpf_vc);
|
||||
Kiff_hpf_vc.InputName = {'fu', 'fv'};
|
||||
Kiff_hpf_vc.OutputName = {'Fu', 'Fv'};
|
||||
|
||||
Kiff_hpf_md = Kiff*opt_iff_hpf_gain_md(i_iff_hpf_md);
|
||||
Kiff_hpf_md.InputName = {'fu', 'fv'};
|
||||
Kiff_hpf_md.OutputName = {'Fu', 'Fv'};
|
||||
|
||||
Kiff_hpf_pz = Kiff*opt_iff_hpf_gain_pz(i_iff_hpf_pz);
|
||||
Kiff_hpf_pz.InputName = {'fu', 'fv'};
|
||||
Kiff_hpf_pz.OutputName = {'Fu', 'Fv'};
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :results none
|
||||
%% Optimal modified IFF parameters that yields maximum simultaneous damping
|
||||
figure;
|
||||
@@ -3066,9 +3081,9 @@ mn = 15; % Nano-Hexapod mass [kg]
|
||||
ms = 1; % Sample Mass [kg]
|
||||
|
||||
%% IFF Controller
|
||||
Kiff_vc = 1/(s + 0.1*sqrt(1e4/(mn+ms)))*eye(2); % IFF
|
||||
Kiff_md = 1/(s + 0.1*sqrt(1e6/(mn+ms)))*eye(2); % IFF
|
||||
Kiff_pz = 1/(s + 0.1*sqrt(1e8/(mn+ms)))*eye(2); % IFF
|
||||
Kiff_vc = 1/(s + 0.1*sqrt(1e4/(mn+ms)))*eye(2); % IFF - VC
|
||||
Kiff_md = 1/(s + 0.1*sqrt(1e6/(mn+ms)))*eye(2); % IFF - MD
|
||||
Kiff_pz = 1/(s + 0.1*sqrt(1e8/(mn+ms)))*eye(2); % IFF - PZ
|
||||
|
||||
%% General Configuration
|
||||
model_config = struct();
|
||||
@@ -3162,6 +3177,19 @@ end
|
||||
[~, i_kp_md] = min(abs(kps_md - 1e4));
|
||||
[~, i_kp_pz] = min(abs(kps_pz - 1e6));
|
||||
|
||||
%% Define the obtained controllers
|
||||
Kiff_kp_vc = Kiff_vc*opt_iff_kp_gain_vc(i_kp_vc);
|
||||
Kiff_kp_vc.InputName = {'fu', 'fv'};
|
||||
Kiff_kp_vc.OutputName = {'Fu', 'Fv'};
|
||||
|
||||
Kiff_kp_md = Kiff_md*opt_iff_kp_gain_md(i_kp_md);
|
||||
Kiff_kp_md.InputName = {'fu', 'fv'};
|
||||
Kiff_kp_md.OutputName = {'Fu', 'Fv'};
|
||||
|
||||
Kiff_kp_pz = Kiff_pz*opt_iff_kp_gain_pz(i_kp_pz);
|
||||
Kiff_kp_pz.InputName = {'fu', 'fv'};
|
||||
Kiff_kp_pz.OutputName = {'Fu', 'Fv'};
|
||||
|
||||
%% Identify plants with choosen Parallel stiffnesses
|
||||
model_config.Tuv_type = "parallel_k"; % Default: 2DoF stage
|
||||
|
||||
@@ -3839,7 +3867,7 @@ hold off;
|
||||
yticks(-360:90:360);
|
||||
ylim([ -200, 20]);
|
||||
|
||||
linkaxes([ax,ax2],'x');
|
||||
linkaxes([ax1,ax2],'x');
|
||||
xlim([freqs_vc(1), freqs_vc(end)]);
|
||||
xticks([1e-1, 1e0, 1e1]);
|
||||
#+end_src
|
||||
@@ -4246,8 +4274,6 @@ xticks([1e-1, 1e0, 1e1, 1e2, 1e3]);
|
||||
xtickangle(0)
|
||||
ldg = legend('location', 'northwest', 'FontSize', 8, 'NumColumns', 1);
|
||||
ldg.ItemTokenSize = [20, 1];
|
||||
|
||||
linkaxes([ax1,ax2,ax3], 'y')
|
||||
ylim([1e-8, 1e-2])
|
||||
#+end_src
|
||||
|
||||
|