Jython HomeDruckenJava-Online

Infrarotsensoren


Pi2Go Roboter verfügt über 5 Infrarotsensoren. Drei befinden sich an der Front des Roboters und sind seitwärts und nach vorne gerichtet. Zwei sind nach unten gerichtet und können die Helligkeit der Unterlage registrieren.

Ein Infrarotsensor besteht aus einer Leuchtdiode (LED) die Lichtstrahlen im Infrarotbereich sendet und einer Fotodiode, welche die Intensität des reflektierenden Lichtes messen kann.  

Durch diese Konstruktion können Infrarotsensoren die Änderungen im näheren Sichtfeld registrieren und werden in der Praxis häufig als Bewegungsmelder eingesetzt.

 


In der der Pi2Go-Bibliothek haben die Sensoren einfache Bezeichnungen, nämlich IR_LEFT, IR_CENTER, IR_RIGHT  IR_LINE_LEFT und IR_LINE_RIGHT. Der Pi2Go Roboter kann mit den Infrarotsensoren IR_CENTER, IR_LEFT und IR_RIGHT Gegenstände, die sich in unmittelbaren Nähe des Sensors befinden, erkennen.

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
Der Roboter bewegt sich in einem quadratischen Feld. Er fährt vorwärts, bis er mit dem Infrarotsensor ein Hindernis registriert. Dann fährt er eine kurze Strecke zurück, dreht um 90° nach links und fährt in der neuen Richtung weiter, bis ein weiteres Hindernis im Weg ist.

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.

# IRSensor1.py

from raspisim import *
#from raspibrick import *

RobotContext.useObstacle("sprites/field1.gif", 250, 250)

robot = Robot()
gear = Gear()
ir = InfraredSensor(IR_CENTER)
gear.forward()

while not robot.isEscapeHit():
    if ir.getValue() == 1:
        gear.backward(500)
        gear.left(550)
        gear.forward()        
robot.exit()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

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
Der Roboter mit zwei Infrarotsensoren IR_LEFT und IR_RIGHT sucht den Weg durch den Kanal. Wenn der Roboter mit dem rechten Sensor die Begrenzung registriert, so fährt er eine kurze Strecke zurück, dreht um einen kleinen Winkel nach links und fährt anschliessend wieder vorwärts. Wenn er mit dem linken Sensor eine Wand registriert, korrigiert er seine Fahrtrichtung nach rechts.


# IRSensor2.py

from raspisim import *
#from raspibrick import *

RobotContext.useObstacle("sprites/racetrack.gif", 250, 250);
RobotContext.setStartPosition(420, 460)

robot = Robot()
gear = Gear()
irL = InfraredSensor(IR_LEFT)
irR = InfraredSensor(IR_RIGHT)

gear.forward()

while not isEscapeHit():
    vL = irL.getValue()
    vR = irR.getValue()
    print vL, vR
    if vL == 1:
        gear.backward(250)
        gear.right(180)
        gear.forward() 
    elif vR == 1:        
        gear.backward(250)
        gear.left(180)
        gear.forward()           
robot.exit()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

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
Es gibt grundsätzlich zwei Möglichkeiten, die Sensorwerte zu erfassen:

  • Mit Pollen: Die Sensorwerte werden in einer while-Schleife ständig abgefragt. In einer if-Struktur wird geregelt, was geschehen soll, wenn sich der Sensorwert geändert hat
  • Mit Events: Die Zustandsänderung eines Sensors wird als Event erfasst und programmtechnisch mit einem Callback verarbeitet

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 (Ctrl+C kopieren, Ctrl+V einfügen)

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.

 

 

cleaner.gif (501x501 pixel)