Durch diese Konstruktion können Infrarotsensoren die Änderungen im näheren Sichtfeld registrieren und werden in der Praxis häufig als Bewegungsmelder eingesetzt. |
In einem Python-Programm muss zuerst ein Sensor-Objekt erzeugt werden. Der Aufruf der Funktion getValue() liefert 1, wenn ein Gegenstand registriert wird, sonst 0. Die Sensorwerte werden in einer endlosen Wiederholungschleife ständig abgefragt (pollen), danach muss in einem Programmblock festgelegt werden, was geschehen soll, wenn ein Objekt registriert wird. Leider sind Infrarotsensoren empfindlich auf Umgebungslicht. Helles Licht kann ihre Funktion beeinträchtigen. Dies betrifft vor allem die Sensoren IR_LEFT und IR_RIGHT. |
|
Beispiel 1: Hindernis registrieren und ausweichen Für die Simulation wird mit RobotContext.useObstacle() ein Hintergrundbild field1.gif hinzugefügt. Methoden aus RobotContext werden im realen Modus nicht berücksichtigt. Die RobotContext-Anweisungen müssen in einem Python-Programm vor dem Erstellen des Roboter-Objekts stehen. Das Bild ist in der Bilderbibliothek sprites im tigerjython2.jar enthalten. Eigene Bilder muss man im Unterverzeichnis sprites des Verzeichnisses, in dem sich das Programm befindet, speichern. Achtung: Die Bilder für Infrarotsensoren müssen einen transparenten Hintergrund haben.
|
Erklärungen zum Programmcode:
RobotContext.useObstacle(): fügt ein Hintergrundbild für die Simulation hinzu | |
ir = InfraredSensor(IR_CENTER): erzeugt ein Infrarotsensor-Objekt des vorderen mittleren Sensors | |
ir.getValue(): gibt 1 zurück, wenn die Fotodiode Infrarotstrahlung empfängt |
Beispiel 2: Mit Hilfe der Infrarotsensoren Kanal durchfahren
|
Erklärungen zum Programmcode:
InfraredSensor(IR_LEFT)): Erzeugt den linken Infrarotsensor | |
InfraredSensor(IR_RIGHT): Erzeugt den rechten Infrarotsensor | |
RobotContext.setStartPosition(420, 460): Wir nur in der Simulation berücksichtigt. Setzt den Roboter im Grafikfenster an die gegebenen Koordinaten. |
Beispiel 3: Zustandsänderung eines Sensors als Event erfassen
Für die Registrierung des Hindernisses mit einem Infrarotsensor ist das Event-Modell viel eleganter. Man definiert eine Callbackfunktion, welche bestimmt, was geschehen soll, wenn der Infrarotsensor ein Objekt registriert. Beim Erzeugen des Infrarotsensors muss diese Funktion als benannte Parameter angegeben. Ähnlich wie im Beispiel 1 registriert der Roboter mit seinem Infrarotsensor das Hindernis, fährt danach eine kurze Strecke zurück, dreht um 90° nach links und fährt in der neuen Richtung weiter.
|
# IRSensor3.py from raspisim import * #from raspibrick import * RobotContext.useObstacle("sprites/bar0.gif", 250, 100) RobotContext.useObstacle("sprites/bar0.gif", 250, 400) RobotContext.useObstacle("sprites/bar1.gif", 100, 250) RobotContext.useObstacle("sprites/bar1.gif", 400, 250) RobotContext.setStartPosition(350, 200) def onActivated(id): gear.backward(600) gear.left(550) gear.forward() robot = Robot() ir = InfraredSensor(IR_CENTER, activated = onActivated) gear = Gear() gear.forward() while not isEscapeHit(): Tools.delay(100) robot.exit() |
Programmcode markieren
|
Erklärungen zum Programmcode:
def onActivated(id):: Definiert die Callbackfunktion | |
ir = InfraredSensor(IR_CENTER, activated = onActivated): Die Callbackfunktion wird mit benannten Parameter beim erzeugen des Sensors angegeben | |
while not isEscapeHit(): Im Remote- und Simulationsmodus kann man diese while-Schleife weglassen, da der Roboter mit Schliessen der Dialogbox oder Grafikfensters gestopt werden kann. Im autonomen Modus ist sie notwendig, denn nur dann der Roboter mit Drücken des Buttons angehalten werden kann |
Aufgaben: Serie 5 |
1) |
Ein Roboter mit Infrarotsensoren soll den Ausgang finden. Für die Simulation kannst du das Hintergrundbild trap.gif verwenden. RobottContext.useObstacle("sprites/trap.gif",250, 250)
|
|
|||
2) |
Optimiere das Programm aus dem Beispiel 2 so, dass der Roboter möglichst schnell 2 Runden durch den Kanal zurücklegt. Löse die Aufgabe im Simulationsmodus mit dem Hintergrundbild canal.gif.
|
|
|||
3) |
Erstelle Parcours in Form eines Kanals und schreibe ein Programm, so dass der Roboter diesen Parcours durchfährt. Für die Simulation kannst du das Hintergrundbild channel.gif verwenden. RobotContext.useObstacle("sprites/channel.gif", 250, 250)
RobotContext.setStartPosition(20, 240)
|
|
|
||
4) |
Der Roboter soll sich auf einer rechteckigen Fläche, die auf allen Seiten begrenzt ist, wie ein Staubsaugerroboter bewegen. Er fährt vorwärts und weicht den Hindernissen aus, indem er beim Erkennen eines Objekts zuerst ein wenig zurück fährt, sich dreht um einen bestimmten Winkel dreht und dann wieder vorwärts fährt. Für die Simulation kannst du das nebenstehende Hintergrundbild cleaner.gif verwenden. Klicke mit der rechten Maustaste in das Bild und wähle "Grafik speichern unter". Speichere das Bild im Unterverzeichnis sprites des Verzeichnisses, in dem dein Programm gespeichert ist. Du musst aber danach TigerJython-IDE neu starten. RobottContext.useObstacle("sprites/cleaner.gif",250, 250)
RobotContext.setStartPosition(200, 300)
Erstelle selbst ein Hintergundbild für den Reinigungsroboter und speichere es im Unterverzeichnis sprites des Verzeichnisses, indem sich dein Programm befindet. |
|
|