├── README.md ├── Wifi_ap_0.5.csv ├── Wifi_ap_1.csv ├── Wifi_ap_1.5.csv ├── beacon1.csv ├── beacon2.csv ├── beacon3.csv ├── wifi.py └── trilateration.py /README.md: -------------------------------------------------------------------------------- 1 | # Indoor-Positioning-techniques 2 | Weighted centroid and basic trilateration on RSSI values from WIFI APs and BLE beacons. 3 | 4 | Trilateration.py uses RSSI values from beacon csv and 5 | wifi.py uses values of RSSI from WIFI APs for weighted centroid positioning. 6 | -------------------------------------------------------------------------------- /Wifi_ap_0.5.csv: -------------------------------------------------------------------------------- 1 | -31 2 | -31.879 3 | -30.872 4 | -31.63 5 | -32 6 | -31.2556 7 | -32.0023 8 | -31.7 9 | -31.4321 10 | -31.223 11 | -31 12 | -31 13 | -31 14 | -31 15 | -31.72 16 | -30.87 17 | -31 18 | -31.107 19 | -30.924 20 | -31.003 21 | -31 22 | -31 23 | -30.611 24 | -31.4352 25 | -30.7634 26 | -31.02 27 | -31.149 28 | -31.002 29 | -31.213 30 | -30.31214 31 | -30.58563 32 | -31 33 | -31 34 | -31 35 | -31 36 | -31 37 | -30.98558 38 | -30.598 39 | -30.345 40 | -31.375 41 | -31.0034 42 | -31 43 | -31.123 44 | -30.1674 45 | -31.321 46 | -31 47 | -31 48 | -31 49 | -30.97 50 | -30.13 51 | -------------------------------------------------------------------------------- /Wifi_ap_1.csv: -------------------------------------------------------------------------------- 1 | -36 2 | -35.867 3 | -36.2999 4 | -36.9245 5 | -36.87 6 | -37.001 7 | -36.3208 8 | -35.9099 9 | -36 10 | -36.11 11 | -36.9 12 | -36.768 13 | -36.198 14 | -36.067 15 | -36 16 | -36 17 | -36 18 | -36 19 | -37.01 20 | -36.923 21 | -36.298 22 | -35.9453 23 | -35.23 24 | -36.023 25 | -36.12 26 | -36.035 27 | -36 28 | -36 29 | -37 30 | -36 31 | -36.875 32 | -36 33 | -35.0569 34 | -35.234 35 | -35.957 36 | -35.8254 37 | -36 38 | -36.0126 39 | -37 40 | -35.73 41 | -35.91209 42 | -37.017 43 | -36.529 44 | -36.721 45 | -36.18 46 | -35.953 47 | -35.875 48 | -36 49 | -36 50 | -36.12 51 | -------------------------------------------------------------------------------- /Wifi_ap_1.5.csv: -------------------------------------------------------------------------------- 1 | -38.12 2 | -38.512 3 | -38.641368 4 | -38.87 5 | -38.697 6 | -38.6014 7 | -38.672 8 | -37.801 9 | -38.569 10 | -37.998 11 | -38.6345 12 | -38.6418 13 | -38.6571 14 | -38.523 15 | -38.6413 16 | -38.0012 17 | -38.5972 18 | -38.6008 19 | -38.5 20 | -38.6 21 | -38.6415 22 | -38.6414 23 | -38.6413 24 | -38.701 25 | -38.6319 26 | -38.654 27 | -38.641438 28 | -38.59821 29 | -38.65 30 | -37.9989 31 | -38.415 32 | -38.6417 33 | -38.6413 34 | -38.6413868 35 | -38.641495 36 | -38.5943 37 | -38.6423 38 | -38.7023 39 | -38.712 40 | -38.5926 41 | -38.4146 42 | -39.01211 43 | -39.007 44 | -38.801 45 | -38.5985 46 | -38.329 47 | -38.491 48 | -38.7912 49 | -38.6915 50 | -38.719 51 | -------------------------------------------------------------------------------- /beacon1.csv: -------------------------------------------------------------------------------- 1 | -79 2 | -79.2 3 | -79.42857 4 | -79.25 5 | -79.125 6 | -79.55556 7 | -79.625 8 | -79.625 9 | -79.2 10 | -79.5 11 | -79.666664 12 | -81.57143 13 | -82.166664 14 | -81.8 15 | -81.166664 16 | -80.625 17 | -80.5 18 | -80.2 19 | -80.2 20 | -79 21 | -79 22 | -79.4 23 | -80 24 | -79.9 25 | -79.8 26 | -80 27 | -80.7 28 | -80.6 29 | -80 30 | -80.9 31 | -81.2 32 | -80.8 33 | -80.75 34 | -80.333336 35 | -80.375 36 | -80.875 37 | -82.14286 38 | -84.55556 39 | -85.125 40 | -85.125 41 | -84.7 42 | -85.55556 43 | -85.5 44 | -85.55556 45 | -84.75 46 | -81.5 47 | -81.375 48 | -81.71429 49 | -81.85714 50 | -81.375 51 | -81.166664 52 | -81.166664 53 | -80.75 54 | -81 55 | -81 56 | -81.625 57 | -81 58 | -81.77778 59 | -81.77778 60 | -81.6 61 | -82 62 | -81.7 63 | -81.7 64 | -81.7 65 | -81.3 66 | -80.1 67 | -80.1 68 | -79.7 69 | -79.2 70 | -77.71429 71 | -77.57143 72 | -77.5 73 | -78.14286 74 | -78.5 75 | -79.875 76 | -82.2 77 | -82.2 78 | -82.4 79 | -82.8 80 | -82.8 81 | -82.8 82 | -82.8 83 | -82.4 84 | -81.5 85 | -81.5 86 | -82 87 | -82 88 | -83 89 | -83 90 | -------------------------------------------------------------------------------- /beacon2.csv: -------------------------------------------------------------------------------- 1 | "Aditi" 2 | "64:E2:E7:F2:C8:BD" 3 | -89.5 4 | -89.5 5 | -88.8 6 | -88.666664 7 | -88.666664 8 | -89.5 9 | -88.57143 10 | -88.85714 11 | -89.0 12 | -89.166664 13 | -89.71429 14 | -89.71429 15 | -88.44444 16 | -88.4 17 | -88.666664 18 | -88.77778 19 | -88.77778 20 | -87.8 21 | -87.22222 22 | -87.7 23 | -88.4 24 | -89.22222 25 | -89.111115 26 | -88.0 27 | -88.0 28 | -87.2 29 | -87.2 30 | -86.7 31 | -85.5 32 | -84.25 33 | -84.0 34 | -84.166664 35 | -84.5 36 | -84.5 37 | -84.666664 38 | -84.666664 39 | -84.666664 40 | -84.5 41 | -84.0 42 | -84.0 43 | -90.7 44 | -90.4 45 | -90.4 46 | -91.8 47 | -92.5 48 | -93.4 49 | -91.4 50 | -91.5 51 | -91.6 52 | -91.6 53 | -91.4 54 | -90.3 55 | -91.44444 56 | -92.5 57 | -93.0 58 | -93.0 59 | -90.9 60 | -90.5 61 | -90.5 62 | -90.75 63 | -90.85714 64 | -90.5 65 | -90.42857 66 | -89.57143 67 | -91.75 68 | -90.333336 69 | -91.375 70 | -91.125 71 | -91.6 72 | -91.22222 73 | -91.375 74 | -91.333336 75 | -90.9 76 | -91.7 77 | -91.0 78 | -91.5 79 | -91.42857 80 | -90.875 81 | -90.55556 82 | -91.25 83 | -92.0 84 | -91.25 85 | -91.25 86 | -90.0 87 | -90.375 88 | -91.0 89 | -91.42857 90 | -91.14286 91 | -91.28571 92 | -92.0 93 | -92.0 94 | -93.0 95 | -92.166664 96 | -93.0 97 | -91.0 98 | -91.5 99 | -91.9 100 | -92.3 101 | -92.3 102 | -92.3 103 | -93.3 104 | -92.4 105 | -92.8 106 | -92.8 107 | -92.6 108 | -93.1 109 | -91.7 110 | -92.55556 111 | -93.1 112 | -92.666664 113 | -92.666664 114 | -91.666664 115 | -90.333336 116 | -91.333336 117 | -91.55556 118 | -91.5 119 | -91.4 120 | -91.75 121 | -91.75 122 | -93.333336 123 | -96.5 124 | -97.0 125 | -------------------------------------------------------------------------------- /beacon3.csv: -------------------------------------------------------------------------------- 1 | "Aditi" 2 | "7E:E1:85:D7:DE:44" 3 | -87.2 4 | -87.3 5 | -87.4 6 | -87.7 7 | -87.77778 8 | -87.25 9 | -88.125 10 | -89.0 11 | -90.125 12 | -91.166664 13 | -91.166664 14 | -90.85714 15 | -90.85714 16 | -91.4 17 | -91.22222 18 | -90.5 19 | -90.0 20 | -90.0 21 | -90.0 22 | -90.77778 23 | -90.77778 24 | -91.57143 25 | -92.375 26 | -94.125 27 | -93.7 28 | -93.7 29 | -94.75 30 | -94.57143 31 | -95.5 32 | -95.666664 33 | -94.833336 34 | -94.75 35 | -97.5 36 | -96.5 37 | -95.4 38 | -96.0 39 | -94.57143 40 | -94.57143 41 | -94.833336 42 | -94.666664 43 | -94.666664 44 | -94.55556 45 | -95.44444 46 | -95.0 47 | -94.888885 48 | -94.888885 49 | -94.5 50 | -94.125 51 | -94.125 52 | -93.125 53 | -92.28571 54 | -91.0 55 | -91.0 56 | -91.0 57 | -91.0 58 | -91.0 59 | -91.0 60 | -89.75 61 | -89.333336 62 | -89.14286 63 | -89.14286 64 | -89.875 65 | -90.0 66 | -90.375 67 | -90.0 68 | -90.0 69 | -90.0 70 | -90.833336 71 | -91.0 72 | -90.666664 73 | -90.6 74 | -92.333336 75 | -92.0 76 | -92.375 77 | -92.4 78 | -91.9 79 | -91.888885 80 | -92.125 81 | -91.5 82 | -90.7 83 | -90.77778 84 | -90.111115 85 | -90.55556 86 | -90.875 87 | -90.888885 88 | -90.888885 89 | -91.25 90 | -91.57143 91 | -91.666664 92 | -91.3 93 | -90.5 94 | -90.57143 95 | -91.25 96 | -91.25 97 | -91.333336 98 | -91.333336 99 | -91.0 100 | -92.0 101 | -91.0 102 | -91.0 103 | -90.5 104 | -90.85714 105 | -91.0 106 | -91.0 107 | -91.77778 108 | -91.888885 109 | -92.125 110 | -91.888885 111 | -92.125 112 | -91.75 113 | -91.833336 114 | -91.833336 115 | -90.6 116 | -91.4 117 | -93.0 118 | -92.833336 119 | -92.6 120 | -93.4 121 | -94.0 122 | -94.0 123 | -94.0 124 | -93.85714 125 | -92.57143 126 | -92.833336 127 | -92.42857 128 | -92.166664 129 | -89.4 130 | -88.833336 131 | -89.28571 132 | -89.5 133 | -90.25 134 | -90.14286 135 | -90.166664 136 | -90.166664 137 | -90.5 138 | -92.0 139 | -92.0 140 | -93.0 141 | -------------------------------------------------------------------------------- /wifi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """wifi.ipynb 3 | 4 | Automatically generated by Colaboratory. 5 | 6 | Original file is located at 7 | https://colab.research.google.com/drive/1tJTeO7DSwhR26UTdJec7qey1HImdnkxJ 8 | """ 9 | 10 | import math 11 | from math import pi 12 | import pandas as pd 13 | import csv 14 | from math import pow 15 | import numpy as np 16 | import matplotlib.pyplot as plot 17 | 18 | rssi_arr_1=np.genfromtxt('/content/Wifi_ap_0.5.csv',delimiter=',') 19 | rssi_arr_2=np.genfromtxt('/content/Wifi_ap_1.csv',delimiter=',') 20 | rssi_arr_3=np.genfromtxt('/content/Wifi_ap_1.5.csv',delimiter=',') 21 | 22 | n=1.5 23 | a=-36 24 | def calc_dist(rss,a,n): 25 | cal_d= pow(10,((rss-a)/(-10*n))) 26 | return cal_d 27 | 28 | 29 | dist_arr_1=[] 30 | dist_arr_2=[] 31 | dist_arr_3=[] 32 | weight_arr_1=[] 33 | weight_arr_2=[] 34 | weight_arr_3=[] 35 | 36 | for x in rssi_arr_1: 37 | cal_d=calc_dist(x,a,n) 38 | dist_arr_1=np.append(dist_arr_1,cal_d) 39 | weight_arr_1=np.append(weight_arr_1,(1/cal_d)) 40 | 41 | for x in rssi_arr_2: 42 | cal_d=calc_dist(x,a,n) 43 | dist_arr_2=np.append(dist_arr_2,cal_d) 44 | weight_arr_2=np.append(weight_arr_2,(1/cal_d)) 45 | 46 | for x in rssi_arr_3: 47 | cal_d=calc_dist(x,a,n) 48 | dist_arr_3=np.append(dist_arr_3,cal_d) 49 | weight_arr_3=np.append(weight_arr_3,(1/cal_d)) 50 | 51 | rssi_var1=np.nanvar(rssi_arr_1) 52 | rssi_var2=np.nanvar(rssi_arr_2) 53 | rssi_var3=np.nanvar(rssi_arr_3) 54 | 55 | print("variance of rssi of APs are respectively(in dBm)=",rssi_var1,rssi_var2,rssi_var3) 56 | 57 | mean_1=np.nanmean(dist_arr_1) 58 | mean_2=np.nanmean(dist_arr_2) 59 | mean_3=np.nanmean(dist_arr_3) 60 | wmean_1=np.nanmean(weight_arr_1) 61 | wmean_2=np.nanmean(weight_arr_2) 62 | wmean_3=np.nanmean(weight_arr_3) 63 | 64 | arr_weight=[wmean_1,wmean_2,wmean_3] 65 | 66 | print("calculated distance from ref.point 1=",mean_1) 67 | print("calculated distance from ref.point 2=",mean_2) 68 | print("calculated distance from ref.point 3=",mean_3) 69 | 70 | 71 | fig = plot.figure() 72 | ax1 = fig.add_subplot(221) 73 | ax2 = fig.add_subplot(222) 74 | ax3 = fig.add_subplot(223) 75 | 76 | 77 | ax1.plot(dist_arr_1) 78 | ax1.axhline(y=mean_1, color='g', linestyle='-') 79 | ax1.axhline(y=0.5, color='r', linestyle='-') 80 | 81 | ax2.plot(dist_arr_2) 82 | ax2.axhline(y=mean_2, color='g', linestyle='-') 83 | ax2.axhline(y=1, color='r', linestyle='-') 84 | 85 | ax3.plot(dist_arr_3) 86 | ax3.axhline(y=mean_3, color='g', linestyle='-') 87 | ax3.axhline(y=1.5, color='r', linestyle='-') 88 | plot.show() 89 | 90 | x=[2,1.5,0] 91 | y=[0,1,0] 92 | 93 | def wcl(weight,x,y): 94 | xiwi=np.multiply(x,weight) 95 | yiwi=np.multiply(y,weight) 96 | xw=np.sum(xiwi)/np.sum(weight) 97 | yw=np.sum(yiwi)/np.sum(weight) 98 | return xw,yw 99 | 100 | res_x,res_y=wcl(arr_weight,x,y) 101 | print("resultant location coordinates(x,y)=",res_x,res_y) 102 | 103 | def calculateDistance(x1,y1,x2,y2): 104 | dist = math.sqrt((x2 - x1)**2 + (y2 - y1)**2) 105 | return dist 106 | print("distance between calculated and setup coordinates in meteres=", calculateDistance(1.5, 0, res_x, res_y) ) -------------------------------------------------------------------------------- /trilateration.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """Trilateration.ipynb 3 | 4 | Automatically generated by Colaboratory. 5 | 6 | Original file is located at 7 | https://colab.research.google.com/drive/19SxnPf7U_CkaIGPEwcqoCqcf7Noj-j1C 8 | """ 9 | 10 | import math 11 | from math import sin, cos, sqrt, atan2, radians, pi 12 | import pandas as pd 13 | import csv 14 | from math import pow 15 | import numpy as np 16 | import matplotlib.pyplot as plot 17 | 18 | 19 | rssi_data =pd.read_csv('/content/drive/My Drive/beacon1.csv').values.flatten() 20 | 21 | 22 | rssi_data = np.flip(rssi_data) 23 | i = np.arange(0, rssi_data.size, 1) 24 | rssi_arr_1=np.genfromtxt('/content/drive/My Drive/beacon1.csv',delimiter=',') 25 | rssi_arr_2=np.genfromtxt('/content/drive/My Drive/beacon2.csv',delimiter=',') 26 | rssi_arr_3=np.genfromtxt('/content/drive/My Drive/beacon3.csv',delimiter=',') 27 | 28 | n=3 29 | a=-90 30 | def calc_rss(n,d,a): 31 | cal_rss= (-10*n*(math.log(d,10)))+a 32 | print(cal_rss) 33 | 34 | def calc_dist(rss,a,n): 35 | cal_d= pow(10,((rss-a)/(-10*n))) 36 | return cal_d 37 | 38 | dist_arr_1=[] 39 | dist_arr_2=[] 40 | dist_arr_3=[] 41 | 42 | for x in rssi_arr_1: 43 | cal_d=calc_dist(x,a,n) 44 | dist_arr_1=np.append(dist_arr_1,cal_d) 45 | for x in rssi_arr_2: 46 | cal_d=calc_dist(x,a,n) 47 | dist_arr_2=np.append(dist_arr_2,cal_d) 48 | for x in rssi_arr_3: 49 | cal_d=calc_dist(x,a,n) 50 | dist_arr_3=np.append(dist_arr_3,cal_d) 51 | 52 | rssi_var1=np.nanvar(rssi_arr_1) 53 | rssi_var2=np.nanvar(rssi_arr_2) 54 | rssi_var3=np.nanvar(rssi_arr_3) 55 | 56 | print("variance of rssi of beacons are respectively=",rssi_var1,rssi_var2,rssi_var3) 57 | 58 | 59 | mean_1=np.nanmean(dist_arr_1) 60 | mean_2=np.nanmean(dist_arr_2) 61 | mean_3=np.nanmean(dist_arr_3) 62 | 63 | print("distance of tag from reference point 1=",mean_1) 64 | print("distance of tag from reference point 2=",mean_2) 65 | print("distance of tag from reference point 3=",mean_3) 66 | 67 | fig = plot.figure() 68 | ax1 = fig.add_subplot(221) 69 | ax2 = fig.add_subplot(222) 70 | ax3 = fig.add_subplot(223) 71 | 72 | 73 | ax1.plot(dist_arr_1) 74 | ax1.axhline(y=mean_1, color='g', linestyle='-') 75 | ax1.axhline(y=0.5, color='r', linestyle='-') 76 | 77 | ax2.plot(dist_arr_2) 78 | ax2.axhline(y=mean_2, color='g', linestyle='-') 79 | ax2.axhline(y=1, color='r', linestyle='-') 80 | 81 | ax3.plot(dist_arr_3) 82 | ax3.axhline(y=mean_3, color='g', linestyle='-') 83 | ax3.axhline(y=1.5, color='r', linestyle='-') 84 | plot.show() 85 | 86 | 87 | 88 | def trilateration(x1,y1,r1,x2,y2,r2,x3,y3,r3): 89 | A = 2*x2 - 2*x1 90 | B = 2*y2 - 2*y1 91 | C = r1**2 - r2**2 - x1**2 + x2**2 - y1**2 + y2**2 92 | D = 2*x3 - 2*x2 93 | E = 2*y3 - 2*y2 94 | F = r2**2 - r3**2 - x2**2 + x3**2 - y2**2 + y3**2 95 | x = (C*E - F*B) / (E*A - B*D) 96 | y = (C*D - A*F) / (B*D - A*E) 97 | return x,y 98 | 99 | x,y = trilateration(2,0,mean_1,1.5,1,mean_2,0,0,mean_3) 100 | 101 | def calculateDistance(x1,y1,x2,y2): 102 | dist = math.sqrt((x2 - x1)**2 + (y2 - y1)**2) 103 | return dist 104 | print("distance between calculated and setup coordinates=", calculateDistance(1.5, 0, x, y) ) 105 | 106 | print("calculated cordinates of tag (x,y)=",x,y) --------------------------------------------------------------------------------