Compare commits

...

21 commits

Author SHA1 Message Date
2157ec4101 Merge pull request 'Funktion für neue Schaufel und Doku' (#19) from laptop02 into main
Reviewed-on: #19
2024-01-03 16:26:50 +00:00
Lars Haferkamp
88c5e7a9ba Merge branch 'main' into laptop02
* main:
  Anpassung fahre_gerade_aus für negative Strecken
  Anpassung fahre_gerade_aus für negative Strecken
  t
  Rückwärsfahren mit Regler
  Anpassung fahre_gerade_aus für negative Strecken
  Anpassung fahre_gerade_aus für negative Strecken
  Hinzufügen von Kommentaren
  Hinzufügen von Kommentaren
  Hinzufügen von Kommentaren
  Hinzufügen von Kommentaren

# Conflicts:
#	iqrobot.py
2024-01-03 17:25:13 +01:00
(MakerLab) Laptop 2
a6ea00afb1 Funktion für neue Schaufel und Doku 2024-01-03 16:58:32 +01:00
f48802abf7 Merge pull request 'Rückwärsfahren mit Regler' (#18) from laptop01 into main
Reviewed-on: #18
2023-12-06 16:31:04 +00:00
Lars Haferkamp
c5d84fc730 Merge branch 'main' into laptop01
* main:
  Anpassung fahre_gerade_aus für negative Strecken
  Anpassung fahre_gerade_aus für negative Strecken
  t
  Anpassung fahre_gerade_aus für negative Strecken
  Anpassung fahre_gerade_aus für negative Strecken
  Hinzufügen von Kommentaren
  Hinzufügen von Kommentaren
  Hinzufügen von Kommentaren
  Hinzufügen von Kommentaren

# Conflicts:
#	iqrobot.py
2023-12-06 17:29:28 +01:00
be67475d91 Merge pull request 'Anpassung fahre_gerade_aus für negative Strecken' (#17) from treffen-291123 into main
Reviewed-on: #17
2023-11-29 20:25:14 +00:00
Harry Kimpel
feac94f2fb Merge branch 'treffen-291123' of https://git.makerlab-murnau.de/Projekte/LegoLeague into treffen-291123 2023-11-29 21:24:09 +01:00
Harry Kimpel
147fb0cc8a Anpassung fahre_gerade_aus für negative Strecken
Signed-off-by: Harry Kimpel <harrykimpel@hotmail.com>
2023-11-29 21:14:04 +01:00
Harry Kimpel
835b9a69b9 Anpassung fahre_gerade_aus für negative Strecken
Signed-off-by: Harry Kimpel <harrykimpel@hotmail.com>
2023-11-29 20:51:04 +01:00
ce7e95ba17 Merge pull request 'Rückwärtsfahren mit Regler' (#16) from fixes into main
Reviewed-on: #16
Reviewed-by: Vincenz Ernst <viernst@linuxmuster.lan>
2023-11-29 17:59:22 +00:00
Makerlab Laptop 1
8304ac28b6 t 2023-11-29 18:57:07 +01:00
Makerlab Laptop 1
7956b2bef7 Rückwärsfahren mit Regler 2023-11-29 18:39:23 +01:00
80e8811180 Merge pull request 'Anpassung fahre_gerade_aus für negative Strecken' (#14) from treffen-291123 into main
Reviewed-on: #14
2023-11-29 17:01:51 +00:00
Harry Kimpel
2fe0c0a556 Anpassung fahre_gerade_aus für negative Strecken
Signed-off-by: Harry Kimpel <harrykimpel@hotmail.com>
2023-11-29 18:01:27 +01:00
b5c1a47f98 Merge pull request 'treffen-291123' (#13) from treffen-291123 into main
Reviewed-on: #13
2023-11-29 16:55:53 +00:00
Harry Kimpel
f5119caeb7 Anpassung fahre_gerade_aus für negative Strecken
Signed-off-by: Harry Kimpel <harrykimpel@hotmail.com>
2023-11-29 17:54:25 +01:00
Harry Kimpel
608480dc44 Hinzufügen von Kommentaren
Signed-off-by: Harry Kimpel <harrykimpel@hotmail.com>
2023-11-29 17:32:32 +01:00
Harry Kimpel
71209bbf1c Hinzufügen von Kommentaren
Signed-off-by: Harry Kimpel <harrykimpel@hotmail.com>
2023-11-29 17:29:15 +01:00
Harry Kimpel
d76983d4e4 Hinzufügen von Kommentaren
Signed-off-by: Harry Kimpel <harrykimpel@hotmail.com>
2023-11-29 16:10:59 +01:00
Harry Kimpel
e51ee00cac Hinzufügen von Kommentaren
Signed-off-by: Harry Kimpel <harrykimpel@hotmail.com>
2023-11-29 16:10:03 +01:00
38972ef784 Merge pull request 'Aufgaben: Hologram, Druckmaschine und Augmented Reality' (#12) from treffen-221123 into main
Reviewed-on: #12
2023-11-29 09:53:36 +00:00
2 changed files with 103 additions and 50 deletions

View file

@ -5,7 +5,8 @@ import math
from spike import PrimeHub, Motor, MotorPair, ColorSensor, MotionSensor, DistanceSensor
from spike.control import wait_for_seconds
HELLO = "HELLO IQ"
print("Lade IQ-Bibliothek")
'''
Wir nutzen "Duck typing", dh wir schreiben hinter jede Variabel mit ':' die Klasse, zB `leftMotor: Motor`
@ -26,6 +27,10 @@ class IQRobot:
FRONT_MOTOR_LEFT_PORT = "A"
self.bothFrontMotors: MotorPair = MotorPair(FRONT_MOTOR_LEFT_PORT, FRONT_MOTOR_RIGHT_PORT)
self.linker_motor_vorne: Motor = Motor(FRONT_MOTOR_LEFT_PORT)
self.linker_motor_vorne.set_stall_detection(stop_when_stalled=True)
self.rechter_motor_vorne: Motor = Motor(FRONT_MOTOR_RIGHT_PORT)
self.rechter_motor_vorne.set_stall_detection(stop_when_stalled=True)
self.linker_motor: Motor = Motor(LEFT_MOTOR_PORT)
@ -42,7 +47,6 @@ class IQRobot:
self.abstandsSensor: DistanceSensor = DistanceSensor("D")
def show(self, image: str):
'''
Zeige Bild auf LED Matrix des Spikes
@ -50,65 +54,99 @@ class IQRobot:
'''
self.hub.light_matrix.show_image(image)
def strecke_gefahren(self):
'''
Gibt die gefahrene Strecke basierend auf den Radumdrehungen zurück
'''
return -self.linker_motor.get_degrees_counted()/360 * self.rad_umfang
def drehe(self, grad=90, with_reset=True):
def drehe(self, grad=90, with_reset=True, speed=10):
"""
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
:param bool with_reset: Parameter, um den Gierwinkel zurückzusetzen, Standard: True
"""
# ist überhaupt etwas zu tun für uns? d.h. grad ist enweder 0 oder 360
if grad == 0 or grad == 360 :
print("nichts zu tun")
return
# soll der Gierwinkel zurückgesetzt werden?
if with_reset:
self.bewegungsSensor.reset_yaw_angle()
self.bewegungsSensor.reset_yaw_angle() # Gierwinkel zurücksetzen
#steering = 100 if grad > 0 else -100
toleranz = 0
aktuell = self.bewegungsSensor.get_yaw_angle()
toleranz = 0 # Toleranz soll null sein. Kann erhöht werden, falls der Roboter sich unendlich dreht.
aktuell = self.bewegungsSensor.get_yaw_angle() # Aktuelle Position
ziel = grad
steering = 100 if ziel > aktuell else -100
self.antrieb.start(steering=steering, speed=10)
self.antrieb.start(steering=steering, speed=speed) # Mit bestimmer Geschwindigkeit starten
differenz = ziel - aktuell
print ("Start Ziel: {}, Aktuell: {}".format(ziel, aktuell))
# wiederhole solange der Grad der Drehung noch nicht erreicht ist
while abs(differenz) > toleranz :
aktuell = self.bewegungsSensor.get_yaw_angle()
differenz = ziel - aktuell
pass
# stoppe die Bewegung
self.antrieb.stop()
print ("Final Ziel: {}, Aktuell: {}".format(ziel, aktuell))
def fahre_gerade_aus(self, cm, speed=20):
self.linker_motor.set_degrees_counted(0)
"""
Funktion um den Roboter geradeaus fahren zu lassen
:param int cm: Strecke in cm, die der Roboter geradeaus fahren soll
:param int speed: Geschwindigkeit zum Fahren der Strecke, Standard: 20
"""
# ist überhaupt etwas zu tun für uns? d.h. cm = 0
if cm == 0 :
print("nichts zu tun")
return
# wollen wir vorwärts oder rückwarts fahren?
richtung = 1
if cm < 0:
richtung = -1
speed = speed * richtung # Die Geschwindigkeit soll negativ sein, wenn wir rückwärts fahren
# Alles zurücksetzen
self.linker_motor.set_degrees_counted(0)
self.bewegungsSensor.reset_yaw_angle()
# Mit irgendeiner Geschwindigkeit g>0 starten. Wert ist irrelevant
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:
wait_for_seconds(0.05)
sum_cm = self.strecke_gefahren()
versatz = self.bewegungsSensor.get_yaw_angle()
linker_speed=speed # Geschwindigkeit linker Motor
rechter_speed=speed # Geschwindigkeit rechter Motor
kp = 1.5 # Verstärkungsfaktor zur Regelung
ki = 1.0 # Integralfaktor zur Regelung
sum_cm = 0 # bereits gefahrene Strecke
versatz = 0 # aktueller Versatz
sum_versatz = 0 # Summe des Versatzes über Zeit
# wiederhole solange die gefahrene Strecke noch nicht erreicht ist
while sum_cm < cm * richtung:
wait_for_seconds(0.05) # Sonst wird das zu oft ausgeführt
sum_cm = self.strecke_gefahren() * richtung # Gefahrene Strecke, ggf. eben negativ machen
versatz = self.bewegungsSensor.get_yaw_angle() # Um wie viel sind wir falsch?
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))
abweichung = (kp * versatz + ki * sum_versatz) / 100 # Abweichung berechnen, um zu korrigieren
linker_speed = speed * (1 - abweichung * richtung)
rechter_speed = speed * (1 + abweichung * richtung)
self.antrieb.start_tank_at_power(int(linker_speed), int(rechter_speed)) # Mit neuer Geschwindigkeit starten
#print("Versatz: " + str(versatz) + " , linker Speed: " + str(linker_speed) + ", rechter Speed: " + str(rechter_speed) + ", strecke: " + str(sum_cm))
self.antrieb.stop()
self.drehe(-versatz)
self.antrieb.stop() # Stoppen
self.drehe(-versatz) # Da Versatz immer != 0, korrigieren
def fahre_mit_drehung(self, strecke1, grad, strecke2):
"""
@ -119,11 +157,14 @@ class IQRobot:
self.fahre_gerade_geregelt(strecke1 + self.abstand_rad_front)
self.drehe(grad)
self.fahre_gerade_geregelt(strecke2 - self.abstand_rad_front)
#deprecated
def fahre_gerade_aus_alt(self, cm: float, speed: int):
"""
Funktion zum gerade aus fahren mit Korrektur am Ende
Wird nicht mehr aktiv genutzt, da wir jetzt fahre_gerade_aus haben,
welche geregelt ist, und der Roboter daher nicht schief wird.
:param int cm: Zentimeter die gerade aus gefahren werden soll
:param speed: Geschwindigkeit mit der gefahren wird
@ -142,17 +183,36 @@ class IQRobot:
self.antrieb.move(amount=richtung * 0.1, steering=100)
drehung = self.bewegungsSensor.get_yaw_angle()
print(drehung)
def heber(self, cm,speed):
self.bothFrontMotors.move_tank(-cm*3.3,"cm", -speed, speed)
def schaufel(self,prozent):
def heber(self, cm,speed):
"""
Lässt den Heber fahren
:param speed: Geschwindigkeit, mit der der Heber bewegt wird
:param cm: Um wie viel soll der Heber bewegt werden?
"""
self.bothFrontMotors.move_tank(-cm*3.3,"cm", -speed, speed) # Heber bewegen
def schaufel(self,prozent, speed=20):
"""
Lässt die Schaufel fahren
:param prozent: Auf wie viel Prozent soll die Schaufel bewegt werden?
"""
volle_umdrehung=0.29
rotations=volle_umdrehung*prozent/100
self.bothFrontMotors.move(rotations, unit='rotations',speed=20)
#self.bothFrontMotors.move(rotations, unit='rotations',speed=20)
self.bothFrontMotors.move_tank(rotations, 'rotations', speed, -speed)
# TODO: Geregeltes Fahren ist noch nicht eingebaut
def fahre_bis_abstand(self, abstand: int, speed=30, geregelt=True):
"""
Nutzt den Abstandssensor, um zu fahren, bis ein Abstand erreicht ist
:param abstand: Abstand zum Objekt
:param speed: Geschwindigkeit, mit der gefahren wird
:param geregelt: Soll mit Regler gefahren werden?
"""
self.antrieb.start_at_power(speed)
abstand_gerade = self.abstandsSensor.get_distance_cm()
while abstand_gerade > abstand:
@ -161,7 +221,7 @@ class IQRobot:
self.antrieb.stop()
print("successfully loaded the IQ Lego teams code :)")
print("Fertig geladen.")

23
main.py
View file

@ -27,11 +27,11 @@ def importFile(slotid=0, precompiled=False, module_name='importFile'):
with open("/projects/.slots","rt") as f:
slots = eval(str(f.read()))
print(slots)
print(os.listdir("/projects/"+str(slots[slotid]["id"])))
#print(os.listdir("/projects/"+str(slots[slotid]["id"])))
with open("/projects/"+str(slots[slotid]["id"])+"/__init__"+suffix,"rb") as f:
print("trying to read import program")
program = f.read()
print(program)
#print(program)
try:
os.remove("/"+module_name+suffix)
except:
@ -52,14 +52,6 @@ def importFile(slotid=0, precompiled=False, module_name='importFile'):
# Dateiname und Modulname sollten gleich sein, dann kann man Code Completion nutzen
importFile(slotid=6, precompiled=True, module_name="iqrobot")
import iqrobot as iq
print(iq.HELLO)
# Importiere Go Robot Code
#importFile(slotid=3, precompiled=True, module_name="gorobot")
#import gorobot as gr
#gr.exampleFour()
#gr.db.gyroRotation(90, 25, 35, 25)
################### Hauptcode ####################################
'''
@ -107,7 +99,7 @@ def hologram():
iqRobot.drehe(45)
iqRobot.fahre_gerade_aus(15,30)
iqRobot.fahre_gerade_aus(-15,30)
def augmented_reality():
iqRobot.drehe(-135)
iqRobot.fahre_gerade_aus(42,30)
@ -119,8 +111,9 @@ def augmented_reality():
iqRobot.fahre_gerade_aus(20,30)
iqRobot.drehe(-90)
iqRobot.fahre_gerade_aus(5,20)
druckmaschine()
hologram()
augmented_reality()
#iqRobot.fahre_gerade_aus(16, 20)
#iqRobot.drehe(38)
#iqRobot.fahre_gerade_aus(33,25)
iqRobot.schaufel(1600, speed=100 )
iqRobot.schaufel(-1600, speed=100 )