508 KiB
508 KiB
Sensor Fusion Paper - Tikz Figures
- Change some default
- Sensor Fusion with complementary filters
- Equivalent configuration
- Equivalent configuration - classical Feedback
- Equivalent configuration - classical Feedback with pre-filter
- Equivalent configuration - bis
- H-Infinity - Complementary filters - Generalized plant
- H-Infinity - Complementary filters
- H-Infinity - 3 Complementary filters
- Input Multiplicative Uncertainty
- One mass
- One mass - Control
- Piezoelectric Actuator
- Upper bounds
- Bode plot of the mechanical system
- Bode plot of the mechanical system - Uncertainty
- Bode plot of the controller
- Bode plot of the loop gain
- Upper bounds with weights
- Upper bounds with Complementary Filters
- Upper bounds with weights and Complementary Filters
- Robustness - Nyquist
- Robustness - Loop Gain
- Robust performance
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}
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}
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}
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}
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}
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}
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}
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}
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}
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}
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}
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}
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}