-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Von Jan-Luca D. und Finn G.
In unserem Projekt geht es um einen Roboter der mit Hilfe einer Benutzeroberfläche auf einem Computer durch den Raum geleitet wird. Der Roboter weiß anfangs nicht wie groß der Raum ist und geht von einem unendlich großen leeren Raum aus. Der Benutzer kann in der Oberfläche den aktuell bekannten Raum sehen und durch aussuchen eines Ziels den Roboter an bestimmt stellen im Raum leiten. Während des Fahrens erkundet der Roboter den Raum und meldet über Bluetooth alle Hindernisse die den Weg blockieren. Somit entsteht mit der Zeit ein immer genaueres Bild vom gesamten Raum. Der Raum wird in 30 x 30 cm großen Quadraten dargestellt. Jedes Quadrat hat 2 Zustände: Frei und belegt (Wand). Um den schnellsten Weg um alle Wände durch den Raum zu finde nutzen wir den Suchalgorithmus A*.
Das Projekt kann für die Navigation im Auto genutzt werden. Aktuell gibt es sehr viele Experimente mit autonomen Autos, die vollständig computergesteuert fahren sollen. Wir versuchen dies auch in einem kleinen Maßstab mit dem ev3, aber unser Projekt ist nur ein Modell und kann mit unseren Mitteln nicht die nötige Genauigkeit für die Realität bieten.
- Der Benutzer markiert ein Ziel für den EV3.
- Der A* Algorithmus sucht den schnellsten Weg zum markierten Ziel.
- Falls der Pfad möglich ist sendet der PC ihn an den EV3. Ansonsten informiert er den Benutzer.
- Der EV3 teilt den Pfad in die einzelnen Kommandos auf.
- Der EV3 führ die Kommandos alle nacheinander aus und informiert den PC über die aktuelle Position und Orientierung.
- Falls ein Kommando aufgrund eines Hindernisses nicht ausgeführt werden kann, sendet der EV3 das Hindernis an den PC.
- Der PC trägt das Hindernis ein und startet bei Punkt 2 neu.
Je nachdem wie voll der Akku ist oder was es für einen Untergrund gibt kann es sein, dass der Roboter sich unterschiedlich verhält. Dieses Problem haben wir auf eine recht simple Art und Weise gelöst. Wir haben unter dem Punkt EV3 in der Menüleiste der Benutzeroberfläche alle EV3 Einstellungen aufgelistet. Derzeit sind es nur 2 Punkte um das vorwärts Fahren und den Distanzsensor zu Kalibrieren. Um die Kalibrierung auszuführen, wählen sie einfach den richtigen Unterpunkt aus und verschieben sie die Schieberegler so lange bis Sie das gewünschte Ergebnis haben.
Beim Kalibrieren des vorwärts Fahren müssen sie die Geschwindigkeit des rechten und linken Motors einstellen und die Zeit wie lange der Roboter fahren soll. Um die aktuellen Einstellungen zu testen klicken sie einfach auf den „Try“ Button. Machen sie dies solange, bis der Roboter exakt 30 cm nach vorne fährt.
Um den Distanzsensor zu testen müssen Sie einfach den Wert des Distanzsensors bei einer Entfernung von 45 cm von der Achse des Roboter in der Kommandozeile ablesen und mit einer kleinen Toleranz am Schieberegler einstellen. Der eingestellte Wert definiert ab welcher Distanz der Roboter ein Hindernis sieht.
In diesem Bild sieht man die Komplette Programmstruktur (9-axis Sensor und MPU9250.py werden sich wahrscheinlich noch ändern). Hier kann man sehr gut erkennen, dass sich unser Projekt gut in drei Teile trennen lässt: „EV3“, „Communication“ und „Remote“. Die einzelnen Bereiche werden in getrennten Abschnitten genauer beschrieben. Zusätzlich sieht man in der Grafik noch alle Dateien die Teil unseres Projektes sind. Nur die globalen Dateien sind im Bild nicht vorhanden.
Die Benutzeroberfläche stellen wir mit Hilfe von PyQt da. PyQt ist eine umfangreiche Python Graphik Bibliothek.
Im folgenden Bild sehen Sie ein Screenshot von der Benutzeroberfläche:
In diesem Screenshot sehen Sie 3 Widgets: Raum (Links), 3D Roboter (Rechts oben) und die Kommandozeile (Rechts unten)
In dem Raum Widget wird der aktuell bekannte Raum dargestellt. Dieser Raum wird in einem zweidimensionalem Array dargestellt und besteht aus beliebig vielen Quadraten. Jedes Quadrat kann in einer von 7 verschiedenen Farben dargestellt werden, welche alle eine unterschiedliche Bedeutung haben.
Alle Bedeutungen der Farben: Gelb: Aktuelle Position des Roboters; Blau: Der Pfad, den der Roboter gerade Fährt; Hellblau: Der Pfad, der genommen wird wenn man die Endposition auswählt; Weiß: Hindernisse; Grau: Boden; Grün: Quadrate die als nächstes vom A* Algorithmus genommen werden könnten; Rot: Quadrate die mit dem A* Algorithmus nicht zum Ziel geführt haben. Zusätzlich gibt es immer ein rotes Dreieck auf dem gelben Quadrat, was die Orientierung der Roboters anzeigt.
Das Raum Widget hat einige Funktionen. Durch einen einfachen Links klick, wählt man den hellblau vorgeschlagenen Pfad aus und wenn man während eines Linksklick die Maus bewegt, kann man die Karte des Raumes bewegen. Zusätzlich gibt es die Möglichkeit rein und raus zu zoomen. Ein rechtsklick öffnet ein Kontextmenü mit weitern Möglichkeiten. Dort kann man den kompletten Raum zurücksetzen, Start- und Endposition des Pfades setzen und den aktuell ausgeführten Pfad stoppen.
Im der Menüleiste gibt es unter dem Punkt „Room“ noch ein paar Einstellmöglichkeiten. Man kann die „Sets“ aktivieren und deaktivieren (Sets zeigen spezielle Quadrate von A* an), den „Floor“ aktivieren und deaktivieren (Um Performance zu sparen) und man kann den „Preview path“ ausblenden (Das ist der Path der hellblau als Vorschau angezeigt wird), falls man Rechenleistung sparen muss, ausblenden.
Dieses Widget dient vor allem zur Überschicht der vom Roboter wahrgenommenen Werte. Hier kann man schnell erkennen ob der Roboter das Umfeld falsch wahrnimmt, oder ob es Fehler im Programm sind (Also mehr für Debugging). In der Grafik werden alle sensorwerte dargestellt: Der Farbsensor erscheint in der Farbe des Untergrunds, der Distanzsensor hat eine Farbverlauf von Rot bis Grün (Rot = kleiner Abstand, Grün = großer Abstand) und der Tastsensor wird Rot wenn er aktiviert wird. Und der ganze Roboter wird auch immer mit der Rotation, die vom Gyrosensor zurückgegeben wird, angezeigt.
Die Kommandozeile dient vor allem zum Debuggen. In der Kommandozeile wird die Komplette Bluetooth Kommunikation angezeigt. Wie genau diese Befehle aufgebaut sind wird im Abschnitt „Kommunikation“ genauer beschrieben. Hier gibt es auch die Möglichkeit eigene Befehle zu schreiben und zu senden. Ein Kommando kann in 3 verschiedenen Farben dargestellt werden: Rot: empfangen; Grün: zum ev3 gesendet und Schwarz: selbst geschrieben.
Um in der Kommandozeile bei sehr vielen Nachrichten noch den Überblick zu behalten haben wir 3 Filterfunktionen eingebaut. Dies können Sie in der Menüleiste unter dem Punkt „Command line“ finden. Dort kannst du entweder alle gesendeten und oder alle empfangenen Nachrichten ausblenden. Zusätzlich gibt es einen etwas feineren Filter, mit dem Sie einzelne Channels ausfiltern können. Dazu klicken sie einfach auf den Menüpunkt „Manage channel filter“ und geben sie oben links im Eingabefeld den gewünschten Channel ein. Dann können sie ihn mit „Add“ einfach hinzufügen. Um ein filter wieder zu entfernen selektieren sie ihn und klicken die „Delete“. Abschließend müssen sie den Dialog mit „Ok“ beenden und alle neuen Nachrichten mit dem angegebenen Filter werden nicht mehr angezeigt.
Falls ihnen zu viele Nachrichten in der Kommandozeile sind können sie diese mit dem Befehl „clear“ einfach wieder leeren.
Um in unserem Projekt zwischen dem EV3 und dem PC kommunizieren zu können nutzen wir Bluetooth. Über Bluetooth senden wir alle Befehle an den EV3 und erhalten die jeweiligen Antworten dafür. Bei uns ist der EV3 der Server und muss daher immer gestartet damit sich der PC verbinden kann. Hat sich der PC einmal erfolgreich zum EV3 verbunden merkt er sich die MAC Adresse in der Text Datei „.mac.txt“ und versucht beim nächsten sich wieder zu dieser Adresse zu Verbinden.
Eine Nachricht hat immer dasselbe Format: „KANAL: WERT“. Eine Überschicht über alle Kanäle mit den jeweiligen Werten sehen sie in der folgenden Tabelle:
Kanal | Wert vom PC | Wert vom EV3 |
---|---|---|
touchSensor | Wert | |
distanceSensor | Wert | |
infraredSensor | Wert | |
ultraSensor | Wert alue | |
colorSensor | 'rgb' oder 'color' | rgbWert or Farbname |
accel | WertX:WertY:WertZ | |
gyrol | WertX:WertY:WertZ | |
mag | WertX:WertY:WertZ | |
wall | x:y | |
path | 'stop' or 'turn:1|forward:1|...' | 'Success' / 'failed' / 'error' / 'stopped' |
current | x:y:orientierung | x:y:orientierung |
screen | x:y|x:y|... | Success |
motorR | time:speed | ECHO |
motorL | time:speed | ECHO |
calibrateForward | time:speedLeft:speedRight | Success |
calibrateLeft | time:speedLeft:speedRight | Success |
calibrateRight | time:speedLeft:speedRight | Success |
calibrateDistance | Distanz | Success |
Um die Verbindung zwischen den beiden Geräten herzustellen müssen beide Geräte miteinander Gekoppelt sein und auf dem EV3 die Option „visible“ in „All Network Connections“ / „Bluetooth“ aktiviert sein. Wenn das alles der Fall ist und der Server auf dem EV3 gestartet ist (Die Datei „runNavigator.sh“ in home starten) kann man die Benutzeroberfläche starten. In der Statuszeile sieht man „Connecting…“ bis der PC sich zum EV3 verbunden hat (Dies kann eine Weile dauern). Ist das Programm schon gestartet, kann man sich auch unter dem Punkt „Bluetooth“ / „Connect“ verbinden.
Die Arbeitsaufteilung ist in unserem Projekt sehr flexibel und ist nur Insgesamt gesehen. Jan-Luca D. kümmert sich um den Algorithmus und Finn G. sich um die Benutzeroberfläche. Um die Kommunikation und den EV3 kümmern wir uns beide. Es kann aber trotzdem sein, dass der eine auch beim Anderem geholfen hat Fehler zu fixen.
In der Projektbeschreibung beschreibt Jan-Luca D. den Algorithmus und Finn G. erklärt die Abläufe des Robters, z.B. wie der EV3 den Pfad ausführt oder wie er Hindernisse erkennt.
Dieses Projekt wurde von Jan-Luca D. und Finn G erstellt.