Compare commits

..

51 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
Laptop 3
dc59501781 . 2023-11-22 19:00:15 +01: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
Laptop 3
01b4c1ebc6 Docs 2023-11-22 18:49:27 +01:00
Laptop 3
4a0671105b Debug entfernt 2023-11-22 18:48:30 +01:00
Laptop 3
83c580e54f Port gefixt 2023-11-22 18:47:07 +01:00
Laptop 3
6de4a7a70b Abstandssensor 2023-11-22 18:43:25 +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
Lars Haferkamp
d7775d4ac1 Merge branch 'main' into laptop_3
* main:
  Ungenutzten Code/Robot Config entfernt und etwas dokumentiert
  Schaufel Funktion
  Aufgabe 07: Hologramm

# Conflicts:
#	iqrobot.py
2023-11-16 20:36:31 +01:00
820a7d83d4 Merge pull request 'Schaufel Funktion' (#6) from schaufel-funktion into main
Reviewed-on: #6
2023-11-16 09:42:02 +00:00
b5314bcd5d Merge branch 'main' into schaufel-funktion 2023-11-16 09:41:29 +00:00
37ceaa3bcb Merge pull request 'Ungenutzten Code/Robot Config entfernt und etwas dokumentiert' (#8) from cleanup-iqrobot into main
Reviewed-on: #8
2023-11-16 09:39:08 +00:00
Lars Haferkamp
33369ff3e2 Ungenutzten Code/Robot Config entfernt und etwas dokumentiert 2023-11-16 09:26:31 +01:00
36c9b37fb8 Merge pull request 'Aufgabe 07: Hologramm' (#5) from laptop02 into main
Reviewed-on: #5
Reviewed-by: Lars Haferkamp <lahaferk@linuxmuster.lan>
2023-11-16 07:52:24 +00:00
Laptop 3
58477b1d54 Heber Funktion 2023-11-15 18:42:59 +01:00
(MakerLab) Laptop 2
68f71f808f Schaufel Funktion 2023-11-15 18:42:04 +01:00
unknown
d7026c60ad TEst 2023-11-08 19:03:45 +01:00
(MakerLab) Laptop 2
eff2b56555 Aufgabe 07: Hologramm 2023-11-08 18:51:37 +01:00
c8d2452a11 Merge pull request 'Aktuelle Version aus Fahre mit Regler' (#4) from iqrobot into main
Reviewed-on: #4
Reviewed-by: Vincenz Ernst <viernst@linuxmuster.lan>
2023-11-08 17:37:59 +00:00
unknown
ad4b131af6 Funktionen drehe angepasst, fahre_gerade_aus hinzugefügt 2023-10-25 19:27:02 +02:00
Lars Haferkamp
833224793a Fixed and refactored 2023-10-05 08:56:46 +02:00
Lars Haferkamp
127137e79f WIP: Fahren mit Regler 2023-09-27 21:00:25 +02:00
4 changed files with 433 additions and 169 deletions

View file

@ -16,7 +16,7 @@ Importiere den Code entweder über die Shell
oder einen Git Client: oder einen Git Client:
- für Mac oder Windows: https://www.sourcetreeapp.com/ - 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; Übersicht über Git Commands: https://ndpsoftware.com/git-cheatsheet.html#loc=workspace;
@ -67,4 +67,3 @@ cp -r ../spike-prime-api/hub ./
cp -r ../spike-prime-api/spike ./ cp -r ../spike-prime-api/spike ./
``` ```
test

View file

@ -1,9 +1,12 @@
# LEGO type:standard slot:7 autostart # LEGO type:standard slot:6 autostart
from spike import PrimeHub, Motor, MotorPair, ColorSensor, MotionSensor import math
from spike import PrimeHub, Motor, MotorPair, ColorSensor, MotionSensor, DistanceSensor
from spike.control import wait_for_seconds from spike.control import wait_for_seconds
HELLO = "HELLO IQ 2" print("Lade IQ-Bibliothek")
''' '''
Wir nutzen "Duck typing", dh wir schreiben hinter jede Variabel mit ':' die Klasse, zB `leftMotor: Motor` Wir nutzen "Duck typing", dh wir schreiben hinter jede Variabel mit ':' die Klasse, zB `leftMotor: Motor`
@ -11,30 +14,38 @@ damit man dann später auch wieder Code Completion hat bei Nutzung der Variablen
''' '''
class IQRobot: class IQRobot:
def __init__(self, hub: PrimeHub, colorSensorPort: str, typ: str): def __init__(self, hub: PrimeHub):
self.hub: PrimeHub = hub self.hub: PrimeHub = hub
self.typ=typ
if self.typ=="backstein": # Radantrieb
LEFT_MOTOR_PORT = 'F'
RIGHT_MOTOR_PORT = 'B'
FRONT_MOTOR_RIGHT_PORT = "E"
self.frontMotorRight: Motor = Motor(FRONT_MOTOR_RIGHT_PORT)
elif self.typ=="brickies":
LEFT_MOTOR_PORT = 'E' LEFT_MOTOR_PORT = 'E'
RIGHT_MOTOR_PORT = 'F' RIGHT_MOTOR_PORT = 'F'
# Motoren für Aufsätze
FRONT_MOTOR_RIGHT_PORT = "B" FRONT_MOTOR_RIGHT_PORT = "B"
FRONT_MOTOR_LEFT_PORT = "A" 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) 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.leftMotor: Motor = Motor(LEFT_MOTOR_PORT) self.linker_motor: Motor = Motor(LEFT_MOTOR_PORT)
self.rightMotor: Motor = Motor(RIGHT_MOTOR_PORT)
self.movementMotors: MotorPair = MotorPair(LEFT_MOTOR_PORT, RIGHT_MOTOR_PORT)
#self.colorSensor: ColorSensor = ColorSensor(colorSensorPort)
#self.frontMotorLeft: Motor = Motor("C")
self.motionSensor: MotionSensor = MotionSensor()
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
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): def show(self, image: str):
''' '''
@ -43,141 +54,180 @@ class IQRobot:
''' '''
self.hub.light_matrix.show_image(image) 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 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): def drehe(self, grad=90, with_reset=True, speed=10):
# Ermittele Farbintensität über den Farbsensor """
(red, green, blue, colorIntensity) = self.colorSensor.get_rgb_intensity() Funktion um den Roboter auf der Stelle zu drehen
return colorIntensity
def drehe(self, grad=90, with_reset=True): :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: if with_reset:
self.motionSensor.reset_yaw_angle() self.bewegungsSensor.reset_yaw_angle() # Gierwinkel zurücksetzen
steering = 100 if grad > 0 else -100
self.movementMotors.start(steering=steering, speed=10) #steering = 100 if grad > 0 else -100
while abs(self.motionSensor.get_yaw_angle()) < abs(grad): 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=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 pass
self.movementMotors.stop()
# stoppe die Bewegung
self.antrieb.stop()
print ("Final Ziel: {}, Aktuell: {}".format(ziel, aktuell))
def drehe_robot(self, grad=90): def fahre_gerade_aus(self, cm, speed=20):
if self.typ == "backstein": """
radius=9.5 Funktion um den Roboter geradeaus fahren zu lassen
stift_versatz=2.2
if self.typ == "brickies": :param int cm: Strecke in cm, die der Roboter geradeaus fahren soll
radius=17.4 :param int speed: Geschwindigkeit zum Fahren der Strecke, Standard: 20
stift_versatz=0.3 """
self.fahre_gerade(-radius - stift_versatz)
# 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 # 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 # 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):
"""
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.drehe(grad)
self.fahre_gerade(radius - stift_versatz) self.fahre_gerade_geregelt(strecke2 - self.abstand_rad_front)
def fahre_gerade(self, cm, zeichne=False):
if zeichne:
self.bewege_stift(1) # Stift runter
self.motionSensor.reset_yaw_angle()
if self.typ == "brickies":
cm = -cm
self.movementMotors.move(cm)
if zeichne:
self.bewege_stift(-1) # Stift hoch
versatz = self.motionSensor.get_yaw_angle()
self.drehe(grad=-versatz)
def buchstabe_zu_segmenten(self, buchstabe):
# Segmente um Buchstaben zu schreiben
# 4_
# 5 |__|3
# 0 |6_|2
# 1
#
buchstabe_zu_segmenten = {"L": [1,1,0,0,0,1,0], "E": [1,1,0,0,1,1,1], "G": [1,1,1,0,1,1,0], "O": [1,1,1,1,1,1,0]}
return buchstabe_zu_segmenten[buchstabe]
def bewege_stift(self, richtung): #deprecated
if self.typ == "backstein": def fahre_gerade_aus_alt(self, cm: float, speed: int):
self.frontMotorRight.run_for_rotations(richtung*0.4) """
if self.typ == "brickies": Funktion zum gerade aus fahren mit Korrektur am Ende
#print("bewege stift brickies") Wird nicht mehr aktiv genutzt, da wir jetzt fahre_gerade_aus haben,
self.bothFrontMotors.move(-richtung*0.2, unit='rotations', speed=5) welche geregelt ist, und der Roboter daher nicht schief wird.
def schreibe_buchstabe(self, buchstabe): :param int cm: Zentimeter die gerade aus gefahren werden soll
print("Schreibe " + buchstabe) :param speed: Geschwindigkeit mit der gefahren wird
segmente = self.buchstabe_zu_segmenten(buchstabe) """
grad_drehung=-90
self.fahre_gerade(2) self.bewegungsSensor.reset_yaw_angle()
self.drehe_robot(-grad_drehung) # drehe rechts
for segment_nummer, segment in enumerate(segmente): self.antrieb.move_tank(amount=cm,left_speed=speed, right_speed=speed)
print("Segment: " + str(segment) + " , Segment Nummer: " + str(segment_nummer)) drehung = self.bewegungsSensor.get_yaw_angle()
if segment==1: print(drehung)
self.fahre_gerade(5, zeichne=True) if drehung > 0:
richtung = -1
else: else:
self.fahre_gerade(5) richtung = 1
if segment_nummer != 2 and segment_nummer != 6: while abs(drehung) > 2:
self.drehe_robot(grad_drehung) # drehe links self.antrieb.move(amount=richtung * 0.1, steering=100)
drehung = self.bewegungsSensor.get_yaw_angle()
print(drehung)
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_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:
abstand_gerade = self.abstandsSensor.get_distance_cm()
print(str(abstand_gerade))
self.antrieb.stop()
print("Fertig geladen.")
def schreibeL(self, schreibe=True, zurueck=False):
if zurueck:
step = 5
faktor = -1
else:
step = 1
faktor = 1
print("Schreibe L")
#self.frontMotorRight.run_for_rotations(-0.4)
radius=9.5
stift_versatz=2.2
if schreibe:
self.frontMotorRight.run_for_rotations(0.4)
self.movementMotors.set_default_speed(10)
while (True):
if step == 0:
break
if step == 1:
self.movementMotors.move(faktor * 5)
if schreibe:
self.frontMotorRight.run_for_rotations(-0.4)
if step == 2:
self.movementMotors.move(faktor * (-radius - stift_versatz))
if step == 3:
self.drehe(faktor * -90)
if step == 4:
self.movementMotors.move(faktor*(radius - stift_versatz))
if schreibe:
self.frontMotorRight.run_for_rotations(0.4)
if step == 5:
self.movementMotors.move(faktor * 2)
if schreibe:
self.frontMotorRight.run_for_rotations(-0.4)
if step == 6:
break
step += faktor
# Fahre 5 cm rückwerts
# dann drehe nach rechts 90°
# und fahre 2cm fohrwärts
#stift hoch
def schreibeLego(self):
#self.schreibeL()
#self.schreibeL(schreibe=False, zurueck=True)
self.movementMotors.set_default_speed(10)
self.bewege_stift(-1)
self.fahre_gerade(4, zeichne=True)
self.drehe_robot()
self.fahre_gerade(4, zeichne=True)
#self.schreibe_buchstabe("L")
#self.schreibe_buchstabe("E")
#self.schreibe_buchstabe("G")
#self.schreibe_buchstabe("O")
print("successfully loaded the IQ Lego teams code :)")

187
iqrobot_schreiber.py Normal file
View file

@ -0,0 +1,187 @@
# LEGO type:standard slot:7 autostart
########################################################################
# "ALTE" VERSION MIT DER WIR VERSUCHT HABEN DAS WORT "LEGO" ZU SCHREIBEN
########################################################################
from spike import PrimeHub, Motor, MotorPair, ColorSensor, MotionSensor
from spike.control import wait_for_seconds
HELLO = "HELLO IQ 2"
'''
Wir nutzen "Duck typing", dh wir schreiben hinter jede Variabel mit ':' die Klasse, zB `leftMotor: Motor`
damit man dann später auch wieder Code Completion hat bei Nutzung der Variablen
'''
class IQRobot:
def __init__(self, hub: PrimeHub, colorSensorPort: str, typ: str):
self.hub: PrimeHub = hub
self.typ=typ
if self.typ=="backstein":
LEFT_MOTOR_PORT = 'F'
RIGHT_MOTOR_PORT = 'B'
FRONT_MOTOR_RIGHT_PORT = "E"
self.frontMotorRight: Motor = Motor(FRONT_MOTOR_RIGHT_PORT)
elif self.typ=="brickies":
LEFT_MOTOR_PORT = 'E'
RIGHT_MOTOR_PORT = 'F'
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)
self.leftMotor: Motor = Motor(LEFT_MOTOR_PORT)
self.rightMotor: Motor = Motor(RIGHT_MOTOR_PORT)
self.movementMotors: MotorPair = MotorPair(LEFT_MOTOR_PORT, RIGHT_MOTOR_PORT)
#self.colorSensor: ColorSensor = ColorSensor(colorSensorPort)
#self.frontMotorLeft: Motor = Motor("C")
self.motionSensor: MotionSensor = MotionSensor()
def show(self, image: str):
'''
Zeige Bild auf LED Matrix des Spikes
image: Bildname wie zB 'HAPPY'
'''
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):
if with_reset:
self.motionSensor.reset_yaw_angle()
steering = 100 if grad > 0 else -100
self.movementMotors.start(steering=steering, speed=10)
while abs(self.motionSensor.get_yaw_angle()) < abs(grad):
pass
self.movementMotors.stop()
def drehe_robot(self, grad=90):
if self.typ == "backstein":
radius=9.5
stift_versatz=2.2
if self.typ == "brickies":
radius=17.4
stift_versatz=0.3
self.fahre_gerade(-radius - stift_versatz)
self.drehe(grad)
self.fahre_gerade(radius - stift_versatz)
def fahre_gerade(self, cm, zeichne=False):
if zeichne:
self.bewege_stift(1) # Stift runter
self.motionSensor.reset_yaw_angle()
if self.typ == "brickies":
cm = -cm
self.movementMotors.move(cm)
if zeichne:
self.bewege_stift(-1) # Stift hoch
versatz = self.motionSensor.get_yaw_angle()
self.drehe(grad=-versatz)
def buchstabe_zu_segmenten(self, buchstabe):
# Segmente um Buchstaben zu schreiben
# 4_
# 5 |__|3
# 0 |6_|2
# 1
#
buchstabe_zu_segmenten = {"L": [1,1,0,0,0,1,0], "E": [1,1,0,0,1,1,1], "G": [1,1,1,0,1,1,0], "O": [1,1,1,1,1,1,0]}
return buchstabe_zu_segmenten[buchstabe]
def bewege_stift(self, richtung):
if self.typ == "backstein":
self.frontMotorRight.run_for_rotations(richtung*0.4)
if self.typ == "brickies":
#print("bewege stift brickies")
self.bothFrontMotors.move(-richtung*0.2, unit='rotations', speed=5)
def schreibe_buchstabe(self, buchstabe):
print("Schreibe " + buchstabe)
segmente = self.buchstabe_zu_segmenten(buchstabe)
grad_drehung=-90
self.fahre_gerade(2)
self.drehe_robot(-grad_drehung) # drehe rechts
for segment_nummer, segment in enumerate(segmente):
print("Segment: " + str(segment) + " , Segment Nummer: " + str(segment_nummer))
if segment==1:
self.fahre_gerade(5, zeichne=True)
else:
self.fahre_gerade(5)
if segment_nummer != 2 and segment_nummer != 6:
self.drehe_robot(grad_drehung) # drehe links
def schreibeL(self, schreibe=True, zurueck=False):
if zurueck:
step = 5
faktor = -1
else:
step = 1
faktor = 1
print("Schreibe L")
#self.frontMotorRight.run_for_rotations(-0.4)
radius=9.5
stift_versatz=2.2
if schreibe:
self.frontMotorRight.run_for_rotations(0.4)
self.movementMotors.set_default_speed(10)
while (True):
if step == 0:
break
if step == 1:
self.movementMotors.move(faktor * 5)
if schreibe:
self.frontMotorRight.run_for_rotations(-0.4)
if step == 2:
self.movementMotors.move(faktor * (-radius - stift_versatz))
if step == 3:
self.drehe(faktor * -90)
if step == 4:
self.movementMotors.move(faktor*(radius - stift_versatz))
if schreibe:
self.frontMotorRight.run_for_rotations(0.4)
if step == 5:
self.movementMotors.move(faktor * 2)
if schreibe:
self.frontMotorRight.run_for_rotations(-0.4)
if step == 6:
break
step += faktor
# Fahre 5 cm rückwerts
# dann drehe nach rechts 90°
# und fahre 2cm fohrwärts
#stift hoch
def schreibeLego(self):
#self.schreibeL()
#self.schreibeL(schreibe=False, zurueck=True)
self.movementMotors.set_default_speed(10)
self.bewege_stift(-1)
self.fahre_gerade(4, zeichne=True)
self.drehe_robot()
self.fahre_gerade(4, zeichne=True)
#self.schreibe_buchstabe("L")
#self.schreibe_buchstabe("E")
#self.schreibe_buchstabe("G")
#self.schreibe_buchstabe("O")
print("successfully loaded the IQ Lego teams code :)")

72
main.py
View file

@ -1,4 +1,4 @@
# LEGO type:standard slot:4 autostart # LEGO type:standard slot:5 autostart
import os, sys import os, sys
@ -27,16 +27,15 @@ def importFile(slotid=0, precompiled=False, module_name='importFile'):
with open("/projects/.slots","rt") as f: with open("/projects/.slots","rt") as f:
slots = eval(str(f.read())) slots = eval(str(f.read()))
print(slots) 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: with open("/projects/"+str(slots[slotid]["id"])+"/__init__"+suffix,"rb") as f:
print("trying to read import program") print("trying to read import program")
program = f.read() program = f.read()
print(program) #print(program)
try: try:
os.remove("/"+module_name+".py") os.remove("/"+module_name+suffix)
os.remove("/"+module_name+".mpy")
except: except:
print("Couldn't remove old module") pass
with open("/"+module_name+suffix,"w+") as f: with open("/"+module_name+suffix,"w+") as f:
print("trying to write import program") print("trying to write import program")
f.write(program) f.write(program)
@ -51,16 +50,8 @@ def importFile(slotid=0, precompiled=False, module_name='importFile'):
# Importiere Code aus der Datei "iqrobot.py" # Importiere Code aus der Datei "iqrobot.py"
# Dateiname und Modulname sollten gleich sein, dann kann man Code Completion nutzen # 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 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 #################################### ################### Hauptcode ####################################
''' '''
@ -71,21 +62,58 @@ und auch `hub` als Instanz von PrimeHub
dh auch an die Funktionen im importierten Code übergeben werde dh auch an die Funktionen im importierten Code übergeben werde
''' '''
# Definiere an welchen Ports die Sensoren angeschlossen sind
COLOR_SENSOR_PORT = 'E' #not implemented yet
# Initialisieren des Hubs, der Aktoren und Sensoren # Initialisieren des Hubs, der Aktoren und Sensoren
hub = PrimeHub() hub = PrimeHub()
# Initialisiere Robot Klasse mit unseren Funktionen # Initialisiere Robot Klasse mit unseren Funktionen
iqRobot: iq.IQRobot = iq.IQRobot(hub, COLOR_SENSOR_PORT, typ="brickies") iqRobot: iq.IQRobot = iq.IQRobot(hub)
# Führe Funktionen aus unser Robot Klasse aus: # Führe Funktionen aus unser Robot Klasse aus:
iqRobot.show('HAPPY') iqRobot.show('HAPPY')
iqRobot.schreibeLego()
#iqRobot.schreibeL()
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)
iqRobot.fahre_gerade_aus(cm=-13,speed=50)
iqRobot.drehe(-45, False)
iqRobot.fahre_gerade_aus(cm=-75,speed=50)
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 )