Netlogo Rescue Projekt 1 - Rescue Line Entry

Du kannst nun die Netlogo Simulationsumgebung nutzen, um einen Rescue Line Entry Linienfolger zu programmieren (also ohne Kreuzungen mit grünen Markierungen).



Lösungsvorschlag links abbiegen: (Download sollte automatisch starten)
https://www.dropbox.com/s/b4bac2vzri3dncm/RescueLineEntryLinks.nlogo?dl=1

Als Pseudocode:

// frische Sensorwerte aus den Sensoren auslesen
// wenn links schwarz und rechts schwarz:
    // ein bisschen geradeaus fahren
    // 90° nach links drehen
    // weiter nach links drehen solang der linke Sensor schwarz sieht
    // nach rechts drehen solang der linke Sensor kein schwarz sieht
// wenn rechts schwarz und links nicht schwarz:
    // nach rechts zurücksetzen
// wenn links schwarz und rechts nicht schwarz:
    // nach links zurücksetzen
// wenn links nicht schwarz und rechts nicht schwarz:
    // geradeaus fahren



Lösungsvorschlag rechts abbiegen:  (Download sollte automatisch starten)
https://www.dropbox.com/s/63qtuubg8l1o42z/RescueLineEntryRechts.nlogo?dl=1

Als Pseudocode:

// frische Sensorwerte aus den Sensoren auslesen
// wenn links schwarz und rechts schwarz:
    // ein bisschen geradeaus fahren
    // 90° nach rechts drehen
    // weiter nach rechts drehen solang der rechte Sensor schwarz sieht
    // nach links drehen solang der rechte Sensor kein schwarz sieht
// wenn rechts schwarz und links nicht schwarz:
    // nach rechts zurücksetzen
// wenn links schwarz und rechts nicht schwarz:
    // nach links zurücksetzen
// wenn links nicht schwarz und rechts nicht schwarz:
    // geradeaus fahren



Beispiel-Arena:  (Download sollte automatisch starten. Oben rechts ist bei Dropbox die Download-Schaltfläche. Es kann ein bisschen dauern bis sie erscheint, weil Dropbox erstmal versucht die Datei darzustellen. Einfach warten bis sie erscheint.)
https://www.dropbox.com/s/u3kywjw548xe3dv/RescueArena.csv?dl=1

Die Lösungsvorschläge sind noch nicht perfekt. Zum Beispiel verliert der Roboter bei Lücken immer noch die Linie und versucht nicht sie wiederzufinden. Das kannst du ergänzen oder ein ganz eigenes Programm entwickeln.



Verbesserter Lösungsvorschlag links abbiegen: (Download sollte automatisch starten)

Es gibt insgesamt 4 mögliche Fälle:
  • beide Sensoren sehen schwarz
  • linker Sensor sieht schwarz und rechter Sensor nicht
  • rechter Sensor sieht schwarz und linker Sensor nicht
  • keiner der Sensoren sieht schwarz
Die beiden Lösungsvorschläge oben benutzen eine flache Hierarchie, um dies abzufragen, genau wie gerade aufgelistet - mit 4 aufeinanderfolgenden Verzweigungen:

if rblack and lblack [
  ; links abbiegen
]

if rblack and not lblack [
  ; rechts zurücksetzen
]

if lblack and not rblack [
  ; links zurücksetzen
]

if not lblack and not rblack [
  ; geradeaus
]

Man kann allerdings auch ein funktionsgleiches Programm schreiben, bei dem die Bedingungen ineinander verschachtelt sind:

ifelse lblack [
  ifelse rblack [
    ; beide schwarz --> links abbiegen
  ] [ ; else:
    ; links schwarz --> links zurücksetzen
  ]
] [ ; else:
  ifelse rblack [
    ; rechts schwarz --> rechts zurücksetzen
  ] [ ; else:
    ; keiner schwarz --> geradeaus
  ]
]

Beide Varianten verhalten sich identisch, benutzen nur einen unterschiedlichen Programmierstil.
Die verschachtelte Variante ist weniger fehleranfällig.

Nehmen wir mal an du hast bei der 2. Verzweigung vergessen hinzuzufügen "und linker Sensor sieht nicht schwarz":

if rblack and lblack [
  ; links abbiegen
]

if rblack and not lblack [
  ; rechts zurücksetzen
]

Wenn jetzt beide Sensoren schwarz sehen, wird die erste Verzweigung betreten, weil ja beide Sensoren schwarz sehen. Der Roboter biegt links ab. Danach wird allerdings auch die 2. Verzweigung betreten, weil der rechte Sensor ja immer noch schwarz ist. Der Roboter steuert nach rechts. Der Roboter soll aber nur eins von beiden machen: Entweder-oder. Das klingt nach einem if-else.

Die 4 Fälle setzen sich aus 2 Sensoren zu je 2 möglichen Farben zusammen:
  • linker Sensor: weiß oder schwarz
  • rechter Sensor: weiß oder schwarz
Sowas programmiert man also am besten immer in der Form:

// wenn Sensor 1 Möglichkeit 1:
    // wenn Sensor 2 Möglichkeit 1: → was machen
    // sonst (Sensor 2 Möglichkeit 2): → was machen
// sonst (Sensor 1 Möglichkeit 2):
    // wenn Sensor 2 Möglichkeit 1: → was machen
    // sonst (Sensor 2 Möglichkeit 2): → was machen

Dann hat man alle 4 Möglichkeiten abgedeckt und keine vergessen.

Kommentare

Beliebte Posts aus diesem Blog

Tinkercad Übung 6 - LED mit Taster ansteuern

Tinkercad Übung 11 - LED dimmen

Tinkercad Übung 15 - Ultraschallsensor auslesen