Selbstständiges Fahren - 3. Programmlogik

Im ersten Fall soll das Fahrzeug durch eine Programmlogik im herkömmlichen Sinne gesteuert werden. Damit soll der Unterschiede zwischen programmierten und lernenden Systemen sichtbar werden. 

In einem programmierten System werden Regeln vorgegeben. Diese Regeln werden ausgewertet und führen zu einer Aktion. Unser Fahrzeug fährt nach vorne, nach rechts und nach links. Wir benötigen eine Regel die entscheidet, in welche Richtung das Fahrzeug fahren soll. Wir haben Sensoren auf der linken und der rechten Seite. Fährt das Fahrzeug zu weit rechts, dann soll es nach links lenken, fährt es zu weit links, muss nach rechts gelenkt werden. Nehmen die Sensoren auf der linken Seite weiße Pixel, d.h. weißen Untergrund wahr, dann sind wir zu weit links. Das Fahrzeug besitzt drei Sensoren auf der linken Seite. Wir lassen das Fahrzeug nach rechts lenken, wenn die ersten beiden Sensoren auf der linken Seite melden, dass das Fahrzeug von der Fahrbahn abgekommen ist. Die Geschwindigkeit steuern

  1. Regel
    Befinden sich die ersten beiden linken Sensoren über weißem Grund, dann lenke nach rechts.
  2. Regel
    Befinden sich die ersten beiden rechten Sensoren über weißem Grund, dann lenke nach links.
  3. Regel
    Die normale Geschwindigkeit ist 2 Pixel.
  4. Regel
    Führt die erste Reihe von Sensoren über schwarzen Untergrund, setze die Geschwindigkeit auf 4 Pixel.
  5. Regel
    Führen die ersten beiden Reihen von Sensoren über schwarzem Untergrund, setze die Geschwindigkeit auf 6 Pixel.
Wir lassen das Fahrzeug starten. In der ersten Kurve ist die Fahrt vorbei. Das Fahrzeug lenkt zu stark und kommt mit der rechten Seite an den Untergrund. Um den Fehler zu korrigieren, müssen wir die Regel korrigieren, damit das Fahrzeug, dass es später lenken soll. Zur Zeit lenken wir bereits, wenn die ersten beiden Sensoren von der Straße abgekommen sind. Wir ändern unsere Regel ab, dass nur gelenkt wird, wenn alle drei Sensoren auf einer Seite von der Straße abkommen.

Nach einem erneuten Versuch fährt das Fahrzeug durch die ganze Strecke. Die Umsetzung mit Hilfe von Programmlogik hat sehr gut funktioniert.

Für alle die es genauer wissen wollen werden nun die beiden benötigten Klassen aufgefüh. Zuerst die Klasse RacerProg. Diese Klasse erbt alles von der Klasse Racer, d.h. wir haben bereits unser Fahrzeug dass sich nach vorne bewegen kann, das lenken kann und Sensoren besitzt die Informationen über die Umwelt zurückliefern. Wir müssen nur eine Methode erstellen die das Setzen von Geschwindigkeit und Richtung entsprechen der Regeln durchführt. Diese Methode muss in der Schleife für die Fortbewegung (drive) eingebunden werden.


package car;

import java.util.concurrent.TimeUnit;

/**
 *
 *
 * Die Logik der Steuerung
 *
 * 1. Sind auf der linken Seite die ersten beiden Punkte weiß,

 *    dann lenke nach rechts
 * 2. Sind auf der rechten Seite die ersten beiden Punkte weiß, 

 *    dann steuer nach links
 * 3. Sind die ersten beiden Reihen schwarz, dann setze die Geschwindigkeit auf 6
 * 4. Ist  die ersten Reihe schwarz, dann setze die Geschwindigkeit auf 4
 * 5. Die normale Geschwindigkeit ist 2
 *
 * Änderung 1
 *
 * Das Fahrzeug soll nur lenken, wenn alle drei Sensoren auf 

 * einer Seite auf weißem Untergrund zeigen.
 *
 * @author Thomas Aldag
 */
public class RacerProg extends Racer {

    public RacerProg(int n) {
        super(n);
    }
    /**
     * Setzt Geschwindigkeit und Richtung entsprechend der Regeln
     *
     * 02 01 00
     * 05 04 03    +--------+
     * 08 07 06 <- |Fahrzeug|
     * 11 10 09    +--------+
     * 14 13 12

     *
     * Der Sehwert ist ein binäre Zahl aus den 15 Sensoren
     *
     * 0b111111111111111
     *
     * links vorne (14) ist die erste Stelle in der binären Zahl
     * rechts vorne (02) ist die dritte Stelle in der binären Zahl
     *
     */

    private void setSpeedDirection() {
        if (stop) return;
        getLook(); // sehwert berechnen
        direction = 0;
        // Regel  1. Sind auf der linken Seite die ersten beiden Punkte weiß,

        //           dann steuer nach rechts
        //           Die Sensoren vorne rechts werden maskiert. Sind beide
        //           Werte 0, dann ist auch das Ergebniss 0
        if ((sehwert & 0b110000000000000) == 0) right();
        // Verbesserte Regel
        //if ((sehwert & 0b111000000000000) == 0) right();
        // Regel 2. Sind auf der rechten Seite die ersten beiden Punkte weiß,

        //          dann steuer nach links
        //          Die Maskierung erfolgt auf der rechten Seite 
        //          mit Sensor 2 und 1
        if ((sehwert & 0b000000000000110) == 0) left();
        // Verbesserte Regel
        //if ((sehwert & 0b000000000000111) == 0) left();
        // Regel 5. Die Normalgeschwindigkeit ist 2
        speed = 2;
        // Regel 4. Ist  die ersten Reihe schwarz, 

        //          dann setze die Geschwindigkeit auf 4
        if ((sehwert & 0b000100100100000) == 0b000100100100000) speed = 4;
        // Regel 3: Sind die ersten beiden Reihen schwarz, 

        //          dann setze die Geschwindigkeit auf 5
        if ((sehwert & 0b110110110110110) == 0b110110110110110) speed = 6;
    }   
    /**
     * Hauptroutine, die das Fahrzeug bewegt.
     */

    public void drive() {
        if (stop) return;
        setSpeedDirection();
        super.drive();
    }   
   
}


Die Cars-Klasse muss überschrieben werden. In der CarsProg-Klasse wird als Fahrzeug ein RacerProg-Fahrzeug erstellt (initRacer) und auf die Strecke geschickt (go).


package car;

import java.io.IOException;

/**
 * Das Fahrzeug wird durch ein Programm gesteuert.
 *
 * @author Thomas Aldag
 *
 */

public class CarsProg extends Cars {
   
    public CarsProg() {
        super("Cars-Prog");
    }
    /**
     * Fahrzeuge erzeugen und zur Rennstrecke hinzufügen.

     *
     * Wir benötigen für das programmgesteuerte Fahren nur ein Fahrzeug.
     */

    public void initRacer() {
        raceCar = new RacerProg[1];
        raceCar[0] = new RacerProg(1);
        raceCar[0].setGround(ground);
        ground.setRacer(raceCar);
    }
    /**
     * Hauptprogramm
     *
     * @param args
     */

    public static void main(String[] args) {
        CarsProg c = new CarsProg();
        try {
            c.go("Strecke0.png");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}


Kommentare

Beliebte Posts