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}