Commit 15c0931dcdec5350afd5d561787212b3481e17fa

Authored by Anthex
1 parent d67a28b9

add script to export 3D visualisation of N-Lateration result

Showing 4 changed files with 51 additions and 19 deletions   Show diff stats
.gitignore
... ... @@ -4,3 +4,4 @@ __pycache__/
4 4 .pytest_cache/
5 5 coverage.xml
6 6 .coverage
  7 +out.gif
... ...
README.md
1 1  
2   -[![Build Status](https://travis-ci.com/Anthex/LO53FP.svg?branch=master)](https://travis-ci.com/Anthex/LO53FP) [![codecov](https://codecov.io/gh/Anthex/LO53FP/branch/master/graph/badge.svg)](https://codecov.io/gh/Anthex/LO53FP) [![CodeFactor](https://www.codefactor.io/repository/github/anthex/lo53fp/badge)](https://www.codefactor.io/repository/github/anthex/lo53fp) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
3   -
4 2  
5 3  
6   -[UTBM - LO53] - Python fingerprinting
7   -
8   -Achille Dantz <achille@dantz.fr>
  4 +[![Build Status](https://travis-ci.com/Anthex/LO53FP.svg?branch=master)](https://travis-ci.com/Anthex/LO53FP) [![codecov](https://codecov.io/gh/Anthex/LO53FP/branch/master/graph/badge.svg)](https://codecov.io/gh/Anthex/LO53FP) [![CodeFactor](https://www.codefactor.io/repository/github/anthex/lo53fp/badge)](https://www.codefactor.io/repository/github/anthex/lo53fp) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9 5  
10   -
  6 +# [UTBM - LO53] - Python fingerprinting
  7 +Documentation : https://dantz.fr/LO53/structure.html
  8 +**Author** : Achille Dantz <achille@dantz.fr>
11 9  
  10 +## Description
12 11 This program aims to compute the approximate location of a mobile terminal for a known set of Wi-Fi accesspoints in an ideal 12x12m space for which we have 9 fingerprinting values (known RSSI for each accesspoint at a given location)
13 12  
14   -
  13 +### Main.py Example Output :
15 14  
16   -Documentation : https://dantz.fr/LO53/structure.html
17   -
18   -
  15 +![Screencap](https://dantz.fr/LO53/Capture_.PNG)
19 16  
20   -Example Output :
  17 +## Annex : N-Lateration 3D visualisation
  18 +visuals.py provides a cool function to graphically represent the N-Lateration distances in a 3D space by creating an animated gif (RMI style)
  19 +### Example :
  20 + ![enter image description here](https://dantz.fr/LO53/out.gif)
21 21  
22 22  
23   -
24   -![Screencap](https://dantz.fr/LO53/Capture_.PNG)
25 23 \ No newline at end of file
... ...
structure.py
1 1 from operator import itemgetter as ig
2   -from math import floor, sqrt
  2 +from math import floor, sqrt, ceil, log, exp
3 3 from numpy import arange
4 4 class RSSVector():
5 5 distances = []
... ... @@ -277,22 +277,25 @@ def NLateration(data, step=.1, xSize=0.0, ySize=0.0, zSize=0.0):
277 277 :param xSize: The X dimension of the cuboid containing all the emitters (automatically computed if not specified)
278 278 :param ySize: The Y dimension of the cuboid containing all the emitters (automatically computed if not specified)
279 279 :param zSize: The Z dimension of the cuboid containing all the emitters (automatically computed if not specified)
  280 + :return: args 4 and 5 are the x/y dimensions of the cuboid, imageArray contains and image of the distances for graphic representation
280 281 '''
281 282 minLoc = Location()
282 283 minDist = 0.0
  284 + #gifArray = []
283 285 for k in data:
284 286 minDist += abs(k[0].distanceTo(Location()) - k[1])
285 287 xSize = k[0].x if k[0].x > xSize else xSize
286 288 ySize = k[0].y if k[0].y > ySize else ySize
287 289 zSize = k[0].z if k[0].z > zSize else zSize
288   - for k in arange(0.1,xSize,step):
289   - for l in arange(0.1,ySize,step):
290   - for m in arange(0.1,zSize,step):
  290 + imageArray=[[] for i in range(0,floor(zSize*10))]
  291 + for k in arange(0,xSize,step):
  292 + for l in arange(0,ySize,step):
  293 + for m in arange(0,zSize,step):
291 294 d = .0
292 295 for n in data:
293 296 d += abs(n[0].distanceTo(Location(k,l,m)) - n[1])
294 297 if d < minDist:
295 298 minDist = d
296 299 minLoc = Location(round(k,2),round(l,2),round(m,2))
297   - return (minLoc, minDist)
298   -
299 300 \ No newline at end of file
  301 + imageArray[floor(l*10)].append(d*10+255-min(10+exp(d*2),255))
  302 + return (minLoc, minDist, imageArray[0], floor(ySize/step), floor(xSize/step), imageArray)
... ...
visuals.py 0 → 100644
  1 +from structure import RSSVector, Location, Cell, newCell, KNeighbors, resolve_barycenter, MarkovModel, NLateration
  2 +from random import random
  3 +from math import floor, sqrt, ceil
  4 +from PIL import Image, ImageDraw
  5 +from os import startfile
  6 +
  7 +#dataset : list of tuples representing emitters (Location, distance)
  8 +dataset = [(Location(.5,.5,.5), 3.0), (Location(4.0,.0,.0), 2.0), (Location(4.0,5.0,5.0), 4.2), (Location(3.0,3.0,3.0), 2.5)]
  9 +
  10 +NLat_result = NLateration(dataset)
  11 +
  12 +W,H = NLat_result[3], NLat_result[4]
  13 +
  14 +frames = []
  15 +
  16 +def createFrame(x,y,nbr):
  17 + img = Image.new("L",(x,y))
  18 + img.putdata(NLat_result[5][nbr])
  19 + return img
  20 +
  21 +for i in range(len(NLat_result[5])):
  22 + newFrame = createFrame(W,H,i)
  23 + newFrame = newFrame.resize((W*10,H*10), Image.ANTIALIAS)
  24 + draw = ImageDraw.Draw(newFrame)
  25 + draw.text(text="z="+str(i), xy=(0,0))
  26 + frames.append(newFrame)
  27 +
  28 +frames[0].save("out.gif", format="GIF", append_images=frames[1:], save_all=True, duration=100, loop=0)
  29 +print("gif exported")
  30 +
... ...