2013-05-10 15 views
16

enter image description hereTriangolazione posizione wifi

Ho bisogno di capire come funziona la triangolazione Wifi. La scena è raffigurata nel diagramma sopra. Per implementare la triangolazione wifi, ho bisogno di un minimo di 3 hotspot Wi-Fi e delle loro posizioni. Il setup:
1. Per semplicità, supponiamo di avere una zona 1 sq-Km per 1 sq-Km, e ho 3 hotspot Wi-Fi in quest'area. Il sistema di coordinate è il seguente: 1 angolo dell'area quadrata è (0,0,0), e l'angolo più in diagonale avrà le coordinate (1,1,1). Tutta la determinazione della posizione deve essere eseguita relativamente a questo sistema di coordinate da solo (per semplicità, non voglio coordinate xyz globali). All'interno di questo, ho 3 hotspot Wi-Fi a (x1, y1, z1), (x2, y2, z2), (x3, y3, z3).
2. Abbiamo una persona con un dispositivo in grado di ricevere segnali wifi e calcolare la forza del segnale in posizione (x, y, z). Il dispositivo potrebbe essere un telefono, un tablet, ecc.
Il problema: Calcolare dinamicamente la posizione (x, y, z) della persona mentre si spostano quando si hanno i seguenti ingressi:
1. Intensità del segnale dei segnali ricevuti da ciascuno degli hotspot wifi
2. Coordinate degli hotspot wifi precedentemente memorizzati in variabili o in un database.

Prima domanda: Come si calcola la posizione dagli ingressi sopra? Suppongo che l'intensità del segnale sia direttamente proporzionale alla distanza dal router, ma qual è la relazione esatta? In che modo Skyhook esegue questa operazione in modo accurato?
Seconda domanda: Credo che gli ingressi di cui sopra siano sufficienti. C'è qualcos'altro richiesto?

Grazie!

+1

Determina la distanza dall'hotspot all'utente in base alla potenza del segnale. Questo è il raggio di un cerchio centrato sull'hotspot. Dove tutti e tre i cerchi si intersecano è la posizione dell'utente. –

risposta

18

Questo è abbastanza facile. È solo un po 'di matematica di base. Scomporlo in 2 parti:

1) Trovare la posizione orizzontale (senza altezza).

Per trovare la posizione, sono necessari 3 punti, ma è sufficiente concentrarsi su 2 punti per un secondo. utilizzando 2 punti, puoi creare un triangolo con te stesso e trovare la tua posizione in base alla forza del tuo segnale tra due punti. Questo scoprirà dove ti trovi tra due router. Ad esempio, se ci si trova tra i router 3 e 4 e la potenza del segnale rispetto a 3 è -89 e la potenza del segnale a 4 è -54, si sa che si è vicini a 3 rispetto a 4. Se fai un'approssimazione della distanza rispetto alla potenza del segnale, puoi ottenere una lettura abbastanza precisa di dove ti trovi tra i router 3 e 4. Il problema rimasto in quel momento, è determinare da che parte stai tra 3 e 4 , dal momento che si potrebbe avere i valori di resistenza stesso segnale (-89, -54) sopra o sotto i router (vedi schema)

  6 

    You could be here 

3--------------------------4 

    You could also be here 

      5 

Poi basta trovare un altro router, e notare la potenza del segnale. Dovresti essere in grado di determinare da che parte stai abbastanza facilmente semplicemente dando un'occhiata alle relazioni di potenza del segnale tra 5 e 6 router (nel diagramma).

2) È possibile fare la stessa cosa con l'altezza.

Per fare tutto quanto sopra, in realtà occorre solo un'approssimazione della distanza rispetto alla potenza del segnale e le distanze tra i router. Dai miei test (ho scritto il mio codice di triangolazione WiFi), la potenza del segnale è abbastanza uniforme tra i dispositivi mobili, quindi un dispositivo dovrebbe avere gli stessi risultati del dispositivo accanto.

skyhook fa questo penso sia attraverso il posizionamento GPS (potrebbe essere codificato in modo difficile), o fondamentalmente lo stesso principio di questo. Skyhook è l'unico servizio approvato da Apple, quindi Apple ha praticamente fatto la stessa cosa e poi si è assicurato che altre app non potessero usarlo (qualsiasi app per iPhone che utilizza la libreria 80211 con restrizioni che contiene le funzioni per farlo sarà essere negato dall'app store).

Edit: Come trovare distanza:

Hai bisogno di fare alcune approssimazioni semplici. Queste approssimazioni non saranno le stesse a seconda del tuo ambiente, quindi -89 piedi potrebbe significare che sei a 15 piedi dal Router 3, ma -89 dal router 4 potrebbe significare che sei a 13 metri di distanza. Non importa quello che fai, questo non sarà accurato al 100 percento, ma va bene, perché puoi stare sicuro con un metro di altezza.

quindi quello che fai è trovare un sacco di punti in cui si ottiene una lettura da -89 dal router 3, e si annota quale fosse la distanza. Poi, prendi una media, e usi questa media per metterla nel tuo database (che dice quando sei -89 dal router 3, sei 15 piedi). Quindi fai questo per altri valori, come -50 o qualsiasi altra cosa, e annoti i tuoi valori e trovi una media. Ora, se -89 significa che sei a 15 piedi di distanza, e -50 significa che sei a 25 piedi di distanza (solo un esempio), devi approssimare la distanza quando sei -75 dal router 3 a meno che tu non voglia andare a prendere un'approssimazione a mano per -75. Questo sarebbe ingombrante per tonnellate di valori, ma dovrai sperimentare per vedere quanto puoi essere preciso con il minor numero di punti dati che puoi ottenere. Puoi approssimare tra due medie di forza del segnale realizzando che la potenza del segnale è logaritmica, quindi puoi stimare che dal -89 è 15 piedi, quindi -75 sarebbe logaritmico (base 10 o base 2, non ricordo ma sono inclinato verso la base 10) più lontano di -89 di un fattore di 14/100.

Edit: La richiesta di codice

Ho il codice da qualche parte, ma era un paio di anni fa, quindi avrei dovuto scavare attraverso un sacco di roba per trovarlo. Penso concettualmente, dovrebbe essere facile da replicare senza codice. Mi ci sono volute circa 50 righe di codice java per i dispositivi Android che stavo testando. In pratica, ho preso un telefono Android e creato un'applicazione che mi consente di visualizzare in qualsiasi momento l'ID corrente del dispositivo wifi connesso, la sua potenza del segnale, altri ID wifi vicini e la loro potenza del segnale, e quindi la posizione GPS. Questo è tutto accessibile tramite l'API di Android. Penso che tu abbia bisogno di un dispositivo Android su API 4 o superiore o qualcosa del genere. Questo è stato come 3 o 4 anni fa, quindi sto solo buttando questo fuori da quello che ricordo.

La parte relativa alla posizione GPS era quella di rendere più semplice la mappatura tra la resistenza fisica e quella wifi, invece di dover creare una mappa di progetto della mia struttura in qualche altro modo, avrei potuto semplicemente fare google maps per me allo stesso tempo dal momento che posso sovrapporre la loro mappa e le coordinate GPS in sostanza, mentre creo la mappa della distanza. Avresti comunque bisogno di una mappa di profondità per mappare i livelli del pavimento, cosa che possiamo fare a mano abbastanza facilmente scoprendo se sei nel mezzo di due router. Sappiamo che la potenza del segnale è più forte per gli hub wifi sullo stesso piano, e quindi possiamo ricontrollare assicurandoti di avere segnali più deboli verso gli hub wifi su piani diversi. Questa mappa di profondità è essenzialmente un elenco di hub wifi e rispettivi piani. Non abbiamo bisogno delle loro posizioni, dal momento che possiamo adattare al meglio la potenza del segnale alle posizioni GPS che abbiamo afferrato quando camminiamo intorno alla struttura e afferrando la forza del segnale per alcuni hub. Questa è una semplice matematica.Quindi, per la posizione piano 2D, guardando dall'alto verso il basso, abbiamo un oggetti mazzo come tale:

BestFitObject{ 
    Tuple<long, long> GPSLocation; 
    List<Tuple<WifiDevice, signedInt>> WifiReadings; //WifiDeviceName(through UUID or some other way), tupled with the signalStrength when that bestFit reading was taken 
} 

WifiDevice{ 
    UUID ID; //Think a string should work fine, might be an internal type that encompasses UUID which woudl be better. 
    int floorNumber; 
    Tuple<long, long> GPSLocation; //Not entirely necessary, could provide better accuracy though 
} 

E poi quando abbiamo il ping del dispositivo client e vuole adattarsi al meglio è, restituisce un oggetto come questo:

ClientPosition{ 
    List<Tuple<UUID, signedIt> NearbySignals; //Tuple of the UUID of the wifi device and the signal strength taken during the time of the ping. 
} 

Quindi possiamo facilmente adattare al meglio la nostra ClientPosition alla mappa 2D che abbiamo creato con i due oggetti precedenti.

Quanto sopra è piuttosto semplice, e la mappa di profondità è ancora più semplice secondo me.

Idealmente, si vorrebbe provare a colpire un paio di dispositivi diversi che comprendono un paio di tecnologie wireless diverse (alcuni dispositivi, alcuni dispositivi b, n, g ecc.) Solo per ottenere risultati più accurati. Quello che ho trovato, però, è che la precisione non è un grosso problema, e tu sarai a meno di 5 piedi o giù di lì. Era abbastanza preciso per le mie esigenze. Idealmente, tutti gli hub wifi sono dello stesso modello e solitamente si trovano in grandi strutture/aziende, ma anche in questo caso non è un grosso problema. La variabilità è così piccola, e se non hai bisogno di un'accuratezza pazzesca, non importa.

+1

Grazie per quello. Ma potresti approfondire il calcolo della distanza dal router usando la potenza del segnale? Non sono chiaro su questa parte della matematica qui .. –

+0

Sì, anche per favore, per elaborare db/dbM a metri da un singolo router. – Yoda

+0

Beh, dovresti testarlo nell'ambiente in cui ti trovi. Quanto accurato vuoi essere correlato alla precisione con cui sarai in grado di determinare la loro posizione. Con letture semi-accurate da un router, dovresti essere in grado di puntare con precisione entro 5 piedi dalla posizione effettiva di qualcuno senza troppi problemi. – Magn3s1um

6

Bene, è un segnale, quindi la sua intensità cadrà del quadrato della distanza. See Inverse-Square Law

Android sta per darti la potenza del segnale in dBm. Non ho familiarità con quell'unità, ma se è qualcosa di simile ai decibel audio, non è una scala lineare.

In un mondo perfetto, i campi saranno abbastanza uniformi per le misurazioni pure per darti la distanza, ma se lo fai attraverso qualsiasi tipo di metallo le cose potrebbero diventare brutte. Inoltre, la configurazione interna della radio wifi del tuo dispositivo potrebbe renderla più sensibile in determinate direzioni. Non sono un ingegnere o altro, quindi non so fino a che punto queste cose influenzeranno il risultato finale. Potrebbe essere irrilevante.

Infine, per la posizione tridimensionale, credo che siano necessari quattro punti di riferimento. Se tutti gli hotspot Wi-Fi sono alla stessa altezza, puoi ancora trovare la tua posizione orizzontale. Se non lo sono, troverai la tua posizione sull'aereo in cui si trovano, il che potrebbe non essere abbastanza preciso per te a seconda di quanto sia ripido quell'aereo.

0

Non preoccupatevi nemmeno di convertire DBm in distanza. I segnali radio viaggiano alla velocità della luce (quasi), salvo qualche attenuazione dovuta a fattori ambientali. Quindi, se riesci a "pingare" il dispositivo puoi avere un'idea generale della sua distanza. Data un'antenna omnidirezionale di una posizione nota, puoi quindi utilizzare il tempo necessario per ricevere la risposta per tracciare un raggio e disegnare un cerchio. Ora se lo fai da più dispositivi i cerchi si intersecano, il che dovrebbe fornire la direzione. Naturalmente questo è tutto 2d. Potresti fare la stessa cosa, in 3d, ma dovresti invece disegnare sfere. Più dispositivi hai, più precisa può essere la posizione.

+0

La luce viaggia a circa 30 cm in 10^-9 con una precisione fino a quel livello, è costosa e non di livello consumer. anche in quel tipo di tempo, la velocità degli elettroni nel circuito deve essere presa in considerazione. se si andasse su questa strada, raccomanderei un array di antenne che si risolverebbe in un'uscita direzionale in modo che i circuiti possano essere calibrati come un'unità. quindi avere 2+ di questi array per ottenere una posizione 3d. - https://en.wikipedia.org/wiki/Angle_of_arrival – Sam

+0

Non è possibile calcolare una distanza tra telefono e router utilizzando un ping su rete wifi, perché i tempi di trasferimento wifi sono inaffidabili, il telefono non ha un RealTimeOS, il tuo wifi le temporizzazioni del router sono inaffidabili e la distanza della massima distanza del wifi (circa 100 metri) viaggia in ((3 * 10^8m/s)/100m) che è un tempo come un ciclo nel processore a 3 GHz, non è possibile misurare il tempo con tale precisione usando uno smartphone normale e anche se si potesse avere uno smartphone con un processore da 300 GHz, c'è ancora un problema di inaffidabilità dei tempi di trasferimento wifi del telefono e del router –