Visualisation 3D du positionnement UWB

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.
Vitesse 1.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

GrandeurValeurRemarque
Précision X / Y±2 à 5 cmTag à l'intérieur du triangle des ancres
Précision Z±10 à 15 cmPlus faible : les 3 ancres sont coplanaires
Cadence~10 HzDurée d'un cycle DS-TWR complet
Ancres minimum34+ pour la robustesse et un meilleur Z
RepèreOrthonormé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.