#+TITLE: Complementary Filters Shaping Using $\mathcal{H}_\infty$ Synthesis - Tikz Figures :DRAWER: #+HTML_LINK_HOME: ../index.html #+HTML_LINK_UP: ../index.html #+HTML_HEAD: #+HTML_HEAD: #+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/thesis/papers/dehaeze21_desig_compl_filte/tikz/}{config.tex}") #+PROPERTY: header-args:latex+ :imagemagick t :fit yes #+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150 #+PROPERTY: header-args:latex+ :imoutoptions -quality 100 #+PROPERTY: header-args:latex+ :results file raw replace #+PROPERTY: header-args:latex+ :buffer no #+PROPERTY: header-args:latex+ :eval no-export #+PROPERTY: header-args:latex+ :exports both #+PROPERTY: header-args:latex+ :mkdirp yes #+PROPERTY: header-args:latex+ :output-dir figs #+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png") :END: Configuration file is accessible [[file:config.org][here]]. * Sensor Fusion - Overview #+begin_src latex :file sensor_fusion_overview.pdf \definecolor{myblue}{rgb}{0, 0.447, 0.741} \definecolor{myred}{rgb}{0.8500, 0.325, 0.098} \begin{tikzpicture} \node[branch] (x) at (0, 0); \node[block, above right=0.3 and 0.5 of x](sensor1){Sensor 1}; \node[block, below right=0.3 and 0.5 of x](sensor2){Sensor 2}; \node[block, right=1.1 of sensor1](H1){$H_1(s)$}; \node[block, right=1.1 of sensor2](H2){$H_2(s)$}; \node[addb, right=5.0 of x](add){}; \draw[] ($(x)+(-0.7, 0)$) node[above right]{$x$} -- (x.center); \draw[->] (x.center) |- (sensor1.west); \draw[->] (x.center) |- (sensor2.west); \draw[->] (sensor1.east) -- node[midway, above]{$\hat{x}_1$} (H1.west); \draw[->] (sensor2.east) -- node[midway, above]{$\hat{x}_2$} (H2.west); \draw[->] (H1) -| (add.north); \draw[->] (H2) -| (add.south); \draw[->] (add.east) -- ++(0.9, 0) node[above left]{$\hat{x}$}; \begin{scope}[on background layer] \node[fit={($(H2.south-|x) + (0, -0.2)$) ($(H1.north-|add.east) + (0.2, 0.6)$)}, fill=black!10!white, draw, inner sep=6pt] (supersensor) {}; \node[below] at (supersensor.north) {Super Sensor}; \node[fit={(sensor2.south west) (sensor1.north east)}, fill=black!20!white, draw, inner sep=6pt] (sensors) {}; \node[align=center] at (sensors.center) {{\tiny Normalized}\\[-0.5em]{\tiny Sensors}}; \node[fit={(H2.south west) (H1.north-|add.east)}, fill=black!20!white, draw, inner sep=6pt] (filters) {}; \node[align=center] at ($(filters.center) + (-0.3, 0)$) {{\tiny Complementary}\\[-0.5em]{\tiny Filters}}; \end{scope} \end{tikzpicture} #+end_src #+name: fig:sensor_fusion_overview #+caption: Sensor Fusion Architecture - Overview #+RESULTS: [[file:figs/sensor_fusion_overview.png]] * Sensor Model #+begin_src latex :file sensor_model.pdf \begin{tikzpicture} \node[addb](add1){}; \node[block, right=0.8 of add1](G1){$G_i(s)$}; \draw[->] ($(add1.west)+(-0.7, 0)$) node[above right]{$x$} -- (add1.west); \draw[<-] (add1.north) -- ++(0, 0.7)node[below right](n1){$n_i$}; \draw[->] (add1.east) -- (G1.west); \draw[->] (G1.east) -- ++(0.7, 0) node[above left]{$\tilde{x}_i$}; \begin{scope}[on background layer] \node[fit={(add1.west |- G1.south) (n1.north -| G1.east)}, fill=black!20!white, draw, inner sep=3pt] (sensor1) {}; \node[below left] at (sensor1.north east) {Sensor}; \end{scope} \end{tikzpicture} #+end_src #+name: fig:sensor_model #+caption: Basic Sensor Model #+RESULTS: [[file:figs/sensor_model.png]] * Sensor Model with calibration #+begin_src latex :file sensor_model_calibrated.pdf \begin{tikzpicture} \node[addb](add1){}; \node[block, right=0.8 of add1](G1){$G_i(s)$}; \node[block, right=0.8 of G1](G1inv){$\hat{G}_i^{-1}(s)$}; \draw[->] ($(add1.west)+(-0.7, 0)$) node[above right]{$x$} -- (add1.west); \draw[<-] (add1.north) -- ++(0, 0.7)node[below right](n1){$n_i$}; \draw[->] (add1.east) -- (G1.west); \draw[->] (G1.east) -- (G1inv.west) node[above left]{$\tilde{x}_i$}; \draw[->] (G1inv.east) -- ++(0.8, 0) node[above left]{$\hat{x}_i$}; \begin{scope}[on background layer] \node[fit={(add1.west |- G1inv.south) (n1.north -| G1inv.east)}, fill=black!10!white, draw, inner sep=6pt] (sensor1cal) {}; \node[below left, align=right] at (sensor1cal.north east) {{\tiny Normalized}\\[-0.5em]{\tiny sensor}}; \node[fit={(add1.west |- G1.south) (n1.north -| G1.east)}, fill=black!20!white, draw, inner sep=3pt] (sensor1) {}; \node[below left] at (sensor1.north east) {Sensor}; \end{scope} \end{tikzpicture} #+end_src #+name: fig:sensor_model_calibrated #+caption: Calibrated Sensor #+RESULTS: [[file:figs/sensor_model_calibrated.png]] * Sensor Fusion Architecture #+begin_src latex :file fusion_super_sensor.pdf \definecolor{myblue}{rgb}{0, 0.447, 0.741} \definecolor{myred}{rgb}{0.8500, 0.325, 0.098} \begin{tikzpicture} \node[branch] (x) at (0, 0); \node[addb, above right=0.8 and 0.5 of x](add1){}; \node[addb, below right=0.8 and 0.5 of x](add2){}; \node[block, right=0.8 of add1](G1){$G_1(s)$}; \node[block, right=0.8 of add2](G2){$G_2(s)$}; \node[block, right=0.8 of G1](G1inv){$\hat{G}_1^{-1}(s)$}; \node[block, right=0.8 of G2](G2inv){$\hat{G}_2^{-2}(s)$}; \node[block, right=0.8 of G1inv](H1){$H_1(s)$}; \node[block, right=0.8 of G2inv](H2){$H_2(s)$}; \node[addb, right=7 of x](add){}; \draw[] ($(x)+(-0.7, 0)$) node[above right]{$x$} -- (x.center); \draw[->] (x.center) |- (add1.west); \draw[->] (x.center) |- (add2.west); \draw[<-] (add1.north) -- ++(0, 0.7)node[below right](n1){$n_1$}; \draw[->] (add1.east) -- (G1.west); \draw[->] (G1.east) -- (G1inv.west) node[above left]{$\tilde{x}_1$}; \draw[->] (G1inv.east) -- (H1.west) node[above left]{$\hat{x}_1$}; \draw[<-] (add2.north) -- ++(0, 0.7)node[below right](n2){$n_2$}; \draw[->] (add2.east) -- (G2.west); \draw[->] (G2.east) -- (G2inv.west) node[above left]{$\tilde{x}_2$}; \draw[->] (G2inv.east) -- (H2.west) node[above left]{$\hat{x}_2$}; \draw[->] (H1) -| (add.north); \draw[->] (H2) -| (add.south); \draw[->] (add.east) -- ++(0.7, 0) node[above left]{$\hat{x}$}; \begin{scope}[on background layer] \node[fit={(G2.south-|x) (n1.north-|add.east)}, fill=black!10!white, draw, inner sep=9pt] (supersensor) {}; \node[below left] at (supersensor.north east) {Super Sensor}; \node[fit={(add1.west |- G1inv.south) (n1.north -| G1inv.east)}, fill=myblue!20!white, draw, inner sep=6pt] (sensor1cal) {}; \node[below left, align=right] at (sensor1cal.north east) {{\tiny Normalized}\\[-0.5em]{\tiny sensor}}; \node[fit={(add1.west |- G1.south) (n1.north -| G1.east)}, fill=myblue!30!white, draw, inner sep=3pt] (sensor1) {}; \node[below left] at (sensor1.north east) {Sensor 1}; \node[fit={(add2.west |- G2inv.south) (n2.north -| G2inv.east)}, fill=myred!20!white, draw, inner sep=6pt] (sensor2cal) {}; \node[below left, align=right] at (sensor2cal.north east) {{\tiny Normalized}\\[-0.5em]{\tiny sensor}}; \node[fit={(add2.west |- G2.south) (n2.north -| G2.east)}, fill=myred!30!white, draw, inner sep=3pt] (sensor2) {}; \node[below left] at (sensor2.north east) {Sensor 2}; \end{scope} \end{tikzpicture} #+end_src #+name: fig:fusion_super_sensor #+caption: Sensor Fusion Architecture ([[./figs/fusion_super_sensor.png][png]], [[./figs/fusion_super_sensor.pdf][pdf]], [[./figs/fusion_super_sensor.tex][tex]]). #+RESULTS: [[file:figs/fusion_super_sensor.png]] * Sensor Model with Uncertainty #+begin_src latex :file sensor_model_uncertainty.pdf \begin{tikzpicture} \node[branch] (input) at (0,0) {}; \node[block, above right= 0.4 and 0.4 of input](W1){$w_1(s)$}; \node[block, right=0.4 of W1](delta1){$\Delta_1(s)$}; \node[addb] (addu) at ($(delta1.east|-input) + (0.4, 0)$) {}; \node[addb, right=0.4 of addu] (addn) {}; \node[block, right=0.4 of addn] (G1) {$\hat{G}_1(s)$}; \node[block, right=0.8 of G1](G1inv){$\hat{G}_1^{-1}(s)$}; \draw[->] ($(input)+(-0.7, 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.east) -- (G1.west); \draw[<-] (addn.north) -- ++(0, 0.7)node[below right](n1){$n_1$}; \draw[->] (G1.east) -- (G1inv.west) node[above left]{$\tilde{x}_1$}; \draw[->] (G1inv.east) -- ++(0.8, 0) node[above left]{$\hat{x}_1$}; \begin{scope}[on background layer] \node[fit={(input.west |- G1inv.south) (delta1.north -| G1inv.east)}, fill=black!10!white, draw, inner sep=6pt] (sensor1cal) {}; \node[below left, align=right] at (sensor1cal.north east) {{\tiny Normalized}\\[-0.5em]{\tiny sensor}}; \node[fit={(input.west |- G1.south) (delta1.north -| G1.east)}, fill=black!20!white, draw, inner sep=3pt] (sensor1) {}; \node[below left] at (sensor1.north east) {Sensor}; \end{scope} \end{tikzpicture} #+end_src #+name: fig:sensor_model_uncertainty #+caption: Input Uncertainty #+RESULTS: [[file:figs/sensor_model_uncertainty.png]] * Sensor Model with Uncertainty - Simplified #+begin_src latex :file sensor_model_uncertainty_simplified.pdf \begin{tikzpicture} \node[branch] (input) at (0,0) {}; \node[block, above right= 0.4 and 0.4 of input](W1){$w_1(s)$}; \node[block, right=0.4 of W1](delta1){$\Delta_1(s)$}; \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.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.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}; \end{scope} \end{tikzpicture} #+end_src #+name: fig:sensor_model_uncertainty_simplified #+caption: Input Uncertainty #+RESULTS: [[file:figs/sensor_model_uncertainty_simplified.png]] * Sensor fusion architecture with sensor dynamics uncertainty #+begin_src latex :file sensor_fusion_dynamic_uncertainty.pdf :tangle figs/fusion_super_sensor.tex \definecolor{myblue}{rgb}{0, 0.447, 0.741} \definecolor{myred}{rgb}{0.8500, 0.325, 0.098} \begin{tikzpicture} \node[branch] (x) at (0, 0); \node[branch, above right=1.0 and 0.3 of x] (input1) {}; \node[branch, below right=1.0 and 0.3 of x] (input2) {}; \node[block, above right= 0.4 and 0.3 of input1](W1){$w_1(s)$}; \node[block, above right= 0.4 and 0.3 of input2](W2){$w_2(s)$}; \node[block, right=0.4 of W1](delta1){$\Delta_1(s)$}; \node[block, right=0.4 of W2](delta2){$\Delta_2(s)$}; \node[addb] (addu1) at ($(delta1.east|-input1) + (0.4, 0)$) {}; \node[addb] (addu2) at ($(delta2.east|-input2) + (0.4, 0)$) {}; \node[addb, right=0.4 of addu1] (addn1) {}; \node[addb, right=0.4 of addu2] (addn2) {}; \node[block, right=0.9 of addn1](H1){$H_1(s)$}; \node[block, right=0.9 of addn2](H2){$H_2(s)$}; \node[addb, right=7 of x](add){}; \draw[] ($(x)+(-0.7, 0)$) node[above right]{$x$} -- (x.center); \draw[->] (x.center) |- (addu1.west); \draw[->] (x.center) |- (addu2.west); \draw[->] (input1.center) |- (W1.west); \draw[->] (W1.east) -- (delta1.west); \draw[->] (delta1.east) -| (addu1.north); \draw[->] (addu1.east) -- (addn1.west); \draw[<-] (addn1.north) -- ++(0, 0.6)node[below right](n1){$n_1$}; \draw[->] (input2.center) |- (W2.west); \draw[->] (W2.east) -- (delta2.west); \draw[->] (delta2.east) -| (addu2.north); \draw[->] (addu2.east) -- (addn2.west); \draw[<-] (addn2.north) -- ++(0, 0.6)node[below right](n2){$n_2$}; \draw[->] (addn1.east) -- (H1.west) node[above left]{$\hat{x}_1$}; \draw[->] (addn2.east) -- (H2.west) node[above left]{$\hat{x}_2$}; \draw[->] (H1) -| (add.north); \draw[->] (H2) -| (add.south); \draw[->] (add.east) -- ++(0.7, 0) node[above left]{$\hat{x}$}; \begin{scope}[on background layer] \node[fit={(addn2.south-|x) (delta1.north-|add.east)}, fill=black!10!white, draw, inner sep=9pt] (supersensor) {}; \node[below left] at (supersensor.north east) {Super Sensor}; \node[fit={(input1.west |- addu1.south) ($(delta1.north -| addn1.east) + (0.1, 0.0)$)}, fill=myblue!20!white, draw, inner sep=6pt] (sensor1cal) {}; \node[below left, align=right] at (sensor1cal.north east) {{\tiny Normalized}\\[-0.5em]{\tiny sensor 1}}; \node[fit={(input2.west |- addu2.south) ($(delta2.north -| addn1.east) + (0.1, 0.0)$)}, fill=myred!20!white, draw, inner sep=6pt] (sensor2cal) {}; \node[below left, align=right] at (sensor2cal.north east) {{\tiny Normalized}\\[-0.5em]{\tiny sensor 2}}; \end{scope} \end{tikzpicture} #+end_src #+name: fig:sensor_fusion_dynamic_uncertainty #+caption: Sensor fusion architecture with sensor dynamics uncertainty ([[./figs/sensor_fusion_dynamic_uncertainty.png][png]], [[./figs/sensor_fusion_dynamic_uncertainty.pdf][pdf]], [[./figs/sensor_fusion_dynamic_uncertainty.tex][tex]]). #+RESULTS: [[file:figs/sensor_fusion_dynamic_uncertainty.png]] * Uncertainty set of the super sensor dynamics #+begin_src latex :file uncertainty_set_super_sensor.pdf :tangle figs/uncertainty_set_super_sensor.tex :exports both \definecolor{myblue}{rgb}{0, 0.447, 0.741} \definecolor{myred}{rgb}{0.8500, 0.325, 0.098} \begin{tikzpicture} \begin{scope}[shift={(4, 0)}] % Uncertainty Circle \node[draw, circle, fill=black!20!white, minimum size=3.6cm] (c) at (0, 0) {}; \path[draw, fill=myblue!20!white] (0, 0) circle [radius=1.0]; \path[draw, fill=myred!20!white] (135:1.0) circle [radius=0.8]; \path[draw, dashed] (0, 0) circle [radius=1.0]; % Center of Circle \node[below] at (0, 0){$1$}; \draw[<->] (0, 0) node[branch]{} -- coordinate[midway](r1) ++(45:1.0); \draw[<->] (135:1.0)node[branch]{} -- coordinate[midway](r2) ++(135:0.8); \node[] (l1) at (2, 1.5) {$|w_1 H_1|$}; \draw[->, out=-90, in=0] (l1.south) to (r1); \node[] (l2) at (-3.2, 1.2) {$|w_2 H_2|$}; \draw[->, out=0, in=-180] (l2.east) to (r2); \draw[<->] (0, 0) -- coordinate[near end](r3) ++(200:1.8); \node[] (l3) at (-2.5, -1.5) {$|w_1 H_1| + |w_2 H_2|$}; \draw[->, out=90, in=-90] (l3.north) to (r3); \end{scope} % Real and Imaginary Axis \draw[->] (-0.5, 0) -- (7.0, 0) node[below left]{Re}; \draw[->] (0, -1.7) -- (0, 1.7) node[below left]{Im}; \draw[dashed] (0, 0) -- (tangent cs:node=c,point={(0, 0)},solution=2); \draw[dashed] (1, 0) arc (0:28:1) node[midway, right]{$\Delta \phi$}; \end{tikzpicture} #+end_src #+name: fig:uncertainty_set_super_sensor #+caption: Uncertainty region of the super sensor dynamics in the complex plane (solid circle), of the sensor 1 (dotted circle) and of the sensor 2 (dashed circle) ([[./figs/uncertainty_set_super_sensor.png][png]], [[./figs/uncertainty_set_super_sensor.pdf][pdf]], [[./figs/uncertainty_set_super_sensor.tex][tex]]). #+RESULTS: [[file:figs/uncertainty_set_super_sensor.png]] * Architecture used for $\mathcal{H}_\infty$ synthesis of complementary filters #+begin_src latex :file h_infinity_robust_fusion.pdf :tangle figs/h_infinity_robust_fusion.tex :exports both \begin{tikzpicture} \node[block={4.0cm}{3.0cm}, fill=black!10!white] (P) {}; \node[above] at (P.north) {$P(s)$}; \coordinate[] (inputw) at ($(P.south west)!0.75!(P.north west) + (-0.7, 0)$); \coordinate[] (inputu) at ($(P.south west)!0.35!(P.north west) + (-0.7, 0)$); \coordinate[] (output1) at ($(P.south east)!0.75!(P.north east) + ( 0.7, 0)$); \coordinate[] (output2) at ($(P.south east)!0.35!(P.north east) + ( 0.7, 0)$); \coordinate[] (outputv) at ($(P.south east)!0.1!(P.north east) + ( 0.7, 0)$); \node[block, left=1.4 of output1] (W1){$W_1(s)$}; \node[block, left=1.4 of output2] (W2){$W_2(s)$}; \node[addb={+}{}{}{}{-}, left=of W1] (sub) {}; % \node[block, below=0.3 of P] (H2) {$H_2(s)$}; \draw[->] (inputw) node[above right]{$w$} -- (sub.west); \draw[->] (inputu) node[above right]{$u$} -- (W2.west); \draw[->] (inputu-|sub) node[branch]{} -- (sub.south); \draw[->] (sub.east) -- (W1.west); \draw[->] ($(sub.west)+(-0.6, 0)$) node[branch]{} |- (outputv) node[above left]{$v$}; \draw[->] (W1.east) -- (output1)node[above left]{$z_1$}; \draw[->] (W2.east) -- (output2)node[above left]{$z_2$}; \end{tikzpicture} #+end_src #+name: fig:h_infinity_robust_fusion #+caption: Architecture used for $\mathcal{H}_\infty$ synthesis of complementary filters ([[./figs/h_infinity_robust_fusion.png][png]], [[./figs/h_infinity_robust_fusion.pdf][pdf]], [[./figs/h_infinity_robust_fusion.tex][tex]]). #+RESULTS: [[file:figs/h_infinity_robust_fusion.png]] * Architecture for $\mathcal{H}_\infty$ synthesis of three complementary filters #+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!20!white] (P) {}; \node[above] at (P.north) {$P(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)$); \coordinate[] (output1) at ($(P.south east)!0.8!(P.north east) + (0.7, 0)$); \coordinate[] (output2) at ($(P.south east)!0.55!(P.north east) + (0.7, 0)$); \coordinate[] (output3) at ($(P.south east)!0.3!(P.north east) + (0.7, 0)$); \coordinate[] (outputv) at ($(P.south east)!0.1!(P.north east) + (0.7, 0)$); \node[block, left=1.4 of output1] (W1){$W_1(s)$}; \node[block, left=1.4 of output2] (W2){$W_2(s)$}; \node[block, left=1.4 of output3] (W3){$W_3(s)$}; \node[addb={+}{}{}{}{-}, left=of W1] (sub1) {}; \node[addb={+}{}{}{}{-}, left=of sub1] (sub2) {}; \node[block, below=0.3 of P] (H) {$\begin{bmatrix}H_2(s) \\ H_3(s)\end{bmatrix}$}; \draw[->] (inputw) node[above right](w){$w$} -- (sub2.west); \draw[->] (W3-|sub1)node[branch]{} -- (sub1.south); \draw[->] (W2-|sub2)node[branch]{} -- (sub2.south); \draw[->] ($(sub2.west)+(-0.5, 0)$) node[branch]{} |- (outputv) |- (H.east); \draw[->] ($(H.south west)!0.7!(H.north west)$) -| (inputu|-W2) -- (W2.west); \draw[->] ($(H.south west)!0.3!(H.north west)$) -| ($(inputu|-W3)+(0.4, 0)$) -- (W3.west); \draw[->] (sub2.east) -- (sub1.west); \draw[->] (sub1.east) -- (W1.west); \draw[->] (W1.east) -- (output1)node[above left](z){$z_1$}; \draw[->] (W2.east) -- (output2)node[above left]{$z_2$}; \draw[->] (W3.east) -- (output3)node[above left]{$z_3$}; \node[above] at (W2-|w){$u_1$}; \node[above] at (W3-|w){$u_2$}; \node[above] at (outputv-|z){$v$}; \end{tikzpicture} #+end_src #+name: fig:comp_filter_three_hinf #+caption: Architecture for $\mathcal{H}_\infty$ synthesis of three complementary filters ([[./figs/comp_filter_three_hinf.png][png]], [[./figs/comp_filter_three_hinf.pdf][pdf]], [[./figs/comp_filter_three_hinf.tex][tex]]). #+RESULTS: [[file:figs/comp_filter_three_hinf.png]]