Compare commits

...

33 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
Lars Haferkamp
0fc7e4ac37 Merge branch 'main' into treffen-221123
* main:
  Kleiner Fix, kein self da nicht in einer Klasse
  Hünchen
  .
  Gerade aus Fahr Funktion mit PI Regler
  Docs
  Debug entfernt
  Port gefixt
  Abstandssensor
  TEst

# Conflicts:
#	main.py
2023-11-29 10:52:11 +01:00
9721fd02b1 Merge pull request 'Hünchenaufgabe' (#11) from laptop01 into main
Reviewed-on: #11
Reviewed-by: Lars Haferkamp <lahaferk@linuxmuster.lan>
2023-11-22 19:17:39 +00:00
Lars Haferkamp
16601f268a Kleiner Fix, kein self da nicht in einer Klasse 2023-11-22 20:16:47 +01:00
Lars Haferkamp
a64f0c639a Merge branch 'main' into laptop01
* main:
  .
  Gerade aus Fahr Funktion mit PI Regler
  Docs
  Debug entfernt
  Port gefixt
  Abstandssensor
  Ungenutzten Code/Robot Config entfernt und etwas dokumentiert
  Heber Funktion
  Schaufel Funktion
  Aufgabe 07: Hologramm

# Conflicts:
#	main.py
2023-11-22 20:14:36 +01:00
(MakerLab) Laptop 2
a20dc32020 hologram, druckmaschine und augmented reality 2023-11-22 19:19:01 +01:00
Makerlab Laptop 1
1214813e2a Hünchen 2023-11-22 19:16:58 +01:00
060a72c2a7 Merge pull request 'Abstandssensor' (#9) from laptop_3 into main
Reviewed-on: #9
Reviewed-by: Lars Haferkamp <lahaferk@linuxmuster.lan>
2023-11-22 18:01:14 +00:00
d82f252f7f Merge pull request 'Gerade aus fahren' (#10) from fahre_gerade into main
Reviewed-on: #10
Reviewed-by: Lars Haferkamp <lahaferk@linuxmuster.lan>
2023-11-22 17:59:20 +00:00
Lars Haferkamp
cd47da6f23 Gerade aus Fahr Funktion mit PI Regler 2023-11-22 18:56:19 +01:00
(MakerLab) Laptop 2
83970cc053 erste Aufgaben 2023-11-22 17:14:36 +01:00
c40f2a97ed Merge pull request 'Heber Funktion' (#7) from laptop_3 into main
Reviewed-on: #7
2023-11-16 19:37:44 +00:00
unknown
d7026c60ad TEst 2023-11-08 19:03:45 +01:00
3 changed files with 145 additions and 42 deletions

View file

@ -16,7 +16,7 @@ Importiere den Code entweder über die Shell
oder einen Git Client:
- für Mac oder Windows: https://www.sourcetreeapp.com/
Username und PW für Makerlab eingeben
Benutzername und Passwort für Makerlab eingeben
Übersicht über Git Commands: https://ndpsoftware.com/git-cheatsheet.html#loc=workspace;

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,21 +27,26 @@ 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)
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()
self.abstandsSensor: DistanceSensor = DistanceSensor("D")
def show(self, image: str):
'''
Zeige Bild auf LED Matrix des Spikes
@ -48,53 +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_geregelt(self, cm):
def fahre_gerade_aus(self, cm, speed=20):
"""
WIP by Lars & Klaus
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)
sum_cm = 0
while sum_cm < cm:
self.antrieb.move(1)
versatz = self.bewegungsSensor.get_yaw_angle()
self.drehe(grad=-versatz)
self.bewegungsSensor.reset_yaw_angle()
sum_cm = sum_cm + 1
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
self.antrieb.move(cm - sum_cm)
# 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 # 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() # Stoppen
self.drehe(-versatz) # Da Versatz immer != 0, korrigieren
def fahre_mit_drehung(self, strecke1, grad, strecke2):
"""
@ -105,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)
def fahre_gerade_aus(self, cm: float, speed: int):
#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
@ -128,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:
@ -147,7 +221,7 @@ class IQRobot:
self.antrieb.stop()
print("successfully loaded the IQ Lego teams code :)")
print("Fertig geladen.")

53
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 ####################################
'''
@ -79,7 +71,15 @@ iqRobot: iq.IQRobot = iq.IQRobot(hub)
# Führe Funktionen aus unser Robot Klasse aus:
iqRobot.show('HAPPY')
def hologram_aufgabe1():
def huenchenaufgabe():
iqRobot.fahre_gerade_aus(40,60)
iqRobot.drehe(-40,True)
iqRobot.fahre_gerade_aus(20,60)
iqRobot.drehe(-20)
iqRobot.fahre_gerade_aus(55,60)
iqRobot.heber(10,30)
def hologram_alt():
iqRobot.fahre_gerade_aus(cm=75,speed=80)
iqRobot.drehe(45, False)
iqRobot.fahre_gerade_aus(cm=14,speed=70)
@ -87,4 +87,33 @@ def hologram_aufgabe1():
iqRobot.drehe(-45, False)
iqRobot.fahre_gerade_aus(cm=-75,speed=50)
hologram_aufgabe1()
def druckmaschine():
iqRobot.fahre_gerade_aus(19,30)
iqRobot.drehe(-45)
iqRobot.fahre_gerade_aus(20,30)
iqRobot.fahre_gerade_aus(-15,30)
def hologram():
iqRobot.drehe(45)
iqRobot.fahre_gerade_aus(37.5,30)
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)
iqRobot.drehe(90)
iqRobot.fahre_gerade_aus(12,30)
iqRobot.schaufel(-100)
iqRobot.fahre_gerade_aus(-3,30)
iqRobot.drehe(90)
iqRobot.fahre_gerade_aus(20,30)
iqRobot.drehe(-90)
iqRobot.fahre_gerade_aus(5,20)
#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 )