Positionsbestimmung mit Arduino radino32-Radio-Modul als RTLS-Baustein

Fast jeder wurde schon einmal mit einem Realtime-Location-System (RTLS) wie GPS konfrontiert. Schwierig wird es, wenn die Positionsbestimmung in einem Haus, einer Fabrikhalle oder einem anderen mehr oder weniger abgeschirmten Raum erfolgen soll. In diesen Fällen müssen andere Technologien her.

Sicher hat auch schon jeder erlebt, dass eine GPS-Positionsbestimmung wegen fehlender Sicht zu den genutzten Satelliten nicht möglich war. Spätestens beim Durchfahren eines Tunnels ist das der Fall und andere Sensoren müssen die Informationen bei der Durchfahrt liefern, bis die Positionsbestimmung nach Ausfahrt und Verbindung zu einer ausreichenden Anzahl von Satelliten wieder möglich ist. In diesem Beitrag wird die Positionsbestimmung auf der Basis des Bausteins DW1000 beschrieben, der von der irischen Firma decaWave für solche Zwecke entwickelt wurde. In Kombination mit einem STM32L151 von STMicroelectronics (Cortex-M3-CPU) bietet die Dresdner Firma In-Circuit ein radino32-DW1000-Modul an, welches als Baustein zur Entfernungsmessung in einem RTLS eingesetzt werden kann [1][2]. Realtime-Location-Systeme können applikationsbezogen sehr unterschiedliche technische Inhalte aufweisen. Die decaWave Applikationsschrift APS003 [3] befasst sich mit den RTLS-Anwendungsfälle und Implementierungsmethoden, die hier ansatzweise angezogen werden.

RTLS-Anwendungsfälle 
 
Einige typische Anwendungsfälle für RTLS zeigt die nachfolgende Zusammenstellung. Die Abstandsmessung (Bild 1 oben) ist die einfachste Form eines RTLS. Die Anforderungen sind dabei soweit reduziert, dass die Kenntnis des Abstands zweier Knoten zur Erfüllung der Aufgabenstellung bereits ausreicht. Diese Funktionalität kann auch mit jedem 2D- oder 3D-RTLS sichergestellt werden. 

Die in Bild 1, Mitte, gezeigte absolute Position bei fester Infrastruktur ist das »traditionelle« RTLS-Schema. Die Lage eines Objektes (T1) wird durch die Messung des Abstands zu feststehenden Objekten (Ai) mit bekannter Position (xi, yi) berechnet. Es gibt hierzu verschiedene Implementierungsmöglichkeiten, die noch betrachtet werden. In der in Bild 1 unten gezeigten Situation gibt es keine feste Infrastruktur, sodass die Knoten ihre Position relativ zu anderen Knoten im Netzwerk bestimmen müssen. Werden absolute Positionen benötigt, dann muss zu Beginn mit mindestens zwei festen Objekten gearbeitet werden.

Implementierungsmethoden

Zur Positionsbestimmung können verschiedene Methoden herangezogen werden. Bild 2 zeigt eine Übersicht solcher Methoden, die in [4] detaillierter betrachtet werden. Für unsere Zwecke hier kommen die Methoden der mittleren Säule (blau) in Betracht.

Die hier betrachtete Distanzmessung benutzt zum einen die Messung der Signalstärke des ankommenden Funksignals auf der Empfängerseite - Received Signal Strength Indication (RSSI) - und zum anderen die Laufzeitmessung eines Funksignals.

Mit Kenntnis der abgestrahlten Signalstärke, den Ausbreitungseigenschaften dieses Funksignals und Umgebungsbedingungen kann ungefähr die Distanz zwischen Sender und Empfänger ermittelt werden. Bei den praktischen Beispielen werde ich darauf zurückkommen, allerdings kann mit den zeitbasierten Systemen mit Ultra-Wide-Band ein weitaus genaueres Ergebnis erzielt werden.

Alle time-of-flight-basierten Systeme (ToA, TDoA) arbeiten mit der Laufzeitbestimmung eines ausgestrahlten Funksignals vom Sender zum Empfänger. Sobald diese Zeit genau bekannt ist, kann der Abstand zwischen dem Sender und dem Empfänger bestimmt werden, da die Geschwindigkeit der Ausbreitung von Funkwellen in Luft bekannt ist.

Beim Time-of-Arrival-Verfahren (ToA) wird die Signallaufzeit zwischen Sender und Empfänger gemessen und daraus die Entfernung zwischen beiden berechnet:

i presuperscript d equals c cross times open parentheses i presuperscript t minus o presuperscript t close parentheses

Bedingung für eine genaue Berechnung ist die Synchronisierung von Sender und Empfänger. Beide müssen taktsynchron arbeiten. In dieser Anforderung liegt auch bereits der Hauptnachteil dieses Verfahrens.

Will man die Synchronisation von Sender und Empfänger vermeiden, so kann die Implementierung nach dem 2-Wege-Verfahren (Two-Way Ranging - TWR) vorgenommen werden [5].

Wie Bild 3 zeigt, sendet der Anchor eine Nachricht an den Tag und zeichnet den Zeitpunkt des Versands der Nachricht (Sende-Zeitstempel) t1 auf. Vom Tag wird die Nachricht empfangen, bearbeitet und nach der Zeit treply zum Anchor zurückgesendet. Nachdem der Anchor die Nachricht empfangen hat, zeichnet er den Empfangs-Zeitstempel t2 auf.

Die Distanz zwischen Anchor und Tag berechnet sich beim TWR damit gemäß der Beziehung:

d subscript i space equals space c space x space fraction numerator open parentheses t subscript 2 space minus space subscript t subscript 1 end subscript space space minus space subscript t subscript r e p l y end subscript end subscript space close parentheses over denominator 2 end fraction

Beim dargestellten TWR-Verfahren zur Distanzermittlung gibt es eine Reihe von Fehlerquellen aufgrund von Takt- und Frequenzdrift. Die symmetrische doppelseitige TWR-Methode wird bei der Implementierung von decaWave verwendet, da sie bessere Ergebnisse liefert. Die Fehlerquellen beim DW1000-TWR werden in der Applikationsschrift [6] erläutert.

Beim Time-Difference-of-Arrival-Verfahren (TDoA) wird dem Nachteil der Synchronisation von Sender und Empfänger dadurch begegnet, dass hier ein Sender an mehrere Empfänger gleichzeitig sendet. Aus der Differenz der Empfangszeiten an den Empfängern kann bei bekannten Ortskoordinaten der Empfängerpositionen der Ort des Senders entsprechend berechnet werden.

Da die Übertragung nur in eine Richtung erfolgt, wird dieses Verfahren auch als One-Way-Ranging (OWR) bezeichnet. Erforderlich sind aber stets mehrere Empfänger, da das TDoA-Verfahren auf den Unterschied in den Ankunftszeiten bei mehreren Empfängern beruht, um den Standort zu berechnen.

Ein Nachteil hierbei ist, dass die Empfänger zeitlich wieder synchronisiert werden müssen. Jeder Fehler in der Synchronisation der Zeit in den Empfängern übersetzt sich direkt zu einem Fehler der Distanzmessung. 

Positionsbestimmung 

 Alle hier dargelegten Implementierungsmethoden nehmen eine Distanzmessung vor. Soll die absolute Position eines Tags bestimmt werden, dann bedarf es in jedem Fall noch einer Auswerteeinrichtung (Location Engine), die die ermittelten Distanzen und Fix-Positionen miteinander zur gesuchten Position verrechnet.

Um die Position eines Objektes im Raum in Abhängigkeit vom Abstand von anderen Punkten zu bestimmen, wird das Verfahren der Trilateration eingesetzt. Vorausgesetzt wird, dass die Entfernung zu jedem der anderen Punkte bekannt ist. Hierzu wird von jedem Punkt ein Kreis mit einem dem Abstand entsprechenden Radius gebildet und die gesuchte Position ist der Schnittpunkt des Kreises. Bild 4 zeigt die betreffende Situation.

Aus Bild 4 ist auch zu entnehmen, dass bei drei bekannten Entfernungen r1, r2 und r3, die gesuchte Position der Schnittpunkt der drei Kreise in Punkt B ist.

Sind nur die zwei Entfernungen r1 und r2 bekannt, dann könnte die gesuchte Position in den beiden Schnittpunkten der Kreise um die Fixpunkte P1 und P2, also Punkte A oder B, liegen. 

Der DW1000 
 
Der DW1000 ist ein kostengünstiges Low-Power-Transceiver-IC zum Einsatz in RTLS nach dem TWR- oder TDoA-Verfahren zur Lokalisierung von Objekten mit einer Genauigkeit bis zu 10 cm. 

Der Hersteller decaWave bietet den DW1000 als IC oder Modul an. Im noch zu betrachtenden radino32-DW1000 wird der DW1000 als IC eingesetzt. Bild 5 zeigt das Blockschema.

Einige wesentliche Hauptmerkmale des DW1000 sollen hier aufgelistet werden:

Versorgungspannung 2,8 V bis 3,6 V,

niedrige Leistungsaufnahme

Stromaufnahme im SLEEP-Modus 1 μA,

im DEEP-SLEEP-Modus 50 nA,

programmierbare Sendeleistung,

Unterstützung von TWR und TDoA,

SPI-Interface zum Host-Controller,

6 mm × 6 mm 48-poliges QFN-Gehäuse,

geringe Anzahl externer Komponenten erforderlich und

FCC- und ETSI-Ultra-Wide-Band-konform.

Detaillierte technische Daten können dem Datenblatt [7] entnommen werden. 

radino32-DW1000

Radino32 sind arduinokompatible 32-Bit-Mikrocontroller ergänzt mit diversen Funkmodulen und wurden im Beitrag »Arduino32 – Die jungen Wilden« [8] neben anderen 32-Bit-Arduinos vorgestellt. Die Performance der 32-Bit-Arduinos wurde mit einfachen Benchmarks verglichen.

Das radino32-DW1000 kombiniert einen STM32L151 Mikrocontroller von STMicroelectronics mit dem DW1000 Funkchip von decaWave zu einem kompakten Modul im Radino-Formfaktor.

Ein radino32-DW1000-Modul kann in ein eigenes PCB-Design integriert werden. Zu Testzwecken ist die Handhabbarkeit eines solchen Moduls nur bedingt gegeben, weshalb der Einsatz des Moduls auf einem radino-Spider-RP-SMA beziehungsweise radino-USB-Stick als Trägerboard zu empfehlen ist.

Für manchen erscheint das Antennendesign sicher etwas ungewohnt. Hierauf möchte ich an dieser Stelle nicht weiter eingehen, sondern auf einen Übersichtsbeitrag in »UWB Antennas for Wireless Applications« [9] verweisen. Das radino32-DW1000 ist neben den bereits erwähnten Eigenschaften durch die folgenden gekennzeichnet: 

STM32L151CC von STMicroelectronics mit 32-bit-Cortex-M3 von ARM,

32 KByte RAM, 256 KByte Flash, 8 KByte EEPROM,

Low-Power-RTC,

12-Bit-A/D-Wandler und D/A-Wandler,

unterstützt kapazitive Touchsensorik,

23 multifunktionale GPIOs (14 PWM, 10 ADC IN, 1 DAC OUT) und

USB, I²C, SPI, 2 × USART. 

Neben dem DW1000-Funkmodul steht also ein komplett ausgebauter Cortex-M3-Mikrocontroller zur Verfügung, was auch durch das in Bild 6 gezeigte Anschlussbelegung deutlich wird. 

Die technischen Daten sind im Datenblatt des radino32-DW1000 zusammengefasst [10].

Für alle radino-Funkmodule, so auch für den radino32-DW1000, bietet der Hersteller In-Circuit eine freie Arduino-Bibliothek an, welche USB-Treiber, Bootloader und zahlreiche Beispiel-Sketches enthält.

Zur Verwendung der aktuellen Version der radino32-Bibliothek (http://wiki.in-circuit.de/index.php5?title=radino_Library) ist eine Arduino-IDE in Version 1.8 erforderlich. Die Installation erfolgt mit Hilfe des Boardmanagers über File -> Preferences -> Settings und Additional Boards Manager URLs http://library.radino.cc/Arduino_1_8/package_radino_radino32_index.json.

In der radino32-Bibliothek ist das Programmbeispiel dw1000_ranging_demo.ino enthalten, wel-ches für die Tests herangezogen werden kann. Vor der Compilation muss das Programm noch als Anchor oder als Tag konfiguriert werden.

Nach der Definition von In-Circuit ist ein Anchor die aktive, feststehende Komponente im betreffenden RTLS, während Tags batteriebetrieben sind und sowohl fest als auch beweglich angeordnet sein können. Tags, die vom Anchor nicht angesprochen werden, befinden sich solange im Schlafzustand bis der Anchor die Kommunikation zu ihnen aufnimmt. Sind die Daten ausgetauscht, dann geht der Tag wieder in den Schlafzustand. Auf diese Weise ist es möglich, den Stromverbrauch des Tags auf ein Minimum abzusenken und somit die Batterielaufzeit zu optimieren.

Für die folgenden Tests mit einem Anchor und zwei Tags sind die Definitionen für WE_ARE_ANCHOR und MY_SHORT_ADDRESS anzupassen (Listing 1).

Die Adressangaben sind hier willkürlich gewählt. Näheres zum Programm dw1000_ranging_demo.ino lässt sich wiederum im Wiki [12] finden.

Nach Konfiguration des Programms und fehlerfreier Compilation erhält man die folgende Ausgabe im Ausgabefenster der IDE:

»Sketch uses 92332 bytes (35%) of program storage space. Maximum is 262144 bytes.

Global variables use 7832 bytes of dynamic memory.«

Gemäß der Ausgabe werden 35 % des zur Verfügung stehenden Programmspeichers vom Programm dw1000_ranging_demo.ino belegt. Es steht somit für zusätzliche Aufgaben bei Anchor und Tag genügend Speicherplatz zur Verfügung.Für die folgenden Experimente wird der Anchor über USB mit einem PC verbunden. Hierzu ist zunächst ein virtueller COM-Port-Treiber für den STM32-Mikrocontroller zu installieren. Für das jeweilige Betriebssystem erforderliche Treiber sind auf der Webseite http://www.st.com/web/en/catalog/tools/PF257938 zu finden.

Nach der Verbindung des radino32-W1000 mit einem freien USB-Port steht im Gerätemanager ein neuer COM-Port zur Verfügung, über welchen mit einem Terminalprogramm mit dem radino32-DW1000 kommuniziert werden kann.

Für den Anchor ist diese Verbindung zwingend, da hier die Daten der detektierten Tags erscheinen. Beim Kontaktieren eines Tags können ebenfalls Daten sichtbar gemacht werden, allerdings reicht auch die Spannungsversorgung über USB vollkommen aus.

Wie bereits erwähnt, werden die folgenden Tests mit einem radino-Spider-RP-SMA als Trägerboard für das radino32-DW1000-Modul durchgeführt. Anchor und Tag unterscheiden sich dann nur durch die Konfiguration der Software und es steht auch beim Tag eine serielle Schnittstelle (UART USB) zur Verfügung.

Beim Tag, wie er in realen Anwendungen zum Einsatz kommt, steht diese Schnittstelle zwar zur Verfügung, wird aber in der Regel nicht genutzt.

Ranging 

 Für das Ranging selbst sind ein Anchor und ein Tag ausreichend. Vom Anchor aus wird die Entfernung zu einem ein Objekt markierenden Tag ermittelt. Die Installation des Anchors erfolgt, wie im vorangegangenen Abschnitt erläutert. Will man beim Tag ebenfalls die Ausgaben an der seriellen Schnittstelle verfolgen, dann ist identisch zu verfahren, anderenfalls reicht die Spannungsversorgung über die USB-Schnittstelle.

Der hier installierte Anchor (mit der Short Address 0x1010) meldete sich an COM6 und detektierte zwei Tags (Bild 7:).

Der Tag mit der Short Address 0x2011 befand sich in einer Entfernung von 1,74 m, während der Tag mit der Short Address 0x2022 sich in einem Abstand von 7,41 m befand. Der nahe Tag (0x2021) war ebenfalls an einen USB-Port des PCs angeschlossen, um dessen Datenausgaben verfolgen zu können (Bild 8). Der mit COM3 verbundene Tag wurde nicht bewegt und zeigt in dieser Situation Distanzwerte zwischen 1,69 m und 1,83 m, was einer Messunsicherheit von 14 cm in dieser Konstellation entspricht.

Ein weiterer Test sollte zeigen, inwieweit die Feldstärke als Distanzkriterium herangezogen werden kann. Hierzu wurde das Logdatei eines Terminalmitschnitts ausgewertet. Bild 9 zeigt deutlich, dass die Feldstärke keine brauchbare Abhängigkeit von der Entfernung zwischen Anchor und Tag liefert und allenfalls für eine grobe Anwesenheitsabschätzung in einem gewissen Bereich herangezogen werden kann. 

Positioning 

Für die Positionsbestimmung waren drei Festpunkte und drei Distanzen erforderlich. Das bedeutet im Kontext hier, dass drei Anchors fix positioniert werden müssen, um die Position von mindestens einem (beweglichen) Tag bestimmen zu können. Jeder Anchor bestimmt die Entfernung zum betreffenden Tag und aus diesen Werten sowie der Position der Anchors (xi, yi) kann dann über Trilateration die Position (x, y) des Tags berechnet werden.

Wie Bild 11 zeigt, werden die Messwerte der Anchors zur Berechnung der Position des Tags einer Location-Engine übergeben, die beispielsweise in Form eines Linux-Gerätes den Trilaterations-Algorithmus abarbeitet.

Der Trilateration-Algorithmus steht als Bibliothek für unterschiedliche Programmiersprachen zur Verfügung.

Zur Verifikation der Positionsbestimmung habe ich ein Excel-Tabelle herangezogen, welches unter [13] veröffentlicht wurde. Bild 11 zeigt die Eingabe der Anchor-Positionen (Point A, B, C) und die gemessenen Distanzen zum Tag (Distances to Apex). Die gesuchte Position ist dann mit den x,y-Koordinaten des Punktes D gegeben.

Die Verifikation dieses Ergebnisses kann nun klassisch mit Stift und Zirkel erfolgen oder man zieht ein CAD-Programm hinzu. Hat man ein solches nicht zur Hand, dann hilft auch ein Programm wie GeoGebra (https://www.geogebra.org/), eine Dynamische-Geometrie-Software.

Bild 12 zeigt die eingegebenen Fixpunkte und die gemessenen Abstände als Radius der sie umgebenden Kreise. Im Schnittpunkt dieser Kreise befindet sich die Tag-Position, die sehr gut mit dem Ergebnis aus der Excel-Tabelle übereinstimmt.


Schlussbemerkung 

Das radino32-DW1000-Modul der Dresdner Firma In-Circuit erlaubt durch seine Arduino-Kompatibilität einen einfachen Zugang zur Distanzmessung mit decaWaves DW1000-UWB-Transceiver.


Die Bedingungen für die Distanzmessung und die Positionsbestimmung werden herausgearbeitet und mit Messwerten belegt.

Das in der radino32-Bibliothek enthaltene Programmbeispiel dw1000_ranging_demo.ino kann als Ausgangspunkt für eigene Experimente herangezogen werden. Optimierungen des Verhaltens lassen sich durch Anpassung der Konfiguration, wie Kanalauswahl, abgestrahlte Leistung und andere vornehmen.

Das bereits in zahlreichen Anwendungen eingesetzte radino32-DW1000 bekommt mit dem radinoL4-DW1000 (http://wiki.in-circuit.de/index.php5?title=radinoL4_DW1000) eine leistungsstärkere Ergänzung.

Durch Einsatz eines STM32L433-Mikro-controllers, einen 32-bit-Cortex-M4 von ARM mit 64 KByte RAM und 256 KByte Flash, kann das SPI zum DW1000 optimiert werden. Auf der Modulrückseite sind Testpunkte angeordnet, um den DW1000 mit externem Takt und Synchronisationspulsen zu versorgen. Durch diese Maßnahmen können mehrere DW1000 synchronisiert arbeiten und die Genauigkeit des TDoA-Verfahrens wird deutlich verbessert. (fr)

Referenzen 

ScenSor DW1000: https://www.decawave.com/products/dw1000

radino32 DW1000 für Ranging und RTLS: http://shop.in-circuit.de/product_info.php?products_id=186

decaWave APS003: Real Time Location Systems: A Guide https://www.decawave.com/support#term5

Reky Novrianto: Methoden zur Lokalisierung von drahtlosen Endgeräten. Hauptseminararbeit, TU Ilmenau, 2012. http://yukon.e-technik.tu-ilmenau.de/~webkn/Abschlussarbeiten/Hauptseminararbeiten/hs_novrianto.pdf

decaWave APS013: The implementation of two-way ranging with the DW1000. https://www.decawave.com/support#term5

decaWave APS011: Sources of Error in Two Way Ranging. https://www.decawave.com/support#term5

Datasheet DW1000 IEEE802.15.4-2011 UWB Transceiver. https://www.decawave.com/sites/default/files/resources/dw1000-datasheet-v2.09.pdf

Claus Kühnel: Arduino32 – Die jungen Wilden. DESIGN&ELEKTRONIK 5/2016 (Teil 1), 6/2016 (Teil 2).

Osama Haraz; Abdel-Razik Sebak: UWB Antennas for Wireless Applications. http://dx.doi.org/10.5772/51403

Datenblatt radino32 DW1000. http://wiki.in-circuit.de/images/6/63/305000092A_radino32_DW1000.pdf

Installation radino32 Library in Arduino V.1.8 – radino32 Wiki https://goo.gl/trfuwH

DW1000_Ranging_Demo – radino32 Wiki http://wiki.in-circuit.de/index.php5?title=dw1000_ranging_demo

Trilateration http://www.stonetabernacle.com/Trilateration.html

Dr.-Ing. Claus Kühnel

studierte und promovierte an der Technischen Universität Dresden auf dem Gebiet der Informationselektronik und bildete sich später in Biomedizintechnik weiter.

Bis zu seiner Pensionierung 2016 war er bei der QIAGEN Instruments AG in Hombrechtikon (CH) als Director Electronic Engineering & Embedded Systems für die Entwicklung von Elektronik-Hardware und hardwarenaher Software verantwortlich. Aktuell arbeitet er als Consultant und weiterhin als Autor.

Kontakt: info@ckuehnel.ch,

https://www.linkedin.com/in/ckuehnel, https://www.xing.com/profile/Claus_Kuehnel