J'ai besoin de comprendre comment fonctionne la triangulation Wifi. La scène est décrite dans le diagramme ci-dessus. Afin de mettre en œuvre la triangulation Wi-Fi, j'ai besoin d'un minimum de 3 points d'accès Wi-Fi et de leurs positions. La mise en place:
1. Par souci de simplicité, supposons que j’ai une zone de 1 km 2 sur 1 km et que je dispose de 3 points d'accès Wi-Fi dans cette région. Le système de coordonnées est le suivant: 1 coin de la surface carrée est (0,0,0) et le coin le plus éloigné en diagonale aura les coordonnées (1,1,1). Toute détermination de position doit être faite par rapport à ce seul système de coordonnées (pour simplifier, je ne veux pas de coordonnées globales xyz). Dans ce cadre, j'ai 3 points d'accès Wi-Fi situés à (x1, y1, z1), (x2, y2, z2), (x3, y3, z3).
2. Nous avons une personne avec un appareil capable de recevoir des signaux Wi-Fi et de calculer l'intensité du signal à la position (x, y, z). L'appareil peut être un téléphone, une tablette, etc.
Le problème: Calcule la position (x, y, z) de la personne de manière dynamique, lorsqu'elle se déplace lorsque vous avez maintenant les entrées suivantes:
1. Puissance des signaux reçus de chacun des points d'accès Wi-Fi
2. Coordonnées des hotspots wifi précédemment stockés dans des variables ou dans une base de données.
Première question: Comment calculer la position à partir des entrées ci-dessus? Je suppose que la force du signal est directement proportionnelle à la distance du routeur, mais quelle est la relation exacte? Comment Skyhook fait-il cela si précisément?
Deuxième question: Je crois que les entrées ci-dessus sont suffisantes. Y at-il autre chose requis?
Merci!
C'est assez facile. Ce ne sont que quelques notions de base en mathématiques. Décomposez-le en 2 parties:
1) Trouver votre position horizontale (pas de hauteur).
Pour trouver votre position, vous avez besoin de 3 points, mais concentrez-vous sur 2 points pendant une seconde. en utilisant 2 points, vous pouvez créer un triangle avec vous-même et trouver votre position en fonction de la force de votre signal entre deux points. Cela permettra de savoir où vous vous trouvez entre deux routeurs. Par exemple, si vous vous trouvez entre les routeurs 3 et 4 et que l'intensité du signal par rapport à 3 est de -89 et que l'intensité du signal de 4 est de -54, vous savez que vous êtes plus près de 3 que de 4. Si vous faites une approximation de la distance par rapport à la puissance du signal, vous pouvez donner une lecture assez précise de la position des routeurs 3 à 4. Le problème qui reste à résoudre consiste alors à déterminer de quel côté vous vous trouvez entre 3 et 4. , puisque vous pouvez avoir les mêmes valeurs d’intensité du signal (-89, -54) au-dessus ou au-dessous des routeurs (voir le diagramme)
6
You could be here
3--------------------------4
You could also be here
5
Ensuite, trouvez un autre routeur et remarquez la force de votre signal. Vous devriez être capable de déterminer facilement quel côté vous êtes en jetant simplement un coup d'œil aux relations de force de signal entre 5 et 6 routeurs (dans le diagramme).
2) Vous pouvez faire la même chose avec la hauteur.
Pour faire tout ce qui précède, vous n’avez vraiment besoin que d’une approximation de la distance par rapport à la force du signal et des distances entre les routeurs. D'après mes tests (j'ai écrit mon propre code de triangulation WiFi), la puissance du signal est assez uniforme sur tous les appareils mobiles. Par conséquent, un appareil devrait avoir les mêmes résultats que l'appareil adjacent.
skyhook fait cela, je pense, soit par le positionnement GPS (il peut être codé en dur), soit fondamentalement le même principe que celui-ci. Skyhook est le seul service approuvé par Apple dans ce domaine. Apple a donc essentiellement fait la même chose, puis s'est assuré que les autres applications ne pourraient pas l'utiliser (toute application iPhone utilisant la bibliothèque restreinte 80211 qui contient les fonctions permettant de le faire être refusé à partir de l'App Store).
Edit: Comment trouver la distance:
Vous devez faire des approximations simples. Ces approximations ne seront pas toutes identiques en fonction de votre environnement. Par conséquent, -89 pieds peut signifier que vous vous trouvez à 15 pieds du routeur 3, mais -89 à partir du routeur 4 peut signifier que vous êtes à 13 pieds. Quoi que vous fassiez, cela ne sera pas précis à 100%, mais ce n'est pas grave, car vous pouvez être à moins de 3 mètres.
donc, ce que vous faites est que vous trouvez un tas de points où vous obtenez une lecture de -89 à partir du routeur 3, et vous écrivez quelle est votre distance. Ensuite, vous prenez une moyenne et vous utilisez cette moyenne pour la mettre dans votre base de données (qui indique que lorsque vous êtes -89 du routeur 3, vous avez 15 pieds). Vous le faites ensuite pour d'autres valeurs, telles que -50 ou autre, et vous notez vos valeurs et trouvez une moyenne. Maintenant, si -89 signifie que vous vous trouvez à 15 pieds et -50 à 25 pieds (un exemple), vous devez approximer votre distance lorsque vous êtes -75 à partir du routeur 3, à moins que vous ne vouliez aller chercher. une approximation à la main pour -75. Cela serait lourd pour des tonnes de valeurs, mais vous devrez faire des essais pour voir avec quelle précision vous pouvez être avec le moins de points de données que vous pouvez obtenir. Vous pouvez approximer entre deux moyennes d'intensité de signal en réalisant que l'intensité de signal est logarithmique. Vous pouvez donc estimer que, puisque -89 est égal à 15 pieds, alors -75 serait logarithmique (base 10 ou base 2, je ne m'en souviens pas mais se penchant vers la base 10) plus loin que -89 par un facteur de 14/100.
Edit: Demander du code
J'ai le code quelque part, mais c'était il y a quelques années, alors je devais fouiller dans beaucoup de choses pour le trouver. Je pense que conceptuellement, il devrait être facile de reproduire sans code. Il m'a fallu environ 50 lignes de code Java pour les appareils Android que je testais.
Essentiellement, j'ai pris un téléphone Android et créé une application qui me permet d'afficher à tout moment l'identifiant actuel du périphérique wifi connecté, la force de son signal, les autres identifiants wifi proches et leur force de signal, puis leur localisation GPS. Tout cela est accessible via l'API d'Android. Je pense que vous avez besoin d'un appareil Android sur API 4 ou supérieure ou quelque chose comme ça. C'était comme il y a 3 ou 4 ans, alors je ne fais que jeter ce dont je me souviens.La partie localisation GPS consistait à faciliter la cartographie entre la force physique et la puissance du réseau Wi-Fi, plutôt que de créer une carte de plan de mon installation d'une autre manière. Je pourrais simplement demander à Google Maps de le faire pour moi simultanément leur carte et les coordonnées GPS essentiellement, tout en créant la carte de distance. Vous aurez néanmoins besoin d'une carte de profondeur pour cartographier les niveaux de plancher, ce que nous pouvons faire à la main assez facilement en recherchant si vous êtes au milieu de deux routeurs. Nous savons que la puissance du signal est la plus forte pour les concentrateurs Wi-Fi du même étage. Nous pouvons ensuite vérifier en vérifiant que vos signaux sont moins puissants vers les concentrateurs Wi-Fi de différents étages. Cette carte de profondeur est essentiellement une liste de hubs wifi et de leurs étages respectifs. Nous n’avons pas besoin de leurs positions, car nous pouvons mieux adapter la puissance du signal aux emplacements GPS que nous avons saisis lorsque nous nous déplaçons dans les installations et que l’intensité du signal est captée par certains concentrateurs. Ceci est un calcul simple. Donc, pour la position de l’avion 2D, en regardant du haut, nous avons un tas d’objets comme:.
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
}
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.
}
Ce qui précède est assez simple, et la carte de profondeur est encore plus simple à mon avis.
Idéalement, vous voudriez essayer d’atteindre deux appareils différents qui englobent plusieurs technologies sans fil différentes (certains appareils a, certains appareils b, n, g, etc.) juste pour obtenir des résultats plus précis. Ce que j’ai trouvé, c’est que la précision n’est pas un si gros problème, et vous serez à moins de 5 pieds. C'était assez précis pour mes besoins. Idéalement, tous les concentrateurs Wi-Fi sont du même modèle et se trouvent généralement dans de grandes installations/entreprises, mais même dans ce cas, ce n’est pas si grave. La variabilité est si faible, et si vous n'avez pas besoin d'une précision folle, ce n'est pas grave.
Ideally, you'd want to try and hit a couple different devices that encompass a couple different wireless techs (some a devices, some b devices, n, g etc) just to get more accurate results. What I found though, was that accuracy isn't that big of a deal, and you'll be within 5 feet or so. That was accurate enough for my needs. Ideally, all the wifi hubs are the same model, and they usually are in large facilities/companies, but even then, its not that big of a deal. The variability is so small, and if you don't need crazy accuracy, it won't matter.
Eh bien, c'est un signal, donc son intensité tombera du carré de la distance. Voir loi inverse des carrés
Android va vous donner la force du signal en dBm . Je ne connais pas bien cet appareil, mais s'il s'agit de décibels audio, il ne s'agit pas d'une échelle linéaire. Vous voudrez en tenir compte.
Dans un monde parfait, les champs seront suffisamment uniformes pour que les mesures pures vous donnent la distance, mais si vous faites cela à travers un métal, quoi que ce soit, les choses pourraient devenir laides. De plus, la configuration interne de la radio wifi de votre appareil peut le rendre plus sensible dans certaines directions. Je ne suis ni ingénieur ni quoi que ce soit, je ne sais donc pas dans quelle mesure cela affectera le résultat final. Cela peut être sans conséquence.
Enfin, pour un emplacement en trois dimensions, je pense que vous avez besoin de quatre points de référence. Si tous les points d'accès wifi sont à la même hauteur, vous pouvez toujours trouver votre position horizontale. S'ils ne le sont pas, vous allez trouver votre position dans l'avion dans lequel ils se trouvent, ce qui peut ne pas être assez exact selon vous, en fonction de la pente de l'avion.
Ne vous inquiétez même pas de convertir le DBm en distance. Les signaux radio voyagent à la vitesse de la lumière (presque), à l’exception d’une atténuation due à des facteurs environnementaux. Donc, si vous pouvez "cingler" l'appareil, vous pouvez avoir une idée générale de sa distance. Avec une antenne omnidirectionnelle d'un emplacement connu, vous pouvez utiliser le temps nécessaire pour recevoir la réponse afin de tracer un rayon et de dessiner un cercle. Maintenant, si vous effectuez cette opération à partir de plusieurs périphériques, les cercles se croiseront, ce qui devrait vous indiquer la direction à suivre. Bien sûr, tout cela est en 2D. Vous pouvez faire la même chose en 3D, mais vous traitez plutôt des sphères. Plus vous avez d'appareils, plus l'emplacement peut être précis.