Update link to journal and matlab scripts

This commit is contained in:
Thomas Dehaeze 2021-06-21 11:42:22 +02:00
parent ad04f8a16d
commit b6ff1da85d
4 changed files with 335 additions and 60 deletions

View File

@ -3,21 +3,30 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2020-11-12 jeu. 10:44 --> <!-- 2021-06-21 lun. 11:42 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Complementary Filters Shaping Using \(\mathcal{H}_\infty\) Synthesis</title> <title>Complementary Filters Shaping Using $\mathcal{H}_\infty$ Synthesis</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Thomas Dehaeze" /> <meta name="author" content="Thomas Dehaeze" />
<meta name="generator" content="Org Mode" />
<link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/> <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
<script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script> <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
<script>MathJax = { <script>
tex: { MathJax = {
tags: 'ams', svg: {
macros: {bm: ["\\boldsymbol{#1}",1],} scale: 1,
} fontCache: "global"
}; },
</script> tex: {
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> tags: "ams",
multlineWidth: "%MULTLINEWIDTH",
tagSide: "right",
macros: {bm: ["\\boldsymbol{#1}",1],},
tagIndent: ".8em"
}
};
</script>
<script id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script>
</head> </head>
<body> <body>
<div id="org-div-home-and-up"> <div id="org-div-home-and-up">
@ -41,18 +50,27 @@ This method is shown to be easily applicable for the synthesis of complex comple
</p> </p>
</blockquote> </blockquote>
<div id="outline-container-org51c6c0b" class="outline-2"> <div id="outline-container-org16737c1" class="outline-2">
<h2 id="org51c6c0b">Paper (<a href="paper/paper.pdf">link</a>)</h2> <h2 id="org16737c1">Paper (<a href="journal/journal.pdf">link</a>)</h2>
<div class="outline-text-2" id="text-org51c6c0b"> <div class="outline-text-2" id="text-org16737c1">
<p> <p>
The paper has been created <a href="https://orgmode.org/">Org Mode</a> (generating <a href="https://www.latex-project.org/">LaTeX</a> code) under <a href="https://www.gnu.org/software/emacs/">Emacs</a>. The paper has been created <a href="https://orgmode.org/">Org Mode</a> (generating <a href="https://www.latex-project.org/">LaTeX</a> code) under <a href="https://www.gnu.org/software/emacs/">Emacs</a>.
</p> </p>
</div> </div>
</div> </div>
<div id="outline-container-org6820ca5" class="outline-2"> <div id="outline-container-orgb50a720" class="outline-2">
<h2 id="org6820ca5">Tikz Figures (<a href="tikz/index.html">link</a>)</h2> <h2 id="orgb50a720">Matlab Scripts (<a href="matlab/index.html">link</a>)</h2>
<div class="outline-text-2" id="text-org6820ca5"> <div class="outline-text-2" id="text-orgb50a720">
<p>
All the <a href="https://fr.mathworks.com/">Matlab</a> code that was used for the paper are accessible so that all the results are reproducible.
</p>
</div>
</div>
<div id="outline-container-org06a9b71" class="outline-2">
<h2 id="org06a9b71">Tikz Figures (<a href="tikz/index.html">link</a>)</h2>
<div class="outline-text-2" id="text-org06a9b71">
<p> <p>
All the figures for the paper have been generated using <a href="https://sourceforge.net/projects/pgf/">TikZ</a>. All the figures for the paper have been generated using <a href="https://sourceforge.net/projects/pgf/">TikZ</a>.
</p> </p>

View File

@ -20,13 +20,13 @@
This method is shown to be easily applicable for the synthesis of complex complementary filters. This method is shown to be easily applicable for the synthesis of complex complementary filters.
#+end_quote #+end_quote
* Paper ([[file:paper/paper.pdf][link]]) * Paper ([[file:journal/journal.pdf][link]])
:PROPERTIES: :PROPERTIES:
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:
The paper has been created [[https://orgmode.org/][Org Mode]] (generating [[https://www.latex-project.org/][LaTeX]] code) under [[https://www.gnu.org/software/emacs/][Emacs]]. The paper has been created [[https://orgmode.org/][Org Mode]] (generating [[https://www.latex-project.org/][LaTeX]] code) under [[https://www.gnu.org/software/emacs/][Emacs]].
* Matlab Scripts ([[file:matlab/index.org][link]]) :noexport: * Matlab Scripts ([[file:matlab/index.org][link]])
:PROPERTIES: :PROPERTIES:
:UNNUMBERED: t :UNNUMBERED: t
:END: :END:

View File

@ -167,10 +167,10 @@ exportFig('figs/weight_formula.pdf', 'width', 'wide', 'height', 'normal');
[[file:figs/weight_formula.png]] [[file:figs/weight_formula.png]]
#+begin_src matlab #+begin_src matlab
n = 2; w0 = 2*pi*10; G0 = 1/10; G1 = 1000; Gc = 0.45; n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 0.45;
W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 0.45; n = 2; w0 = 2*pi*10; G0 = 1/10; G1 = 1000; Gc = 0.45;
W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
#+end_src #+end_src
@ -249,6 +249,28 @@ H1 = 1 - H2;
** Obtained Complementary Filters ** Obtained Complementary Filters
The obtained complementary filters are shown on figure [[fig:hinf_filters_results]]. The obtained complementary filters are shown on figure [[fig:hinf_filters_results]].
#+begin_src matlab :results output replace :exports results :tangle no
zpk(H1)
zpk(H2)
#+end_src
#+RESULTS:
#+begin_example
zpk(H1)
ans =
(s+1.289e05) (s+153.6) (s+3.842)^3
-------------------------------------------------------
(s+1.29e05) (s^2 + 102.1s + 2733) (s^2 + 69.45s + 3272)
zpk(H2)
ans =
125.61 (s+3358)^2 (s^2 + 46.61s + 813.8)
-------------------------------------------------------
(s+1.29e05) (s^2 + 102.1s + 2733) (s^2 + 69.45s + 3272)
#+end_example
#+begin_src matlab :exports none #+begin_src matlab :exports none
figure; figure;
tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None');
@ -1315,45 +1337,67 @@ exportFig('figs/hinf_comp_H1_H2_syn.pdf', 'width', 'wide', 'height', 'normal');
[[file:figs/hinf_comp_H1_H2_syn.png]] [[file:figs/hinf_comp_H1_H2_syn.png]]
** Using Feedback architecture ** Using Feedback architecture
#+begin_src matlab #+begin_src matlab
n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2; n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 0.45;
W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2; n = 2; w0 = 2*pi*10; G0 = 1/10; G1 = 1000; Gc = 0.45;
W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
#+end_src #+end_src
Let's first synthesize $H_1(s)$: Let's first synthesize $H_1(s)$:
#+begin_src matlab #+begin_src matlab
P = [W1 -W1; P = [ W1 0 1;
0 W2; -W1 W2 -1];
1 -1];
#+end_src #+end_src
#+begin_src matlab :results output replace :exports both #+begin_src matlab :results output replace :exports both
[K, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on'); [L, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on');
#+end_src #+end_src
#+begin_src matlab #+begin_src matlab
H1 = inv(1 + K); H1 = inv(1 + L);
H2 = 1 - H1; H2 = 1 - H1;
#+end_src #+end_src
#+begin_src matlab :results output replace :exports results :tangle no
zpk(H1)
zpk(H2)
#+end_src
#+RESULTS:
#+begin_example
zpk(H1)
ans =
(s+2.115e07) (s+153.6) (s+4.613) (s^2 + 6.858s + 12.03)
--------------------------------------------------------
(s+2.117e07) (s^2 + 102.1s + 2732) (s^2 + 69.43s + 3271)
zpk(H2)
ans =
20455 (s+3425) (s+3318) (s^2 + 46.58s + 813.2)
--------------------------------------------------------
(s+2.117e07) (s^2 + 102.1s + 2732) (s^2 + 69.43s + 3271)
#+end_example
#+begin_src matlab :exports none #+begin_src matlab :exports none
freqs = logspace(-2, 4, 1000); freqs = logspace(-2, 4, 1000);
figure; figure;
hold on; hold on;
plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$');
plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$');
set(gca,'ColorOrderIndex',1); set(gca,'ColorOrderIndex',1);
plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$'); plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$');
plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$'); plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$');
set(gca,'ColorOrderIndex',1);
plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$|H_1|$');
plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$|H_2|$');
plot(freqs, abs(squeeze(freqresp(L, freqs, 'Hz'))), 'k--', 'DisplayName', '$|L|$');
hold off; hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Magnitude'); xlabel('Frequency [Hz]'); ylabel('Magnitude');
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2); legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 3);
#+end_src #+end_src
** Adding feature in the filters ** Adding feature in the filters
@ -1999,6 +2043,183 @@ There is no difference between " open-loop" shaping and "close-loop" shaping:
- same obtained filter orders - same obtained filter orders
#+end_important #+end_important
** Integral Action
*** Test
#+begin_src matlab
freqs = logspace(-2, 3, 1000);
#+end_src
\begin{equation}
W_1(s) = \frac{W_{10}(s)}{s}
\end{equation}
with $W_{10}(0) \neq 0$
#+begin_src matlab
W10 = 0.1*(s+125.7)^2/(s+1.257)^2*(s + 0.0001)/(1 + s/1000);
W1 = W10/s;
#+end_src
#+begin_src matlab
n = 2; w0 = 2*pi*10; G0 = 1/10; G1 = 1000; Gc = 0.5;
W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
set(gca,'ColorOrderIndex',1)
plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$');
set(gca,'ColorOrderIndex',2)
plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
xlabel('Frequency [Hz]'); ylabel('Magnitude');
hold off;
xlim([freqs(1), freqs(end)]);
ylim([1e-4, 20]);
xticks([0.1, 1, 10, 100, 1000]);
leg = legend('location', 'southeast', 'FontSize', 8);
leg.ItemTokenSize(1) = 18;
#+end_src
#+begin_src matlab
V = 1;
#+end_src
#+begin_src matlab
P = [ V*W10 W10;
0 W2;
-V -1];
#+end_src
And we do the $\mathcal{H}_\infty$ synthesis using the =hinfsyn= command.
#+begin_src matlab :results output replace :exports both
[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on');
#+end_src
#+begin_src matlab
H1 = 1 - H2;
#+end_src
#+begin_src matlab :exports none
figure;
tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None');
% Magnitude
ax1 = nexttile([2, 1]);
hold on;
set(gca,'ColorOrderIndex',1)
plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$w_1$');
set(gca,'ColorOrderIndex',2)
plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$w_2$');
set(gca,'ColorOrderIndex',1)
plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$');
set(gca,'ColorOrderIndex',2)
plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Magnitude');
set(gca, 'XTickLabel',[]);
ylim([1e-4, 20]);
yticks([1e-4, 1e-3, 1e-2, 1e-1, 1, 1e1]);
leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2);
leg.ItemTokenSize(1) = 18;
% Phase
ax2 = nexttile;
hold on;
set(gca,'ColorOrderIndex',1)
plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-');
set(gca,'ColorOrderIndex',2)
plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-');
hold off;
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
set(gca, 'XScale', 'log');
yticks([-180:90:180]);
linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]);
#+end_src
*** Example 6.7.3
#+begin_src matlab
n = 2; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 0.45;
W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
n = 2; w0 = 2*pi*10; G0 = 1/10; G1 = 1000; Gc = 0.45;
W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
#+end_src
#+begin_src matlab
V = 1/(1 + s/2/pi/100);
#+end_src
#+begin_src matlab
V = W2;
W2 = tf(1);
#+end_src
#+begin_src matlab
P = [W1 -W1;
0 W2;
V 0];
#+end_src
#+begin_src matlab :results output replace :exports both
[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
#+end_src
#+begin_src matlab
H2 = H2*V;
#+end_src
#+begin_src matlab
H1 = 1 - H2;
#+end_src
#+begin_src matlab :exports none
figure;
tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None');
% Magnitude
ax1 = nexttile([2, 1]);
hold on;
set(gca,'ColorOrderIndex',1)
plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$w_1$');
set(gca,'ColorOrderIndex',2)
plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$w_2$');
set(gca,'ColorOrderIndex',1)
plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$');
set(gca,'ColorOrderIndex',2)
plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$');
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
hold off;
set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
ylabel('Magnitude');
set(gca, 'XTickLabel',[]);
ylim([1e-4, 20]);
yticks([1e-4, 1e-3, 1e-2, 1e-1, 1, 1e1]);
leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2);
leg.ItemTokenSize(1) = 18;
% Phase
ax2 = nexttile;
hold on;
set(gca,'ColorOrderIndex',1)
plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-');
set(gca,'ColorOrderIndex',2)
plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-');
hold off;
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
set(gca, 'XScale', 'log');
yticks([-180:90:180]);
linkaxes([ax1,ax2],'x');
xlim([freqs(1), freqs(end)]);
#+end_src
* Impose a positive slope at DC or a negative slope at infinite frequency * Impose a positive slope at DC or a negative slope at infinite frequency
** Introduction :ignore: ** Introduction :ignore:

View File

@ -213,17 +213,17 @@ Configuration file is accessible [[file:config.org][here]].
\node[addb] (addu) at ($(delta1.east|-input) + (0.4, 0)$) {}; \node[addb] (addu) at ($(delta1.east|-input) + (0.4, 0)$) {};
\node[addb, right=0.4 of addu] (addn) {}; \node[addb, right=0.4 of addu] (addn) {};
\draw[->] ($(input)+(-0.7, 0)$) node[above right]{$x$} -- (addu); \draw[->] ($(input)+(-0.8, 0)$) node[above right]{$x$} -- (addu);
\draw[->] (input.center) |- (W1.west); \draw[->] (input.center) |- (W1.west);
\draw[->] (W1.east) -- (delta1.west); \draw[->] (W1.east) -- (delta1.west);
\draw[->] (delta1.east) -| (addu.north); \draw[->] (delta1.east) -| (addu.north);
\draw[->] (addu.east) -- (addn.west); \draw[->] (addu.east) -- (addn.west);
\draw[<-] (addn.north) -- ++(0, 0.7)node[below right](n1){$n_1$}; \draw[<-] (addn.north) -- ++(0, 0.6)node[below right](n1){$n_1$};
\draw[->] (addn.east) -- ++(0.9, 0) node[above left]{$\hat{x}_1$}; \draw[->] (addn.east) -- ++(0.9, 0) node[above left]{$\hat{x}_1$};
\begin{scope}[on background layer] \begin{scope}[on background layer]
\node[fit={(input.west |- addu.south) ($(delta1.north -| addn.east) + (0.1, 0.4)$)}, fill=black!10!white, draw, inner sep=6pt] (sensor1cal) {}; \node[fit={(input.west |- addu.south) ($(delta1.north -| addn.east) + (0.1, 0)$)}, fill=black!10!white, draw, inner sep=6pt] (sensor1cal) {};
\node[below] at (sensor1cal.north) {Normalized Sensor}; \node[below left, align=right] at (sensor1cal.north east) {{\tiny Normalized}\\[-0.5em]{\tiny sensor}};
\end{scope} \end{scope}
\end{tikzpicture} \end{tikzpicture}
#+end_src #+end_src
@ -423,19 +423,19 @@ Configuration file is accessible [[file:config.org][here]].
#+RESULTS: #+RESULTS:
[[file:figs/ligo_super_sensor_architecture.png]] [[file:figs/ligo_super_sensor_architecture.png]]
* Feedback Loop Sensor Fusion Architecture * Closed-Loop Complementary Filters
#+begin_src latex :file feedback_sensor_fusion.pdf :tangle figs/feedback_sensor_fusion.tex #+begin_src latex :file feedback_sensor_fusion.pdf :tangle figs/feedback_sensor_fusion.tex
\begin{tikzpicture} \begin{tikzpicture}
\node[addb={+}{}{}{}{-}] (addfb) at (0, 0){}; \node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
\node[block, right=1 of addfb] (L){$L$}; \node[block, right=1 of addfb] (L){$L(s)$};
\node[addb={+}{}{}{}{}, right=1 of L] (adddy){}; \node[addb={+}{}{}{}{}, right=1 of L] (adddy){};
\draw[<-] (addfb.west) -- ++(-1, 0) node[above right]{$\hat{x}_1$}; \draw[<-] (addfb.west) -- ++(-1, 0) node[above right]{$\hat{x}_2$};
\draw[->] (addfb.east) -- (L.west); \draw[->] (addfb.east) -- (L.west);
\draw[->] (L.east) -- (adddy.west); \draw[->] (L.east) -- (adddy.west);
\draw[->] (adddy.east) -- ++(1.4, 0) node[above left]{$\hat{x}$}; \draw[->] (adddy.east) -- ++(1.4, 0) node[above left]{$\hat{x}$};
\draw[->] ($(adddy.east) + (0.5, 0)$) node[branch]{} -- ++(0, -0.8) coordinate(botc) -| (addfb.south); \draw[->] ($(adddy.east) + (0.5, 0)$) node[branch]{} -- ++(0, -0.8) coordinate(botc) -| (addfb.south);
\draw[<-] (adddy.north) -- ++(0, 1) node[below right]{$\hat{x}_2$}; \draw[<-] (adddy.north) -- ++(0, 1) node[below right]{$\hat{x}_1$};
\begin{scope}[on background layer] \begin{scope}[on background layer]
\node[fit={(L.north-|addfb.west) (botc)}, fill=black!10!white, draw, inner sep=6pt] (supersensor) {}; \node[fit={(L.north-|addfb.west) (botc)}, fill=black!10!white, draw, inner sep=6pt] (supersensor) {};
@ -445,25 +445,61 @@ Configuration file is accessible [[file:config.org][here]].
#+end_src #+end_src
#+name: fig:feedback_sensor_fusion #+name: fig:feedback_sensor_fusion
#+caption: ([[./figs/feedback_sensor_fusion.png][png]], [[./figs/feedback_sensor_fusion.pdf][pdf]], [[./figs/feedback_sensor_fusion.tex][tex]]). #+caption: "Closed-Loop" complementary filters ([[./figs/feedback_sensor_fusion.png][png]], [[./figs/feedback_sensor_fusion.pdf][pdf]], [[./figs/feedback_sensor_fusion.tex][tex]]).
#+RESULTS: #+RESULTS:
[[file:figs/feedback_sensor_fusion.png]] [[file:figs/feedback_sensor_fusion.png]]
* Feedback Loop Sensor Fusion Architecture * Closed-Loop Fusion Architecture
#+begin_src latex :file feedback_sensor_fusion_arch.pdf :tangle figs/feedback_sensor_fusion_arch.tex
\begin{tikzpicture}
\node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
\node[block, right=1 of addfb] (L){$L(s)$};
\node[addb={+}{}{}{}{}, right=1 of L] (adddy){};
\node[block, left=1.2 of addfb] (sensor2){Sensor 2};
\node[block, above=0.4 of sensor2] (sensor1){Sensor 1};
\node[branch, left=0.6 of sensor2] (x){};
\draw[->] (addfb.east) -- (L.west);
\draw[->] (L.east) -- (adddy.west);
\draw[->] (adddy.east) -- ++(1.4, 0) node[above left]{$\hat{x}$};
\draw[->] ($(adddy.east) + (0.5, 0)$) node[branch]{} -- ++(0, -0.8) coordinate(botc) -| (addfb.south);
\draw[->] (x.center) |- (sensor1.west);
\draw[->] ($(x)-(0.8,0)$) node[above right]{$x$} -- (sensor2.west);
\draw[->] (sensor2.east)node[above right=0 and 0.25]{$\hat{x}_2$} -- (addfb.west);
\draw[->] (sensor1.east)node[above right=0 and 0.25]{$\hat{x}_1$} -| (adddy.north);
\begin{scope}[on background layer]
\node[fit={(x|-sensor1.north) (botc)}, fill=black!10!white, draw, inner sep=9pt] (supersensor) {};
\node[fit={(sensor1.north-|addfb.west) (botc)}, fill=black!20!white, draw, inner sep=6pt] (feedbackfilter) {};
\node[fit={(sensor2.west|-botc) (sensor1.north east)}, fill=black!20!white, draw, inner sep=6pt] (sensors) {};
\node[above, align=center] at (sensors.south) {{\tiny Normalized}\\[-0.5em]{\tiny sensors}};
\node[below, align=center] at (feedbackfilter.north) {{\tiny "Closed-Loop"}\\[-0.5em]{\tiny complementary filters}};
% \node[above, align=center] at (supersensor.north) {Super Sensor};
\end{scope}
\end{tikzpicture}
#+end_src
#+name: fig:feedback_sensor_fusion_arch
#+caption: ([[./figs/feedback_sensor_fusion_arch.png][png]], [[./figs/feedback_sensor_fusion_arch.pdf][pdf]], [[./figs/feedback_sensor_fusion_arch.tex][tex]]).
#+RESULTS:
[[file:figs/feedback_sensor_fusion_arch.png]]
* TODO Feedback Loop Sensor Fusion Architecture
#+begin_src latex :file feedback_synthesis_architecture.pdf :tangle figs/feedback_synthesis_architecture.tex #+begin_src latex :file feedback_synthesis_architecture.pdf :tangle figs/feedback_synthesis_architecture.tex
\begin{tikzpicture} \begin{tikzpicture}
\node[block] (W1) at (0,0) {$W_1$}; \node[block] (W2) at (0,0) {$W_2$};
\node[addb={+}{}{}{}{-}, right=1 of W1] (addfb){}; \node[addb={+}{}{}{}{-}, right=1 of W2] (addfb){};
\node[addb={+}{}{}{}{}, right=4.5 of W1] (adddy){}; \node[addb={+}{}{}{}{}, right=4.5 of W2] (adddy){};
\node[block, above=0.8 of adddy] (W2){$W_2$}; \node[block, above=0.8 of adddy] (W1){$W_1$};
\draw[<-] (W1.west) -- ++(-1, 0) node[above right]{$w_1$}; \draw[<-] (W2.west) -- ++(-1, 0) node[above right]{$w_2$};
\draw[->] (W1.east) -- (addfb.west) node[above left]{$\tilde{w}_1$}; \draw[->] (W2.east) -- (addfb.west) node[above left]{$\tilde{w}_2$};
\draw[->] (addfb.east) -- ++(1, 0) node[above left]{$v$}; \draw[->] (addfb.east) -- ++(1, 0) node[above left]{$v$};
\draw[<-] (adddy.west) -- ++(-1, 0) node[above right]{$u$}; \draw[<-] (adddy.west) -- ++(-1, 0) node[above right]{$u$};
\draw[->] (adddy.east) -- ++(1.4, 0) node[above left]{$z$}; \draw[->] (adddy.east) -- ++(1.4, 0) node[above left]{$z$};
\draw[->] (W2.south) -- (adddy.north) node[above right]{$\tilde{w}_2$}; \draw[->] (W1.south) -- (adddy.north) node[above right]{$\tilde{w}_1$};
\draw[<-] (W2.north) -- ++(0, 1) node[below right]{$w_2$}; \draw[<-] (W1.north) -- ++(0, 1) node[below right]{$w_1$};
\draw[->] ($(adddy.east) + (0.5, 0)$) node[branch]{} -- ++(0, -0.8) -| (addfb.south); \draw[->] ($(adddy.east) + (0.5, 0)$) node[branch]{} -- ++(0, -0.8) -| (addfb.south);
\end{tikzpicture} \end{tikzpicture}
#+end_src #+end_src
@ -473,29 +509,29 @@ Configuration file is accessible [[file:config.org][here]].
#+RESULTS: #+RESULTS:
[[file:figs/feedback_synthesis_architecture.png]] [[file:figs/feedback_synthesis_architecture.png]]
* Feedback Loop Sensor Fusion Architecture * Feedback Sensor Fusion - Generalized Plant
#+begin_src latex :file feedback_synthesis_architecture_generalized_plant.pdf :tangle figs/feedback_synthesis_architecture_generalized_plant.tex #+begin_src latex :file feedback_synthesis_architecture_generalized_plant.pdf :tangle figs/feedback_synthesis_architecture_generalized_plant.tex
\begin{tikzpicture} \begin{tikzpicture}
\node[block={4.5cm}{3.0cm}, fill=black!10!white] (P) {}; \node[block={4.5cm}{3.0cm}, fill=black!10!white] (P) {};
\node[above] at (P.north) {$P_L(s)$}; \node[above] at (P.north) {$P_L(s)$};
\coordinate[] (inputw2) at ($(P.south west)!0.75!(P.north west) + (-0.7, 0)$); \coordinate[] (inputw1) at ($(P.south west)!0.75!(P.north west) + (-0.7, 0)$);
\coordinate[] (inputw1) at ($(P.south west)!0.40!(P.north west) + (-0.7, 0)$); \coordinate[] (inputw2) at ($(P.south west)!0.40!(P.north west) + (-0.7, 0)$);
\coordinate[] (inputu) at ($(P.south west)!0.15!(P.north west) + (-0.7, 0)$); \coordinate[] (inputu) at ($(P.south west)!0.15!(P.north west) + (-0.7, 0)$);
\coordinate[] (outputz) at ($(P.south east)!0.75!(P.north east) + ( 0.7, 0)$); \coordinate[] (outputz) at ($(P.south east)!0.75!(P.north east) + ( 0.7, 0)$);
\coordinate[] (outputv) at ($(P.south east)!0.40!(P.north east) + ( 0.7, 0)$); \coordinate[] (outputv) at ($(P.south east)!0.40!(P.north east) + ( 0.7, 0)$);
\node[block, right=1.2 of inputw1] (W1){$W_1(s)$};
\node[block, right=1.2 of inputw2] (W2){$W_2(s)$}; \node[block, right=1.2 of inputw2] (W2){$W_2(s)$};
\node[addb={+}{}{}{}{}, right=0.8 of W2] (add) {}; \node[block, right=1.2 of inputw1] (W1){$W_1(s)$};
\node[addb={+}{}{-}{}{}, right=1.8 of W1] (sub) {}; \node[addb={+}{}{}{}{}, right=0.8 of W1] (add) {};
\node[addb={+}{}{-}{}{}, right=1.8 of W2] (sub) {};
\draw[->] (inputw1) node[above right]{$w_1$} -- (W1.west);
\draw[->] (inputw2) node[above right]{$w_2$} -- (W2.west); \draw[->] (inputw2) node[above right]{$w_2$} -- (W2.west);
\draw[->] (inputw1) node[above right]{$w_1$} -- (W1.west);
\draw[->] (inputu) node[above right]{$u$} -| (add.south); \draw[->] (inputu) node[above right]{$u$} -| (add.south);
\draw[->] (W1.east) -- (sub.west); \draw[->] (W2.east) -- (sub.west);
\draw[->] (W2.east) -- (add.west); \draw[->] (W1.east) -- (add.west);
\draw[->] (add.east) -- (outputz)node[above left]{$z$}; \draw[->] (add.east) -- (outputz)node[above left]{$z$};
\draw[->] (sub.east) -- (outputv)node[above left]{$v$}; \draw[->] (sub.east) -- (outputv)node[above left]{$v$};
\draw[->] (add-|sub) node[branch]{} -- (sub.north); \draw[->] (add-|sub) node[branch]{} -- (sub.north);
@ -595,7 +631,7 @@ Configuration file is accessible [[file:config.org][here]].
#+begin_src latex :file comp_filter_three_hinf.pdf :tangle figs/comp_filter_three_hinf.tex #+begin_src latex :file comp_filter_three_hinf.pdf :tangle figs/comp_filter_three_hinf.tex
\begin{tikzpicture} \begin{tikzpicture}
\node[block={5.0cm}{4.5cm}, fill=black!10!white] (P) {}; \node[block={5.0cm}{4.5cm}, fill=black!10!white] (P) {};
\node[above] at (P.north) {$P(s)$}; \node[above] at (P.north) {$P_3(s)$};
\coordinate[] (inputw) at ($(P.south west)!0.8!(P.north west) + (-0.7, 0)$); \coordinate[] (inputw) at ($(P.south west)!0.8!(P.north west) + (-0.7, 0)$);
\coordinate[] (inputu) at ($(P.south west)!0.4!(P.north west) + (-0.7, 0)$); \coordinate[] (inputu) at ($(P.south west)!0.4!(P.north west) + (-0.7, 0)$);