From eff2b56555612098ca4c1879cfbe8643e7598de0 Mon Sep 17 00:00:00 2001 From: "(MakerLab) Laptop 2" Date: Wed, 8 Nov 2023 18:51:37 +0100 Subject: [PATCH 01/10] Aufgabe 07: Hologramm --- main.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/main.py b/main.py index 296fcf8..682b717 100644 --- a/main.py +++ b/main.py @@ -74,14 +74,17 @@ dh auch an die Funktionen im importierten Code übergeben werde hub = PrimeHub() # Initialisiere Robot Klasse mit unseren Funktionen -iqRobot: iq.IQRobot = iq.IQRobot(hub, typ=iq.BRICKIES_BOT) +iqRobot: iq.IQRobot = iq.IQRobot(hub, typ=iq.BRICKIES_BOT_2) # Führe Funktionen aus unser Robot Klasse aus: iqRobot.show('HAPPY') -iqRobot.fahre_mit_drehung(strecke1=10, grad=90, strecke2=10) -iqRobot.fahre_mit_drehung(strecke1=0, grad=-90, strecke2=10) - - - +def hologram_aufgabe1(): + iqRobot.fahre_gerade_aus(cm=75,speed=80) + iqRobot.drehe(45, False) + iqRobot.fahre_gerade_aus(cm=14,speed=70) + iqRobot.fahre_gerade_aus(cm=-13,speed=50) + iqRobot.drehe(-45, False) + iqRobot.fahre_gerade_aus(cm=-75,speed=50) +hologram_aufgabe1() From 68f71f808f104a8542dbb5e58820ca4ad7bb2415 Mon Sep 17 00:00:00 2001 From: "(MakerLab) Laptop 2" Date: Wed, 15 Nov 2023 18:42:04 +0100 Subject: [PATCH 02/10] Schaufel Funktion --- iqrobot.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/iqrobot.py b/iqrobot.py index 3aa2ed9..c542e4c 100644 --- a/iqrobot.py +++ b/iqrobot.py @@ -157,6 +157,11 @@ class IQRobot: drehung = self.motionSensor.get_yaw_angle() print(drehung) + def schaufel(self,prozent): + volle_umdrehung=0.29 + rotations=volle_umdrehung*prozent/100 + self.bothFrontMotors.move(rotations, unit='rotations',speed=20) + print("successfully loaded the IQ Lego teams code :)") From 58477b1d548f3249f6b151fbb3a92407d79dd6ba Mon Sep 17 00:00:00 2001 From: Laptop 3 Date: Wed, 15 Nov 2023 18:42:59 +0100 Subject: [PATCH 03/10] Heber Funktion --- iqrobot.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iqrobot.py b/iqrobot.py index 3aa2ed9..4be7d7b 100644 --- a/iqrobot.py +++ b/iqrobot.py @@ -52,7 +52,7 @@ class IQRobot: self.rad_radius = 2.9 # Abstand zwischen Rädern (Mitte) und Vorderseite des Roboters self.abstand_rad_front = 8.5 - + ## Allgemein ## self.movementMotors: MotorPair = MotorPair(LEFT_MOTOR_PORT, RIGHT_MOTOR_PORT) # Radumfang neu berechnen und Motor konfigurieren @@ -156,7 +156,8 @@ class IQRobot: self.movementMotors.move(amount=richtung * 0.1, steering=100) drehung = self.motionSensor.get_yaw_angle() print(drehung) - + def heber(self, cm,speed): + self.bothFrontMotors.move_tank(-cm*3.3,"cm", -speed, speed) print("successfully loaded the IQ Lego teams code :)") From 33369ff3e2f5560e095571f49f44e0e75d8aeaf1 Mon Sep 17 00:00:00 2001 From: Lars Haferkamp <> Date: Thu, 16 Nov 2023 09:26:31 +0100 Subject: [PATCH 04/10] Ungenutzten Code/Robot Config entfernt und etwas dokumentiert --- iqrobot.py | 148 +++++++++++++++++++++-------------------------------- main.py | 2 +- 2 files changed, 60 insertions(+), 90 deletions(-) diff --git a/iqrobot.py b/iqrobot.py index 3aa2ed9..6a4791c 100644 --- a/iqrobot.py +++ b/iqrobot.py @@ -6,9 +6,6 @@ from spike import PrimeHub, Motor, MotorPair, ColorSensor, MotionSensor from spike.control import wait_for_seconds HELLO = "HELLO IQ" -BRICKIES_BOT = "brickies" -BRICKIES_BOT_2 = "brickies_2" -BACKSTEIN_BOT = "backstein" ''' Wir nutzen "Duck typing", dh wir schreiben hinter jede Variabel mit ':' die Klasse, zB `leftMotor: Motor` @@ -16,53 +13,30 @@ damit man dann später auch wieder Code Completion hat bei Nutzung der Variablen ''' class IQRobot: - def __init__(self, hub: PrimeHub, typ: str): + def __init__(self, hub: PrimeHub): self.hub: PrimeHub = hub - self.typ=typ - if self.typ==BACKSTEIN_BOT: - # Radantrieb - LEFT_MOTOR_PORT = 'F' - RIGHT_MOTOR_PORT = 'B' - # Motoren für Aufsätze - FRONT_MOTOR_RIGHT_PORT = "E" - self.frontMotorRight: Motor = Motor(FRONT_MOTOR_RIGHT_PORT) + # Radantrieb + LEFT_MOTOR_PORT = 'E' + RIGHT_MOTOR_PORT = 'F' - elif self.typ==BRICKIES_BOT: - # Radantrieb - LEFT_MOTOR_PORT = 'E' - RIGHT_MOTOR_PORT = 'F' - # Motoren für Aufsätze - FRONT_MOTOR_RIGHT_PORT = "B" - FRONT_MOTOR_LEFT_PORT = "A" - self.frontMotorRight: Motor = Motor(FRONT_MOTOR_RIGHT_PORT) - self.frontMotorLeft: Motor = Motor(FRONT_MOTOR_LEFT_PORT) - self.bothFrontMotors: MotorPair = MotorPair(FRONT_MOTOR_LEFT_PORT, FRONT_MOTOR_RIGHT_PORT) - # Radius der Antriebsräder - self.rad_radius = 2.1 - # Abstand zwischen Rädern (Mitte) und Vorderseite des Roboters - self.abstand_rad_front = 5.55 - - elif self.typ==BRICKIES_BOT_2: - # Radantrieb - LEFT_MOTOR_PORT = 'E' - RIGHT_MOTOR_PORT = 'F' - # Radius der Antriebsräder - self.rad_radius = 2.9 - # Abstand zwischen Rädern (Mitte) und Vorderseite des Roboters - self.abstand_rad_front = 8.5 - - ## Allgemein ## - self.movementMotors: MotorPair = MotorPair(LEFT_MOTOR_PORT, RIGHT_MOTOR_PORT) + # Motoren für Aufsätze + FRONT_MOTOR_RIGHT_PORT = "B" + FRONT_MOTOR_LEFT_PORT = "A" + + self.bothFrontMotors: MotorPair = MotorPair(FRONT_MOTOR_LEFT_PORT, FRONT_MOTOR_RIGHT_PORT) + + self.antrieb: MotorPair = MotorPair(LEFT_MOTOR_PORT, RIGHT_MOTOR_PORT) # Radumfang neu berechnen und Motor konfigurieren + # Radius der Antriebsräder + self.rad_radius = 2.1 + # Abstand zwischen Rädern (Mitte) und Vorderseite des Roboters + self.abstand_rad_front = 5.55 rad_umfang = 2 * math.pi * self.rad_radius - self.movementMotors.set_motor_rotation(rad_umfang) - self.leftMotor: Motor = Motor(LEFT_MOTOR_PORT) - self.rightMotor: Motor = Motor(RIGHT_MOTOR_PORT) - #self.colorSensor: ColorSensor = ColorSensor(colorSensorPort) - #self.frontMotorLeft: Motor = Motor("C") - self.motionSensor: MotionSensor = MotionSensor() + self.antrieb.set_motor_rotation(rad_umfang) + + self.bewegungsSensor: MotionSensor = MotionSensor() def show(self, image: str): @@ -73,88 +47,84 @@ class IQRobot: self.hub.light_matrix.show_image(image) - def driveForward_for_sec(self, seconds: float): - # Fahre die übergebene Anzahl seconds gerade aus - self.movementMotors.start() - wait_for_seconds(seconds) - self.movementMotors.stop() - - - def getColorIntensity(self): - # Ermittele Farbintensität über den Farbsensor - (red, green, blue, colorIntensity) = self .colorSensor.get_rgb_intensity() - return colorIntensity - - def drehe(self, grad=90, with_reset=True): + """ + Funktion um den Roboter auf der Stelle zu drehen + + :param int grad: Grad um die der Roboter gedreht werden soll + mittels Vorzeichen +/- kann links oder rechts herum gedreht werden + """ if grad == 0 or grad == 360 : print("nichts zu tun") return if with_reset: - self.motionSensor.reset_yaw_angle() + self.bewegungsSensor.reset_yaw_angle() #steering = 100 if grad > 0 else -100 toleranz = 0 - aktuell = self.motionSensor.get_yaw_angle() + aktuell = self.bewegungsSensor.get_yaw_angle() ziel = grad steering = 100 if ziel > aktuell else -100 - self.movementMotors.start(steering=steering, speed=10) + self.antrieb.start(steering=steering, speed=10) differenz = ziel - aktuell print ("Start Ziel: {}, Aktuell: {}".format(ziel, aktuell)) while abs(differenz) > toleranz : - aktuell = self.motionSensor.get_yaw_angle() + aktuell = self.bewegungsSensor.get_yaw_angle() differenz = ziel - aktuell pass - self.movementMotors.stop() + self.antrieb.stop() print ("Final Ziel: {}, Aktuell: {}".format(ziel, aktuell)) - - - def fahre_gerade(self, cm): - if self.typ == "brickies": - cm = -cm - self.motionSensor.reset_yaw_angle() - self.movementMotors.start_tank(10, 10) - self.movementMotors.set_default_speed(10) - self.movementMotors.move(cm) - versatz = self.motionSensor.get_yaw_angle() - self.drehe(grad=-versatz) - + def fahre_gerade_geregelt(self, cm): - if self.typ == "brickies": - cm = -cm - self.motionSensor.reset_yaw_angle() - self.movementMotors.start_tank(10, 10) - self.movementMotors.set_default_speed(10) + """ + WIP by Lars & Klaus + """ + self.bewegungsSensor.reset_yaw_angle() + self.antrieb.start_tank(10, 10) + self.antrieb.set_default_speed(10) sum_cm = 0 while sum_cm < cm: - self.movementMotors.move(1) - versatz = self.motionSensor.get_yaw_angle() + self.antrieb.move(1) + versatz = self.bewegungsSensor.get_yaw_angle() self.drehe(grad=-versatz) - self.motionSensor.reset_yaw_angle() + self.bewegungsSensor.reset_yaw_angle() sum_cm = sum_cm + 1 - self.movementMotors.move(cm - sum_cm) + self.antrieb.move(cm - sum_cm) + def fahre_mit_drehung(self, strecke1, grad, strecke2): + """ + Funktion für eine Fahrt mit 1. Strecke, dann Drehung in der Mitte, dann 2. Strecke + Vereinfacht die Logik, da der Roboter durch die Drehung einen Versatz hat gegenüber einer + Strecke die mit dem Lineal ausgemessen wurde + """ self.fahre_gerade_geregelt(strecke1 + self.abstand_rad_front) self.drehe(grad) self.fahre_gerade_geregelt(strecke2 - self.abstand_rad_front) - def fahre_gerade_aus(self, cm,speed): + + def fahre_gerade_aus(self, cm: float, speed: int): + """ + Funktion zum gerade aus fahren mit Korrektur am Ende + + :param int cm: Zentimeter die gerade aus gefahren werden soll + :param speed: Geschwindigkeit mit der gefahren wird + """ - self.motionSensor.reset_yaw_angle() + self.bewegungsSensor.reset_yaw_angle() - self.movementMotors.move_tank(amount=cm,left_speed=speed, right_speed=speed) - drehung = self.motionSensor.get_yaw_angle() + self.antrieb.move_tank(amount=cm,left_speed=speed, right_speed=speed) + drehung = self.bewegungsSensor.get_yaw_angle() print(drehung) if drehung > 0: richtung = -1 else: richtung = 1 while abs(drehung) > 2: - self.movementMotors.move(amount=richtung * 0.1, steering=100) - drehung = self.motionSensor.get_yaw_angle() + self.antrieb.move(amount=richtung * 0.1, steering=100) + drehung = self.bewegungsSensor.get_yaw_angle() print(drehung) diff --git a/main.py b/main.py index 682b717..cffdfc7 100644 --- a/main.py +++ b/main.py @@ -74,7 +74,7 @@ dh auch an die Funktionen im importierten Code übergeben werde hub = PrimeHub() # Initialisiere Robot Klasse mit unseren Funktionen -iqRobot: iq.IQRobot = iq.IQRobot(hub, typ=iq.BRICKIES_BOT_2) +iqRobot: iq.IQRobot = iq.IQRobot(hub) # Führe Funktionen aus unser Robot Klasse aus: iqRobot.show('HAPPY') From 6de4a7a70bc624e77e3de818e896681299f0d092 Mon Sep 17 00:00:00 2001 From: Laptop 3 Date: Wed, 22 Nov 2023 18:43:25 +0100 Subject: [PATCH 05/10] Abstandssensor --- iqrobot.py | 16 ++++++++++++++-- main.py | 9 +++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/iqrobot.py b/iqrobot.py index 0ea4b35..768c184 100644 --- a/iqrobot.py +++ b/iqrobot.py @@ -1,8 +1,8 @@ -# LEGO type:standard slot:6 autostart +# LEGO type:standard slot:7 autostart import math -from spike import PrimeHub, Motor, MotorPair, ColorSensor, MotionSensor +from spike import PrimeHub, Motor, MotorPair, ColorSensor, MotionSensor, DistanceSensor from spike.control import wait_for_seconds HELLO = "HELLO IQ" @@ -38,6 +38,8 @@ class IQRobot: self.bewegungsSensor: MotionSensor = MotionSensor() + self.abstandsSensor: DistanceSensor = DistanceSensor("D") + def show(self, image: str): ''' @@ -135,6 +137,15 @@ class IQRobot: rotations=volle_umdrehung*prozent/100 self.bothFrontMotors.move(rotations, unit='rotations',speed=20) + + def fahre_bis_abstand(self, abstand: int, speed=30, geregelt=True): + self.antrieb.start_at_power(speed) + abstand_gerade = self.abstandsSensor.get_distance_cm() + while abstand_gerade > abstand: + abstand_gerade = self.abstandsSensor.get_distance_cm() + print(str(abstand_gerade)) + self.antrieb.stop() + print("successfully loaded the IQ Lego teams code :)") @@ -145,3 +156,4 @@ print("successfully loaded the IQ Lego teams code :)") + diff --git a/main.py b/main.py index cffdfc7..3a68222 100644 --- a/main.py +++ b/main.py @@ -50,7 +50,7 @@ def importFile(slotid=0, precompiled=False, module_name='importFile'): # Importiere Code aus der Datei "iqrobot.py" # Dateiname und Modulname sollten gleich sein, dann kann man Code Completion nutzen -importFile(slotid=6, precompiled=True, module_name="iqrobot") +importFile(slotid=7, precompiled=True, module_name="iqrobot") import iqrobot as iq print(iq.HELLO) @@ -72,12 +72,15 @@ dh auch an die Funktionen im importierten Code übergeben werde # Initialisieren des Hubs, der Aktoren und Sensoren hub = PrimeHub() +print("HUB") # Initialisiere Robot Klasse mit unseren Funktionen iqRobot: iq.IQRobot = iq.IQRobot(hub) +print("HUB2") # Führe Funktionen aus unser Robot Klasse aus: iqRobot.show('HAPPY') +print("HAPPY") def hologram_aufgabe1(): iqRobot.fahre_gerade_aus(cm=75,speed=80) @@ -87,4 +90,6 @@ def hologram_aufgabe1(): iqRobot.drehe(-45, False) iqRobot.fahre_gerade_aus(cm=-75,speed=50) -hologram_aufgabe1() +#hologram_aufgabe1() + +iqRobot.fahre_bis_abstand(5) From 83c580e54fd8329f431595e1ab6a442dce48f1e6 Mon Sep 17 00:00:00 2001 From: Laptop 3 Date: Wed, 22 Nov 2023 18:47:07 +0100 Subject: [PATCH 06/10] Port gefixt --- iqrobot.py | 2 +- main.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iqrobot.py b/iqrobot.py index 768c184..509dcf6 100644 --- a/iqrobot.py +++ b/iqrobot.py @@ -1,4 +1,4 @@ -# LEGO type:standard slot:7 autostart +# LEGO type:standard slot:6 autostart import math diff --git a/main.py b/main.py index 3a68222..e63b281 100644 --- a/main.py +++ b/main.py @@ -50,7 +50,7 @@ def importFile(slotid=0, precompiled=False, module_name='importFile'): # Importiere Code aus der Datei "iqrobot.py" # Dateiname und Modulname sollten gleich sein, dann kann man Code Completion nutzen -importFile(slotid=7, precompiled=True, module_name="iqrobot") +importFile(slotid=6, precompiled=True, module_name="iqrobot") import iqrobot as iq print(iq.HELLO) From 4a0671105b197134e3bd08e81571d189e5026768 Mon Sep 17 00:00:00 2001 From: Laptop 3 Date: Wed, 22 Nov 2023 18:48:30 +0100 Subject: [PATCH 07/10] Debug entfernt --- main.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/main.py b/main.py index e63b281..1a4e5bb 100644 --- a/main.py +++ b/main.py @@ -72,15 +72,12 @@ dh auch an die Funktionen im importierten Code übergeben werde # Initialisieren des Hubs, der Aktoren und Sensoren hub = PrimeHub() -print("HUB") # Initialisiere Robot Klasse mit unseren Funktionen iqRobot: iq.IQRobot = iq.IQRobot(hub) -print("HUB2") # Führe Funktionen aus unser Robot Klasse aus: iqRobot.show('HAPPY') -print("HAPPY") def hologram_aufgabe1(): iqRobot.fahre_gerade_aus(cm=75,speed=80) From 01b4c1ebc6c00ca9c92d5baed467655fd5b86a44 Mon Sep 17 00:00:00 2001 From: Laptop 3 Date: Wed, 22 Nov 2023 18:49:27 +0100 Subject: [PATCH 08/10] Docs --- main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 1a4e5bb..06a23f1 100644 --- a/main.py +++ b/main.py @@ -87,6 +87,7 @@ def hologram_aufgabe1(): iqRobot.drehe(-45, False) iqRobot.fahre_gerade_aus(cm=-75,speed=50) -#hologram_aufgabe1() +hologram_aufgabe1() +# Fahre, bis 5 Zentimeter vor Gegenstand iqRobot.fahre_bis_abstand(5) From cd47da6f23b60ae4665553185d64e8d883fba635 Mon Sep 17 00:00:00 2001 From: Lars Haferkamp <> Date: Wed, 22 Nov 2023 18:56:19 +0100 Subject: [PATCH 09/10] Gerade aus Fahr Funktion mit PI Regler --- iqrobot.py | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/iqrobot.py b/iqrobot.py index 0ea4b35..cec7049 100644 --- a/iqrobot.py +++ b/iqrobot.py @@ -27,14 +27,16 @@ class IQRobot: self.bothFrontMotors: MotorPair = MotorPair(FRONT_MOTOR_LEFT_PORT, FRONT_MOTOR_RIGHT_PORT) + self.linker_motor: Motor = Motor(LEFT_MOTOR_PORT) + self.antrieb: MotorPair = MotorPair(LEFT_MOTOR_PORT, RIGHT_MOTOR_PORT) # Radumfang neu berechnen und Motor konfigurieren # Radius der Antriebsräder self.rad_radius = 2.1 # Abstand zwischen Rädern (Mitte) und Vorderseite des Roboters self.abstand_rad_front = 5.55 - rad_umfang = 2 * math.pi * self.rad_radius - self.antrieb.set_motor_rotation(rad_umfang) + self.rad_umfang = 2 * math.pi * self.rad_radius + self.antrieb.set_motor_rotation(self.rad_umfang) self.bewegungsSensor: MotionSensor = MotionSensor() @@ -47,6 +49,9 @@ class IQRobot: self.hub.light_matrix.show_image(image) + def strecke_gefahren(self): + return -self.linker_motor.get_degrees_counted()/360 * self.rad_umfang + def drehe(self, grad=90, with_reset=True): """ Funktion um den Roboter auf der Stelle zu drehen @@ -75,23 +80,32 @@ class IQRobot: print ("Final Ziel: {}, Aktuell: {}".format(ziel, aktuell)) - def fahre_gerade_geregelt(self, cm): - """ - WIP by Lars & Klaus - """ + def fahre_gerade_aus(self, cm, speed=20): + self.linker_motor.set_degrees_counted(0) self.bewegungsSensor.reset_yaw_angle() + self.antrieb.start_tank(10, 10) self.antrieb.set_default_speed(10) + linker_speed=speed + rechter_speed=speed + kp = 1.5 + ki = 1.0 sum_cm = 0 + sum_versatz = 0 while sum_cm < cm: - self.antrieb.move(1) + wait_for_seconds(0.05) + sum_cm = self.strecke_gefahren() versatz = self.bewegungsSensor.get_yaw_angle() - self.drehe(grad=-versatz) - self.bewegungsSensor.reset_yaw_angle() - sum_cm = sum_cm + 1 + sum_versatz = sum_versatz + versatz + abweichung = (kp * versatz + ki * sum_versatz) / 100 + linker_speed = speed * (1 - abweichung) + rechter_speed = speed * (1 + abweichung) + self.antrieb.start_tank_at_power(int(linker_speed), int(rechter_speed)) + #print("Versatz: " + str(versatz) + " , linker Speed: " + str(linker_speed) + ", rechter Speed: " + str(rechter_speed) + ", strecke: " + str(sum_cm)) - self.antrieb.move(cm - sum_cm) + self.antrieb.stop() + self.drehe(-versatz) def fahre_mit_drehung(self, strecke1, grad, strecke2): @@ -105,7 +119,7 @@ class IQRobot: self.fahre_gerade_geregelt(strecke2 - self.abstand_rad_front) - def fahre_gerade_aus(self, cm: float, speed: int): + def fahre_gerade_aus_alt(self, cm: float, speed: int): """ Funktion zum gerade aus fahren mit Korrektur am Ende From dc5950178189a8d244b9abca27f6e8beebffabde Mon Sep 17 00:00:00 2001 From: Laptop 3 Date: Wed, 22 Nov 2023 19:00:15 +0100 Subject: [PATCH 10/10] . --- main.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/main.py b/main.py index 06a23f1..cffdfc7 100644 --- a/main.py +++ b/main.py @@ -88,6 +88,3 @@ def hologram_aufgabe1(): iqRobot.fahre_gerade_aus(cm=-75,speed=50) hologram_aufgabe1() - -# Fahre, bis 5 Zentimeter vor Gegenstand -iqRobot.fahre_bis_abstand(5)