Netlogo Rescue Übung 4 - Sensoren und Motoren simulieren

Wie die Simulation funktioniert

Die Netlogo Simulationsumgebung simuliert die Welt, in der sich der Roboter bewegt, den Roboter selbst und wie Welt und Roboter miteinander interagieren. Diese Interaktion findet in der Realität über Sensoren und Motoren statt:
  • Sensoren geben eine Information in den Roboter hinein (Eingang).
  • Aktoren (z.B. Motoren) geben eine Information aus dem Roboter heraus (Ausgang).
Ein Sensor nutzt ein physikalisches Messprinzip (z.B. eine Fotodiode zum Lichtstärke messen), um eine Eigenschaft der Welt als Messwert dem Roboter zur Verfügung zu stellen.

Das Programm des Roboters kann nun darauf reagieren und einen Aktor ansteuern.

Der Aktor nutzt ein physikalisches Prinzip (z.B. Elektromagnetismus beim Motor), um die Umgebung zu beeinflussen.

Die Art des Aktors und wie dieser vom Roboter-Programm angesteuert wird beeinflusst die Welt (z.B. der Roboter bewegt sich und stößt eine Tee-Tasse um). Diese Veränderung führt wieder zu Veränderungen der von Sensoren gemessenen Werten. Die Sensorwerte können sich allerdings auch ändern, ohne dass der Roboter einen seiner Aktoren ansteuert, da in der Welt ja auch Dinge passieren, mit denen der Roboter direkt nichts zu tun hat und diese nicht verursacht hat.

Das alles muss die Simulation leisten.


In der Simulation

Zur Simulation gehört ein Modell, dass beschreibt wie die Welt funktioniert. Dieses Welt-Programm bewegt in unserem Fall den Roboter über die Arena und schaut, welche Farbe die Arena an der Position der Sensoren hat.

Die Simulation kann mehrere Agenten und sogar Agenten-Typen beinhalten. D.h. wir könnten auch mehr als nur einen Rescue-Roboter in der Simulation platzieren. Diese Roboter könnten alle dieselbe Anzahl Sensoren und Motoren haben und das selbe Roboter-Programm benutzen (selber Agenten-Typ) oder sich voneinander unterscheiden (unterschiedliche Agenten-Typen). Die Agenten bekommen Informationen vom Welt-Programm zur Verfügung gestellt - z.B. welche Farbe die Farbsensoren gerade sehen. Sie geben auch Informationen wieder an das Welt-Programm zurück - z.B. welche Geschwindigkeit und Richtung die Motoren des Roboters gerade haben.

Das Welt-Programm kann auch Informationen vom Benutzer der Simulation (von dir) erhalten, z.B. über die Schaltflächen auf der linken Seite.


Simulationsschleife und Tick

Die Simulation schreitet in kleinen Zeitabschnitten voran. In jedem dieser Abschnitte passieren die folgenden Schritte (siehe Abbildung 1):
  1. Simulationseinstellungen und Einstellung der Motoren (Geschwindigkeit und Richtung) aller Roboter sind Eingabewerte. Die Simulation führt das Welt-Programm aus und berechnet basierend auf den Motorgeschwindigkeiten in welche Richtung und wie weit die Roboter in der Arena verschoben werden müssen.
  2. Die Sensoren werden natürlich mit verschoben. Der Farbwert des Arena-Pixel, auf dem ein Sensor nun positioniert ist, ist der neue Farbwert des Sensors. Die Farbwerte der Sensoren sind die Ausgangswerte des Welt-Programms.
  3. Die Farbwerte sind die Eingangswerte für die Roboter-Programme. Das Welt-Programm führt die Roboter-Programme aller Roboter aus. Dein Roboter-Programm entscheidet nun wie die Motoren einzustellen sind, um auf der Linie zu bleiben.
  4. Die Ausgangswerte der Roboter-Programme sind die neuen Motorgeschwindigkeiten. Gleichzeitig werden sie die Eingangswerte für den nächsten Simulationsschritt sein, genau wie auch veränderte Simulationseinstellungen.
Das war ein Simulationsschritt (Tick). Die Simulation wiederholt diesen bis sie beendet wird.

Abbildung 1 - Simulations-Schleife



Simulationsgeschwindigkeit verändern

Wenn du die Simulationsgeschwindigkeit veränderst, kannst du die Simulation in Zeitlupe oder im Zeitraffer ablaufen lassen. Dabei verstellt man die Verzögerung zwischen den Simulationsschritten.

Öffne ein Modell oder lade dieses hier herunter: (Download sollte automatisch starten)
https://www.dropbox.com/s/63qtuubg8l1o42z/RescueLineEntryRechts.nlogo?dl=1

Importiere eine Arena oder lade diese hier herunter: (Download sollte automatisch starten)
https://www.dropbox.com/s/u3kywjw548xe3dv/RescueArena.csv?dl=1


Starte die Simulation. Oben in der Mitte gibt es einen Schiebe-Regler ("ticks"), mit dem du die Simulationsgeschwindigkeit verstellen kannst. Probiere mal Zeitlupe aus, um genau sehen wie die Sensoren über die Linie bewegt werden:
Abbildung 2 - Simulationsgeschwindigkeit verändern

Das geht natürlich auch im Zeitraffer:
Abbildung 3 - Zeitraffer



Motoren ansteuern

Öffne den "Code" Tab.

In Netlogo stehen Welt-Programm und Roboter-Programm in derselben Text-Datei. Der obere Teil des Programm-Codes ist das Welt-Programm.

Scrolle runter bis zu den Zeilen

;
; Roboter-Programm
;

Darunter beginnt das Roboter-Programm. Das Hauptprogramm, dass bei jedem Simulationsschritt aufgerufen wird, ist die Prozedur

; Das eigentliche Linienfolgeprogramm
to follow-line
  ; was bei Arduino loop() ist
end

Um neue Motorgeschwindigkeiten zu setzen, können im Programm folgende Befehle verwendet werden:

; Geschwindigkeiten: (rechts zurückfahren)
set-power 20 -50 ; links=20 rechts=-50

; Geschwindigkeiten: (rechts zurückfahren)
set-lpower 20    ; links=20
set-rpower -50   ; rechts=-50

Die Motorgeschwindigkeiten der Motoren können entweder gleichzeitig mit einem Befehl oder einzeln verändert werden.

Jetzt ist zu beachten, dass das Verändern der Motorgeschwindigkeiten noch nichts macht, weil wir uns immer noch im selben Simulations-Schritt (Tick) befinden. Damit der Roboter "fährt", muss das Welt-Programm ihn versetzen und damit muss ein neuer Simulationsschritt gestartet werden.

Das macht man mit dem Befehl

; Tick!
move-robot

den du am Ende der follow-line Prozedur findest (also ganz am Ende des Programm-Codes).

Du kannst die Motorgeschwindigkeiten im Programm beliebig oft veränden. Am Ende gelten die, die als letztes vor Aufruf von move-robot eingestellt waren, da nur in diesem Moment die Simulation wirklich weiterläuft und der Roboter bewegt wird.

Um den Roboter längere Zeit zu bewegen steht dieser Befehl zur Verfügung:

; Geschwindigkeiten: (nach rechts auf der Stelle rotieren)
; für 55 Ticks (entspricht ungefähr 90° Rotation)
set-power-for 40 -40 55 ; links=40 rechts=-40 ticks=55

Diese Prozedur lässt den Roboter für 55 Ticks (Simulationsschritte) nach rechts rotieren.



Sensoren auslesen

Am Anfang des Roboter-Programms werden die Sensoren ausgelesen:

; Sensoren auslesen (frische Werte holen)
let lblack [pcolor] of lsensor = black
let rblack [pcolor] of rsensor = black
let lgreen [pcolor] of lsensor = green
let rgreen [pcolor] of rsensor = green

Die Variablen sind vom Datentyp bool (auch wenn dieser Fakt in Netlogo vor uns versteckt wird) und sind wahr, wenn
  • lblack: linker Sensor schwarz misst
  • rblack: rechter Sensor schwarz misst
  • lgreen: linker Sensor grün misst
  • rgreen: rechter Sensor grün misst
Die kann man dann so verwenden:

if rblack [
  ; rechter Sensor sieht schwarz
]

Man kann natürlich auch die Sensoren direkt abfragen:

if [pcolor] of rsensor = black [
  ; rechter Sensor sieht schwarz
]

Jetzt ist zu beachten, dass egal wie oft man die Sensor-Variablen abfragt - die Werte werden sich nie verändern, weil wir uns immer noch im selben Simulations-Schritt befinden. Die Simulation ist also momentan "pausiert".

Um ein einen frischen Sensorwert zu erhalten, muss die Simulation weiter ticken. Das funktioniert nachwievor mit

; Tick!
move-robot



Jetzt kannst du ein eigenes Linienfolgen-Programm umsetzen:

Projekt 1 - Rescue Line Entry

Kommentare

Beliebte Posts aus diesem Blog

Tinkercad Übung 6 - LED mit Taster ansteuern

Tinkercad Übung 11 - LED dimmen

Tinkercad Übung 15 - Ultraschallsensor auslesen