diff --git a/index.html b/index.html index a5c613b..a5ec226 100644 --- a/index.html +++ b/index.html @@ -3,21 +3,30 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- + -+All the Matlab code that was used for the paper are accessible so that all the results are reproducible. +
+All the figures for the paper have been generated using TikZ.
diff --git a/index.org b/index.org index 659e39f..148aad2 100644 --- a/index.org +++ b/index.org @@ -20,13 +20,13 @@ This method is shown to be easily applicable for the synthesis of complex complementary filters. #+end_quote -* Paper ([[file:paper/paper.pdf][link]]) +* Paper ([[file:journal/journal.pdf][link]]) :PROPERTIES: :UNNUMBERED: t :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]]. -* Matlab Scripts ([[file:matlab/index.org][link]]) :noexport: +* Matlab Scripts ([[file:matlab/index.org][link]]) :PROPERTIES: :UNNUMBERED: t :END: diff --git a/matlab/index.org b/matlab/index.org index 8da025d..42edf83 100644 --- a/matlab/index.org +++ b/matlab/index.org @@ -167,10 +167,10 @@ exportFig('figs/weight_formula.pdf', 'width', 'wide', 'height', 'normal'); [[file:figs/weight_formula.png]] #+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; -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; #+end_src @@ -249,6 +249,28 @@ H1 = 1 - H2; ** Obtained Complementary Filters 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 figure; 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]] ** Using Feedback architecture - #+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; -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; #+end_src Let's first synthesize $H_1(s)$: #+begin_src matlab -P = [W1 -W1; - 0 W2; - 1 -1]; +P = [ W1 0 1; + -W1 W2 -1]; #+end_src #+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 #+begin_src matlab -H1 = inv(1 + K); +H1 = inv(1 + L); H2 = 1 - H1; #+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 freqs = logspace(-2, 4, 1000); figure; 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); 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}$'); +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; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('Magnitude'); -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2); +legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 3); #+end_src ** 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 #+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 ** Introduction :ignore: diff --git a/tikz/index.org b/tikz/index.org index 41bc953..29e59ec 100644 --- a/tikz/index.org +++ b/tikz/index.org @@ -213,17 +213,17 @@ Configuration file is accessible [[file:config.org][here]]. \node[addb] (addu) at ($(delta1.east|-input) + (0.4, 0)$) {}; \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[->] (W1.east) -- (delta1.west); \draw[->] (delta1.east) -| (addu.north); \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$}; \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[below] at (sensor1cal.north) {Normalized Sensor}; + \node[fit={(input.west |- addu.south) ($(delta1.north -| addn.east) + (0.1, 0)$)}, fill=black!10!white, draw, inner sep=6pt] (sensor1cal) {}; + \node[below left, align=right] at (sensor1cal.north east) {{\tiny Normalized}\\[-0.5em]{\tiny sensor}}; \end{scope} \end{tikzpicture} #+end_src @@ -423,19 +423,19 @@ Configuration file is accessible [[file:config.org][here]]. #+RESULTS: [[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{tikzpicture} \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){}; - \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[->] (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[<-] (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] \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 #+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: [[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{tikzpicture} - \node[block] (W1) at (0,0) {$W_1$}; - \node[addb={+}{}{}{}{-}, right=1 of W1] (addfb){}; - \node[addb={+}{}{}{}{}, right=4.5 of W1] (adddy){}; - \node[block, above=0.8 of adddy] (W2){$W_2$}; + \node[block] (W2) at (0,0) {$W_2$}; + \node[addb={+}{}{}{}{-}, right=1 of W2] (addfb){}; + \node[addb={+}{}{}{}{}, right=4.5 of W2] (adddy){}; + \node[block, above=0.8 of adddy] (W1){$W_1$}; - \draw[<-] (W1.west) -- ++(-1, 0) node[above right]{$w_1$}; - \draw[->] (W1.east) -- (addfb.west) node[above left]{$\tilde{w}_1$}; + \draw[<-] (W2.west) -- ++(-1, 0) node[above right]{$w_2$}; + \draw[->] (W2.east) -- (addfb.west) node[above left]{$\tilde{w}_2$}; \draw[->] (addfb.east) -- ++(1, 0) node[above left]{$v$}; \draw[<-] (adddy.west) -- ++(-1, 0) node[above right]{$u$}; \draw[->] (adddy.east) -- ++(1.4, 0) node[above left]{$z$}; - \draw[->] (W2.south) -- (adddy.north) node[above right]{$\tilde{w}_2$}; - \draw[<-] (W2.north) -- ++(0, 1) node[below right]{$w_2$}; + \draw[->] (W1.south) -- (adddy.north) node[above right]{$\tilde{w}_1$}; + \draw[<-] (W1.north) -- ++(0, 1) node[below right]{$w_1$}; \draw[->] ($(adddy.east) + (0.5, 0)$) node[branch]{} -- ++(0, -0.8) -| (addfb.south); \end{tikzpicture} #+end_src @@ -473,29 +509,29 @@ Configuration file is accessible [[file:config.org][here]]. #+RESULTS: [[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{tikzpicture} \node[block={4.5cm}{3.0cm}, fill=black!10!white] (P) {}; \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.40!(P.north west) + (-0.7, 0)$); + \coordinate[] (inputw1) at ($(P.south west)!0.75!(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[] (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)$); - \node[block, right=1.2 of inputw1] (W1){$W_1(s)$}; \node[block, right=1.2 of inputw2] (W2){$W_2(s)$}; - \node[addb={+}{}{}{}{}, right=0.8 of W2] (add) {}; - \node[addb={+}{}{-}{}{}, right=1.8 of W1] (sub) {}; + \node[block, right=1.2 of inputw1] (W1){$W_1(s)$}; + \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[->] (inputw1) node[above right]{$w_1$} -- (W1.west); \draw[->] (inputu) node[above right]{$u$} -| (add.south); - \draw[->] (W1.east) -- (sub.west); - \draw[->] (W2.east) -- (add.west); + \draw[->] (W2.east) -- (sub.west); + \draw[->] (W1.east) -- (add.west); \draw[->] (add.east) -- (outputz)node[above left]{$z$}; \draw[->] (sub.east) -- (outputv)node[above left]{$v$}; \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{tikzpicture} \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[] (inputu) at ($(P.south west)!0.4!(P.north west) + (-0.7, 0)$);