Algoritmo di trilaterazione per n quantità di punti


27

Ho bisogno di trovare un algoritmo in grado di calcolare il centroide A (aka centro di gravità, centro geometrico, centro di massa) dalla figura in cui i cerchi T1, T2, T3, T4, T5, .., Tn si intersecano E la lunghezza della linea R dal centroide a angolo più lontano della figura menzionata

Vengono fornite le seguenti informazioni:

  • Latitudine T1 = 56.999883 Longitudine = 24.144473 Raggio = 943
  • Latitudine T2 = 57.005352 Longitudine = 24.151168 Raggio = 857
  • T3 Latitudine = 57.005352 Longitudine = 24.163356 Raggio = 714
  • Latitudine T4 = 56.999042 Longitudine = 24.168506 Raggio = 714
  • T5 Latitudine = 56.994226 Longitudine = 24.15709 Raggio = 771

Il risultato dovrebbe essere simile al seguente: A Latitudine = XX.XXXXXXX Longitudine = XX.XXXXXXX Raggio = XX

inserisci qui la descrizione dell'immagine

Come probabilmente hai già capito, sto lavorando a un software in grado di trovare la posizione del dispositivo tramite i punti di accesso WiFi o le stazioni base mobili più vicini, poiché il numero di punti di accesso o stazioni base potrebbe cambiare, ho bisogno di un algoritmo in grado di adattarsi a un numero incerto di punti .

Ci sono alcune domande simili qui e qui , ma nessuna di queste risponde esattamente alla mia domanda.


in che lingua stai lavorando?
WolfOdrade,

Principalmente PHP, un po 'di JavaScript. Immagino di doverlo menzionare prima, ma sono uno sviluppatore web e per capire la risposta di Whuber dovrò trovare un matematico.
Kārlis Baumanis,

I raggi sono derivati ​​dall'intensità del segnale relativa?
Kirk Kuykendall il

Sì! In realtà i radio sono in dBm
Kārlis Baumanis il

1
@Reddox, in parte - sono riuscito a calcolarlo con php_exec () usando matematica sul lato server.
Kārlis Baumanis,

Risposte:


29

Le misure del raggio sono sicuramente soggette a qualche errore. Mi aspetto che la quantità di errore sia proporzionale ai raggi stessi. Supponiamo che le misurazioni siano altrimenti imparziali. Una soluzione ragionevole utilizza quindi un raccordo dei minimi quadrati non lineari ponderati , con pesi inversamente proporzionali ai raggi quadrati.

Questa è roba standard disponibile in (tra le altre cose) di Python, R, Mathematica , e molti pacchetti statistici full-optional, quindi mi limiterò a illustrarlo. Ecco alcuni dati ottenuti misurando le distanze, con errore relativo del 10%, a cinque punti di accesso casuali che circondano la posizione del dispositivo:

Tabella dati

Mathematica richiede solo una riga di codice e nessun tempo misurabile della CPU per calcolare l'adattamento:

fit = NonlinearModelFit[data, Norm[{x, y} - {x0, y0}], {x0, y0}, {x, y}, Weights -> 1/observations^2]

Modificare--

Per grandi raggi, si possono trovare soluzioni più accurate (sferiche o ellissoidali) semplicemente sostituendo la distanza euclidea Norm[{x, y} - {x0, y0}]con una funzione per calcolare la distanza sferica o ellissoidale. In Mathematica questo potrebbe essere fatto, ad esempio , tramite

fit = NonlinearModelFit[data, GeoDistance[{x, y}, {x0, y0}], {x0, y0}, {x, y}, 
        Weights -> 1/observations^2]

--end di modifica

Uno dei vantaggi dell'utilizzo di una tecnica statistica come questa è che può produrre intervalli di confidenza per i parametri (che sono le coordinate del dispositivo) e persino un'ellisse di confidenza simultanea per la posizione del dispositivo.

ellipsoid = fit["ParameterConfidenceRegion", ConfidenceLevel -> 0.95];
fit["ParameterConfidenceIntervalTable", ConfidenceLevel -> 0.95]

Tabella degli intervalli di confidenza

È istruttivo tracciare i dati e la soluzione:

Graphics[{Opacity[0.2], EdgeForm[Opacity[0.75]], White, Disk[Most[#], Last[#]] & /@ data, 
  Opacity[1], Red, ellipsoid, 
  PointSize[0.0125], Blue, Point[source], Red, Point[solution],
  PointSize[0.0083], White, Point @ points}, 
  Background -> Black, ImageSize -> 600]

Carta geografica

  • I punti bianchi sono le posizioni (note) del punto di accesso.

  • Il grande punto blu è la vera posizione del dispositivo.

  • I cerchi grigi rappresentano i raggi misurati. Idealmente, si intersecherebbero tutti nella posizione reale del dispositivo, ma ovviamente non lo fanno, a causa di un errore di misurazione.

  • Il grande punto rosso è la posizione stimata del dispositivo.

  • L'ellisse rossa delimita un'area di confidenza del 95% per la posizione del dispositivo.

La forma dell'ellisse in questo caso è interessante: l'incertezza della posizione è maggiore lungo una linea NW-SE. Qui, le distanze da tre punti di accesso (verso NE e SW) cambiano a malapena e c'è un compromesso tra gli errori tra le distanze rispetto agli altri due punti di accesso (a nord e sud-est).

(Una regione di confidenza più accurata può essere ottenuta in alcuni sistemi come contorno di una funzione di probabilità; questa ellisse è solo un'approssimazione del secondo ordine a tale contorno.)

Quando i raggi vengono misurati senza errori, tutti i cerchi avranno almeno un punto di intersezione reciproca e - se quel punto è unico - sarà la soluzione unica.

Questo metodo funziona con due o più punti di accesso. Sono necessari tre o più per ottenere intervalli di confidenza. Quando sono disponibili solo due, trova uno dei punti di intersezione (se esistono); in caso contrario, seleziona una posizione appropriata tra i due punti di accesso.


3
Ben fatto Bill!

1
@Reddox In linea di principio sì: qualsiasi linguaggio completo di turing può fare letteralmente qualsiasi calcolo. Ma PHP sarebbe in fondo alla lista di scelte di chiunque come lingua di destinazione. Anche il manuale di PHP lo ammette: "PHP probabilmente non è il linguaggio migliore per creare un'applicazione desktop con un'interfaccia grafica, ma se conosci PHP molto bene e vorresti utilizzare alcune funzionalità PHP avanzate sul tuo lato client applicazioni puoi anche usare PHP-GTK per scrivere tali programmi. "
whuber

1
@Reddox Grazie per il link. Vedo come fornisce calcoli geometrici. In questa circostanza non sono realmente necessari: l'unico calcolo di questo tipo è un'applicazione del teorema di Pitagora per ottenere le distanze come somme di radice dei quadrati (la chiamata a Normnel mio codice). Tutto il lavoro è coinvolto nell'adattamento dei minimi quadrati non lineari ponderati, ma non credo che la libreria GEOS offra questa funzionalità. Forse GEOS potrebbe essere di aiuto quando sono necessarie precise distanze ellissoidali.
whuber

2
Se sto leggendo correttamente, @BenR, sembra che tu stia ponderando i dati in proporzione ai raggi quadrati anziché inversamente proporzionali a loro. Cosa succede quando dividi per square(data[2])invece di moltiplicare per esso?
whuber


1

In questo caso, ogni cerchio interseca tutti gli altri cerchi e quindi possiamo determinare i punti di intersezione in questo modo:

Innanzitutto determinare tutti i punti di intersezione n * (n-1). Chiamare l'insieme di questi punto di intersezione I . Prendi un elenco di punti T che contiene i punti più interni. Quindi per ogni punto p in I , controlla se p è all'interno di ogni cerchio. Se p è all'interno di ogni cerchio, allora questo è il punto sull'intersezione più interna. Aggiungere un punto tale all'elenco T .

Ora hai le coordinate di intersezione desiderate. Mi vengono in mente almeno due modi per prevedere la posizione:

  1. Basta calcolare il centroide (usare la distanza come peso?) Del poligono formato da T e il centroide è la posizione desiderata.
  2. Calcolare il cerchio minimo che contiene ogni punto di T . Quindi il centro di questo cerchio è la posizione desiderata. Il calcolo di R dovrebbe essere semplice dopo questo.

Un'altra nota: prima converti l'intensità del segnale in distanza usando il modello (o variazioni) del percorso dello spazio libero. La mia opinione è: hai un set di dati di addestramento, dovresti cercare di trovare un esponente della perdita di percorso usando alcune tecniche di apprendimento invece di usare n = 2 o n = 2.2 come valore fisso.


che cos'è T ... i "punti più interni" - se ho 5 nodi ... quanti "punti più interni" dovrei controllare?
Lucertola
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.