5.5 Localiza por Trilateración – Revisa un punto

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()