UP | HOME

# A new method of designing complementary filters for sensor fusion using the \(\mathcal{H}_\infty\) synthesis - Tikz Figures

## Table of Contents

- 1. Sensor Fusion - Overview
- 2. Sensor Model
- 3. Sensor Model with calibration
- 4. Sensor Fusion Architecture
- 5. Sensor Model with Uncertainty
- 6. Sensor Model with Uncertainty - Simplified
- 7. Sensor fusion architecture with sensor dynamics uncertainty
- 8. Uncertainty set of the super sensor dynamics
- 9. Generalized plant used for \(\mathcal{H}_\infty\) synthesis of complementary filters
- 10. Architecture used for \(\mathcal{H}_\infty\) synthesis of complementary filters
- 11. LIGO Sensor Fusion Architecture
- 12. Closed-Loop Complementary Filters
- 13. Closed-Loop Fusion Architecture
- 14. Feedback Loop Sensor Fusion Architecture
- 15. Feedback Sensor Fusion - Generalized Plant
- 16. Sensor Fusion - Sequential
- 17. Sensor Fusion - Parallel
- 18. Architecture for \(\mathcal{H}_\infty\) synthesis of three complementary filters
- 19. Architecture for \(\mathcal{H}_\infty\) synthesis of three complementary filters

Configuration file is accessible here.

## 1. Sensor Fusion - Overview

    \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}

Figure 1: Schematic of a sensor fusion architecture using complementary filters

## 2. Sensor Model

    \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}

Figure 2: Basic sensor model consisting of a noise input \(n_i\) and a linear time invariant transfer function \(G_i(s)\)

## 3. Sensor Model with calibration

    \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}

Figure 3: Normalized sensors using the inverse of an estimate \(\hat{G}_i(s)\) of the sensor dynamics

## 4. Sensor Fusion Architecture

    \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}

Figure 4: Sensor fusion architecture with two normalized sensors

## 5. Sensor Model with Uncertainty

    \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}

Figure 5: Sensor with multiplicative input uncertainty

## 6. Sensor Model with Uncertainty - Simplified

    \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.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.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)$)}, 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}

Figure 6: Simplified sensor model

## 7. Sensor fusion architecture with sensor dynamics uncertainty

    \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}

Figure 7: Sensor fusion architecture with sensor dynamics uncertainty

## 8. Uncertainty set of the super sensor dynamics

    \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_\text{max}$};
    \end{tikzpicture}

Figure 8: Uncertainty region of the super sensor dynamics in the complex plane (grey circle). The contribution of both sensors 1 and 2 to the total uncertainty are represented respectively by a blue circle and a red circle. The frequency dependency \(\omega\) is here omitted.

## 9. Generalized plant used for \(\mathcal{H}_\infty\) synthesis of complementary filters

    \begin{tikzpicture}
      \node[block={4.0cm}{3.0cm}, fill=black!10!white] (P) {};
      \node[above] at (P.north) {$P(s)$};

      \node[block, below=0.2 of P, opacity=0] (H2) {$H_2(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) {};

      \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}

Figure 9: Generalized plant used for \(\mathcal{H}_\infty\) synthesis of complementary filters

## 10. Architecture used for \(\mathcal{H}_\infty\) synthesis of complementary filters

    \begin{tikzpicture}
      \node[block={4.0cm}{3.0cm}, fill=black!10!white] (P) {};
      \node[above] at (P.north) {$P(s)$};

      \node[block, below=0.2 of P] (H2) {$H_2(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.4, 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.4, 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) {};

      \draw[->] (inputw) node[above right]{$w$} -- (sub.west);
      \draw[->] (inputu-|sub) node[branch]{} -- (sub.south);
      \draw[->] (sub.east) -- (W1.west);
      \draw[->] ($(sub.west)+(-0.6, 0)$) node[branch]{} |- (outputv) |- (H2.east);
      \draw[->] (H2.west) -| (inputu) -- (W2.west);
      \draw[->] (W1.east) -- (output1)node[above left]{$z_1$};
      \draw[->] (W2.east) -- (output2)node[above left]{$z_2$};
    \end{tikzpicture}

Figure 10: Generalized plant with the synthesized filter

## 11. LIGO Sensor Fusion Architecture

    \definecolor{myblue}{rgb}{0, 0.447, 0.741}
    \definecolor{myred}{rgb}{0.8500, 0.325, 0.098}

    \begin{tikzpicture}
      \node[block, align=center] (position)    at (0, 2.2) {Position\\Sensor};
      \node[block, align=center] (seismometer) at (0, 1.0) {Seismometer};
      \node[block, align=center] (geophone)    at (0,-0.6) {Geophone};

      \node[branch, left=0.4 of seismometer] (x);

      \node[block, right=1.1 of seismometer](H1){$L_2(s)$};
      \node[block](H2) at (H1|-geophone)        {$H_2(s)$};

      \node[addb] (add) at (4, 0){};
      \node[block, right=1.1 of add](H2p)   {$H_1(s)$};
      \node[block] (H1p) at (H2p|-position) {$L_1(s)$};

      \node[addb] (addp) at (7, 1.0){};

      \draw[->] ($(x)+(-1.0, 0)$)  -- (seismometer.west);
      \draw[->] (x.center)         |- (position.west);
      \draw[->] (x.center)         |- (geophone.west);
      \draw[->] (position.east)    -- (H1p.west);
      \draw[->] (seismometer.east) -- (H1.west);
      \draw[->] (geophone.east)    -- (H2.west);
      \draw[->] (H1) -| (add.north);
      \draw[->] (H2) -| (add.south);
      \draw[->] (add.east) -- (H2p.west);
      \draw[->] (H1p) -| (addp.north);
      \draw[->] (H2p) -| (addp.south);
      \draw[->] (addp.east) -- ++(1.0, 0);

      \begin{scope}[on background layer]
        \node[fit={(x.west|-geophone.south) (position.north-|addp.east)}, fill=black!10!white, draw, inner sep=6pt] (supersensor) {};
        \node[below] at (supersensor.north) {Super Sensor};

        \node[fit={(x.west|-seismometer.north) (add.east|-geophone.south)}, fill=black!20!white, draw, inner sep=3pt] (superinertialsensor) {};
        \node[] at (superinertialsensor.center) {"Inertial" Super Sensor};
      \end{scope}
    \end{tikzpicture}

Figure 11: Simplified block diagram of the sensor blending strategy for the first stage at the LIGO

## 12. Closed-Loop Complementary Filters

    \begin{tikzpicture}
      \node[addb={+}{}{}{}{-}] (addfb) at (0, 0){};
      \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}_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}_1$};

      \begin{scope}[on background layer]
        \node[fit={(L.north-|addfb.west) (botc)}, fill=black!10!white, draw, inner sep=6pt] (supersensor) {};
      \end{scope}
    \end{tikzpicture}

Figure 12: “Closed-Loop” complementary filters

## 13. Closed-Loop Fusion Architecture

    \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}};
      \end{scope}
    \end{tikzpicture}

Figure 13: Classical feedback architecture used for sensor fusion

## 14. Feedback Loop Sensor Fusion Architecture

    \begin{tikzpicture}
      \node[block] (W2) at (0,0) {$W_2(s)$};
      \node[addb={+}{}{}{}{-}, right=0.8 of W2] (addfb){};
      \node[addb={+}{}{}{}{}, right=4.5 of W2] (adddy){};
      \node[block, above=0.8 of adddy] (W1){$W_1(s)$};

      \draw[<-] (W2.west) -- ++(-0.8, 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[->] (W1.south) -- (adddy.north) node[above right]{$\tilde{w}_1$};
      \draw[<-] (W1.north) -- ++(0, 0.8) node[below right]{$w_1$};
      \draw[->] ($(adddy.east) + (0.5, 0)$) node[branch]{} -- ++(0, -0.8) -| (addfb.south);
    \end{tikzpicture}

Figure 14: Feedback architecture with included weights

## 15. Feedback Sensor Fusion - Generalized Plant

    \begin{tikzpicture}
      \node[block={4.5cm}{3.0cm}, fill=black!10!white] (P) {};
      \node[above] at (P.north) {$P_L(s)$};

      \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 inputw2] (W2){$W_2(s)$};
      \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[->] (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[->] (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);
    \end{tikzpicture}

Figure 15: Generalized plant used for the \(\mathcal{H}_\infty\) synthesis of “closed-loop” complementary filters

## 16. Sensor Fusion - Sequential

    \begin{tikzpicture}
      \node[branch] (x) at (0, 0);

      \node[block, right=0.4 of x] (sensor2) {Sensor 2};
      \node[block, above=0.4 of sensor2] (sensor1) {Sensor 1};
      \node[block, below=0.4 of sensor2] (sensor3) {Sensor 3};

      \node[block, right=1.1 of sensor1](H1){$H_1(s)$};
      \node[block, right=1.1 of sensor2](H2){$H_2(s)$};
      \node[addb] (add) at ($0.5*(H1.east)+0.5*(H2.east)+(0.6, 0)$){};

      \node[block, right=0.8 of add](H1p)  {$H_1^\prime(s)$};
      \node[block] (H2p) at (H1p|-sensor3) {$H_2^\prime(s)$};

      \node[addb] (addp) at ($0.5*(H1p.east)+0.5*(H2p.east)+(0.6, 0)$){};

      \draw[->] ($(x)+(-0.8, 0)$) node[above right]{$x$} -- (sensor2.west);
      \draw[->] (x.center)     |- (sensor1.west);
      \draw[->] (x.center)     |- (sensor3.west);
      \draw[->] (sensor1.east) -- (H1.west)  node[above left]{$\hat{x}_1$};
      \draw[->] (sensor2.east) -- (H2.west)  node[above left]{$\hat{x}_2$};
      \draw[->] (sensor3.east) -- (H2p.west) node[above left]{$\hat{x}_3$};
      \draw[->] (H1)           -| (add.north);
      \draw[->] (H2)           -| (add.south);
      \draw[->] (add.east)     -- (H1p.west) node[above left]{$\hat{x}_{12}$};
      \draw[->] (H1p)          -| (addp.north);
      \draw[->] (H2p)          -| (addp.south);
      \draw[->] (addp.east)    -- ++(0.8, 0) node[above left]{$\hat{x}$};

      \begin{scope}[on background layer]
        \node[fit={(x.west|-sensor3.south) (sensor1.north-|addp.east)}, fill=black!10!white, draw, inner sep=6pt] (supersensor) {};

        \node[fit={(x.west|-sensor1.north) (add.east|-sensor2.south)}, fill=black!20!white, draw, inner sep=3pt] (superinertialsensor) {};
      \end{scope}
    \end{tikzpicture}

Figure 16: Sequential fusion

## 17. Sensor Fusion - Parallel

    \begin{tikzpicture}
      \node[branch] (x) at (0, 0);
      \node[block, right=0.4 of x] (sensor2) {Sensor 2};
      \node[block, above=0.3 of sensor2] (sensor1) {Sensor 1};
      \node[block, below=0.3 of sensor2] (sensor3) {Sensor 3};

      \node[block, right=1.1 of sensor1](H1){$H_1(s)$};
      \node[block, right=1.1 of sensor2](H2){$H_2(s)$};
      \node[block, right=1.1 of sensor3](H3){$H_3(s)$};

      \node[addb, right=0.6 of H2](add){};

      \draw[->] (x.center)                             |- (sensor1.west);
      \draw[] ($(x)+(-0.8, 0)$) node[above right]{$x$} -- (sensor2.west);
      \draw[->] (x.center)                             |- (sensor3.west);

      \draw[->] (sensor1.east) -- (H1.west) node[above left]{$\hat{x}_1$};
      \draw[->] (sensor2.east) -- (H2.west) node[above left]{$\hat{x}_2$};
      \draw[->] (sensor3.east) -- (H3.west) node[above left]{$\hat{x}_3$};

      \draw[->] (H1) -| (add.north);
      \draw[->] (H2) -- (add.west);
      \draw[->] (H3) -| (add.south);

      \draw[->] (add.east) -- ++(0.8, 0) node[above left]{$\hat{x}$};

      \begin{scope}[on background layer]
        \node[fit={(H3.south-|x) (H1.north-|add.east)}, fill=black!10!white, draw, inner sep=6pt] (supersensor) {};
      \end{scope}
    \end{tikzpicture}

Figure 17: Parallel fusion

## 18. Architecture for \(\mathcal{H}_\infty\) synthesis of three complementary filters

      \begin{tikzpicture}
         \node[block={5.0cm}{4.5cm}, fill=black!10!white] (P) {};
         \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)$);

         \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, opacity=0] (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);
         \draw[->] (inputu|-W2) -- (W2.west);
         \draw[->] (inputu|-W3) -- (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}

Figure 18: Generalized plant for the \(\mathcal{H}_\infty\) synthesis of three complementary filters

## 19. Architecture for \(\mathcal{H}_\infty\) synthesis of three complementary filters

      \begin{tikzpicture}
         \node[block={5.0cm}{4.5cm}, fill=black!10!white] (P) {};
         \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)$);

         \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}

Figure 19: Generalized plant with the synthesized filter for the \(\mathcal{H}_\infty\) synthesis of three complementary filters

Author: Thomas Dehaeze

Created: 2021-09-01 mer. 10:15