Suivi en temps réel d'un tag mobile dans le repère orthonormé défini par 3 ancres DWM3000 —
trilatération par DS-TWR. Précision cible : 2 à 5 cm.
✓ Principe. Les 3 ancres ne font pas que mesurer des distances : elles
définissent un repère orthonormé. A1 fixe l'origine,
A2 donne l'axe X, A3 donne l'axe Y ; l'axe Z (vertical) s'en déduit.
La position du tag est ensuite exprimée dans ce repère, en mètres.
1. Scène 3D — suivi du tag en temps réel
DÉMO — trajectoire simulée
Glisser pour orbiter · molette pour zoomer · clic droit pour déplacer
Chargement du moteur 3D…
⚠
Impossible de charger le moteur 3D. La bibliothèque Three.js est récupérée
depuis un CDN (unpkg) — vérifiez la connexion internet, puis rechargez la page.
Vitesse1.0×
Vues
2. Le repère orthonormé formé par les ancres
Trois ancres suffisent à construire un repère cartésien complet. On choisit A1
comme origine ; le segment A1→A2 donne la direction de l'axe X,
le segment A1→A3 celle de l'axe Y. L'axe Z est
le produit vectoriel des deux — il pointe vers le haut. Les trois axes sont perpendiculaires et
partagent la même unité (le mètre) : le repère est orthonormé.
Repère orthonormé défini par les ancres
O = A1 (origine)
x̂ = A1→A2 / |A1→A2| (axe X, Lx = |A1A2|)
ŷ = A1→A3 / |A1→A3| (axe Y, Ly = |A1A3|)
ẑ = x̂ × ŷ (axe Z, vertical)
Trilatération 3D — forme analytique
r₁, r₂, r₃ = distances tag↔A1 , tag↔A2 , tag↔A3
x = ( r₁² − r₂² + Lx² ) / ( 2·Lx )
y = ( r₁² − r₃² + Ly² ) / ( 2·Ly )
z = √( r₁² − x² − y² )
✓ Pourquoi ce placement ? Cette forme fermée n'existe que parce que les ancres
reposent exactement sur les axes. Un placement orthonormé transforme la trilatération en
trois formules directes — sans résolution itérative. La racine carrée impose z ≥ 0
(tag au-dessus du plan des ancres), ce qui lève l'ambiguïté haut/bas inhérente à 3 ancres coplanaires.
3. De la mesure de distance à la position 3D
Chaîne de traitement
Chaque distance vient du DS-TWR (Double-Sided Two-Way Ranging) : 4 trames
échangées — POLL 0x21 → RESPONSE 0x10 → FINAL 0x23 → RESULT 0x11.
Les 6 horodatages 40 bits annulent la dérive d'horloge entre les modules.
Chaque distance est lissée par une moyenne glissante (5 échantillons).
La trilatération convertit r₁, r₂, r₃ en position (x, y, z).
Cadence du cycle complet : ≈ 10 Hz.
Ce que montre la scène
Le tag bleu est la position trilatérée, pas la position vraie.
Les rayons colorés matérialisent les 3 distances mesurées.
Les sphères de trilatération (option) ont pour rayon chaque distance :
leur intersection est la position du tag.
L'écart affiché illustre l'effet du bruit de mesure sur la précision finale.
4. Performances et intégration des données réelles
Grandeur
Valeur
Remarque
Précision X / Y
±2 à 5 cm
Tag à l'intérieur du triangle des ancres
Précision Z
±10 à 15 cm
Plus faible : les 3 ancres sont coplanaires
Cadence
~10 Hz
Durée d'un cycle DS-TWR complet
Ancres minimum
3
4+ pour la robustesse et un meilleur Z
Repère
Orthonormé
A1 = origine, A2 = axe X, A3 = axe Y
✓ Données réelles — branchement disponible. Cette page exécute une
trajectoire simulée par défaut, mais bascule automatiquement en mode
« EN DIRECT » dès qu'un tag réel émet. Lancez le relais fourni
(relais_uwb/) : il reçoit les datagrammes UDP du tag ESP32 et les rediffuse en
flux SSE, puis sert cette visualisation. Voir documentation_donnees_reelles.html
pour la procédure complète. On peut aussi pousser une mesure depuis la console :
window.uwbViz.appliquerMesure({d:[d1,d2,d3]}).
⚙ Géométrie réelle des ancres — obligatoire pour les données réelles.
La trilatération suppose un repère orthonormé (A1 = origine, A2 sur X, A3 sur Y). Si vos
ancres ne sont pas espacées de 6 m × 5 m, indiquez leur écartement réel dans l'URL, sinon
la position reste figée et le tag ne bouge pas :
?a2x=<dist A1→A2 en m>&a3y=<dist A1→A3 en m>.
Exemple banc d'essai : ?a2x=0.90&a3y=0.80. Options : lz (hauteur),
a1z/a2z/a3z (hauteur de chaque ancre).
Élément de présentation du projet dw3000_uwb_ranging — voir aussi
schema_positionnement_ancres.html, documentation_donnees_reelles.html.