Un beacon Bluetooth est volontairement simple : il s’éveille, émet une petite charge utile, puis se rendort. La position du récepteur est calculée ailleurs, par un logiciel qui convertit les mesures radio en coordonnées. Cet article parcourt les trois couches qui comptent vraiment — convertir la force du signal en distance, résoudre la position et lisser le résultat — avec les chiffres dont un ingénieur a besoin pour fixer ses attentes.
De RSSI à la distance : le modèle logarithmique
L’entrée la plus courante est l’Indicateur de Force de Signal Reçu (RSSI). Selon le modèle de perte de trajet logarithmique, la puissance décroît environ avec le carré de la distance, modulée par un facteur d’environnement :
RSSI(d) = RSSI0 - 10 * n * log10(d / d0) + X_sigma
- `RSSI0` — puissance mesurée à la distance de référence `d0` (généralement 1 m)
- `n` — exposant de perte de trajet (2,0 espace libre, 2,5–4,0 intérieur)
- `X_sigma` — évanouissement d’ombre gaussien, écart-type 3–8 dB en intérieur
On l’inverse pour estimer la distance :
d = d0 * 10^((RSSI0 - RSSI) / (10 * n))
Exemple : RSSI0 = -59 dBm, n = 2,0, mesuré RSSI = -75 dBm, d0 = 1 m :
d = 10^(( -59 - (-75) ) / 20) = 10^(16/20) = 10^0,8 ≈ 3,98 m
Le piège est X_sigma. Une oscillation de ±6 dB avec n = 3 déplace l’estimation d’un facteur 10^(6/30) ≈ 1,58. Une seule mesure RSSI n’est donc bonne que sur ~±50 % de distance. Voilà pourquoi la distance brute n’est jamais la réponse finale.
Trilatération : résoudre l’intersection
Avec trois ancres Beacon ou plus à coordonnées connues, on trilatère le récepteur. Chaque ancre donne un rayon bruité ; les moindres carrés trouvent le point minimisant les résidus au carré :
<h1>ancres : liste de (x_i, y_i, r_i)</h1>
<h1>minimiser sum_i ( sqrt((x-x_i)^2 + (y-y_i)^2) - r_i )^2</h1>
<h1>résoudre avec Gauss-Newton / Levenberg-Marquardt</h1>
def trilaterate(ancres):
p = centroide(ancres)
for _ in range(20):
J, f = jacobien_residu(p, ancres)
dp = solve(J.T @ J + lam*I, J.T @ f)
p = p - dp
if norm(dp) < 1e-3: break
return p
La géométrie compte : la Dilution de Précision (GDOP) explose quand les ancres sont colinéaires ou que le récepteur sort de l’enveloppe des ancres. Gardez les ancres réparties en 2D (idéal 3+), couvrez la zone de plusieurs côtés. Une hauteur de 2,5–3,5 m sur des murs différents donne typiquement 1–3 m d’erreur en intérieur ouvert.
Empreinte : sauter la physique
Au lieu de modéliser la propagation, l’empreinte apprend l’espace. Phase hors ligne : parcourir une grille et enregistrer le vecteur RSSI à chaque point de référence (RP). Phase en ligne : associer le vecteur live au RP le plus proche :
<h1>kNN / Weighted-kNN</h1>
def localiser(vecteur_live, bd_rp):
dists = [euclidien(vecteur_live, rp.vecteur) for rp in bd_rp]
k_proches = argsort(dists)[:k]
w = 1 / (dists[k_proches] + eps)
x = sum(w * bd_rp[i].x for i in k_proches) / sum(w)
y = sum(w * bd_rp[i].y for i in k_proches) / sum(w)
return x, y
L’empreinte est robuste au multitrajet et hors-ligne-de-vue (NLOS) car elle intègre ces effets dans le relevé. Coût : le relevé hors ligne est laborieux (~1 RP/m² pour une bonne résolution) et à refaire si l’agencement change. Erreur typique : 0,5–2 m.
Lissage : tuer le tremblement
Une piste brute saute d’image en image. Appliquez un filtre de Kalman 1-D par axe, ou un filtre à particules si vous avez des contraintes de mouvement :
<h1>Kalman vitesse constante 1-D, par coordonnée</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 : bruit de mesure (de l'écart-type RSSI) ; Q : bruit de processus (de la vitesse)</h1>
Mettez R élevé (faire confiance au modèle) quand RSSI est bruité ; abaissez Q pour les mouvements lents. Pour les étiquettes portables, un filtre à particules qui rejette les mouvements impossibles (à travers les murs) bat la moyenne naive.
Comparaison des méthodes
| Méthode | Entrée | Erreur typ. | Coût relevé | Idéal pour |
|---|---|---|---|---|
| Trilatération | 3+ ancres, RSSI→dist | 1–3 m | Faible | Layouts stables, peu d’ancres |
| Empreinte | Vecteurs RSSI | 0,5–2 m | Élevé | Multitrajet, NLOS, grilles fines |
| Fusion (RSSI+IMU) | RSSI + accéléro | 0,3–1 m | Moyen | Wearables, dead-reckoning |
Règles de déploiement pratique
- Calibrez `RSSI0` et `n` par site ; ne faites pas confiance aux valeurs d’usine.
- Utilisez 4+ ancres par zone, montées à 2,5–3,5 m, sur des murs différents.
- Indiquez l’incertitude de distance (écart-type), pas seulement un point — la logique aval doit filtrer dessus.
- Lissez avant de décider ; un filtre médian à 3 échantillons capture les pics RF à peu de frais.
- Combinez avec le cadencement et la planification RF des articles précédents : la densité d’ancres et le placement des passerelles fixent le plafond de précision.
La valeur d’un système Beacon n’est pas l’émission — c’est le solveur derrière. Modèle, géométrie et filtre justes, et vous transformez une radio bruitée en une piste qu’un entrepôt ou un hôpital peut exploiter.