# Übung macht den Meister

Hier werden die ersten Programmierschritte mit Aseba erklärt, die man auch ohne Roboter ausprobieren kann. Falls Sie bereits den Roboter Thymio II besitzen, gibt es eine spezifisch für Thymio II geschriebene Bedienungsanleitung.

# Simulationsspiel Challenge

Aseba Challenge (rechtes Bild) ist eine simulierte Welt in welcher mit Aseba programmierte Roboter um Energie kämpfen. Diese simulierte Welt ist als Trainingspiel aufgebaut und gut für den Programmierunterricht geeignet.

Zuerst muss Aseba Challenge in Betrieb genommen werden. Falls Sie Aseba noch nicht installiert haben, folgen Sie bitte der Installationsanleitung. Sobald Challenge gestartet wurde, drücken Sie “Neuen Roboter hinzufügen”. Dann wählen Sie einen Namen für Ihren Roboter. Dabei braucht jeder Spieler in einer Gruppe einen eigenen Roboter. Sämtliche Roboter können mit einem Klick auf “Alle Roboter entfernen” gelöscht werden. Die Tasten können durch “Automatisches Verstecken” vorübergehend unsichtbar gemacht werden. Die Tasten erscheinen erst wieder, wenn der Mauspfeil in dessen Nähe ist. Die Kameraführung kann automatisch erfolgen durch einen Klick auf “Automatische Kamera” oder manuell mit folgenden Befehlen gesteuert werden:

- ctrl + linke Maustaste: rotierende Ansicht
- ctrl + shift + linke Maustaste: Zweidimensionale Ortung auf einer X/Y-Achse
- ctrl + shift + rechte Maustaste: Ortung auf der Z-Achse

Das Ziel des Spiels Challenge besteht darin, durch das Sammeln von Energie am Leben zu bleiben. Die Punkte der einzelnen Roboter werden an einer lichtdurchlässigen Anzeigetafel über dem Spielfeld angezeigt. Die Punkte vermehren sich solange ein Roboter am Leben bleibt, sobald der Roboter stirbt, werden die Punkte durch zwei geteilt. Vier blaue Energiequellen versorgen die Roboter mit Energie. Von Zeit zu Zeit verschwinden die Energiequellen in den Boden und werden auf diese Weise unsichtbar für die Roboter. Wenn eine Energiequelle vollständig augebraucht ist, verfärbt sich die Energiequelle rot und gibt keine Energie mehr an Roboter ab.

Sobald Aseba Challenge gestartet wurde, sollten Sie Aseba studio ebenfalls starten, um Ihren Roboter zu programmieren. Für jeden einzelnen Roboter muss eine Sequenz auf Studio auf irgendeinem Computer laufen. Zu Beginn, fordert Aseba studio Sie auf, mit einem Aseba Ziel zu verbinden (Bild rechts). Falls Sie Aseba Challenge öffnen, während noch ein Roboter mit Ihrem Computer verbunden ist, wird der Computer automatisch eine Verbindung mit dem Roboter herstellen. Falls Sie Challenge von einem Computer ohne angeschlossenem Roboter öffnen oder sich mehrere Roboer in der Nähe befinden, registrieren Sie sich bitte unter Gast und wählen Ihren Roboter unter port. Das lichtdurchlässige Fenster über der Arena in Challenge zeigt die verschiedenen Verbindungen zu den Robotern an.

# Eine simple Robotersteuerung

Sobald studio läuft (Bild rechts), können Sie Ihre erste Programme in das mittlere Eingabefeld schreiben. Diese Eingaben werden automatisch in Echtzeit überprüft und Fehler im Syntax werden sofort mitgeteilt. Weitere Informationen dazu erhalten Sie unter studio, welches Sie im Menu `Hilfe->Studio` finden. Zusätzlich finden Sie im Menu `Hilfe->Sprache` eine detaillierte Dokumentation der Programmiersprache Aseba.

Um einen Roboter zu programmieren, müssen Sie zuerst verstehen, wie er funktioniert. Ein Roboter interagiert mit der Umgebung in einem Kreislauf: Durch Sensoren nimmt der Roboter die Umgebung wahr und reagiert mit einigen vorinstallierten Programmen, welche verschiedene Aktivitäten auslösen können. Dadurch wird die Umgebung verändert und der Roboter nimmt die Veränderung der Umwelt mit seinen Sensoren wahr.

In Challenge können Sie einen simulierten E-puck-Roboter programmieren. Dieser Roboter hat 8 Distanzsenoren und einer nach vorne gerichteten, einfache Kamera mit 3 Pixels mit einem Öffnungswinkel von je 20° pro Pixel. Diese Werte können von Ihnen abgelesen werden und die Geschwindigkeit der Räder gesteuert werden.

original svg file, background e-puck top

Jetzt wissen Sie genug, um die erste Robotersteuerung zu programmieren. Schreiben Sie in das Textfeld in der Mitte des studio-Fensters folgendes:

    wheel_left_speed = 5
    #Rad_links_Geschwindigkeit = 5
    wheel_right_speed = -5
    #Rad_rechts_Geschwindigkeit = -5

Klicken Sie auf “Laden” und dann auf “Start”. Nun sollten Sie sehen, wie sich Ihr Roboter um einen imaginären Punkt dreht. Dieser Kode definiert nur beim Start die Geschwindigkeit der Räder des Roboters und danach löst dieser Kode nichts mehr aus. Um ein interessanteres Verhalten des Roboters zu sehen, sollte man dem Roboter erlauben, seine Umgebung wahrzunehmen. Zum Beispiel könnte man programmieren, dass der Roboter Hindernisse wahrnimmt und diesen selbstständig ausweichen kann.
Um selbstständig mit der Umwelt zu interagieren, braucht der Roboter periodische Befehle. Dies kann mit dem Befehl `onevent timer` (wenn dieses Ereignis eintritt, dann…) erreicht werden. Eine andere Möglichkeit besteht darin, den Distanzsensor so zu benützen, dass man die Geschwindigkeit der Räder auf Hindernisse abstimmen kann:

    onevent timer
    wheel_left_speed = dist[0] - 6
    wheel_right_speed = dist[0] - 6

Klicken Sie auf “Laden” und dann auf “Start”. Der Distanzsensor kann Werte zwischen 0 und 12cm annehmen. Distanzen von mehr als 12cm werden trotzdem mit einer 12 angezeigt. Der Roboter wird mit dem oben geschriebenen Programm eine Geschwindigkeit von -6 cm/s annehmen, wenn das Hindernis nahe ist, und 0 cm/s, wenn das Objekt etwa 6cm vom Roboter entfernt ist. Aus diesem Grund wird der Roboter jeweils 6 cm vor einem Hindernis zum Stillstand kommen. Falls das Hindernis weit entfernt ist, wird der Roboter mit einer Geschwindigkeit von 6 cm/s unterwegs sein.

# Eine kompliziertere Robotersteuerung

Einen sicheren Abstand vor Hindernissen zu bewahren ist gut, aber mit diesem Programm wird der Roboter nicht mehr weiterfahren. Um einen Roboter frei herumfahren zu lassen, müssen Sie verstehen, auf welche Art und Weise er sich bewegt.

Der simulierte E-puck Roboter in Challenge kann sich dank verschiedener Geschwindigkeiten auf seinen Rädern freier bewegen. Wenn beide Räder die gleiche Geschwindigkeit aufweisen, fährt der Roboter geradeaus, ansonsten wendet der Roboter. Wenn die Räder mit genau entgegengesetzte Geschwindigkeiten fahren, dreht sich der Roboter um sich selbst an einem Punkt. Industriell gefertigte Raupenantriebe funktionieren nach demselben Prinzip.

Schreiben Sie jetzt einen einfachen Kode, der es dem Roboter erlaubt, Hindernisse zu umfahren und sich sonst geradeaus fortzubewegen:

    onevent timer
    wheel_left_speed = dist[1] - 6
    wheel_right_speed = dist[6] - 6

Diese Steuerung liest die vorderen linken und rechten Distanzsensoren. Wenn kein Hindernis in der Nähe ist, senden die Distanzsensoren `dist[1]` und `dist[6]` den Wert 12. Darauf fährt der Roboter mit einer Geschwindigkeit von 6 cm/s geradeaus. Falls nun aber ein Hindernis auftaucht, reduziert sich der von den Sensoren gemeldete Wert. Wenn zum Beispiel ein Hindernis auf der linken Seite auftaucht, wird der Distanzsensor `dist[6]`, welcher nach links blickt, einen Wert von z.B. 10 senden, währen der Distanzsensor `dist[1]`, welcher nach rechts blickt, immer noch einen Wert von 12 zurückmeldet. Daher wird sich bei`wheel_right_speed` die Geschwindigkeit auf 4 cm/s reduzieren, während die Geschwindigkeit von `wheel_left_speed` konstant bei 6 cm/s bleibt. Diese Anpassung der Geschwindigkeit veranlasst den Roboter, eine Drehung nach rechts zu fahren und auf diese Weise das Hindernis zu umfahren.

# Entscheidungen treffen

Die bisher erläuterten Steuerungen verknüpfen durch mathematische Ausdrücke die Werte der Sensoren mit der Geschwindigkeit der Räder. Bislang wurden noch keine “wenn…, dann…” Entscheidungen getroffen. In gewissen Situation wäre dies aber wünschenswert, zum Beispiel, wenn der Roboter entweder geradeaus oder im Kreis fahren sollte. In diesem Fall können Sie programmieren:

    onevent timer
    var dists = dist[6] + dist[7] + dist[0] + dist[1]
    if dists < 48 then
        wheel_left_speed = 5
        wheel_right_speed = -5
    else
        wheel_left_speed = 5
        wheel_right_speed = 5
    end

Diese Steuerung zählt die Werte aller Distanzsensoren zusammen. Falls die Summe weniger als 48 ergibt, bedeutet dies, dass zumindest einer der Distanzsensoren ein Hindernis entdeckt haben muss. Falls die Summe also 48 beträgt, fährt der Roboter geradeaus weiter, ansonsten beginnt der Roboter sich um einen Punkt zu drehen.

Eine Programmiersprache enthält aber auch andere interessante Möglichkeiten, wie zum Beispiel eine `while` Schleife, die ermöglicht, denselben Kodeblock mehrmals durchzuführen, bis die Anfangsbedingung nicht mehr zutrifft. Eine weitere Möglichkeit bietet die `for` Schleife, wobei die Werte jedes Mal erneuert werden. Im Menu `Hilfe -> Sprache` findet sich eine Liste mit allen möglichen Befehlen und dazugehörigen Beispielen.

# Die Herausforderung

Spielen Sie zur Übung ein wenig mit dem Ausweichen von Hindernissen, um ein gutes Verständnis für die Sensoren zu erhalten. Experimentieren Sie mit allem Möglichen, denn der Roboter in Challenge ist nur ein Simulator und kann nicht kaputt gehen.

Sobald Sie sich sicher beim Programmieren fühlen, versuchen Sie, den Roboter so zu programmieren, dass er automatisch auf die blauen Energiequellen (0, 0, 100) (in R, G, B), zusteuert und automatisch rote Energiequellen vermeidet (100, 0, 0), während die Farbe des Hintergrundes konstant grau (50, 50, 50) bleibt.

Versuchen Sie Ihre Freunde mit der besten Roboterprogrammierung zu übertreffen. Die Farbe Ihres Roboters können Sie durch die Variablen `color_red`, `color_green` und `color_blue` verändern und so Energiequellen imitieren. Falls Ihre Mitspieler versuchen, Sie auf diese Weise hinters Licht zu führen, können Sie anhand einer Überprüfung der Energievariablen herausfinden, ob es sich um echte oder simulierte Energiequellen handelt. Wenn der Roboter blau sieht, seine Variablen sich aber nicht erhöhen, wurden Sie ausgetrickst.

Das Ziel vom Trainingsspiel Aseba Challenge besteht darin, auf spielerische Weise das Programmieren von Robotern zu erlernen.

# Weiterführende Webseiten:

- Dokumentation von Aseba Studio
- Programmiersprache Aseba
- Beschreibung einiger Grundkonzepte für Aseba
- Vorgegebene Funktionen