dehaeze20_virtu_senso_fusio/tikz/index.org
2020-10-08 10:53:01 +02:00

508 KiB

Sensor Fusion Paper - Tikz Figures

Configuration file is accessible here.

Change some default

  \tikzset{block/.default={0.8cm}{0.6cm}}
  \tikzset{addb/.append style={scale=0.7}}
  \tikzset{node distance=0.6}
  \def\cdist{0.7}

  \definecolor{T}{rgb}{0.230, 0.299, 0.754}%
  \definecolor{S}{rgb}{0.706, 0.016, 0.150}%

Sensor Fusion with complementary filters

  <<tikz_default>>
  \begin{tikzpicture}
    \node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
    \node[block, right=of addfb] (K){$k$};
    \node[block, right=1.2 of K] (G){$G^\prime$};
    \node[addb={+}{}{}{}{}, right=of G] (adddy){};
    \coordinate[] (KG) at ($0.5*(K.east)+0.5*(G.west)$);
    \node[block, below=of KG] (Gm){$G$};
    \node[block, below=of Gm] (Hh){$H_H$};
    \node[addb={+}{}{}{}{}, below=of Hh] (addsf){};
    \node[block] (Hl) at (addsf-|G) {$H_L$};
    \node[addb={+}{}{}{}{}, right=1.2 of Hl] (addn) {};


    \draw[->] (addfb.east) -- (K.west) node[above left]{};
    \draw[->] (K.east) -- (G.west) node[above left]{$u$};
    \draw[->] (KG) node[branch]{} -- (Gm.north);
    \draw[->] (Gm.south) -- (Hh.north);
    \draw[->] (Hh.south) -- (addsf.north) node[above left]{};
    \draw[->] (Hl.west) -- (addsf.east);
    \draw[->] (addsf.west) -| (addfb.south) node[below right]{};
    \draw[->] (G.east) -- (adddy.west);
    \draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$};
    \draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$};
    \draw[->] (adddy-|addn) node[branch]{} -- (addn.north);
    \draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right]{$r$};
    \draw[->] (addn.west) -- (Hl.east) node[above right]{$y_m$};
    \draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$};
  \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/sf_arch.png

Sensor Fusion with complementary filters (png, pdf, tex).

Equivalent configuration

  <<tikz_default>>
  \begin{tikzpicture}
    \node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
    \node[addb={+}{}{}{}{-}, right=of addfb] (addK){};
    \node[block, right=of addK] (K){$k$};
    \node[block, right=1.8 of K] (G){$G^\prime$};
    \node[addb={+}{}{}{}{}, right=of G] (adddy){};
    \node[block, below right=0.5 and -0.2 of K] (Gm){$G$};
    \node[block, below left =0.5 and -0.2 of K] (Hh){$H_H$};
    \node[block, below=1.5 of G] (Hl) {$H_L$};
    \node[addb={+}{}{}{}{}, right=1 of Hl] (addn) {};

    \draw[->] (addfb.east) -- (addK.west);
    \draw[->] (addK.east) -- (K.west);
    \draw[->] (K.east) -- (G.west) node[above left]{$u$};
    \draw[->] (G.east) -- (adddy.west);
    \draw[->] ($(G.west)+(-0.8, 0)$) node[branch](sffb){} |- (Gm.east);
    \draw[->] (Gm.west) -- (Hh.east);
    \draw[->] (Hh.west) -| (addK.south);
    \draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$};
    \draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$};
    \draw[->] (adddy-|addn) node[branch]{} -- (addn.north);
    \draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right]{$r$};
    \draw[->] (addn.west) -- (Hl.east) node[above right]{$y_m$};
    \draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$};
    \draw[->] (Hl.west) -| (addfb.south) node[below right]{};

    \begin{scope}[on background layer]
      \node[fit={($(addK.west|-Hh.south)+(-0.1, 0)$) (K.north-|sffb)}, inner sep=5pt, draw, fill=black!20!white, dashed, label={$K$}] (Kfb) {};
    \end{scope}
  \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/sf_arch_eq.png

Equivalent configuration (png, pdf, tex).

Equivalent configuration - classical Feedback

  <<tikz_default>>
  \begin{tikzpicture}
    \node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
    \node[block, right=of addfb] (K){$K$};
    \node[block, right=of K] (G){$G^\prime$};
    \node[addb={+}{}{}{}{}, right=of G] (adddy){};
    \node[addb={+}{}{}{}{}, below right=and 0.5 of adddy] (addn) {};
    \node[block] (Hh) at (G|-addn) {$H_L$};

    \draw[->] (addfb.east) -- (K.west) node[above left]{};
    \draw[->] (K.east) -- (G.west) node[above left]{$u$};
    \draw[->] (G.east) -- (adddy.west);
    \draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$};
    \draw[->] (G-|addn)node[branch]{} -- (addn.north);
    \draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$};
    \draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right]{$r$};
    \draw[->] (addn.west) -- (Hh.east);
    \draw[->] (Hh.west) -| (addfb.south);
    \draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$};
  \end{tikzpicture}
/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/sf_arch_class.png
Equivalent configuration - classical Feedback (png, pdf, tex).

Equivalent configuration - classical Feedback with pre-filter

  <<tikz_default>>
  \begin{tikzpicture}
    \node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
    \node[block, left=of addfb] (Kr){$K_r$};
    \node[block, right=of addfb] (K){$K$};
    \node[block, right=of K] (G){$G^\prime$};
    \node[addb={+}{}{}{}{}, right=of G] (adddy){};
    \node[addb={+}{}{}{}{}, below right=0.7 and 0.3 of adddy] (addn) {};
    \node[block, left=of addn] (Hh) {$H_H$};

    \draw[->] (addfb.east) -- (K.west) node[above left]{};
    \draw[->] (K.east) -- (G.west) node[above left]{$u$};
    \draw[->] (G.east) -- (adddy.west);
    \draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$};
    \draw[->] (G-|addn)node[branch]{} -- (addn.north);
    \draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$};
    \draw[<-] (Kr.west) -- ++(-\cdist, 0) node[above right]{$r$};
    \draw[->] (Kr.east) -- (addfb.west);
    \draw[->] (addn.west) -- (Hh.east);
    \draw[->] (Hh.west) -| (addfb.south);
    \draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$};
  \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/sf_arch_class_prefilter.png

Equivalent configuration - classical Feedback with pre-filter (png, pdf, tex).

Equivalent configuration - bis

  <<tikz_default>>
  \begin{tikzpicture}
    \node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
    \node[block, left=of addfb] (Kr){${H_L}^{-1}$};
    \node[block, right=of addfb] (K){$G^{-1} {H_H}^{-1} H_L$};
    \node[block, right=of K] (G){$G^\prime$};
    \node[addb={+}{}{}{}{}, right=of G] (adddy){};
    \node[addb={+}{}{}{}{}, below right=0.7 and 0.3 of adddy] (addn) {};

    \draw[->] (addfb.east) -- (K.west) node[above left]{};
    \draw[->] (K.east) -- (G.west) node[above left]{$u$};
    \draw[->] (G.east) -- (adddy.west);
    \draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$};
    \draw[->] (G-|addn)node[branch]{} -- (addn.north);
    \draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$};
    \draw[<-] (Kr.west) -- ++(-\cdist, 0) node[above right]{$r$};
    \draw[->] (Kr.east) -- (addfb.west);
    \draw[->] (addn.west) -| (addfb.south);
    \draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$};
  \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/sf_arch_class_bis.png

Equivalent configuration - bis (png, pdf, tex).

H-Infinity - Complementary filters - Generalized plant

  <<tikz_default>>
  \begin{tikzpicture}
     \node[block={4.0cm}{3.0cm}, draw, dashed, fill=black!20!white] (P) {};
     \node[above] at (P.north) {$P$};

     \coordinate[] (inputw)  at ($(P.south west)!0.8!(P.north west) + (-\cdist, 0)$);
     \coordinate[] (inputu)  at ($(P.south west)!0.4!(P.north west) + (-\cdist, 0)$);

     \coordinate[] (outputh) at ($(P.south east)!0.8!(P.north east) + ( \cdist, 0)$);
     \coordinate[] (outputl) at ($(P.south east)!0.4!(P.north east) + ( \cdist, 0)$);
     \coordinate[] (outputv) at ($(P.south east)!0.1!(P.north east) + ( \cdist, 0)$);

     \node[block, left=2*\cdist of outputl] (WL){$w_L$};
     \node[block, left=2*\cdist of outputh] (WH){$w_H$};
     \node[addb={+}{}{}{}{-}, left=of WH] (sub) {};

     \draw[->] (inputw) node[above right]{$w$} -- (sub.west);
     \draw[->] (inputu) node[above right]{$u$} -- (WL.west);
     \draw[->] (inputu-|sub) node[branch]{} -- (sub.south);
     \draw[->] (sub.east) -- (WH.west);
     \draw[->] ($(inputw)+(2*\cdist, 0)$) node[branch]{} |- (outputv) node[above left]{$v$};
     \draw[->] (WH.east) -- (outputh)node[above left]{$z_H$};
     \draw[->] (WL.east) -- (outputl)node[above left]{$z_L$};
   \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/sf_hinf_filters_plant_b.png

H-Infinity - Complementary filters - Generalized plant (png, pdf, tex).

H-Infinity - Complementary filters

  <<tikz_default>>
  \begin{tikzpicture}
     \node[block={4.0cm}{3.0cm}, draw, dashed, fill=black!20!white] (P) {};
     \node[above] at (P.north) {$P$};

     \coordinate[] (inputw)  at ($(P.south west)!0.8!(P.north west) + (-\cdist, 0)$);
     \coordinate[] (inputu)  at ($(P.south west)!0.4!(P.north west) + (-\cdist, 0)$);

     \coordinate[] (outputh) at ($(P.south east)!0.8!(P.north east) + ( \cdist, 0)$);
     \coordinate[] (outputl) at ($(P.south east)!0.4!(P.north east) + ( \cdist, 0)$);
     \coordinate[] (outputv) at ($(P.south east)!0.1!(P.north east) + ( \cdist, 0)$);

     \node[block, left=2*\cdist of outputl] (WL){$w_L$};
     \node[block, left=2*\cdist of outputh] (WH){$w_H$};
     \node[addb={+}{}{}{}{-}, left=of WH] (sub) {};

     \node[block, below=\cdist of P] (HL) {$H_L$};

     \draw[->] (inputw) node[above right]{$w$} -- (sub.west);
     \draw[->] (HL.west) -| ($(inputu)+(0.5*\cdist, 0)$) -- (WL.west);
     \draw[->] (inputu-|sub) node[branch]{} -- (sub.south);
     \draw[->] (sub.east) -- (WH.west);
     \draw[->] ($(inputw)+(2*\cdist, 0)$) node[branch]{} |- ($(outputv)+(-0.5*\cdist, 0)$) |- (HL.east);
     \draw[->] (WH.east) -- (outputh)node[above left]{$z_H$};
     \draw[->] (WL.east) -- (outputl)node[above left]{$z_L$};
  \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/sf_hinf_filters_b.png

H-Infinity - Complementary filters (png, pdf, tex).

H-Infinity - 3 Complementary filters

  <<tikz_default>>
  \begin{tikzpicture}
     \node[block={5.0cm}{4.0cm}, dashed] (P) {};
     \node[above] at (P.north) {$P$};

     \coordinate[] (inputw)  at ($(P.south west)!0.8!(P.north west) + (-\cdist, 0)$);
     \coordinate[] (inputu)  at ($(P.south west)!0.4!(P.north west) + (-\cdist, 0)$);

     \coordinate[] (output3) at ($(P.south east)!0.8!(P.north east) + ( \cdist, 0)$);
     \coordinate[] (output2) at ($(P.south east)!0.6!(P.north east) + ( \cdist, 0)$);
     \coordinate[] (output1) at ($(P.south east)!0.4!(P.north east) + ( \cdist, 0)$);
     \coordinate[] (outputv) at ($(P.south east)!0.1!(P.north east) + ( \cdist, 0)$);

     \node[block, left=2*\cdist of output1] (W1){$w_1$};
     \node[block, left=2*\cdist of output2] (W2){$w_2$};
     \node[block, left=2*\cdist of output3] (W3){$w_3$};
     \node[addb={+}{}{}{}{-}, left=of W3] (sub1) {};
     \node[addb={+}{}{}{}{-}, left=of sub1] (sub2) {};

     \node[block, below=\cdist of P] (H) {$\begin{bmatrix}H_1 \\ H_2\end{bmatrix}$};

     \draw[->] (inputw) node[above right]{$w$} -- (sub2.west);
     \draw[->] (W1-|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|-W1)+(0.4, 0)$) -- (W1.west);
     \draw[->] ($(H.south west)!0.3!(H.north west)$) -| (inputu|-W2) -- (W2.west);

     \draw[->] (sub2.east) -- (sub1.west);
     \draw[->] (sub1.east) -- (W3.west);
     \draw[->] (W1.east) -- (output1)node[above left]{$z_1$};
     \draw[->] (W2.east) -- (output2)node[above left]{$z_2$};
     \draw[->] (W3.east) -- (output3)node[above left]{$z_3$};
  \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/comp_filter_three_hinf.png

H-Infinity - Complementary filters (png, pdf, tex).

Input Multiplicative Uncertainty

  <<tikz_default>>
  \begin{tikzpicture}
    % Blocs
    \node[block] (G) {$G$};

    \node[addb, left= of G] (addi) {};
    \node[block, above left=0.3 and 0.3 of addi] (deltai) {$\Delta_I$};
    \node[block, left= of deltai] (wi) {$w_I$};
    \node[branch] (branch) at ($(wi.west|-addi)+(-0.4, 0)$) {};

    % Connections and labels
    \draw[->] (branch.center) |- (wi.west);
    \draw[->] ($(branch)+(-0.6, 0)$) -- (addi.west);
    \draw[->] (wi.east) -- (deltai.west);
    \draw[->] (deltai.east) -| (addi.north);
    \draw[->] (addi.east) -- (G.west);
    \draw[->] (G.east) -- ++(0.6, 0);

    \begin{scope}[on background layer]
      \node[fit={(branch|-wi.north) (G.south east)}, inner sep=6pt, draw, dashed, fill=black!20!white] (Gp) {};
        \node[below left] at (Gp.north east) {$G\prime$};
    \end{scope}
  \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/input_uncertainty.png

Input Multiplicative Uncertainty (png, pdf, tex).

One mass

  <<tikz_default>>
  \begin{tikzpicture}
    % ====================
    % Parameters
    % ====================
    \def\massw{2.2}  % Width of the masses
    \def\massh{0.8}  % Height of the masses
    \def\spaceh{1.2} % Height of the springs/dampers
    \def\dispw{0.3}  % Width of the dashed line for the displacement
    \def\disph{0.5}  % Height of the arrow for the displacements
    \def\bracs{0.05} % Brace spacing vertically
    \def\brach{-10pt} % Brace shift horizontaly
    % ====================


    % ====================
    % Ground
    % ====================
    \draw (-0.5*\massw, 0) -- (0.5*\massw, 0);
    \draw[dashed] (0.5*\massw, 0) -- ++(\dispw, 0);
    \draw[->] (0.5*\massw+0.5*\dispw, 0) -- ++(0, \disph) node[right]{$w$};
    % ====================

    \begin{scope}[shift={(0, 0)}]
      % Mass
      \draw[fill=white] (-0.5*\massw, \spaceh) rectangle (0.5*\massw, \spaceh+\massh) node[pos=0.5]{$m$};

      % Spring, Damper, and Actuator
      \draw[spring] (-0.4*\massw, 0) -- (-0.4*\massw, \spaceh) node[midway, left=0.1]{$k$};
      \draw[damper] (0, 0)           -- ( 0, \spaceh)          node[midway, left=0.2]{$c$};
      \draw[actuator] ( 0.4*\massw, 0) -- (	0.4*\massw, \spaceh) node[midway, left=0.1](F){$F$};

      % Displacements
      \draw[dashed] (0.5*\massw, \spaceh) -- ++(\dispw, 0);
      \draw[->] (0.5*\massw+0.5*\dispw, \spaceh) -- ++(0, \disph) node[right]{$x$};

      % Legend
      % \draw[decorate, decoration={brace, amplitude=8pt}, xshift=\brach] %
      %   (-0.5*\massw, \bracs) -- (-0.5*\massw, \spaceh+\massh-\bracs) %
      %   node[midway,rotate=90,anchor=south,yshift=10pt]{};
    \end{scope}
  \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/mech_sys_alone.png

One mass (png, pdf, tex).

One mass - Control

  <<tikz_default>>
  \begin{tikzpicture}
    % ====================
    % Parameters
    % ====================
    \def\massw{2.2}  % Width of the masses
    \def\massh{0.8}  % Height of the masses
    \def\spaceh{1.2} % Height of the springs/dampers
    \def\dispw{0.3}  % Width of the dashed line for the displacement
    \def\disph{0.5}  % Height of the arrow for the displacements
    \def\bracs{0.05} % Brace spacing vertically
    \def\brach{-10pt} % Brace shift horizontaly
    % ====================


    % ====================
    % Ground
    % ====================
    \draw (-0.5*\massw, 0) -- (0.5*\massw, 0);
    \draw[dashed] (0.5*\massw, 0) -- ++(\dispw, 0);
    \draw[->] (0.5*\massw+0.5*\dispw, 0) -- ++(0, \disph) node[below right]{$w$};
    % ====================

    \begin{scope}[shift={(0, 0)}]
      % Mass
      \draw[fill=white] (-0.5*\massw, \spaceh) rectangle (0.5*\massw, \spaceh+\massh) node[pos=0.5]{$m$};

      % Spring, Damper, and Actuator
      \draw[spring] (-0.4*\massw, 0) -- (-0.4*\massw, \spaceh) node[midway, left=0.1]{$k$};
      \draw[damper] (0, 0)           -- ( 0, \spaceh)          node[midway, left=0.2]{$c$};
      \draw[actuator] ( 0.4*\massw, 0) -- (	0.4*\massw, \spaceh) coordinate[midway, right=0.15](F);

      % Displacements
      \draw[dashed] (0.5*\massw, \spaceh) -- ++(\dispw, 0);
      \draw[->] (0.5*\massw+0.5*\dispw, \spaceh) -- ++(0, \disph) node[right](x){$x$};
    \end{scope}

    \node[block, right=1 of F] (Kfb) {$K$};
    \node[addb={+}{}{-}{}{}, right=2*\cdist of Kfb] (add) {};
    \node[addb] (addn) at (x-|Kfb) {};
    \node[block, right=of addn] (Hl) {$H_L$};

    \draw[->] (x) -- (addn.west);
    \draw[->] (addn.east) -- (Hl.west);
    \draw[->] (Hl.east) -| (add.north);
    \draw[->] (add.west) -- (Kfb.east);
    \draw[->] (Kfb.west) -- (F) node[above right]{$F$};
    \draw[<-] (addn.north) -- ++(0,\cdist) node[below right]{$n$};
    \draw[<-] (add.east) -- ++(\cdist,0) node[above left]{$r$};
  \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/mech_sys_alone_ctrl.png

One mass - Control (png, pdf, tex).

Piezoelectric Actuator

  <<tikz_default>>
  \begin{tikzpicture}
    \node[piezo={2}{3}{10}] (piezo) at (0, 0){};
    \node[draw, fill=white, anchor=south, minimum width=3cm, minimum height=1.5cm] (mass) at ($(piezo.north)+(0, 0.5)$) {Mass};
    \draw[] ($(piezo.south)+(-1.5, -0.5)$) -- ++(3, 0);
    \draw ($0.8*(piezo.north west)+0.2*(piezo.north east)$) -- ++(0, 0.5);
    \draw ($0.2*(piezo.north west)+0.8*(piezo.north east)$) -- ++(0, 0.5);
    \draw ($0.8*(piezo.south west)+0.2*(piezo.south east)$) -- ++(0, -0.5);
    \draw ($0.2*(piezo.south west)+0.8*(piezo.south east)$) -- ++(0, -0.5);
  \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/1dof_isolation_piezo.png

Piezoelectric Actuator (png, pdf, tex).

Upper bounds

  <<tikz_default>>
  \setlength\fwidth{7cm}
  \setlength\fheight{5cm}

  \begin{tikzpicture}
    \begin{axis}[%
      name=axis,
      width=\fwidth,
      height=\fheight,
      at={(0, 0)},
      scale only axis,
      separate axis lines,
      every outer x axis line/.append style={black},
      every x tick label/.append style={font=\color{black}},
      every x tick/.append style={black},
      xmode=log,
      xmin=0.1,
      xmax=1000,
      xminorticks=true,
      xlabel={Frequency [Hz]},
      every outer y axis line/.append style={black},
      every y tick label/.append style={font=\color{black}},
      every y tick/.append style={black},
      ymode=log,
      ymin=0.001,
      ymax=10,
      yminorticks=true,
      ylabel={Magnitude},
      axis background/.style={fill=white},
      xmajorgrids,
      xminorgrids,
      ymajorgrids,
      yminorgrids
      ]
      \addplot [color=T, line width=1.5pt, forget plot, upperbound]
      table[row sep=crcr]{%
        <<data:upperbound-robust-stability>>
      };
      \addplot [color=T, line width=1.5pt, forget plot, upperbound]
      table[row sep=crcr]{%
        <<data:upperbound-bandwidth>>
      };
      \addplot [color=T, line width=1.5pt, forget plot, upperbound]
      table[row sep=crcr]{%
        <<data:upperbound-noise-attenuation-1>>
      };
      \addplot [color=T, line width=1.5pt, forget plot, upperbound]
      table[row sep=crcr]{%
        <<data:upperbound-noise-attenuation-2>>
      };
      \addplot [color=S, line width=1.5pt, forget plot, upperbound]
      table[row sep=crcr]{%
        <<data:upperbound-dist-rejection>>
      };

      \node[draw, fill=white, align=center, anchor=west] (noise) at (20, 0.01){Noise\\Attenuation};
      \draw[->] (noise.north) -- (100, 0.1-|noise.north);
      \draw[->] (noise.east) -- (500, 0.01);

      \node[draw, fill=white, align=center, anchor=north east] (bandwidth) at (900, 8) {Bandwidth\\Limitation};
      \draw[->] (bandwidth.west) -- (20, 0.7);

      \node[draw, fill=white, align=center, anchor=south west] (robust) at (0.2, 1) {Robust\\Stability};
      \draw[->] (robust.east) -- (8,2|-robust.east);

      \node[draw, fill=white, align=center, anchor=south west] (dist) at (0.11, 0.1) {Disturbance\\Rejection};
      \draw[->] (dist.south) -- (1, 0.025);
    \end{axis}

    % \begin{customlegend}[legend cell align=left, %<= to align cells
    %   legend entries={ % <= in the following there are the entries
    %   $S$,
    %   $T$
    % },
    %   legend style={at={(axis.north east)}, outer sep=5pt, font=\footnotesize}]
    %   \addlegendimage{upperbound, S}
    %   \addlegendimage{upperbound, T}
    % \end{customlegend}

  \end{tikzpicture}

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/spec_S_T.png

Upper bounds (png, pdf, tex).

Bode plot of the mechanical system

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/bode_plot_mech_sys.png

Bode plot of the mechanical system (png, pdf, tex).

Bode plot of the mechanical system - Uncertainty

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/bode_plot_mech_sys_uncertainty.png

Bode plot of the mechanical system - Uncertainty (png, pdf, tex).

Bode plot of the controller

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/bode_Kfb.png

Bode plot of the controller (png, pdf, tex).

Bode plot of the loop gain

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/bode_plot_loop_gain.png

Bode plot of the loop gain (png, pdf, tex).

Upper bounds with weights

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/spec_S_T_weights.png

Upper bounds with weights (png, pdf, tex).

Upper bounds with Complementary Filters

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/hinf_filters_result_tikz.png

Upper bounds with Complementary Filters (png, pdf, tex).

Upper bounds with weights and Complementary Filters

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/hinf_filters_result_weights.png

Upper bounds with weights and Complementary Filters (png, pdf, tex).

Robustness - Nyquist

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/nyquist_robustness.png

Robustness - Nyquist (png, pdf, tex).

Robustness - Loop Gain

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/bode_plot_loop_gain_robustness.png

Robustness - Loop Gain (png, pdf, tex).

Robust performance

/tdehaeze/dehaeze20_virtu_senso_fusio/media/commit/3c7d99117baf2b796487bd30973cb17f2c26ad11/tikz/figs/robust_perf.png

Robust performance (png, pdf, tex).