Het bouwen van een lokaal positioneringssysteem om lopers te volgen met Ultra-Wideband

De 12Urenloop is een jaarlijkse loopwedstrijd op het Sint-Pietersplein in Gent. De deelnemende studentenverenigingen lopen in een estafetterace twaalf uur lang zoveel mogelijk rondjes. Elk team krijgt één baton (doorgeefstok) toegekend, waardoor er per team slechts één loper tegelijkertijd op het circuit kan zijn.

Zeus WPI is al enige tijd verantwoordelijk voor het tellen van de rondes bij de 12Urenloop. In het begin gebeurde dit via een manueel telsysteem waarbij de rugnummers van de lopers handmatig werden ingevoerd. Vanaf 2011 werd overgestapt op een automatisch telsysteem op basis van bluetooth-modules in de batons.

Tussen 2019 en 2022 is de volledige stack vernieuwd met modernere hardware, een website waarop de geschatte posities van de lopers worden getoond, en uitgebreide redundantie, fouttolerantie en monitoring.

Wat is UWB?

UltraWideBand (UWB) is een radiocommunicatie-standaard die gericht is op lokalisatie van zenders en ontvangers met centimeterprecisie. Dit is mogelijk omdat de technologie een groot deel van het radiospectrum gebruikt (500 MHz), waardoor het zeer effectief is in het negeren van signaalreflecties. Hierdoor kan het begin van een ontvangen pakket nauwkeurig worden geïdentificeerd.

Wanneer dit wordt gecombineerd met een klok die accuraat is op picoseconden-niveau, kan door het vergelijken van de verzendtijd en de ontvangsttijd van een pakket worden berekend hoe lang dat pakket (met de lichtsnelheid) onderweg is geweest. Door deze tijd te vermenigvuldigen met de lichtsnelheid, wordt de afstand tussen zender en ontvanger bepaald. Als deze afstand tot een bewegende UWB-zender (tag) vanaf meerdere vaste UWB-zenders (anchors) kan worden gemeten, kan de exacte positie van de tag worden berekend. Dit is hetzelfde principe als GPS, maar dan op kleinere schaal.

Deze technologie wordt onder andere gebruikt in iPhones en AirTags om de afstand en richting tot een tag aan te geven. Ook wordt het toegepast in moderne autosleutels die de auto ontgrendelen wanneer je dichtbij komt; aangezien een UWB-signaal geëncrypteerd kan worden, is het bestand tegen relay attacks.

Wat maakt deze technologie mogelijk?

Sinds 2021 werd er gesproken over het gebruik van UWB bij de 12Urenloop vanwege enkele grote voordelen:

  • Exacte positiemeting: Het huidige bluetooth-systeem geeft een goede inschatting van de voortgang op het circuit door de snelheid te berekenen, maar levert geen werkelijke positiemetingen.
  • Nauwkeurige rondetelling: Met positionering kan een ronde worden geteld op het exacte moment dat iemand de startlijn passeert. Dit is niet mogelijk met bestaande RFID-systemen voor loopwedstrijden, omdat er bij de 12Urenloop per team een eigen startlijn is (bij de tent van elke vereniging).
  • Uitgebreidere statistieken: Het maakt het mogelijk om data te verzamelen over individuele lopers, zoals maximum- en minimumsnelheid en snelheid in de bochten.
  • Schoner signaal: Er is minder last van ruis, aangezien er bij de wedstrijd veel bluetooth-signalen van honderden of duizenden toeschouwers aanwezig zijn.

Zelf bouwen versus kant-en-klare oplossingen

Er bestaan professionele RTLS (real-time location system) oplossingen inclusief hardware en software, maar deze vallen buiten het budget van een door studenten georganiseerde wedstrijd (een starterkit van het Gentse Pozyx kost bijvoorbeeld rond de 5000 euro).

De laatste jaren is de prijs van UWB-modules echter sterk gedaald. Officieel verpakte Qorvo-modules (gebruikt door Pozyx en interoperabel met de Apple U1-chip) kosten ongeveer 19 tot 25 euro per stuk, terwijl aftermarket clones met een geïntegreerde microcontroller zelfs voor 12 euro beschikbaar zijn.

Dit maakte het een goed moment om te onderzoeken hoe haalbaar en nuttig een eigen UWB-systeem zou zijn voor de 12Urenloop. Bij nader inzien bleek er vrijwel geen open-source software te bestaan die het positioneren van meerdere tags ondersteunt; de meeste beschikbare code richt zich op één enkele tag met meerdere anchors.

Bij meerdere tags en anchors moeten alle modules coördineren wanneer ze mogen uitzenden, omdat alle communicatie over één kanaal verloopt. Synchronisatie tussen modules moet binnen enkele milliseconden gebeuren om een meetfrequentie van 1 tot 10 keer per seconde per tag te behalen. Om dit te testen zijn vijf DWM3000 UWB-modules aangeschaft voor een opstelling met drie vaste anchors en twee tags. Voor de aansturing is gekozen voor de ESP32-WROOM vanwege de lage prijs, de aanwezigheid van bluetooth en wifi, en beschikbaarheid in het clublokaal. De code is geschreven in het Arduino-framework.

Tuning & Testing

De DW3000 chipset wordt aangestuurd via SPI door het lezen en schrijven van honderden registers en een aantal commando's. Hoewel Qorvo een SDK aanbiedt, werkt deze niet voor Espressif-chips. Gelukkig is er een community-port van de driver library naar het Arduino-framework beschikbaar.

De eerste weken stonden in het teken van de vraag of de DWM3000 module geschikt was voor de 12Urenloop, met focus op drie punten:

  1. Bereik: Is het meetbereik voldoende (doel: minimaal 30 meter)?
  2. Accuraatheid: Is de gemeten afstand nauwkeurig genoeg?
  3. Capaciteit: Hoe vaak kan de positie worden gemeten als er 15 tags (één per loper) op het circuit zijn?

Na optimalisatie van de registers voor de radio-frame structuur en het uitzendvermogen kon afstand worden gemeten tot ongeveer 50 meter. Dit zou met grotere antennes op de anchors waarschijnlijk verder verbeterd kunnen worden. Het bereik neemt af wanneer er geen direct zicht (Line Of Sight) is tussen modules of wanneer er veel metaal in de buurt is, wat zorgt voor reflecties van het radiosignaal.

Na kalibratie kon de afstand tussen twee modules binnen 5 meter met een tolerantie van ongeveer 2 centimeter worden gemeten. Op langere afstanden is meer kalibratie per module nodig om accuraat te blijven; daarna kan de tolerantie rond de 10 centimeter blijven door gebruik te maken van een double sided ranging scheme (waarbij beide modules de afstand tot elkaar meten).

Positioneringstest en Synchronisatie

Voor de positioneringstest werden twee anchors in de hoek van het lokaal geplaatst. De tag mat beurtelings de afstand naar elke anchor, waarna de anchors deze afstanden via wifi en MQTT terugstuurden naar de tag. De getrianguleerde positie werd realtime gevisualiseerd via een dashboard gebouwd met Bevy.

Om dit systeem met twee tags op hoge snelheid te laten werken zonder signaalinterferentie, is synchronisatie tussen anchors essentieel. Dit wordt geregeld via een gedeelde klok waarbij elke anchor een tijdslot krijgt toegewezen binnen een interval. Met een interval van 1 seconde en tijdslots van 10 milliseconden kunnen er bijvoorbeeld 100 afstandsmetingen per seconde worden uitgevoerd.

De distributie van de klok (het tellen van ticks op de UWB-chip) verloopt via de bestaande UWB-berichten. Telkens wanneer er een bericht wordt verzonden tussen een anchor en een tag, wisselen ze hun klokwaarden uit en wordt de hoogste waarde door beide partijen overgenomen (monotoon toenemende klok).

In een demo onder ideale omstandigheden met 3 anchors en 2 tags werden metingen gecoördineerd op 60 Hz. Dit resulteert in $60 / 2 / 3 = 10$ positiemetingen per seconde. Theoretisch zou deze timing het mogelijk maken om de positie van 20 tags één keer per seconde te updaten.

Software-architectuur voor de 12Urenloop

Om deze metingen realtime te aggregeren voor live-tracking, is aanvullende software nodig. Het huidige systeem gebruikt zeven stations met Raspberry Pi's verspreid over het circuit, verbonden via Ethernet. Voor het prototype werden de drie anchors via USB aangesloten op deze Raspberry Pi's. Een publisher-script leest de meetresultaten en stuurt deze naar een centrale RabbitMQ-server in de controlekamer (container). Het Bevy-dashboard leest alle berichten en voert de triangulatie-logica uit, waarop vervolgens de rondetelling kan worden gebaseerd.

Ondersteuning van meer anchors

Er wordt geschat dat er 7 tot 10 anchors nodig zijn om het volledige circuit van de 12Urenloop te dekken. In die situatie zullen maximaal drie anchors tegelijkertijd binnen bereik van een tag zijn. Als elke anchor altijd het kanaal zou moeten gebruiken om elke tag individueel te contacteren, zou de meetsnelheid drastisch dalen bij een groeiend aantal anchors.

Dit kan worden opgelost door tijdslots te hergebruiken tussen anchors die nooit tegelijkertijd in het bereik van dezelfde tag kunnen zijn.

Conclusie en vervolgstappen

Met deze resultaten is de basis voor de proof-of-concept afgerond. De testen op een bocht van het circuit vlak voor de wedstrijd toonden aan dat de kwaliteit (na kalibratie) voldoende is voor accurate tracking.

Om het systeem daadwerkelijk in gebruik te nemen, moeten de tags worden geïntegreerd in de batons waar momenteel het bluetooth-systeem zit. Daarnaast moeten er uitgebreidere metingen worden gedaan naar het stroomverbruik en de betrouwbaarheid.

De repository met alle code is te vinden op GitHub.