Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== Robotik ====== {{lehrkraefte:blc:informatik:glf20:robotik:mgr:presentation.pdf}} ===== Begriffe, Definitionen ===== * https://de.wikipedia.org/wiki/Roboter * https://de.wikipedia.org/wiki/Aktor * https://de.wikipedia.org/wiki/Sensor ===== Roboter bewegen ===== ==== Wichtigste Gear-Funktionen ==== * Voraussetzung ist, dass die Variable ''gear'' auch ein ''Gear''-Objekt ist. * Nicht-blockierend heisst, das Programm läuft sofort weiter. Die Einstellung der Motoren bleibt dann so, bis eine Änderung vorgenommen wird. * Blockierend heisst, das Programm wartet an dieser Stelle die gegebene Anzahl Millisekunden und kann während dieser Zeit nicht auf Sensoreingaben reagieren. ^ nicht-blockierend ^ blockierend ^ Beschreibung ^ | gear.backward() | gear.backward(ms) | fährt rückwärts | | gear.forward() | gear.forward(ms) | fährt forwärts | | gear.left() | gear.left(ms) | dreht links | | gear.right() | gear.right(ms) | dreht rechts | | gear.leftArc(radius) | gear.leftArc(radius , ms) | fährt auf einem Linksbogen | | gear.rightArc(radius) | gear.rightArc(radius , ms) | Rechtsbogen | | gear.setSpeed(speed) | | setzt die Geschwindigkeit (Werte zwischen 0 und ungefähr 70 sind überhaupt sinnvoll.) | | gear.stop() | | stoppt das Fahrwerk | Vollständige Dokumentation der Funktionen: http://tigerjython.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=robotik/robotikdoc.html ==== Aufgaben ==== === Aufgabe 1 === Verwenden Sie for- oder while-Schleife, um einen Weg, der aus drei Bogen besteht, zu programmieren. Mit dem Befehl "RobotContext.enableTrace(True)" können Sie die Spuren des Roboters Grafikfenster anzeigen lassen. (Diese Zeile muss im Programm gerade nach der Importzeile stehen). {{:lehrkraefte:blc:informatik:glf20:robotik:mgr:pasted:20210325-220909.png}} <hidden Lösungsvorschlag> <code python> from simrobot import * RobotContext.enableTrace(True) robot = LegoRobot() gear = Gear(); robot.addPart(gear); gear.forward() for i in range(3): gear.rightArc(0.15) Tools.delay(4000) gear.right(1100) robot.exit() </code> </hidden> === Aufgabe 2 === Der Roboter soll sich auf einer Spiralbahn bewegen. Verwenden Sie eine while-Schleife und Vergrössern Sie nach jedem Schleifendurchlauf den Radius im Befehl rightArc(radius). Das Programm soll mit der <ESC> Taste abgebrochen werden. Beginnen Sie mit radius 0.05. {{:lehrkraefte:blc:informatik:glf20:robotik:mgr:pasted:20210325-223207.png}} <hidden Lösungsvorschlag> <code python> from simrobot import * RobotContext.enableTrace(True) robot = LegoRobot() gear = Gear(); robot.addPart(gear); radius = 0.05 gear.forward() while not robot.isEscapeHit(): gear.rightArc(radius) Tools.delay(2000) radius = radius * 1.1 robot.exit() </code> </hidden> ===== Lichtsensor ===== Es ist auch möglich, im Simulator einen Lichtsensor zu verwenden. Der Lichtsensor misst die Helligkeit, die Werte liegen zwischen 0 und 1023 (je grösser der Wert, umso heller). Der Lichtsensor muss auch zum Roboter hinzugefügt werden und zwar mit folgenden Zeilen <code python> ls = LightSensor(SensorPort.S3) robot.addPart(ls) ls.activate(True) </code> Ausgelesen wird der Sensor mit <code python> v = ls.getValue() </code> ==== Aufgaben ==== === Aufgabe 3 === Wir wollen den Roboter fahren lassen, bis er auf eine helle Stelle kommt oder die <ESC> Taste gedrückt wird. Fügen Sie bitte dazu als erste Zeilen in Ihrer Lösung folgende Zeilen ein <code python > from simrobot import * from random import randrange RobotContext.useBackground("sprites/border.gif") RobotContext.setStartPosition(350 + randrange(50), 250) RobotContext.setStartDirection(135+randrange(90)) </code> <hidden Lösungsvorschlag> <code python> from simrobot import * from random import randrange RobotContext.useBackground("sprites/border.gif") RobotContext.setStartPosition(350 + randrange(50), 250) RobotContext.setStartDirection(135+randrange(90)) robot = LegoRobot() gear = Gear() robot.addPart(gear) ls = LightSensor(SensorPort.S3) robot.addPart(ls) ls.activate(True) gear.forward() while not robot.isEscapeHit(): v = ls.getValue() if v > 500: break Tools.delay(100) robot.exit() </code> </hidden> === Aufgabe 4 === Wir wollen nun versuchen, dass der Roboter entlang der Wellenlinie fährt. Auch hier soll das Programm wieder mit der <ESC> Taste beendet werden können. Fügen Sie bitte dazu als erste Zeilen in Ihrer Lösung folgende Zeilen ein <code python > from simrobot import * RobotContext.useBackground("sprites/border.gif") RobotContext.setStartPosition(250, 490) </code> Hinweis: Wenn der Roboter auf einer dunklen Fläche liegt, dann kann er einen Kreis nach links fahren, wenn er auf einer hellen Fläche ist, dann... Wenn Ihr Roboter der Linie folgt von unten nach oben, dann versuche mit den verschiedenen Werten zu spielen. Mit welchen Werten ist der Roboter am schnellsten am Ziel? Mit welchen Werten folgt der Roboter möglichst exakt der Linie? <hidden Lösungsvorschlag> <code python> kommt bald... </code> </hidden> ===== Ultraschallsensor ===== Mit dem Ultraschallsensor ist es möglich, die Entfernung von Hindernissen zu messen. Der Sensor muss auch zum Roboter hinzugefügt werden und zwar mit folgenden Zeilen <code python> us = UltrasonicSensor(SensorPort.S1) robot.addPart(us) </code> Ausgelesen wird der Sensor mit <code python> distance = us.getDistance() </code> ==== Aufgaben ==== === Aufgabe 5 === Wir wollen die Aufgabe 4 so erweitern, dass wir ein Hindernis einbauen. Der Roboter soll wieder so lange der Linie folgen, bis der Benutzer <ESC> drückt oder die Distanz zum Hindernis kleiner als 30 ist. Wir simulieren das Hindernis mit folgenden Zeilen <code python > mesh_hbar = [[200, 10], [-200, 10], [-200, -10], [200, -10]] RobotContext.useTarget("sprites/bar0.gif", mesh_hbar, 250, 100) </code> Somit beginnt unser Lösung mit folgenden Zeilen <code python > from simrobot import * RobotContext.useBackground("sprites/border.gif") RobotContext.setStartPosition(250, 490) mesh_hbar = [[200, 10], [-200, 10], [-200, -10], [200, -10]] RobotContext.useTarget("sprites/bar0.gif", mesh_hbar, 250, 100) </code> <hidden Lösungsvorschlag> <code python> kommt bald... </code> </hidden> lehrkraefte/blc/informatik/glf20/robotik/mgr/start.txt Last modified: 2021/03/26 12:09by michael.greminger