Ein Bluetooth-Beacon ist bewusst dumm: Es wacht auf, sendet eine kleine Nutzlast und schläft wieder. Die Position eines Empfängers wird woanders berechnet — von Software, die Funkmessungen in Koordinaten umwandelt. Dieser Artikel geht durch die drei Ebenen, die wirklich zählen: Signalstärke in Entfernung umrechnen, Position lösen und das Ergebnis glätten — mit den Zahlen, die ein Ingenieur braucht, um Erwartungen zu setzen.

Von RSSI zur Distanz: das logarithmische Distanzmodell

Die gängigste Eingabe ist der Received Signal Strength Indication (RSSI). Beim logarithmischen Pfadverlustmodell fällt die Leistung etwa mit dem Quadrat der Distanz ab, moduliert durch einen Umgebungsfaktor:

RSSI(d) = RSSI0 - 10 * n * log10(d / d0) + X_sigma
  • `RSSI0` — gemessene Leistung bei Referenzdistanz `d0` (meist 1 m)
  • `n` — Pfadverlustexponent (2,0 freier Raum, 2,5–4,0 Innenraum)
  • `X_sigma` — Gaußsches Schattenfading, Std.-Abw. 3–8 dB Innenraum

Umgestellt ergibt die Entfernungsschätzung:

d = d0 * 10^((RSSI0 - RSSI) / (10 * n))

Beispiel: RSSI0 = -59 dBm, n = 2,0, gemessen RSSI = -75 dBm, d0 = 1 m:

d = 10^(( -59 - (-75) ) / 20) = 10^(16/20) = 10^0,8 ≈ 3,98 m

Die Falle ist X_sigma. Eine Schwankung von ±6 dB bei n = 3 verschiebt die Schätzung um den Faktor 10^(6/30) ≈ 1,58. Eine einzelne RSSI-Stichprobe ist also nur auf ~±50 % Distanz genau. Darum ist die rohe Distanz nie die Endantwort.

Trilateration: den Schnittpunkt lösen

Mit drei oder mehr Beacon-Ankern an bekannten Koordinaten trilateriert man den Empfänger. Jeder Anker liefert einen verrauschten Radius; die Kleinstquadrate-Methode findet den Punkt, der die quadratischen Residuen minimiert:

<h1>anchors: Liste von (x_i, y_i, r_i)</h1>
<h1>minimiere sum_i ( sqrt((x-x_i)^2 + (y-y_i)^2) - r_i )^2</h1>
<h1>lösen mit Gauss-Newton / Levenberg-Marquardt</h1>

def trilaterate(anchors):
p = schwerpunkt(anchors)
for _ in range(20):
J, f = jacobian_residuum(p, anchors)
dp = solve(J.T @ J + lam*I, J.T @ f)
p = p - dp
if norm(dp) < 1e-3: break
return p

Geometrie zählt: Dilution of Precision (GDOP) explodiert, wenn Anker kollinear sind oder der Empfänger außerhalb der Ankerhülle liegt. Anker in 2D verteilen (ideal 3+), Fläche aus mehreren Richtungen abdecken. Montagehöhe 2,5–3,5 m an verschiedenen Wänden liefert im offenen Innenraum typisch 1–3 m Fehler.

Fingerprinting: die Physik überspringen

Statt der Ausbreitung zu modellieren, lernt das Fingerprinting den Raum. Offline-Phase: Gitter ablaufen, RSSI-Vektor an jedem Referenzpunkt (RP) speichern. Online-Phase: Live-Vektor mit nächstem RP matchen:

<h1>kNN / Weighted-kNN</h1>

def locate(live_vec, rp_db):
dists = [euklid(live_vec, rp.vec) for rp in rp_db]
k_nearest = argsort(dists)[:k]
w = 1 / (dists[k_nearest] + eps)
x = sum(w * rp_db[i].x for i in k_nearest) / sum(w)
y = sum(w * rp_db[i].y for i in k_nearest) / sum(w)
return x, y

Fingerprinting ist robust gegen Multipath und Nicht-Sichtlinie (NLOS), weil es diese Effekte in die Vermessung einbäckt. Kosten: Die Offline-Vermessung ist mühsam (~1 RP/m² für gute Auflösung) und bei Layoutänderung zu wiederholen. Typischer Fehler: 0,5–2 m.

Glätten: das Rauschen töten

Eine rohe Spur springt von Frame zu Frame. Pro Achse ein 1-D Kalman-Filter, oder ein Partikelfilter bei Bewegungsbeschränkungen:

<h1>1-D Kalman, konstante Geschwindigkeit, pro Koordinate</h1>

x_hat = A @ x;  P = A @ P @ A.T + Q
K = P @ H.T @ inv(H @ P @ H.T + R)
x = x_hat + K @ (z - H @ x_hat);  P = (I - K @ H) @ P

<h1>R: Messrauschen (aus RSSI-Std.-Abw.); Q: Prozessrauschen (aus Gehgeschwindigkeit)</h1>

R hoch setzen (Modell vertrauen), wenn RSSI verrauscht; Q niedrig für Langsame. Bei tragbaren Tags schlägt ein Partikelfilter, der unmögliche Bewegungen (durch Wände) verwirft, das naive Mitteln.

Methodenvergleich

Methode Eingabe Typ. Fehler Vermess.-Aufw. Geeignet für
Trilateration 3+ Anker, RSSI→dist 1–3 m Gering Stabile Layouts, wenige Anker
Fingerprinting RSSI-Vektoren 0,5–2 m Hoch Multipath, NLOS, feine Gitter
Fusion (RSSI+IMU) RSSI + Beschleunigung 0,3–1 m Mittel Wearables, Dead-Reckoning

Praktische Regeln

  • `RSSI0` und `n` pro Standort kalibrieren; Werkwerte nicht blind vertrauen.
  • 4+ Anker pro Zone, 2,5–3,5 m hoch, an verschiedenen Wänden.
  • Entfernungsunsicherheit (Std.-Abw.) mitmelden, nicht nur einen Punkt — nachgelagerte Logik soll danach gatten.
  • Vor der Entscheidung glätten; ein 3-Sample-Medianfilter fängt RF-Spikes günstig ab.
  • Mit Timing und RF-Planung früherer Artikel kombinieren: Ankerdichte und Gateway-Platzierung setzen das Genauigkeitslimit.

Der Wert eines Beacon-Systems ist nicht der Aussendung — es ist der Löser dahinter. Modell, Geometrie und Filter stimmen, verwandelst du verrauschtes Funk in eine Spur, die ein Lager oder Krankenhaus nutzen kann.