Die Dokumentation wurde auf die gegebenen Hinweise reagierend noch einmal ergänzt und ist jetzt mit ihren ausgezeichneten Abbildungen und detaillierten Herleitungen vorbildlich.
Ausgezeichnet
Umfang und Inhalt schon sehr gut!
Insbesondere gefällt uns, dass ihr eure Berechnungen mit Formeln belegt, die allerdings auch direkt in Latex Syntax ($a=\frac{b}{c}$) ins Wiki geschrieben werden könnten, um die Lesbarkeit zu verbessern.
Die Herleitung der Messung der Phasenverschiebung könnte noch etwas mehr mit Text und/oder einer Zeichnung erklärt werden.
Die Navigation kommt im Text noch etwas zu kurz.
Ein Projekt von André Bertholdt, Lisa Heimburger, Julia Henkel, Tobias Rieper und Anne Wulfhorst.
Der Roboter „findoBot“ ortet ein Handy auf dem Boden im Raum, nimmt es auf und bringt es zum Ausgangspunkt zurück. Dazu empfängt findobot ein vom Handy ausgesendetes Audiosignal und bewegt sich durch dessen Analyse in Richtung des Handy. Der Roboter bringt das Handy über denselben Weg zum Startpunkt zurück. Er bewegt sich mit elektromotorbetriebenen Rädern und die Energie dafür sowie auch für den Mikrochip wird von einem Akku bereitgestellt.
Ziele
Erwartete Herausforderungen
Planung
Die Gruppe wurde in zwei Teams eingeteilt, von denen sich eines mit der Konstruktion sowie Motorisierung des Roboters und eines mit der Signalverarbeitung des Audiosignals beschäftigte. In den ersten Arbeitsstunden wurde Recherchearbeit im Internet geleistet, um passende Technik und Codes für die Problemlösung zu finden, ebenso standen die Tutoren beratend bei und gaben technische Empfehlungen. Von den Tutoren kam z.B. der Tipp, dass man die Audiosignale mit Hilfe der Fourier-Transformation verarbeiten kann, um entsprechende Informationen zur Identifikation und für die Ortung des Signals zu bekommen. Ebenso wurde der Teensy-Chip empfohlen, da dieser eine stärkere Rechenleistung als der Arduino aufweist. Bei der Konstruktion des Roboters wurden teilweise Roboter aus den vergangenen Jahren zur Planungsorientierung benutzt. Die gesamten technischen Bestandteile wurden aus dem Bestand des Robotiklabors bezogen.
verwendete Bauteile
Bauteil | Anzahl |
---|---|
Steppermotor (Polulu) | 2 |
Stepper Motorteiber (Polulu A4988) | 2 |
Rad (d = 9 cm) | 2 |
Stützrad | 1 |
Mikrofon | 3 |
Spannungsregulator (LM-2940) | 1 |
Kondensator (100 μF) | 4 |
Teensy 3.1 (Microcontroller) | 1 |
Akku 8 V | 1 |
Breadboard | 2 |
Zusammenbau
Das Roboter-Grundgerüst besteht aus einer kreisrunden Holzplatte auf deren Unterseite die zwei Steppermotoren, die zwei Räder, das Stützrad und die zwei hölzernen Schiebeleisten befestigt sind. Die Steppermotoren wurden mit Kabelbindern befestigt, das Stützrad und die Leisten mit Schrauben. Steppermotoren sind Elektromotoren, die sich sehr präzise auch um kleine Schritte (steps) bzw. Winkel drehen können, d.h. eine ganze Umdrehung ist in eine modellabhängige Anzahl von steps eingeteilt, durch die man die Räder beliebig genau steuern kann. Durch die zwei seitlichen Räder und das hintere Stützrad ist es möglich, dass findobot sich auf der Stelle drehen kann indem sich beide Räder im oder gegen den Uhrzeigersinn drehen, dadurch ist eine einfache Berechnung des Drehwinkels möglich, wie im nächsten Abschnitt beschrieben wird. Auf der Oberseite der Platte befinden sich die Breadboards inklusive Mikrochips, der Akku und die Mikrofonhalterung mit den 3 Mikros; hier ist alles mit flexiblen Klettklebern befestigt. Die Abstände der Mikrofone wurden so gewählt, dass eine optimale Aufnahme und Analyse der Schallwellen gewährleistet ist.
findoBOT von oben:
findoBOT von unten:
findoBOT von vorne:
Pinbelegungstabelle
Bauteil | Signalfunktion | Pinnummer |
---|---|---|
Stepper Motortreiber links | Step | 23 |
Direction | 22 | |
Stepper Motortreiber rechts | Step | 2 |
Direction | 3 | |
Mikrofon links | Signal Output | 15 |
Mikrofon vorne | Signal Output | 14 |
Mikrofon rechts | Signal Output | 16 |
Signalverarbeitung
Das Prinzip der Phasenverschiebung ist das folgende:
$ \Delta s= \Delta s1 - \Delta s2 $
$ \alpha = arccos(\frac{\Delta s}{d}) $
$ \varphi = 90° - \alpha $
$ \Delta ac = proj_{\vec{c} \rightarrow \vec{a}} $
$ \Delta ab = proj_{\vec{b} \rightarrow \vec{a}} $
$ proj_{\vec{b} \rightarrow \vec{a}} |\vec{a}| = proj_{\vec{a} \rightarrow \vec{b}} |\vec{b}| $
$ \leftrightarrow proj_{\vec{a} \rightarrow \vec{b}} = proj_{\vec{b} \rightarrow \vec{a}} \frac{|\vec{a}|}{|\vec{b}|} $
analog: $ \qquad proj_{\vec{a} \rightarrow \vec{c}} = proj_{\vec{c} \rightarrow \vec{a}} \frac{|\vec{a}|}{|\vec{c}|} $
$ tan(\gamma) = \frac{proj_{\vec{a} \rightarrow \vec{b}}}{proj_{\vec{a} \rightarrow \vec{c}}} = \frac{\Delta ab \frac{|\vec{a}|}{|\vec{b}|}}{\Delta ac \frac{|\vec{a}|}{|\vec{c}|}} $
$ |\vec{b}| = |\vec{c}| \leftrightarrow \gamma = arctan(\frac{\Delta ab}{\Delta ac}) $
Der Winkel bei einem Versuchsaufbau mit zwei Mikros leitet sich wie folgt her:
$ sin(x+y)=sin(x)cos(\varphi)+cos(x)sin(\varphi) $
$ \int_{0}^{2\pi} sin(x)sin(x+y)dx $ Skalarprodukt aus Messwerten und Vergleichswerten
$ =\int_{0}^{2\pi} sin^2(x)cos(\varphi)+sin(x)con(x)sin(\varphi)dx $
$ =\pi cos(\varphi) \rightarrow $ Sinusskalarprodukt
$ \int_{0}^{2\pi} cos(x)sin(x+y) dx $
$ =\int_{0}^{2\pi} sin(x)cos(\varphi)+cos^2(x)sin(\varphi)dx $
$ =\pi sin(\varphi) \rightarrow $ Cosinusskalarprodukt
$ \rightarrow \frac{sp_1}{sp_2}=\frac{\pi sin(\varphi)}{\pi cos(\varphi)}=tan(\varphi) $
$ \rightarrow \varphi =arctan2(\frac{cosSP}{sinSP}) $
Bei der Winkelmessung in der Praxis stellten wir leider erst sehr spät fest, dass der Roboter selbst mit seinen Versuchsaufbauten das Messsignal beeinflusste. Das lässt sich deutlich in den durch ein Oszilloskop dargestellten Daten mit möglichst freier Umgebung (erste Abb.) bzw. mit einem Blatt hinter dem rechten Mikroskop (pink). Der Schall kam hierbei von links und wurde damit vom Blatt reflektiert, d. h. die Phasenverschiebung ist verfälscht, weil der Schall länger braucht, bis er vom Mikro eingefangen wird.
Aus diesem Grund mussten wir die Mikros vorlagern vor den Fibo, um Beeinträchtigungen durch die Aufbauten des Roboters zu minimieren.
Bewegung
Die Codes für die Bewegungsprogrammierung werden mit Arduinosoftware in einer vereinfachten Form von C++ geschrieben. Es wird bei diesem Projekt zwar ein „Teensy“-Mikrocontroller verwendet, jedoch ist die Programmierung der Arduinosoftware damit kompatibel.
Damit der Roboter aus dem durch die Signalverarbeitung erhaltenen Lagewinkel eine Drehung in Richtung Handy vornehmen kann, muss dem Roboter mitgeteilt werden, wieviele steps die Räder machen müssen, um den Roboter um einen bestimmten Winkel auf der Stelle zu drehen. Dazu muss bekannt sein, aus wievielen steps eine Radumdrehung bzw. aus wievielen steps eine Roboterumdrehung besteht.
Der von den Mikrofonen ermittelte Winkel, indem das Handy zum Roboter liegt, ist leider nicht exakt genug, um mit ihm sofort das Handy zu finden. Deshalb bewegt sich der Roboter mit einem festen Winkel von 30° nach rechts oder links. Die Richtung, in der er sich drehen muss, ermittelt er daraus, ob der errechnete Winkel größer gleich Null (hier erfolgt eine Rechtsdrehung) oder kleiner Null (hier folgt eine Linksdrehung) ist. So kann der Roboter die grobe Richtung, in der das Handy liegt, gut finden und fährt dann meistens mit abwechselnden Rechts- und Linksdrehungen quasi geradeaus auf das Handy zu. Da sich der Roboter nicht zu Beginn bereits um einen festen Winkel dreht und dann geradeaus auf das Handy zufährt, haben kleine Mess- oder Rechenungenauigkeiten keinen negativen Einfluss und somit verfehlt der Roboter das Handy nicht. Er ermittelt den Winkel des Handys immer wieder neu und kann es auch noch finden, wenn es den ursprünglichen Platz verlässt und an einem neuen Ort gefunden werden muss.
Damit der findobot auch den Rückweg finden kann, wird jede ausgeführte Bewegung als Zahl in einem Array gespeichert. Um Arbeit zu sparen, wird immer die Zahl für das Gegenteil der gerade ausgeführten Bewegung gespeichert. Sobald der Roboter das Handy dann gefunden hat, kann das Array rückwärts aufgerufen werden. Dadurch fährt der findobot genau den Weg zurück, auf dem er zum Handy gefunden hat und kommt zu seinem Ausgangspunkt zurück. Dies kann der findobot mit dem von den Mirkofonen errechenten Winkeln leider noch nicht, da wir bisher kein aussagekräftiges und immer zutreffendes Kriterium gefunden haben, was eindeutig zeigt, dass das Handy gefunden wurde.
Präsentation im Wisschenschaftsfenster
Im Rahmen des Wissenschaftsfensters wurden alle fortgeschrittenen Forschungsergebnisse der MINTgrün-Labore präsentiert. Auch der findoBOT wurde vorgestellt. Die PowerPoint-Präsentation als Download: findobot.pptx
Aktueller Stand
Der findoBOT kann eine Audioquelle auf einer Frequenz von 440Hz eindeutig erkennen, sich in Richtung dieser ausrichten und dorthin fahren. Da die Problematik mit den Mikrofonen erst spät gelöst werden konnte, wurde parallel bereits ein erweitertes Programm geschrieben, dass mit Zufallszahlen diesen Prozess simuliert und anschließend zum Ausgangspunkt zurückfahren kann (er könnte ein Handy einsammeln und zum Besitzer zurückfahren). Da dieses aber noch angepasst werden müsste, gibt es im Anhang zwei Programme. Das andere erfüllt den bereits genannten Zweck, findet aber noch nicht zurück und bewegt sich noch sehr unelegant.
Zielerreichung
Das selbst gesetzte Ziel wurde hinreichend erfüllt. Die Hinderniserkennung und -Umfahrung wird vermutlich nicht mehr im Zeitraum fertiggestellt werden können, dafür aber eine Zusammenführung der bisher zwei Programme zu einem.
Probleme
Große Probleme haben die korrekte Auswertung der Mikrofondaten bereitet, sowie die mutmaßlich falschen Zahlen zur Anzahl der Schritte einer vollen Umdrehung der Räder, die daraufhin nochmal selbst ermittelt werden mussten. Weitere gelöste Schwierigkeiten waren eine effiziente Sammlung der vom findoBOT erzeugten Daten, mit welchen man den Roboter letztendlich zu seinem ursprünglichen Stadort zurückschicken konnte, sowie eine clevere Umgehensweise mit der Geschwindigkeit, sodass der findoBOT nicht beim Losfahren stockte, er aber auch nicht die gesamte Zeit über zu langsam fuhr.
Unser kommentierter Quellcode zum Download: fibo_quellcode.zip