Sortieren mit Bubblesort (EV3)

Aus Informatik
Wechseln zu: Navigation, Suche

Ziel

Der Roboter muss von alleine eine Reihe von farbigen Elementen sortieren. Dies geschieht auf Grundlage eines Programms unter Zuhilfenahme des Sortieralgorithmus Bubblesort. Der EV3 bewegt sich entlang einer Bahn und vergleicht (vertauscht gegebenenfalls) die Elemente. Am Ende des Programms liegen alle Elemente sortiert vor. Es soll nach der Helligkeit (hell -> dunkel) sortiert werden.


Genauerer Aufbau


- Ich muss einen Roboter bauen, der sich auf einer vorgegebenen Bahn bewegt.

-Bahn: Die Bahn besteht aus einer festen, stehenden Holzplatte, auf welcher eine Schiene platziert ist. Die Schiene führt das Rad des EV3. Auf der Bahn befinden sich die Stellen, auf denen die Elemente liegen, welche sortiert werden sollen. Diese sind abgeklebt, damit die Elemente immer an der gleichen Stelle stehen.

- Die Elemente müssen unterschiedliche Farben haben, die der Roboter per Farbsensor erkennt und mit dem nächsten Element vergleicht.

- Der Roboter läuft die Strecke mit den Elementen von vorne nach hinten ab, beginnt beim ersten und vergleicht mit dem zweiten…… (siehe Bubblesort)


Elemente

-Die Elemente müssen unterschiedliche Farben haben -> Dies ist gelöst durch die Lackierung mit Grautönen (5 Farbstufen [Weiß/Hellgrau/Grau/Dunkelgrau/Schwarz]).

-Quaderförmige Holzelemente mit Farben -> Quaderförmig und Einfräßungen an den Seiten zum optimierten Greifen.

-In verschiedenen nebeneinander liegenden Fächern -> Sind durch Isolierband eingezeichnet (siehe Bild im Abschnitt "Genauerer Aufbau").

-Die Unterseite musste am Ende glatt sein, damit die Elemente geschoben werden können (Zeitersparnis). Des Weiteren muss auch die Oberfläche (wie im ersten Bild erkennbar) des Elements glatt sein, um keine Fehler beim Scannen des Farbtons zu bekommen.


Bubblesort

Bubblesort

Bubblesort funktioniert wie folgt: Beim Bubblesort werden zwei benachbarte Elemente verglichen. Das größere Element (je nach Einstellung) wird bei falscher Reihenfolge mit dem niedrigeren Element getauscht. So geht der Algorithmus alle Stellen bis zum Ende der Liste ab und das letzte Element ist dadurch fertig sortiert (ist das größte Element). Danach ist die Liste der Elemente sozusagen um eins kleiner geworden und nun wird diese 'Restliste' sortiert.

siehe: Bubblesort



Grundbau

Grundbau Fahrgestell
Rad und Schiene

Roboter:

-Braucht Programm ... siehe Abschnitt->Programm

-Der Roboter braucht ein stabiles Grundgerüst, damit er nicht umkippt oder die falsche Richtung durch falsche Belastung eingeschlagen wird.

-Der Roboter braucht zwei Greifer, welche weit genug vom Fahrzeug wegreichen, um die Greifer öffnen zu können und die Elemente nicht (mit dem Fahrgestell) zu berühren.

-Der erste Greifer (nachfolgend als Greifer bezeichnet) muss stabil, präzise und auf der richtigen Höhe am Fahrgestell angebracht werden. Passt auch nur eine Sache nicht, so könnte und konnte der Roboter die Elemente aus ihrer Bahn schieben und dadurch einen Fehler auslösen.

-Der zweite Greifer (nachfolgend als Heber bezeichnet) sollte sowohl stabil, als auch gut beweglich angebracht werden. Dies folgt daraus, dass der Heber starr sein muss, damit er wie der Greifer keine Elemente fehlerhaft verschiebt. Des Weiteren muss dieser (Heber) jedoch beweglich sein, um ihn hochheben zu können. Dies funktioniert über eine stabile Konstruktion, die fast ausschließlich über zwei nicht haftende(leicht drehbare) Steckverbindungen mit dem Fahrgestell verbunden ist. Darüber hinaus ist der Heber über die Halterung des "Drehhebers" stabilisiert, welcher fest mit dem Fahrgestell verbunden wurde.

-Am Greifer ist der Farbscanner angebracht, da dieser immer als erster über die Elemente fährt und dadurch einen minimalen Abstand einhalten kann. Diese Nähe muss eingehalten werden, damit die gemessenen Farbwerte nicht zu stark variieren, beziehungsweise überhaupt gemessen werden können.

-Zwei Greifer sind notwendig, da immer mindestens ein Element gehoben werden soll und um die Zeit, welche der EV3 braucht, relativ gering zu halten.

-Der Roboter muss relativ präzise fahren; Schienen kommen wegen der Länge nicht in Frage, jedoch aber Reifen. Diese hinterließen aber aufgrund des Gewichtes des EV3 einen nicht behebbaren Fahrfehler. Dieser konnte durch eine Art Plastikschiene behoben werden, welche die Felge des Vorderrades führt.






Programm

-Farberkennung des ersten Elements merken

-Farberkennung des zweiten Elements und diese mit der des ersten Elements vergleichen

-falls richtig: das "zweite" merken und mit dem dritten vergleichen, usw. ...

-falls die Reihenfolge falsch ist, dann:

->nehme das letzte gemessene Element (nächstes) mit dem Heber hoch und fahre zurück zu dem vorherigen Element (erstes)
->ziehe "erstes" mit dem Greifer durch Greifen und Fahren nach vorne und senke danach den Heber, um "nächstes" an die Stelle von "erstes" zu stellen
->nun ziehe das gegriffene Element (erstes) auf den ursprünglichen Platz von "nächstes"

Auszug aus dem wichtigsten Quellcode ist hier -> Media:Quellcode.JPG <- dargestellt


Herangehensweise beim Programmieren

- Ich habe zu Beginn ein Probe-Programm geschrieben, in welchem ich alle Motoren testete und die Geschwindigkeit herausfand.

- In meinem zweiten Programm nutzte ich das erste Mal auch das Display des EV3-Steins. Darüber hinaus stellte ich die Motoren nun auf die richtige Gradzahlen ein und versuchte optimale Abstände herauszufinden. Über einen langen Zeitraum bekam ich die optimalen Abstände der Elemente heraus und führte die Idee mit immer mehr Elementen durch. Die Elemente hinterließen oft Probleme, die ich öfters durch minimale Gradänderungen herausfiltern musste (Es handelte sich oft um nicht mehr als 1°).

Des Weiteren versuchte ich hier den richtigen Sensor-Mode herauszubekommen:

->So erfuhr ich, dass der Mode "Color-ID" absolut nicht funktionierte (bei meinen Farben).
->Beim Mode "Ambient" waren die gemessenen Werte zu nah beieinander und hätten Probleme auslösen können.
->Der Color-Mode "RED" liefert die reflektierte Lichtstärke und nutzt somit optimal das Farbspektrum aus.

- In meinem letzten endgültigen Programm kombinierte ich alle zuvor ausgetüftelten Motorbewegungen und Sensordaten. Danach baute ich den Sortieralgorithmus Bubblesort ein und passte ihn nach und nach der Aufgabe an.


Hauptprobleme

-Roboter muss sich langsam bewegen können, damit die Räder nicht durchdrehen und somit die Genauigkeit des Programms nicht darunter leidet, beziehungsweise ganz verschwindet.

-Der Bau des Greifers zeigte sich schwieriger als gedacht, da dieser stabil sein muss und eine einheitliche Greifbreite benötigt. Der Einbau von je einem mittleren Motor vereinfachte die Form und den späteren Einbau in das Gesamtkonstrukt. Es sind nur wenige Grad zwischen Greifen und Loslassen des Elements und somit sollte der Greifer nicht zu klein sein.


Stabilität

-Eines der großen Probleme war die Stabilität, welche sich aus Verbindung und Zusammenhalt der Teile und Gleichgewicht des ganzen Konstrukts ergibt:

->Die Teile mussten über mehrere Streben jeweils miteinander verbunden sein und die Greifer brauchen eine gewisse Höhe, welche über Verbindungsstreben und Halterungen gelöst wurde. 
->Die Zahnräder bei den Reifen drohten oft auseinanderzugehen, weshalb ich das Heck zusätzlich verstärkt zusammenbaute. 
->Des Weiteren steuerte ich das Gegengewicht der Greifer dadurch, dass ich die Hauptkonsole des EV3 auf der gegenüberliegenden Seite auslagerte.

Stichwort Präzision

-Gradgenaue Fortbewegung des EV3 und der Greifer
-Präzise Ablage der Elemente beim Tauschen
-Genaue Einstellung des Abstandes der Greifer und der Elemente
-Sensor-Mode RED zum genauen sicheren Messen

Probleme beim Fahren

->Exakte Positionen - lösbar durch viele Versuche und mein Probe-Programm
->Der EV3 ist nach einer bestimmten Distanz eine Kurve aufgrund des Gewichtes gefahren
   - habe ich durch die Benutzung einer Führungsschiene begradigt, da diese sowohl vorne als auch hinten führt.
->Die senkrechten Holzplatten am Ende bringen den Roboter in eine immer gleiche Startposition, was auch wieder in die Präzision einspielt.
-> Ich lasse den Roboter auf der Startposition immer eine halbe Sekunde lang warten, damit die bewegte Masse zur Ruhe kommt. - Trägheit der Masse
-> Zu Beginn hatte ich die Reifen einzeln montiert, was später zu einem Problem wurde. 
    Einer der Reifen drehte sich nach einer geringen Distanz immer weiter raus und fiel schließlich ab.  
    -Die Lösung hierfür ist eine durchgehende Stange, die so in dem Bau fixiert ist, dass sie sich nur drehen lässt, aber nicht verrutschen kann.

Greifer-Problematik

->Exakte Greifer-Drehzahl für optimalen und festen Halt am Element = Greif-Druck
->Einkerbungen der Elemente zum besseren Greifen, da Gummierung alleine als Haftung nicht reichen würde
->Greifer müssen relativ exakt die Elemente wieder ablegen - hierbei spielt der Korrektur-Grad eine Rolle und Verbindung zu den Fahr-Problemen

Farbsensorik

-Die Farbe der Elemente sollte zu Beginn durch bedrucktes Papier in Graustufen geschehen, dies war aber nicht so einfach und die ersten Versuche im Sensor-Mode COLOR-ID funktionierten nicht. Ich entschied mich daher zum Lackieren der Elemente; so bekamen diese eine glatte Oberfläche (und sahen auch noch viel besser aus  ;D ). Die glatte Oberfläche half beim genauen Erkennen der Farbe (Sensor-Mode "RED") und die glatte Unterseite beim Vertauschen der Elemente.

-Der zum Einlesen der Farben benötigte Farbsensor muss relativ nah an die Oberfläche der Elemente, damit die Farben erkannt werden. ->Diese Nähe halte ich dadurch ein, dass ich den Sensor direkt unter den Greifer platzieren kann und deshalb direkt über der Oberfläche messe.


Verlauf des Projekts

Fahrgestell mit Greifern

-01.02.2016: Beginn des Fahrgestells (Einbau des Hauptrechners erst spät, bzw. am Ende)

-08.02.2016: Vorstellung und Skizze des Greifers (Bau-Idee)

-15.02.2016: Fertigstellung des Fahrgestells + Beginn eines Greifers

- Zwei Greifer gebaut


- lange Überlegungszeit, wie man die zwei Greifer einbaut und benutzt, um die Elemente einfach zu sortieren und dabei wenig Zeit braucht:

-> erste Überlegung: ein Greifer, der sich heben lässt; Mit Hilfe von einer Lagerstelle neben der Bahn, in welche er die Elemente verschiebt. Nachher nimmt er dieses Element wieder auf und fügt das andere Element hinein und tauscht so immer weiter nach Bubblesort.

-> zweite Überlegung: zwei Greifer, wovon sich einer heben lässt und einer fest am Fahrgestell sitzt; der Heber hebt ein Element über die anderen und der Greifer schiebt das nächste Element von seiner Stelle. Danach wird das erste Element abgelegt und das andere hochgehoben und so vertauscht.

-> dritte Überlegung: zwei Greifer, die sich heben lassen; Beide Heber heben jeweils ein Element hoch (einer das erste, der andere das nächste) und vertauschen diese so.

-> vierte Überlegung: zwei Greifer, die beide fest sitzen; Funktioniert nicht. Die Greifer stehen sich im Weg, da mindestens über ein Element gehoben werden muss.


- Ich hab dann die Idee mit zwei Greifern genommen, wovon einer fest ist und der andere hochhebbar ist, damit das Sortieren mit dem zeitintensiven Sortieralgorithmus Bubblesort nicht Stunden dauert. Dies hatte den Vorteil, dass das Gegengewicht auch nicht übermäßig groß sein muss und der Hauptrechner genügt hat.

- Zuerst stockte ich das Fahrgestell auf, damit der Heber genügend Platz zum Boden hat. - Als nächstes baute ich die Verbindungsstreben zwischen Greifer und Fahrgestell.

- Danach blieb das Problem mit dem Motor, welcher aufgrund der Drehung der "Kreuzstange" unter dem "Drehheber" angebracht werden musste. Zuerst die Überlegung, ob ich dies mit einem mittleren Motor löse, jedoch wies die Schräglage des "Drehhebers" Probleme beim Drehen auf; Deshalb musste ich umbauen und entschied mich für den großen Motor, welcher aufgrund seiner Bauweise schon senkrecht drehte. -> Für den großen Motor musste ich zwar das Fahrgestell umbauen und stabilisieren, dennoch funktionierte es und die ersten Testläufe zeigten, dass es hierbei kaum Probleme für das Programm gab. - Danach befestigte ich den Heber mit dem Fahrgestell und baute eine bewegliche Verbindung zum Drehheber, damit dieser nicht verkeilt.

- Als nächstes blieb der vordere feste Greifer übrig, für welchen ich das Fahrgestell in die Länge nach vorne erweitern musste. Diesen montierte ich mit mehr oder weniger kleinen Problemen am Fahrgestell. - Die Höhenhalterung unterstützte ich mit einer Querstange, welche von dem stabilen Aufbau zu den Verbindungsstangen des Greifers lief und zog diesen auf die zum Heber parallele Höhe. - Nur die Nähe der Greifer blieb lange Zeit ein Problem, aber ich hab die Greifer dann ein kleines Stückchen auseinandergezogen. So musste ich zwar die Stabilität ausbessern, nutze die Lücke zwischen den Greifern aber um einige Fehler auszubessern.

- So habe ich in der ersten Ferienwoche alles zusammengebaut und die Greifer an ihren jeweiligen Platz befestigt, was zwar einige Probleme aufkommen lies (Siehe Abschnitt: "Probleme"), jedoch aber, wie man an der Lösung sieht, lösbar war.