Para revisar los resultados de un solo punto, de todos los resultados anteriores, se realiza una gráfica que muestre los círculos de cada baliza con los radios de las distancias estimadas.
La gráfica permite observar los detalles de trilateración para ese punto en particular.
Resultados: baricentro: [ 614804.97 9762762.46] bar_error: 72.84 poligono x: [614760.66 614776.52 614877.73] poligono y: [9762742.69 9762778.91 9762765.77]
Por ejemplo para el caso del punto ‘FIEC130’ del que no se registró señal desde ‘gtwFCNM’ se tiene:
Algoritmo Python
# trilaterando - gráfica de un punto # Girni 2020-10-07 propuesta: edelros@espol.edu.ec import numpy as np import matplotlib.pyplot as plt import pandas as pd import girni_lora_libreria as girni # INGRESO cadapunto = 'FIEC111' modo = 'rx' medida = 'rssi' arch_trilatera = 'rsmP07_'+medida+'trilateraSector01.txt' # Referencias baliza = {'d1':'gtwRECT', 'd2':'gtwFIEC', 'd3':'gtwFCNM'} tolera = 1e-8 # PROCEDIMIENTO baliza_key = list(baliza.keys()) baliza_val = list(baliza.values()) # leer datos tabla = pd.read_csv(arch_trilatera, index_col='etiqueta') tabla = pd.DataFrame(tabla) # Revisa indices existe = 0 if cadapunto in tabla.index: # coordenadas de baliza coordbaliza = {} for cadabaliza in baliza: cualbaliza = baliza[cadabaliza] coordbaliza[cadabaliza] = [tabla['c_este'][cualbaliza]] coordbaliza[cadabaliza].append(tabla['c_norte'][cualbaliza]) existe = 1 # coordenadas GPS del punto c_este = tabla['c_este'][cadapunto] c_norte = tabla['c_norte'][cadapunto] # coordenadas por trilateración punto = {} ubicados = np.zeros(4,dtype=int) for i in range(0,3,1): punto[i] = {} cuenta = 0 for unabaliza in baliza: punto[i][unabaliza] = tabla['dist'+str(i)+'_'+unabaliza][cadapunto] # si existe distancia if not(np.isnan(punto[i][unabaliza])): cuenta = cuenta + 1 if cuenta>0: ubicados[3]= ubicados[3] + 1 encontrado = tabla['encontrado'][cadapunto] if not(np.isnan(encontrado)): encontrado = int(encontrado) else: encontrado = 0 # trilatera el punto raiztodas = girni.intersectacirculos(punto[encontrado],coordbaliza,tolera) todasx = raiztodas[0] todasy = raiztodas[1] if len(todasx)>0: resultado = girni.trilatera(punto[encontrado],coordbaliza,tolera) # SALIDA precision=2 np.set_printoptions(precision) if existe ==1: if len(todasx)>0: print('intersectados: ') print(np.array(todasx)) print(np.array(todasy)) print('\nResultados: ') print('baricentro: ',np.array(resultado['baricentro'])) print('bar_error: ',np.round(resultado['barerror'],precision)) print('poligono x: ',np.array(resultado['poligono'][0])) print('poligono y: ',np.array(resultado['poligono'][1])) else: print('El punto indicado no existe') # Grafica if existe ==1: figura = plt.figure() grafica = figura.add_subplot(111) grafica.set_aspect('equal', adjustable='box') # punto con GPS texto = '['+str(np.round(c_este,2))+', '+str(np.round(c_norte,2))+']' grafica.scatter(c_este,c_norte, marker='D', color = 'grey', label = texto) grafica.annotate('gps',(c_este,c_norte), color ='grey') # cotas de gráfica unalista = list(coordbaliza.values()) unalista = np.array(unalista) cotax = [np.min(unalista[:,0]), np.max(unalista[:,0])] cotay = [np.min(unalista[:,1]), np.max(unalista[:,1])] cotadx = 0.15*(cotax[1]-cotax[0]) cotady = 0.15*(cotay[1]-cotay[0]) grafica.set_xlim(cotax[0]-cotadx,cotax[1]+cotadx) grafica.set_ylim(cotay[0]-cotady,cotay[1]+cotady) # raices k = len(todasx) if k>0: grafica.scatter(todasx,todasy, marker='+', color = 'magenta') poligono = resultado['poligono'] p = len(poligono[0]) for j in range(0,p,1): grafica.scatter(poligono[0][j],poligono[1][j], marker='*', color = 'blue') # coodenada con trilatera baricentro = resultado['baricentro'] sumabaricentro = np.sum(baricentro) if not(np.isnan(sumabaricentro)): texto = '['+str(np.round(baricentro[0],2)) texto = texto +', '+str(np.round(baricentro[1],2))+']' grafica.scatter(baricentro[0],baricentro[1], marker='D', color = 'red', label = texto) grafica.annotate('trilatera', (baricentro[0],baricentro[1]), color ='red') uncirculo = plt.Circle((baricentro[0],baricentro[1]), resultado['barerror'], ec = 'red', fc='None', linestyle ='dashed') grafica.add_artist(uncirculo) # circulos colores = ['blue','orange','lightgreen','grey'] j = 0 for fila in coordbaliza: xc = coordbaliza[fila][0] yc = coordbaliza[fila][1] r = punto[encontrado][fila] uncolor = colores[j] grafica.scatter(xc,yc, marker = '+', color = uncolor) grafica.annotate(fila,(xc,yc)) uncirculo = plt.Circle((xc,yc),r, ec = uncolor, fc='None', linestyle ='dotted') grafica.add_artist(uncirculo) j = j + 1 plt.title('Trilatera: ' + cadapunto) plt.legend() plt.xlabel('coordenada este') plt.ylabel('coordenada norte') plt.show()