Data fusion system

This figure represents a data fusion system used for pedestrian indoor localisation. It is from a scientific paper published in IEEE Sensors 2023 with the following DOI https://doi.org/10.1109/JSEN.2022.3222639.

On the left part, the primary and secondary stages of fusion, that leverage the inertial data (IMU) and the building’s map, are detailed in a bloc scheme. On the right is one of the contribution of this paper: the human motion likelihood representation in the form of a grid. The grid allows to assign a weight to each particle the system uses. Such system is called a Particle Filter.

For usage and reproduction, this figure falls under the IEEE Sensors 2023 copyright. It requires proper citation of the provided paper via its DOI.

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{positioning, calc}
\begin{document}
  \begin{tikzpicture}[
    dot/.style = {circle, minimum size= 8,fill,inner sep=0pt, outer sep=0pt},
    dot/.default = 5pt
  ]
  % Drawing the likelihood grid
  % Horizontal cells count
    \def\lowbound{0}
    \def\highbound{9}

    \begin{scope}[shift={(0,0.5)}, scale=0.7]
      \tikzstyle{cell} = [rectangle, minimum size = 19.5 , fill, color = black]
      \draw [black, step = 1] (\lowbound, 1) grid (\highbound+1, 10);

      \begin{scope}[shift = {(0.5,0.5)}, opacity = 0.7]
        \foreach \x in {\lowbound,1,...,\highbound}{
         \node [cell, black] at  (\x, 9) {};
         \node [cell, black] at  (\x, 1) {};
        } % black cells = walls
        \foreach \x in {\lowbound, 1,..., \highbound}{
         \node [cell, color = blue!100!white] at  (\x, 8) {};
         \node [cell, color = blue!100!white] at  (\x, 2) {};
        } % deep blue cells
        \foreach \x in {\lowbound,1,...,\highbound}{
         \node [cell, color = blue!75!white] at  (\x, 7) {};
         \node [cell, color = blue!75!white] at  (\x, 3) {};
        }         
        \foreach \x in {\lowbound,1,...,\highbound}{
         \node [cell, color = blue!30!white] at  (\x, 6){};
         \node [cell, color = blue!30!white] at  (\x, 4){};
        }        
        \foreach \x in {\lowbound,1,...,\highbound}{
         \node [cell, color = blue!20!white] at  (\x, 5){};
        }
      \end{scope}
      % Adding particles with random numbers drawn from a python script
      % Yes, LaTeX/Tikz allow to draw random numbers but these come from an experiment
      \begin{scope}
        \coordinate [dot] (a) at (3.9285231, 2.6985591);
        \coordinate [dot] (b) at (1.3611608, 1.9969122);
        \coordinate [dot] (c) at (0.6288356, 3.84908  );
        \coordinate [dot] (e) at (9.6810041, 4.1691515);
        \coordinate [dot] (f) at (7.644834 , 8.55942  );
        \coordinate [dot] (g) at (6.0297038, 7.0389246);
        \coordinate [dot] (h) at (3.2925639, 6.6886047);
        \coordinate [dot] (i) at (1.3797099, 8.5992524);
        \coordinate [dot] (j) at (8.1116873, 2.1354121);
        \coordinate [dot] (k) at (7.7211166, 6.5463598);
        \coordinate [dot] (l) at (6.5935806, 2.6034567);
        \coordinate [dot] (m) at (3.9761724, 6.4383623);
        \coordinate [dot] (n) at (2.4039057, 5.6784096);
        \coordinate [dot] (o) at (4.9582929, 3.4551362);
        \coordinate [dot] (p) at (3.7579452, 1.5857479);
        \coordinate [dot] (q) at (6.2010185, 4.215724 );
        \coordinate [dot] (r) at (2.0341973, 5.4074832);
        \coordinate [dot] (s) at (3.8130486, 9.4286342);
        \coordinate [dot] (t) at (7.518949 , 1.857585 );
        \coordinate [dot] (u) at (2.1995326, 2.236611 );
      \end{scope}

      % circle on top of each coordinate
      \foreach \i in {a,c,e,k,n,r,m,o,q,h,g}
        \draw [green, fill] (\i) circle [radius = 0.15];
     
      % draw the conenction to the green particles
      \coordinate [dot] (mean) at (4.2424450, 4.7708627);
      \draw [red, fill] (mean) circle [radius = 0.15];
      \draw (mean) edge 
        [stroke=black, very thick, green, shorten <=2, shorten >=2] (a);
      \draw (mean) edge 
        [stroke, very thick, green, shorten <=2, shorten >=2] (c);
      \draw [stroke, very thick, green, shorten <=2, shorten >=2]
        (mean) -- (e);

        % shorten allows to cut the edge before reaching a node
      \foreach \i in {k,n,r,m,o,q,h,g}
        \draw (mean) edge [very thick, green, shorten <=2, shorten >=2] (\i);

      \begin{scope}[shift={(10.8,5.6)}]
        \node [rotate=-90,
        thick,
        rectangle, 
        rounded corners, 
        draw,
        text width=, 
        minimum height=15,
        align = center](fusion) {\huge\textbf{Fusion}};
      \end{scope}
    \end{scope}

    \begin{scope}[
      shift={(-6.5,7)},
      scale=1, font = {\sffamily},
      every path/.style = {thick},
      every node/.style = {
      thick,
      rectangle, 
      rounded corners, 
      draw,
      text width = 55, 
      minimum height = 12,
      align=center
      },
      empty/.style={color = white, text= black},
      void/.style={fill = white, minimum size = 0}
    ]
     
      % This is one way to define space between blocs:
      \def\hspacer{0.5} % spacing between columns
      \def\vspacer{1} % spacing between lines

      %%%%%%% Acquisition
      \node[empty] (input) {Primary sources};
      \node[below of = input] (imu) {IMU};
      \node[below of = imu, below = 2*\vspacer] (map) {Map};
      \coordinate [below of = map] (dots);

      %%%%%%%% Prediction
      \node[right of = input, right = \hspacer, empty] (prediction) {Prediction};
      \node[below of = prediction] (detect) {Step Detection};
      \node[below of = detect] (weinberg) {Weinberg};
      \node[below of = weinberg] (madgwick) {Madgwick};

      %%%%%%%%% Output
      \node[right of = prediction, right = \hspacer, empty] (output)
       {Secondary sources};
      \node[below of = output] (events) {Step event};
      \node[below of = events] (lengths) {Step length};
      \node[below of = lengths] (angles) {Step heading};

      \node[below of = angles] (walls) {Map Walls};
      \node[below of = walls] (grid) {Likelihood Grid};

      %% Links
      \draw [->] (imu)--(detect);
      \draw [->] (imu)|-(weinberg);
      %
      \draw [->] (imu)|-(madgwick);
      %
      \draw [->] (detect)--(events);
      \draw [->] (weinberg)--(lengths);
      \draw [->] (detect)--(weinberg);
      %
      \draw [->] (madgwick)--(angles);
      %
      \draw [->] (map.east)  -| ($(map)!0.5!(walls)$) coordinate |-(walls);
      \draw [->] (map)       -| ($(map)!0.5!(walls)$)            |-(grid);
      %

      % Draw columns sperators

      \draw [dashed] ($(input.north)     !0.5!(prediction.north)$) 
        --($(input)     !0.5!(prediction)+(dots.south)$);
      \draw [dashed] ($(prediction.north)!0.5!(output.north)$)     
        --($(prediction)!0.5!(output)    +(dots.south)$);
    \end{scope}
  \end{tikzpicture}
\end{document}

Leave a Reply

Your email address will not be published.