Versuchen Sie, die Position des Senders aus dem Funkwellenausbreitungsmodell mit Python [Wi-Fi, Beacon] zu berechnen.

Überblick

Zweck: Im Allgemeinen können Sie anhand der Positionsberechnung mit Wi-Fi oder Beacon verstehen, was Sie hinter den Kulissen tun ~~.

Methode: Ich werde die Grundidee erklären und sie mit Python-Code demonstrieren.

Umgebung: MacOS Mojave 10.14.6, Python 3.7.4

grundlegende Denkweise

Dinge notwendig

  1. Funkempfänger (3) und ihre Standorte
  2. Sender (Smartphone usw.) und seine Position
  3. Stärke der Funkwellen, die jeden Empfänger erreichen
  4. Okumura-Hata-Kurve

Verfahren

Schritt 1. Berechnen Sie die Entfernung mit der ** Okumura-Hata-Kurve ** aus der vom Sender empfangenen Signalstärke und den Positionsinformationen des Empfängers. Schritt 2. Bereiten Sie einen Kreis vor, der auf der berechneten Entfernung als Radius und Position jedes Empfängers zentriert ist. Schritt 3. Finden Sie den Schnittpunkt von Kreisen mit ** Dreipunktpositionierung **. ** Schnittpunktkoordinaten = Positionskoordinaten des Senders **

Ein konkretes Bild der Dreipunktpositionierung befindet sich am Ende dieses Eintrags. Wenn Sie interessiert sind, sehen Sie das bitte zuerst.

Code und Ergebnisse

Schritt 0. Vorbereitung der richtigen Antwortdaten

Bereiten Sie die richtigen Antwortdaten für die eigentliche Berechnung vor. Dieses Mal haben wir die Toramon Hills, in denen sich unser Unternehmen befindet, und die umliegenden Einrichtungen ins Visier genommen. Die spezifische Position ist wie folgt.

ぼくとらのモン.PNG

Jetzt, wo wir diese Längen- und Breitengrade haben Entfernung vom Drei-Quadrat-Theorem, Finden Sie die (theoretische) Funkstärke an jedem Empfänger aus der Entfernung.

Dieses Mal verwenden wir städtische Umgebungen, kleine oder mittelgroße Städte aus Hata-Modell: Wikipedia.

# -*- coding: utf-8 -*-
import math
import numpy as np
import pandas as pd
import sympy.geometry as sg

# latitude 1 digree = 0.0090133729745762 km
# longitutde 1 degree = 0.010966404715491394

def eucl_dist(pointA, pointB):
	return np.sqrt((pointA[0]-pointB[0])**2+(pointA[1]-pointB[1])**2)
	# euclidean distance

def Oku_Hata(f, h_b, C_H, d):
  Loss = (69.55 + 26.16*math.log10(f)
              - 13.82*math.log10(h_b) - C_H 
              + (44.9 - 6.55*math.log10(h_b))*math.log10(d))
  return Loss
  # Okumura_Hata Curve

def inv_Oku_Hata(f, h_b, C_H, Loss):
	numerator = Loss - 69.55 - 26.16*math.log10(f) + 13.82*math.log10(h_b) + C_H
	denominator = 44.9 - 6.55 * math.log10(h_b)
	d = 10**(numerator/denominator)
	return round(d, 10)
  # Inversed Okumura_Hata Curve

# variables 
f = 150  # frequency of transmissiton: Megahertz
h_b = 1  # height of base station antenna : meter
h_M =  1  # heigth of mobile station antenna ; meter
C_H =0.8 + (1.1 *math.log10(f) - 0.7) * h_M -1.56*math.log10(f)
d = 500

# Test whether or not the functions function?
euDist = eucl_dist([0,0],[3,4])
Loss = Oku_Hata(f, h_b, C_H, d)
d = inv_Oku_Hata(f, h_b, C_H, Loss) 

print('euDist should be 5: ', euDist)
print('Loss from distance :  ', Loss)
print('d should be 500: ', d)  # Should be 500

Überprüfe das Ergebnis

euDist should be 5: 5.0 Loss from distance : 248.5613025107495 d should be 500: 500.0

Die Zeremonie scheint richtig gemacht zu sein. Berechnen Sie als Nächstes die Entfernung von den tatsächlichen Positionsinformationen und konvertieren Sie sie in Verlust.

# Set of lattitude/ longitude each GeoData
tmitter = [35.6662344,139.7496597]  # Transmitter from Torano-Mon

sensorLocation = {'S1':['GoodMorningCafe',35.6664959,139.7500406],
                  'S2':['LeParc',35.6666179,139.7479538],
                  'S3':['GrandSuite',35.6675194,139.7489692]}
                  # SensorLocation around Trano-Mon

# Compute distance (= radius) from the transmitter
r1 = eucl_dist(tmitter, sensorLocation['S1'][1:])
r2 = eucl_dist(tmitter, sensorLocation['S2'][1:])
r3 = eucl_dist(tmitter, sensorLocation['S3'][1:])
radii = [r1, r2, r3]  # plural of radius

# Compute Loss
L1 = Oku_Hata(f, h_b, C_H, r1)
L2 = Oku_Hata(f, h_b, C_H, r2)
L3 = Oku_Hata(f, h_b, C_H, r3)

print('List of distance: ', radii)
print('List of Loss: ', L1, L2, L3)

Ergebnis

List of distance: [0.0004620249560447818, 0.0017484756389397347, 0.0014587718293119327] List of Loss: -22.378972679965557 3.572964717331658 0.040582137429893805

Schritt 1. Berechnen Sie die Entfernung mit der ** Okumura-Hata-Kurve ** aus der vom Sender empfangenen Signalstärke und den Positionsinformationen des Empfängers.

Da Verlust berechnet werden konnte (aus der Entfernung) Berechnen Sie die Entfernung (vom Verlust). ~~ Ich mache es mit korrekten Antwortdaten, also kann es nicht geholfen werden, wenn ich herumgehe. Sag mir nicht, ich soll den Abstand von Anfang an nutzen! ~~

d1 = inv_Oku_Hata(f, h_b, C_H, L1)
d2 = inv_Oku_Hata(f, h_b, C_H, L2)
d3 = inv_Oku_Hata(f, h_b, C_H, L3)

print('Computed Value: ', [d1, d2, d3])  # plural of radius
print('Original Value: ', radii)

Überprüfe das Ergebnis

Computed Value: [0.000462025, 0.0017484756, 0.0014587718] Original Value: [0.0004620249560447818, 0.0017484756389397347, 0.0014587718293119327]

Da der Wert in der Mitte der Formel gerundet ist, ist die Anzahl der Stellen unterschiedlich, aber es scheint, dass er richtig berechnet werden kann.

Schritt 2. Bereiten Sie einen Kreis vor, der auf der berechneten Entfernung als Radius und Position jedes Empfängers zentriert ist.

Code. Ich habe Sympy verwendet, weil es einfach zu bedienen zu sein scheint. Qiita: Der Schnittpunkt von Kreisen mit Sympy

# Step2.
centers = [sg.Point(sensorLocation['S1'][2], sensorLocation['S1'][1]),
           sg.Point(sensorLocation['S2'][2], sensorLocation['S2'][1]),
           sg.Point(sensorLocation['S3'][2], sensorLocation['S3'][1])]
           # x = longitude, y = latitude

circles = [sg.Circle(centers[0], radii[0]), 
           sg.Circle(centers[1], radii[1]),
           sg.Circle(centers[2], radii[2])]
           # define all three circles

print('List of centers (latitude/longitude) :', centers)
print('List of Circles :', circles)

Ergebnis

Zentralkoordinaten

List of centers (latitude/longitude) : [Point2D(698750203/5000000, 356664959/10000000), Point2D(698739769/5000000, 356666179/10000000), Point2D(349372423/2500000, 178337597/5000000)]

Kreisinformationen. Der Radius wurde hinzugefügt. Es ist eine Liste von Mittelkoordinaten und Radien.

List of Circles : [Circle(Point2D(698750203/5000000, 356664959/10000000), 231012478022391/500000000000000000), Circle(Point2D(698739769/5000000, 356666179/10000000), 174847563893973/100000000000000000), Circle(Point2D(349372423/2500000, 178337597/5000000), 145877182931193/100000000000000000)]

Schritt 3. Finden Sie den Schnittpunkt von Kreisen mit ** Dreipunktpositionierung **. ** Schnittpunktkoordinaten = Positionskoordinaten des Senders **

Code. Immerhin benutze ich Sympy. Es gibt 3 Kreise, aber da die Schnittpunkte jeweils 2 berechnet werden, können 6 Lösungen erhalten werden. Daher besteht die Logik darin, die Schnittpunkte, die dreimal auftreten, aus den sechs Lösungen zu extrahieren. Daher runde ich den Berechnungsfehler und ignoriere ihn.

# Step3. 
crossPoints12 = sg.intersection(circles[0], circles[1])
crossPoints23 = sg.intersection(circles[1], circles[2])
crossPoints31 = sg.intersection(circles[2], circles[0])
# Compute crosspoints for each two circles

crossPointsList = [
    [float(crossPoints12[i].y),float(crossPoints12[i].x)] for i in [0,1]
    ] + [
    [float(crossPoints23[i].y),float(crossPoints23[i].x)] for i in [0,1]
    ] + [
    [float(crossPoints31[i].y),float(crossPoints31[i].x)] for i in [0,1]
    ]
crossPointsList = [[round(i[0],8), round(i[1],8)]for i in crossPointsList]
df = pd.DataFrame(crossPointsList).groupby([0, 1])[0].count()
print('Computed Value: ', df[df.values == max(df.values)].index[0])
print('Original Value: ', tmitter)
# print the most frequent set of lattitude-longitude

Ergebnis

Computed Value: (35.6662344, 139.7496597) Original Value: [35.6662344, 139.7496597]

Es scheint, dass die richtige Antwort abgeleitet wurde. Ich bin glücklich.

Ergänzung: Bild der Dreipunktpositionierung usw.

Wenn Sie mit "Dreipunktpositionierung" googeln, werden Sie viele davon sehen, aber vorerst war dieser Blog der älteste Eintrag, den ich gesehen habe, daher werde ich Respekt einbringen. Referenz: Ich wünschte, ich könnte die zweidimensionalen Koordinaten des iPhone mit RSSI von iBeacon erhalten

Wenn ich also über das Ende der Geschichte spreche, spreche ich über andere Blogs als die oben genannten Blogs. In der Praxis ist dieser Code, insbesondere die Hata-Kurve, nutzlos.

In der Stadt werden Objekte gestreut und Funkwellen diffus reflektiert, sodass die Funkwellenausbreitung den Empfänger nicht im Idealzustand erreicht. Ich habe nicht vor, die detaillierte Geschichte dieses Bereichs vorzustellen, da sie über den Rahmen technischer Blogs hinausgeht. Wenn Sie wissen wollen, denke ich, wäre es schön, wenn Sie googeln oder sich uns anschließen könnten.

das ist alles.

~~ Es ist mir egal, aber ich habe das Gefühl, ich werde mir auf die Zunge beißen ~~

Recommended Posts

Versuchen Sie, die Position des Senders aus dem Funkwellenausbreitungsmodell mit Python [Wi-Fi, Beacon] zu berechnen.
Versuchen Sie, die Position eines Objekts auf dem Schreibtisch (reales Koordinatensystem) anhand des Kamerabilds mit Python + OpenCV zu messen
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
[Abgeschlossene Version] Versuchen Sie, die Anzahl der Einwohner der Stadt anhand der Adressliste mit Python herauszufinden
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Berechnen Sie die Gesamtzahl der Kombinationen mit Python
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Versuchen Sie, das Programmier-Herausforderungsbuch mit Python3 zu lösen
Lerne Nim mit Python (ab Anfang des Jahres).
Versuchen Sie, mit matplotlib aus den Daten von "Schedule-kun" eine Kampfaufzeichnungstabelle zu erstellen.
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Berechnen Sie den Regressionskoeffizienten der einfachen Regressionsanalyse mit Python
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
So kratzen Sie mit Python den Aktienkurs einer einzelnen Aktie von der Nikkei Shimbun-Website
Wie man die Anzahl der GPUs aus Python kennt ~ Hinweise zur Verwendung von Multiprocessing mit pytorch ~
Versuchen Sie, in die Datenbank zu importieren, indem Sie ShapeFile mit numerischen Informationen zum nationalen Land mit Python bearbeiten
Versuchen Sie, die Nährstoffe von Cornflakes zu visualisieren, die M-1-Champion Milkboy mit Python sagte
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Klassifizierung zu bewerten
Berechnen des aus ABC134-D gelernten Rechenaufwands
Versuchen Sie, die verstümmelten Zeichen im angehängten Dateinamen mit Python zu entschlüsseln
Holen Sie sich die Quelle der Seite unbegrenzt mit Python zu laden.
Versuchen Sie, Merkmale von Sensordaten mit CNN zu extrahieren
Zusammenfassung des Zeichenkettenformats in Python3 Gibt an, ob mit dem alten oder dem neuen Modell gelebt werden soll
Ich möchte mit Python eine beliebige URL aus der Zeichenfolge der HTML-Quelle extrahieren
Erste Python ② Versuchen Sie, Code zu schreiben, während Sie die Funktionen von Python untersuchen
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Geben Sie den Inhalt von ~ .xlsx im Ordner mit Python in HTML aus
Versuchen Sie, mit Python3 eine Zeichenfolge aus einem Bild zu extrahieren
Versuchen Sie, die kumulierte Rendite des Rollovers im Futures-Handel zu modellieren
Tipps: [Python] Berechnen Sie den Durchschnittswert des angegebenen Bereichs mit Bedgraph
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Versuchen Sie, den kürzesten Weg mit Python + NetworkX + Social Data zu lösen
Vom "Zeichnen" zum "Schreiben" des Konfigurationsdiagramms: Zeichnen Sie das AWS-Konfigurationsdiagramm mit Diagrammen
[Python] Versuchen Sie, Zeichen aus Bildern mit OpenCV und pyocr zu erkennen
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
Versuchen Sie, Facebook mit Python zu betreiben
Existenz aus Sicht von Python
Versuchen Sie, Trace in Python zu berechnen
So berechnen Sie das Datum mit Python
[Python] So legen Sie die Position und Größe der Fensteranzeige von matplotlib fest
Setzen Sie Cabocha 0.68 in Windows ein und versuchen Sie, die Abhängigkeit mit Python zu analysieren
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
Versuchen Sie es mit Pythons Webframework Django (1) - Von der Installation bis zum Serverstart
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Versuchen Sie, nur den Kohlenstoff am Ende der Kette mit SMARTS zu reagieren
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Versuchen Sie, ein festgelegtes Problem der High-School-Mathematik mit Python zu lösen
[Einführung in Python] Wie wird mit der continue-Anweisung wiederholt?
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.