Was ist der Plan?

Der Titel verrät fast schon alles. Was machen wir denn jetzt? Wie wollen wir vorgehen? Was werden unsere Unteraufgaben sein?

Ohne Planung läuft in der Informatik nichts! Deshalb haben wir uns ran gesetzt und überlegt was wir machen wollen.

Erst einmal müssen wir ein Konstrukt bauen, welches einen Rubics Cube bewegen kann. Gesagt, getan! Im Internet haben wir eine Bauanleitung gefunden, die uns dabei geholfen hat unsere erste Aufgabe erfolgreich zu lösen. Zu diesem Zeitpunkt waren Andrey und Meike noch meine Konkurrenten. Es stellt sich jedoch heraus, dass die beiden ein bisschen Hilfe brauchten von mir, sodass ich vorgeschlagen habe, dass wir uns fusionieren. Das war gelogen. Wir wussten wenn wir zu dritt arbeiten haben wir nicht nur weniger zutun (;)), sondern auch noch mehr kombinierte Gehirnmasse, was uns besonders im Algorithmusteil helfen wird und auch getan hat! Jetzt hatten wir zwar zwei funktionierende Roboter, die schön aussahen aber nichts können.

Mein Teil war es den Roboter so zu kontrollieren, dass er den Würfel wie gewünscht dreht. Dazu habe ich genau zwei Klassen angelegt.

  1. Sensormovements
  2. Movement

Sensormovements:

Diese Klasse lässt mich drei Motoren kontrollieren:

Der Motor, der…

  • …den Korb dreht in dem der Würfel ist (hier: Motor B)
  • …den Dreher dreht, welcher wiederum den Würfel umdreht (hier: Motor C)
  • …den Farbenerkenner dreht, welcher die Farben auf dem Würfel scannt und verarbeitet (hier: Motor A)

Um einen Motor zu drehen braucht mal folgenden Quellcode (hier am Beispiel des Motor A’s um 70°):

Motor.A.rotate(70);

Da wir aber nicht immer Motor A und besonders nicht immer um 70° drehen wollen habe ich folgende Methode implementiert:

public void right(int grad) {
Motor.A.rotate((270 * grad) / 90);
Delay.msDelay(100);
}

Diese Methode erwartet eine Gradanzahl als Ganzzahl int und berechnet die Zahl so, dass die Basis sich genau um die Gradanzahl dreht. Netterweise wartet das Programm nach dem Kommando noch 100 Millisekunden um Fehler zu vermeiden.
Um den Würfel weiter zu drehen ist die Methode etwas komplizierter gestaltet:

public void next() {
Motor.C.setSpeed(150);
Motor.C.rotate(225);
Delay.msDelay(100);
Motor.C.rotate(-225);
Delay.msDelay(100);
}

setSpeed() setzt die Geschwindigkeit des Motors runter um Fehler zu vermeiden.

Mit diesen und weiteren Methoden kommen wir auch schon zur Klasse Movements:

Wichtig ist hierbei die Bewegungen eines Würfels zu verstehen. Ein Würfel kann in 12 Richtungen gedreht werden (Sechs davon sind nur „inverted (hier abgekürzt mit i)“ Bewegungen, die nur in die andere Richtung gehen als ihr Vorgänger).

Hier mal ein kleines Bild, welches alle Bewegungen gut erklärt:
Rubicscube Bewegungen

Diese 12 Richtungen habe ich dann implementiert. Beispiel:
public void u() {
t.next();
t.next();
t.rLeft(90);
t.next();
t.next();
}

 

Mit diesen zwei Klassen haben wir jetzt die Möglichkeit gezielte Bewegungen auszuführen und haben damit eine Grundlage geschaffen auf die wir dann den Algorithmus aufbauen können um den Cube zu lösen.

(Um uns im Blog nicht zu wiederholen ist der Algorithmus bei Meike im Blog zu finden. [HIER klicken])