LBotics.at

Soll ein Roboter oder ein autonomes System unterschiedliche Aufgaben erledigen, so können entsprechende Codesegmente zusammengefasst und diesen ein Status zugewiesen werden. Dieser Status wird in einer Integer-Variable Status festgelegt, deren Wert für die Steuerung des Programmablaufs ausschlaggebend ist.

Die Informationen der Sensoren werden dazu herangezogen um darüber zu entscheiden, welches Codesegment ausgeführt werden soll. Zur besseren Übersichtlichkeit bietet es sich an, den Programmcode innerhalb der while-Schleife in zwei Bereiche zu unterteilen: Ereignisbehandlung und Aktionen

Ereignisbehandlung

Im Bereich Ereignisbehandlung werden die Sensordaten ausgewertet und aufgrund der jeweiligen Situation der Variable Status ein Wert zugewiesen. Erreicht die Ausführung des Programmcodes den Bereich Aktionen, so wird nur das Codesegment ausgeführt, das dem aktuellen Wert der Variable Status entspricht.

Ergänzend bietet es sich an, den jeweiligen Status in dem sich der Roboter gerade befindet am Display anzuzeigen, um während der Ausführung des Programms gut nachvollziehen zu können, welches Codesegment gerade ausgeführt wird.

Bei dieser Strukturierung des Programmcodes ist gewährleistet, dass bereits beim nächsten Durchlauf der while-Schleife auf eine Veränderung der Umgebungssituation bzw. der Sensorinformationen reagiert werden kann. Voraussetzung ist natürlich, dass sich innerhalb der while-Schleife keine Codeteile (z. B. die Funktion SLEEP()) befinden, welche die Ausführung des Programmcodes anhalten!

Mit dem folgenden Programm kann ein Roboter unterschiedliche Bewegungsabläufe (gerade aus, Kurve nach rechts, ...) fahren. Zunächst wird im Bereich Ereignisbehandlung abgefragt, ob einer der Buttons am EV3 Brick gedrückt wurde. Davon ausgehend wird der Variable Status ein Wert zwischen 1 und 5 zugewiesen.

Aktionen

Im Bereich Aktionen wird dann die Variable Status auf ihren Wert hin überprüft und der, dem jeweiligen Status zugeordnete Programmcode ausgeführt.

Da die Variable Status zu Beginn den Wert 0 zugewiesen bekommt und es für diesen Status kein Codesegment im Bereich Aktionen gibt, bleibt der Roboter zunächst stehen, wenn das Programm gestartet wird und beginnt erst zu fahren, wenn einer der Buttons UP, LEFT, RIGHT oder DOWN gedrückt wurde.

Durch den Druck auf einen anderen Button kann die Ausführung des gerade aktiven Programmsegments jederzeit unterbrochen werden und somit auf einen anderen Bewegungsablauf gewechselt werden.

Beendet kann dieses Programm jederzeit mit dem Exit-Button werden.

Programmbeispiel - Ablaufsteuerung mit Buttons
#include "evclibrary.h"
int main()
{
// 1. Konfiguration
SET_OUT(OUT_A,OUT_MOTOR);
SET_OUT(OUT_B,OUT_MOTOR);
// 2. Initialisieren des Brick
EVC_INIT();
// 3. Programm - Roboter
int Status = 0;
while(NOTEXITBUTTON)
{
// Ereignisbehandlung
if (READ_BUTTON(BUTTON_UP)==1) Status = 1;
if (READ_BUTTON(BUTTON_LEFT)==1) Status = 2;
if (READ_BUTTON(BUTTON_RIGHT)==1) Status = 3;
if (READ_BUTTON(BUTTON_DOWN)==1) Status = 4;
if (READ_BUTTON(BUTTON_CENTER)==1) Status = 5;
// Aktionen
if(Status==1)
{
WRITE_OUT(OUT_A, MOTOR_POWER, 40);
WRITE_OUT(OUT_B, MOTOR_POWER, 40);
}
if(Status==2)
{
WRITE_OUT(OUT_A, MOTOR_POWER, 40);
WRITE_OUT(OUT_B, MOTOR_POWER, 10);
}
if(Status==3)
{
WRITE_OUT(OUT_A, MOTOR_POWER, 10);
WRITE_OUT(OUT_B, MOTOR_POWER, 40);
}
if(Status==4)
{
WRITE_OUT(OUT_A, MOTOR_POWER, -40);
WRITE_OUT(OUT_B, MOTOR_POWER, -40);
}
if(Status==5)
{
WRITE_OUT(OUT_A, MOTOR_STOP, MOTOR_BRAKE);
WRITE_OUT(OUT_B, MOTOR_STOP, MOTOR_BRAKE);
}
}
// 4. Programmende - Freigeben der Hardwarezugriffe
EVC_CLOSE();
return 0;
}
Erklärungen zu diesem Programmbeispiel
Zeile 10: int Status = 0;

Definition der Variable Status welcher zu Beginn der Wert 0 zugewiesen wird.

Zeile 14-18: if (READ_BUTTON(BUTTON_UP)==1) Status = 1;

Im Bereich Ereignisbehandlung wird mit den entsprechenden Funktionen ermittelt, ob einer der Buttons am EV3 Brick gedrückt wurde. Wenn ja, dann wird der Variable Status einer
der Werte zwischen 1 und 5 zugewiesen.

Zeile 20-44: if(Status==1) {... }

In den if-Abfragen im Bereich Aktionen wird überprüft, welchen Wert die Variable Status hat. Innerhalb der if-Abfragen befindet sich der Programmcode, der bei einem bestimmten
Status ausgeführt werden soll.

Programmbeispiel - Bewegungsablauf mit Kollisionsabfrage

Ein weiteres Beispiel wäre das Abfahren eines Pfades (dieses wird dem Status 1 zugeordnet), das aber jederzeit und abrupt abgebrochen werden muss, wenn ein Roboter dabei mit einem Hindernis kollidiert. Dabei würde die Information eines Kollisions-Sensors zur Festlegung eines neuen Status führen, mit dem das Abstoppen aller Motoren verbunden ist und damit der Bewegungsablauf, der in Status 1 festgelegt ist, unterbrochen werden.

Im folgenden Code-Beispiel ist dieses Grundkonzept dargestellt:

#include "evclibrary.h"
int main()
{
// 1. Konfiguration
SET_OUT(OUT_A,OUT_MOTOR);
SET_OUT(OUT_B,OUT_MOTOR);
SET_IN(IN_1,IN_EV3_TOUCH);
// 2. Initialisieren des Brick
EVC_INIT();
// 3. Programm - Roboter
int Status = 0;
while(NOTEXITBUTTON)
{
// Ereignisbehandlung
if(READ_BUTTON(BUTTON_UP)==1)
{
Status = 1;
}
if(READ_IN(IN_1)==1)
{
Status = 2;
}
// Aktionen
if(Status==1)
{
// Code fuer den Bewegungsablauf
}
if(Status==2)
{
// Code fuer die Kollision
}
}
// 4. Programmende - Freigeben der Hardwarezugriffe
EVC_CLOSE();
return 0;
}