Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektewise20:abstandsroboterpublic:start

Projektdokumentation Abstandsroboter

Ein Projekt von Philipp, Darius und Sarah aus dem WS 20/21

Themenbeschreibung

Der Abstandsroboter berechnet den Abstand zwischen 2 Personen im Raum und ist in der Lage diesen Abstand auszuwerten. Die Idee für das Projekt kam auf Grund der momentanen Corona-Pandemie, in der Abstand halten aktueller den je ist. Unser Roboter hat also die Aufgabe die Menschen um ihn rum an die Einhaltung dieses Abstandes zu erinnern und so das Infektionsrisiko zu verringern. Er orientiert sich an dem von der Bundesregierung festgelegten Mindestabstand von 1,5 Metern.

Um diese Aufgabe zu realisieren muss er sich im Raum frei bewegen können, er muss Personen erkennen und den Abstand zwischen diesen Personen berechnen können. Über einen Lautsprecher warnt er dann diejenigen, die zu nah stehen mit einer Sprachausgabe wie beispielsweise: „You are too close to each other. Please keep the minimal distance.“ Diese Idee ließ sich nur umsetzen, wenn wir unseren Roboter in 2 Teile unterteilen. In einen mobilen, herumfahrenden Teil zur Wahrnehmung des Raumes und einen stationären Teil zur Datenverarbeitung und Berechnung des Abstandes.

Umsetzung und Methoden

Überblick

Aufbau

|
Abbildung 1: Skizze des Roboters mit einem mobilen und einem stabilen Teil

In Abbildung 1 ist unser Roboter skizziert. Es ist auch gut die Einteilung in einen mobilen und einen stationären Teil zu erkennen. Der sich im Raum bewegende Teil (links im Bild) besteht aus einem Gestell und 3 Rädern. Diese werden über Treiber von Stepper-Motoren angesteuert. Auf dem Gestell befindet sich auch der Arduino, dieser ist an einen Akku angeschlossen, um eine Stromversorgung zu ermöglichen. Mit dem Arduino sind nicht nur die Stepper-Motoren, sondern auch ein Bluetooth-Modul, ein Text-to-Speech Modul und ein kleiner Lautsprecher verbunden. Auf diese Bestandteile und ihre Funktionen gehen wir genauer in der Dokumentation ein. Auch befindet sich an der Spitze des Gestells ein Smartphone mit einer integrierten Kamera, die den Raum vor dem Roboter aufnimmt.

Der stabile Part (rechts im Bild) umfasst einen Laptop, auf dem die Daten der Kamera verarbeitet werden.

Aufgaben unseres Roboters

Notwendige Aufgaben unseres Roboters sind:

  • Menschen im Raum erkennen
  • den Abstand zwischen zwei Menschen ermitteln
  • ein akustisches Signal ausgeben, wenn der Abstand zu gering ist

Wünschenswerte Aufgaben unseres Roboters wären:

  • im Raum bewegen und nach weiteren Menschen suchen
  • Abstand zwischen mehr als zwei Personen ausrechnen

Aufgaben, die wir bewusst ausgeklammert haben sind:

  • als ein „Desinfektionsspender“ fungieren
  • erkennen, ob die Person eine Maske trägt, wenn nicht eine Maske aushändigen
  • Schutz vor Aerosolen bieten, wenn sich Personen gegenüberstehen (mit Hilfe einer transparenten Scheibe)
  • Körpertemperatur (z.B. an der Stirn) messen und falls die Temperatur zu hoch ist, die Kontaktdaten eingeben lassen
Abbildung 2: grober Datenfluss des Roboters

In Abbildung 2 ist vereinfacht der Datenfluss des Roboters dargestellt. Man erkennt die einzelnen Teilschritte, die durchlaufen werden müssen, um die oben genannten Aufgaben realisieren zu können. Der detaillierten Beschreibung dieser Teilaufgaben und den damit verbundenen Hindernissen widmen wir uns im folgenden Teil der Projektdokumentation.

Den Roboter fahren lassen

Damit der Roboter sich im Raum bewegen kann, haben wir 3 Räder verbaut, die über Stepper-Motoren angetrieben werden. Die Stepper-Motoren steuern wir über Treiber an.

Abbildung 3: Gestell des Roboters

Kamerabild bereitstellen

Die Kamera, mit der der Raum um den Roboter aufgenommen wird, befindet sich auf dem Smartphone. Dieses fährt auf dem Gestell durch den Raum. Um auf unserem Laptop das Bild auswerten zu können, müssen wir die Aufnahme kabellos mit dem Laptop teilen. Es ist nicht möglich, das Kamerabild auf dem Smartphone, bzw. einem Raspberry-PI auszuwerten, da der Algorithmus zum Erkennen der Menschen und Berechnen des Abstandes zu rechenintensiv ist.

Mit Hilfe der DroidCam-App, die man sich kostenlos herunterladen kann, war es möglich unsere Smartphone-Kamera als Webcam am Computer einzusetzen. Der Laptop und das Smartphone müssen dafür im selben WLAN-Netzwerk sein.

Menschen erkennen

Damit wir den Abstand zwischen den Personen berechnen können, brauchen wir ein Programm was Menschen identifizieren kann.
Eine erste Idee war Kinect, eine Tiefenkamera von Microsoft, welche Anwendung bei der Xbox Konsole findet. Vorteil bei dieser Kamera ist, dass sie den Abstand zwischen ihr und der Person berechnen kann. So hätte man einfach ein relativ genaues Ergebnis für diesen Abstand. Leider hat die Installation der Kinectkamera bei uns nicht geklappt.
Aus diesem Grund haben wir Tensorflow genutzt. Tensorflow ist ein Programmiergerüst von Google, welches Anwendung im maschinellen Lernen findet. Auch das Modell welches wir genutzt haben, wurde durch maschinelles Lernen trainiert. Dem Programm (Posenet) wurden viele Bilder von Menschen gezeigt und gesagt was welche Körperteile sind. Posenet gibt uns also in Echtzeit die Koordinaten bestimmter Körperteile von bis zu drei Personen.

Abbildung 4: Keypoints in TenserFlow. Quelle: hier.

Abstandsberechnung

Nun haben wir die X/Y Koordinaten verschiedener Körperteile von bis zu drei Personen. In unserer Abstandsberechnung beschränken wir uns aber auf zwei Personen. Nun müssen wir den Abstand aus diesen Daten berechnen. Ein Problem dabei ist, das wir nicht einfach den Abstand in der X/Y Ebene berechnen können, sondern auch den Abstand in der Tiefe berücksichtigen müssen.

Abbildung 5: einfache Abstandsberechnung

Der Abstand ∆d wäre nur korrekt, wenn die Personen den gleichen Abstand zur Kamera haben.

Abbildung 6: Abstand im Koordinatensystem

In diesem Fall z.B. wäre der Abstand ∆d nach der ersten Berechnung unter 1,5m. Dann würde unser Roboter die Personen bitten ihren Abstand zu halten, obwohl dieser ausreichend ist.

Der gesuchte Abstand ist also die Strecke AB. Um diesen zu ermitteln benutzen wir den Kosinussatz:

$AB = √(AK² + BK² - 2*AK*BK*cos(γ))$

Wir brauchen also die Strecken der jeweiligen Personen zur Kamera, sowie den Winkel den sie einschließen.

Den Abstand zwischen Person und Kamera berechnen wir mit einem Antiproportionalen Dreisatz.
Posenet liefert uns die Koordinaten der Hüfte und Schulter. Um den Dreisatz anzuwenden brauchen wir zunächst einen gemessen Abstand zwischen Hüfte und Schulter, bei einem vorher festgelegten Abstand zwischen Kamera und Person. Unsere Testperson hat einen Abstand von 0,46m zwischen Hüfte und Schulter und steht 2m von der Kamera entfernt. Berechnen wir nun den Abstand zwischen Hüfte und Schulter mit den Daten, die wir von Posenet erhalten haben, erhält man durchschnittlich 127 Pixel.

Abbildung 7: festgelegter Wert Schulter-Hüfte

Ist die Person nun weiter von der Kamera entfernt, so wird sie kleiner und auch ihr Abstand zwischen Hüfte und Schulter, den wir über Posenet erhalten. Dank diesem Zusammenhang können wir auf die Entfernung zwischen der Kamera und der Person kommen.

Abbildung 8: Abstand der Personen zur Kamera berechnen

Bei $∆K = 200cm$ beträgt die Anzahl der Pixel 127 (∆HS 46cm).

⇒ $∆K = 200*127/∆HS $

Um den Abstand zwischen den Personen zu berechnen, fehlt uns nur noch cos(γ):

Abbildung 9: Winkelberechnung

LR ist in dieser Abbildung die Bildschirmebene. Also sind die folgenden Strecken keine realen ( in cm), sondern in Pixeln.

K : Kamera
L : linker Bildschirmrand
R : rechter Bildschirmrand
A : Person A (Abstand zwischen linken Bildschirmrand und Mitte zwischen beiden Schultern)
B : Person B (Abstand zwischen linken Bildschirmrand und Mitte zwischen beiden Schultern)
e : Strecke LR = gesamte Bildschirmbreite in Pixel (wählbar)

Wir nutzten dazu ein gleichseitiges Dreieck (LRK). Die Länge einer Seite beträgt gerade die ausgewählte Länge des Bildschirms in Pixel.

Nach dem Kosinussatz gilt für das Dreieck ABK : $e² = a² + b² – 2*a*b*cos(γ)$
⇒ $cos(γ) = (a² + b² – e²) / 2 a b \\$

Die Strecke e ist die Differenz zwischen A und B: $e = B - A$

Die Strecke a lässt sich über das Dreieck LAK mit dem Kosinussatz folgendermaßen ausdrücken:

$a² = c² + d² – 2*d*cos(LAK) $

Die Strecke b lässt sich über das Dreieck BRK mit dem Kosinussatz folgendermaßen ausdrücken:

$b² = c² + f² – 2*c*f*cos(BRK)$

Da das Dreieck LRK gleichseitig ist sind gilt : cos(BRK) = cos(LAK) = cos(60°)

Nun haben wir alle Informationen, um den finalen Abstand zu berechnen:

$AB = √(AK² + BK² - 2*AK*BK*cos(γ))$

Datenübermittlung zum Arduino

Der Abstand zwischen den Personen wurde nun berechnet. Und Ziel des nächsten Schrittes ist es, diesem Abstandswert an unseren Arduino zu übermitteln, damit dieser dort bewertet werden kann.

Im Moment befindet sich der Abstand noch im p5-Editor, also online im Browser. Die Kommunikation hin zum Arduino erfolgt über einen seriellen Port, also eine Verbindungsstelle zur Datenübertragung zwischen 2 Geräten.

Ein Hindernis ist nun, dass man über den Browser bzw. Client keinen Zugriff auf einen seriellen Port hat. Das ist aus Sicherheitsgründen nicht möglich. Die Lösung des Problems ist es einen Server zu erstellen. Ein Server kann eine vom Client angeforderte Dienstleistung bzw. Anfrage erfüllen und wie in unserem Fall auch auf einen seriellen Port zugreifen. (Dieses Video erklärt das Server-Client-Modell ganz gut.) Hier muss auch beachtet werden, dass keine direkte Verbindung, also keine Kabelverbindung zwischen unserem Laptop und dem Arduino besteht. Der Arduino ist ja auf dem Gestell im Raum unterwegs. Das heißt die Datenübermittlung muss kabellos und in dem Fall über Bluetooth geschehen. Dafür greift der Server statt auf einen normalen seriellen Port auf einen Bluetooth-Port zu. Damit die Daten auch über Bluetooth nicht nur verschickt, sondern auch empfangen werden können, haben wir an unseren Arduino ein HC-05 Bluetooth-Modul angeschlossen.

Abbildung 10: HC-05 Bluetooth-Modul

Erstellen eines lokalen Servers

Den lokalen Server haben wir mit Hilfe dieses Wikiartikels erstellt. Das erstellen eines Servers kann in unterschiedlichen Programmiersprachen geschehen, wir haben mit Javascript und Node.js gearbeitet. Hier ist gut erklärt, was Node ist.

Bluetooth-Verbindung testen

Als nächstes testen wir, ob die Datenübermittlung über Bluetooth funktioniert. Das machen wir mit Hilfe unseres Smartphones und der Bluetooth Terminal App, welche kostenlos zum Download zur Verfügung steht. Über die App können wir uns mit dem Bluetooth-Modul verbinden. Man muss aber beachten, dass ein PIN beim ersten Koppeln nötig ist (meistens 1234). Der ausgewählte Datentyp in der App ist ASCII und keine der möglichen Endungen für die geschickten Daten sind ausgewählt. Zum Testen haben wir das im Wikiartikel bereitgestellte Codebeispiel genutzt. Die Daten wurden versendet und auf dem seriellen Monitor in der Arduino IDE ausgegeben.

Ein Denkfehler hier war, dass in der IDE nicht der gleiche Port ausgewählt werden darf, wie der der mit dem Modul über Bluetooth verbunden ist. Es muss der serielle Port ausgewählt sein, an den der Arduino am Computer angeschlossen ist.

LC-Display

Wir haben auch mit einem Liquid Crystal Display gearbeitet. (Hier ist die genaue Funktion eines LCD's beschrieben.) Der Gedanke ist, den LC-Display an den Arduino anzuschließen, um den übermittelten Abstandswert anzeigen zu können, da dieses wie im Test der Verbindung nicht mehr über den Computerbildschirm geschehen kann. Um einen LCD nutzen zu können, muss die Bibliothek LiquidCrystal_l2C eingebunden sein. Die Anzeige hat funktioniert mit einfachen Code Beispielen, aber wir konnten leider noch nicht die Funktion in der endgültigen Schaltung testen.

Sprachausgabe über Emic2

Wir haben es geschafft den Abstand an den Arduino zu übermitteln. Jetzt muss der Wert des Abstands bewertet werden. Also muss verglichen werden, ob der Abstand über oder unter 1,5 m groß ist. Das kann im Code mit einer einfachen if-Kontrollstruktur realisiert werden. Wenn der Abstand zu gering ist, soll eine Sprachausgabe ertönen. Dieses passiert über das Text-to-Speech-Modul Emic2. Es ist auch mit dem Arduino direkt verbunden und kann im Code geschriebenen Text zu Sprache umwandeln. Die Stimme klingt roboterhaft und wir haben uns für Englisch entschieden. Es gibt eine hilfreiche Wikiseite zu dem Thema. Momentan erfolgt die Sprachausgabe noch über mit dem Modul verbundene Kopfhörer. Eigentlich soll sie aber über einen kleinen Lautsprecher mit angeschlossener Verstärkerschaltung ausgegeben werden.

Die Warnung soll sich beispielsweise so anhören:

Video: Bespielhafte Sprachausgabe des Roboters

SoftwareSerial und HardwareSerial

Wir haben eine Schaltung in der sowohl das Emic2-Modul und das HC-05-Modul mit einem Arduino verbunden sind und diese benötigen beide einen SoftwareSerial-Port, um funktionieren zu können. Da in dieser Schaltung beide Module auf einen SoftwareSerial-Port zugreifen funktioniert sie nicht. Es ist nicht möglich, dass das Emic2-Modul an einen SoftwareSerial-Port angeschlossen ist und auch andere Bauteile über einen SoftwareSerial-Port funktionieren. (Weitere Infos zu SoftwareSerial gibt es hier.) Warum das mit dem Emic2-Modul nicht möglich ist, wissen wir noch nicht. Um dieses Problem zu umgehen, haben wir eines der beiden Module an einen HardwareSerial-Port angeschlossen. Dafür haben wir das Modul an die Pins TX und RX (oder auch D0 und D1) angeschlossen.

Leider hat auch dieser Code nicht wie gewünscht funktioniert und es gab keine Sprachausgabe. Über die Fehlerquellen sind wir uns unklar.

Nutzen von 2 Arduinos

Ein weiterer Lösungsansatz ist es die beiden Module über 2 unterschiedliche Arduinos laufen zu lassen. So ist nur ein Serial-Gerät mit dem jeweiligen Arduino verbunden. Die beiden Arduinos sind über ein Kabel an beliebigen analogen bzw. digitalen Pins miteinander verbunden. Arduino Nummer 1 ist mit dem HC-05-Modul verbunden und empfängt die Daten vom Computer, also den Abstand zwischen den Personen. Über ihn werden dann auch theoretisch die Stepper-Motoren angesteuert. An Arduino Nummer 2 ist nur das Emic2-Modul angeschlossen.

Abbildung 11: Schaltung mit 2 angeschlossenen Arduinos

Leider hat auch dieser Ansatz bis jetzt nicht funktioniert und wir arbeiten noch an einer Lösung.

Verwendete Bauteile

Eine Liste der bis jetzt verwendeten Bauteile:

  • Holzgestell
  • 3 Räder
  • 2 Stepper-Motoren mit Treibern
  • 2 Arduinos + Verbindungskabel
  • 1 Breadboard
  • isolierte Drähte
  • 1 Emic2-Modul
  • 1 HC-05 Bluetooth-Modul
  • 1 LCD
  • Widerstände
  • 1 Smartphone mit integrierter Kamera
  • 1 Laptop

Noch geplante Bauteile:

  • 1 Ultraschall-Entfernungssensor
  • 1 Lautsprecher + Verstärkerschaltung
  • 1 Akku

Ergebnis und Diskussion

Unser Roboter kann den Abstand von zwei Personen berechnen. Die Genauigkeit reicht aus, um zu überprüfen, ob die Personen Ihren Abstand einhalten.
Trotzdem gibt es einige Verbesserungsmöglichkeiten um den Abstand genauer zu berechnen. Zum einen könnte man den Abstand zwischen Kamera und den jeweiligen Personen genauer berechnen. Dazu könnte man eine Umfrage mit vielen unterschiedlichen Personen durchführen, um einen durchschnittlichen Abstand zwischen Hüfte und Schulter zu bekommen. Außerdem könnte man diesen Abstand abhängig von der Region machen, wo der Roboter eingesetzt wird, da die Menschen in asiatischen Ländern durchschnittlich kleiner sind, als z.B. Europäer.
Man könnte aber auch eine LiDAR-Scanner (z.B. IPhone 12 Pro) nutzen, welcher den Abstand zwischen Kamera und Person präzise angibt.

Die Kommunikation zwischen den einzelnen Teilaufgaben funktioniert leider noch nicht reibungslos.
Bei der aktuellen Schaltung mit 2 Arduinos an welchen jeweils ein Modul angeschlossen ist ertönt noch keine Sprachausgabe. Wir glauben der Fehler liegt an der Datenübertragung. Es werden keine Werte auf dem seriellen Monitor ausgegeben. Eine Alternative und Vereinfachung wäre, statt dem Emic2 Text-to-Speech-Modul mit einer einfachen LED zu arbeiten und so zu signalisieren, dass der Abstand zu gering ist.

Wir befinden uns vielleicht am Ende dieser Pandemie, aber sind trotzdem der Meinung, dass es noch Potential hat.
Um für mögliche zukünftige Pandemien vorbereitet zu sein und somit das Infektionsgeschehen zu beeinflussen, wäre es sinnvoll weiter an dem Roboter zu arbeiten. So kann der Roboter durch seine Abstandsüberprüfung Beamte der Polizei und des Ordnungsamtes entlasten.
Wir sind der Meinung, dass der Roboter eine gute Basis hat um von anderen Gruppen vorgesetzt zu werden. So fehlen z.B. nur wenige Schritte, um den Abstand zwischen mehr als zwei Personen auszurechen. Weitere Aufgaben, welche wir unter „Aufgaben unseres Roboters“ genannt haben, würden den Roboter noch nützlicher machen.

Zusammenfassend lässt sich sagen, das wir relativ zufrieden mit dem Endstand unseres Projekts sind.
Es ist schade, dass es am Ende an „Kleinigkeiten“ gehapert hat um das endgültige Zusammenspiel aller Teilaufgaben zu überprüfen.

Code und Rohdaten

Bite hier den geschriebenen Code einfügen und jeweils nummerieren/markieren zu welchem Abschnitt er gehört: Code

projektewise20/abstandsroboterpublic/start.txt · Zuletzt geändert: 2021/04/23 18:31 von d.golovko