def preProcess(self): for f in self.files: print(f'Processing {f}...') raw_datas = read_data_file(f) acc = raw_datas.acce direciton = raw_datas.ahrs real_pos = raw_datas.waypoint mag = raw_datas.magn wifi = raw_datas.wifi step_points = StepPoint(acc, direciton, real_pos).get_step_points() self.dataToMap(mag, step_points, "mag") if wifi.size > 0: self.dataToMap(wifi, step_points, "wifi")
def task1_visualize_groundTruth(number=0): if number > len(path_filenames): number = len(path_filenames)-1 path_data = read_data_file(path_filenames[number]) path_id = path_filenames[number].name.split(".")[0] plt = visualize_trajectory( path_data.waypoint[:, 1:3], floor_plan_filename, width_meter, height_meter, title=path_id, dir=path_image_save_dir, show=True, save=True) plt.clf() plt.close()
def calibrate_magnetic_wifi_ibeacon_to_position(path_file_list): mwi_datas = {} for path_filename in path_file_list: print(f'Processing {path_filename}...') path_datas = read_data_file(path_filename) acce_datas = path_datas.acce magn_datas = path_datas.magn ahrs_datas = path_datas.ahrs wifi_datas = path_datas.wifi ibeacon_datas = path_datas.ibeacon posi_datas = path_datas.waypoint # 使用加速度数据和角度数据,计算每一步的位置信息 step_positions = compute_step_positions( acce_datas, ahrs_datas, posi_datas) # visualize_trajectory(posi_datas[:, 1:3], floor_plan_filename, width_meter, height_meter, title='Ground Truth', show=True) # visualize_trajectory(step_positions[:, 1:3], floor_plan_filename, width_meter, height_meter, title='Step Position', show=True) if wifi_datas.size != 0: # 对wifi数据时间戳进行去重和排序 sep_tss = np.unique(wifi_datas[:, 0].astype(float)) # 得到按时间戳分组后的所有wifi数据 wifi_datas_list = split_ts_seq(wifi_datas, sep_tss) for wifi_ds in wifi_datas_list: # 找出所有位置时间戳与当前wifi数据时间戳的差值 diff = np.abs(step_positions[:, 0] - float(wifi_ds[0, 0])) # 找出差值最小的下标 index = np.argmin(diff) # 得到最小值的xy坐标计做(x,y) target_xy_key = tuple(step_positions[index, 1:3]) if target_xy_key in mwi_datas: # 如果当前位置已有wifi信息,则增加一条记录 mwi_datas[target_xy_key]['wifi'] = np.append( mwi_datas[target_xy_key]['wifi'], wifi_ds, axis=0) else: # 记录当前位置的wifi信息 mwi_datas[target_xy_key] = { 'magnetic': np.zeros((0, 4)), 'wifi': wifi_ds, 'ibeacon': np.zeros((0, 3)) } # 以同样的逻辑得到不同位置的磁力信息 sep_tss = np.unique(magn_datas[:, 0].astype(float)) magn_datas_list = split_ts_seq(magn_datas, sep_tss) for magn_ds in magn_datas_list: diff = np.abs(step_positions[:, 0] - float(magn_ds[0, 0])) index = np.argmin(diff) target_xy_key = tuple(step_positions[index, 1:3]) if target_xy_key in mwi_datas: mwi_datas[target_xy_key]['magnetic'] = np.append( mwi_datas[target_xy_key]['magnetic'], magn_ds, axis=0) else: mwi_datas[target_xy_key] = { 'magnetic': magn_ds, 'wifi': np.zeros((0, 5)), 'ibeacon': np.zeros((0, 3)) } return mwi_datas
# 读取楼层地图信息(宽高) with open(floor_info_filename) as f: floor_info = json.load(f) width_meter = floor_info["map_info"]["width"] height_meter = floor_info["map_info"]["height"] # 读取所有文件名 path_filenames = list(Path(path_data_dir).resolve().glob("*.txt")) # Task1. Visualize way points (ground-truth locations) # 这一问直接读数据绘制即可,不需要再处理数据 print('Visualizing ground truth positions...') for path_filename in path_filenames: print(f'Processing file: {path_filename}...') path_data = read_data_file(path_filename) path_id = path_filename.name.split(".")[0] fig = visualize_trajectory( path_data.waypoint[:, 1:3], floor_plan_filename, width_meter, height_meter, title=path_id, show=False) html_filename = f'{path_image_save_dir}/{path_id}.html' html_filename = str(Path(html_filename).resolve()) save_figure_to_html(fig, html_filename) # Task2: Visualize geomagnetic heat map print('Visualizing more information...') mwi_datas = calibrate_magnetic_wifi_ibeacon_to_position(path_filenames) magnetic_strength = extract_magnetic_strength(mwi_datas) heat_positions = np.array(list(magnetic_strength.keys())) heat_values = np.array(list(magnetic_strength.values())) fig = visualize_heatmap(heat_positions, heat_values, floor_plan_filename, width_meter,
def calibrate_magnetic_wifi_ibeacon_to_position(path_file_list): mwi_datas = {} for path_filename in path_file_list: print(f'Processing {path_filename}...') path_datas = read_data_file(path_filename) acce_datas = path_datas.acce magn_datas = path_datas.magn ahrs_datas = path_datas.ahrs wifi_datas = path_datas.wifi ibeacon_datas = path_datas.ibeacon posi_datas = path_datas.waypoint step_positions = compute_step_positions(acce_datas, ahrs_datas, posi_datas) # visualize_trajectory(posi_datas[:, 1:3], floor_plan_filename, width_meter, height_meter, title='Ground Truth', show=True) # visualize_trajectory(step_positions[:, 1:3], floor_plan_filename, width_meter, height_meter, title='Step Position', show=True) if wifi_datas.size != 0: sep_tss = np.unique(wifi_datas[:, 0].astype(float)) wifi_datas_list = split_ts_seq(wifi_datas, sep_tss) for wifi_ds in wifi_datas_list: diff = np.abs(step_positions[:, 0] - float(wifi_ds[0, 0])) index = np.argmin(diff) target_xy_key = tuple(step_positions[index, 1:3]) if target_xy_key in mwi_datas: mwi_datas[target_xy_key]['wifi'] = np.append(mwi_datas[target_xy_key]['wifi'], wifi_ds, axis=0) else: mwi_datas[target_xy_key] = { 'magnetic': np.zeros((0, 4)), 'wifi': wifi_ds, 'ibeacon': np.zeros((0, 3)) } if ibeacon_datas.size != 0: sep_tss = np.unique(ibeacon_datas[:, 0].astype(float)) ibeacon_datas_list = split_ts_seq(ibeacon_datas, sep_tss) for ibeacon_ds in ibeacon_datas_list: diff = np.abs(step_positions[:, 0] - float(ibeacon_ds[0, 0])) index = np.argmin(diff) target_xy_key = tuple(step_positions[index, 1:3]) if target_xy_key in mwi_datas: mwi_datas[target_xy_key]['ibeacon'] = np.append(mwi_datas[target_xy_key]['ibeacon'], ibeacon_ds, axis=0) else: mwi_datas[target_xy_key] = { 'magnetic': np.zeros((0, 4)), 'wifi': np.zeros((0, 5)), 'ibeacon': ibeacon_ds } sep_tss = np.unique(magn_datas[:, 0].astype(float)) magn_datas_list = split_ts_seq(magn_datas, sep_tss) for magn_ds in magn_datas_list: diff = np.abs(step_positions[:, 0] - float(magn_ds[0, 0])) index = np.argmin(diff) target_xy_key = tuple(step_positions[index, 1:3]) if target_xy_key in mwi_datas: mwi_datas[target_xy_key]['magnetic'] = np.append(mwi_datas[target_xy_key]['magnetic'], magn_ds, axis=0) else: mwi_datas[target_xy_key] = { 'magnetic': magn_ds, 'wifi': np.zeros((0, 5)), 'ibeacon': np.zeros((0, 3)) } return mwi_datas