xiaomi_vacuum_as_data_colle.../rss_map_parser.py

190 lines
6.2 KiB
Python

import csv
import numpy as np
import sys
import pickle
import matplotlib.pyplot as plt
import bisect
np.set_printoptions(threshold=sys.maxsize)
types = []
type_values = []
xy_locs_rss = np.empty([1,3])
rss_map = np.empty([64, 64])
picked_type = -1
def main():
if sys.argv[1] == "-help":
print("usage: python3 rss_map_parser.py path/to/file/filename.csv -u/-d/-l/-r (when dot at upper/lower/left/right edge) -d/-v/-dv (download/&visulize parsed rss map)")
else:
pathtofile = sys.argv[1]
orientation = sys.argv[2]
operation = sys.argv[3]
if len(pathtofile) == 0:
print("error: missing arguments[1] indicating the csv file path")
return
find_type(pathtofile)
if orientation == '-r':
readCSV_r(pathtofile)
elif orientation == '-d':
readCSV_d(pathtofile)
elif orientation == '-l':
readCSV_l(pathtofile)
elif orientation == '-u':
readCSV_u(pathtofile)
else:
print("error: missing arguments[2] indicating the dot position")
return
parse_map()
if operation == '-d':
write_pickle(pathtofile)
elif operation == '-v':
visualize_map()
elif operation == '-dv':
write_pickle(pathtofile)
visualize_map()
else:
print("error: missing arguments[3] indicating the operation (e.g., download & visulize)")
return
def find_type(pathtofile):
global type_values
global picked_type
with open(pathtofile) as csvfile:
csv_reader = csv.reader(csvfile, delimiter=',')
for row in csv_reader:
if row[1]=='y':
continue
if len(types)==0:
types.append(row[8])
type_values.append(1)
elif row[8] in types:
type_values[types.index(row[8])] += 1
else:
types.append(row[8])
type_values.append(1)
picked_type = types[type_values.index(max(type_values))]
def readCSV_u(pathtofile):
global xy_locs_rss
global picked_type
with open(pathtofile) as csvfile:
csv_reader = csv.reader(csvfile, delimiter=',')
for row in csv_reader:
if row[8]==picked_type:
x_loc = -float(row[0])
y_loc = -float(row[1])
rss = float(row[4])
xy_locs_rss = np.vstack([xy_locs_rss, [x_loc, y_loc, rss]])
xy_locs_rss = sorted(xy_locs_rss, key=lambda x: x[0])
xy_locs_rss = np.transpose(xy_locs_rss)
def readCSV_d(pathtofile):
global xy_locs_rss
global picked_type
with open(pathtofile) as csvfile:
csv_reader = csv.reader(csvfile, delimiter=',')
for row in csv_reader:
if row[8]==picked_type:
x_loc = float(row[0])
y_loc = float(row[1])
rss = float(row[4])
xy_locs_rss = np.vstack([xy_locs_rss, [x_loc, y_loc, rss]])
xy_locs_rss = sorted(xy_locs_rss, key=lambda x: x[0])
xy_locs_rss = np.transpose(xy_locs_rss)
def readCSV_l(pathtofile):
global xy_locs_rss
global picked_type
with open(pathtofile) as csvfile:
csv_reader = csv.reader(csvfile, delimiter=',')
for row in csv_reader:
if row[8]==picked_type:
x_loc = -float(row[1])
y_loc = float(row[0])
rss = float(row[4])
xy_locs_rss = np.vstack([xy_locs_rss, [x_loc, y_loc, rss]])
xy_locs_rss = sorted(xy_locs_rss, key=lambda x: x[0])
xy_locs_rss = np.transpose(xy_locs_rss)
def readCSV_r(pathtofile):
global xy_locs_rss
global picked_type
with open(pathtofile) as csvfile:
csv_reader = csv.reader(csvfile, delimiter=',')
for row in csv_reader:
if row[8]==picked_type:
x_loc = float(row[1])
y_loc = -float(row[0])
rss = float(row[4])
xy_locs_rss = np.vstack([xy_locs_rss, [x_loc, y_loc, rss]])
xy_locs_rss = sorted(xy_locs_rss, key=lambda x: x[0])
xy_locs_rss = np.transpose(xy_locs_rss)
def parse_map():
global rss_map
rss_sum_count = 0
rss_sum_temp = 0
for i in range(64):
for ii in range(64):
upper_bound_x = (-3.2+0.1*i+0.1)
lower_bound_x = (-3.2+0.1*(i-1)-0.1)
lower_bound_iii = bisect.bisect_left(xy_locs_rss[0,:], lower_bound_x)
upper_bound_iii = bisect.bisect_right(xy_locs_rss[0,:], upper_bound_x, lo=lower_bound_iii)
nums = xy_locs_rss[:, lower_bound_iii:upper_bound_iii]
for iii in range(len(nums[0,:])):
if nums[1,iii]>(5.8-0.1*ii-0.025) and nums[1,iii]<=(5.8-0.1*(ii-1)+0.025):
rss_sum_temp += nums[2,iii]
rss_sum_count += 1
if rss_sum_count != 0:
rss_map[i,ii] = rss_sum_temp / rss_sum_count
else:
rss_map[i,ii] = -85
rss_sum_temp = 0
rss_sum_count = 0
rss_map = np.transpose(rss_map)
def write_pickle(pathtofile):
file = open(pathtofile+".pickle", 'wb')
pickle.dump(rss_map, file)
file.close()
def visualize_map():
plt.imshow(rss_map, cmap='hot', interpolation='nearest')
plt.colorbar()
plt.show()
main()
#def parse_horizontal_map():
# global rss_map
# rss_sum_count = 0
# rss_sum_temp = 0
# for i in range(64):
# for ii in range(64):
# upper_bound_x = (-5.8+0.1*i+0.025)
# lower_bound_x = (-5.8+0.1*(i-1)-0.025)
# lower_bound_iii = bisect.bisect_left(xy_locs_rss[0,:], lower_bound_x)
# upper_bound_iii = bisect.bisect_right(xy_locs_rss[0,:], upper_bound_x, lo=lower_bound_iii)
# nums = xy_locs_rss[:, lower_bound_iii:upper_bound_iii]
# for iii in range(len(nums[0,:])):
# if nums[1,iii]>(3.2-0.1*ii-0.075) and nums[1,iii]<=(3.2-0.1*(ii-1)+0.075):
# rss_sum_temp += nums[2,iii]
# rss_sum_count += 1
# if rss_sum_count != 0:
# rss_map[i,ii] = rss_sum_temp / rss_sum_count
# else:
# rss_map[i,ii] = -85
# rss_sum_temp = 0
# rss_sum_count = 0
# rss_map = np.transpose(rss_map)