Compare commits

..

26 commits

Author SHA1 Message Date
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
3 changed files with 136 additions and 96 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

@ -2,13 +2,10 @@
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"
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,34 @@ 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.linker_motor: Motor = Motor(LEFT_MOTOR_PORT)
self.antrieb: MotorPair = MotorPair(LEFT_MOTOR_PORT, RIGHT_MOTOR_PORT)
# Radumfang neu berechnen und Motor konfigurieren
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()
# 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):
@ -73,89 +51,114 @@ 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 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
: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_aus(self, cm, speed=20):
self.linker_motor.set_degrees_counted(0)
self.bewegungsSensor.reset_yaw_angle()
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)
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.movementMotors.move(1)
versatz = self.motionSensor.get_yaw_angle()
self.drehe(grad=-versatz)
self.motionSensor.reset_yaw_angle()
sum_cm = sum_cm + 1
wait_for_seconds(0.05)
sum_cm = self.strecke_gefahren()
versatz = self.bewegungsSensor.get_yaw_angle()
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.stop()
self.drehe(-versatz)
self.movementMotors.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_alt(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)
def heber(self, cm,speed):
self.bothFrontMotors.move_tank(-cm*3.3,"cm", -speed, speed)
def schaufel(self,prozent):
volle_umdrehung=0.29
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 :)")
@ -167,3 +170,4 @@ print("successfully loaded the IQ Lego teams code :)")

42
main.py
View file

@ -74,12 +74,20 @@ 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')
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 +95,32 @@ 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)
druckmaschine()
hologram()
augmented_reality()