Seite 1 von 1

"roboter" soll quadrat abfahren

Verfasst: Donnerstag 2. Mai 2019, 21:33
von milaTheGreat
hey,

ich hoffe jmd kann mir bei meinem code weiter helfen weil ich selbst langsam ein bisschen verzweifle weil es einfach nicht laufen will :/
wie im betreff gesagt soll mein kleiner roboter ein quadrat abfahren.
startpunkt (mit motor laufend & gerade strecke): 25cm
dann soll er sich anhand eines sensors um 90grad drehen, nach den 25cm also nach links drehen und dann für 25cm wieder gerade aus.
dann: drehung nach rechts, gerade aus fahren für 50cm (diese anweisung 3 mal hintereinander ausführen damit ein quadrat "abgefahren" entsteht) und danach wieder 25cm (die zweite hälfte von den 50cm "vom anfang"), dann linksdrehung und dann wieder 25cm zur startposition zurück.
also dass es theoretisch so aussehen soll:
__
|__|
||

hier ist mein code und schonmal vielen dank für eure hilfe/ tipps!

#!/usr/bin/env python3
import ev3dev.ev3 as ev3
from time import sleep

wheel = 17.28 #umfang

def straight(line):
degree = line / wheel * 360
motor_left.run_to_rel_pos(position_sp=degree, speed_sp=150, stop_action="hold")
motor_right.run_to_rel_pos(position_sp=degree, speed_sp=150, stop_action="hold")

def turn(sensorAngle):
angleBeforTurn= gy.value()
angleAfterTurn= angleBeforeTurn+sensorAngle
if angleAfterTurn > angleBeforeTurn:
motor_left.run_forever(speed_sp=150)
motor_right.run_forever(speed_sp=-150)
else:
motor_left.run_forever(speed_sp=-150)
motor_right.run_forever(speed_sp=150)
turnAround = True
while turnAround:
angle = gy.value()
if angleBeforeTurn < angleAfterTurn:
if angleAfterTurn < angle:
motor_left.stop(stop_action="hold")
motor_right.stop(stop_action="hold")
turnAround = False
else:
if angle < angleAfterTurn:
motor_left.stop(stop_action="hold")
motor_right.stop(stop_action="hold")
turnAround = False

gy = GyroSensor()
ts = TouchSensor()

gy.mode = "GYRO-ANG"
units = gy.units

motor_left = LargeMotor('outA')
motor_right = LargeMotor('outD')

Sound.beep()

i = 1;
while i<=6:
sleep(1)
if(i==1 or i==2 or i==6):
straight(25)
else:
straight(50)
sleep(1)

if(i==1 or i==6):
turn(-80)
else:
turn(80)

sleep(1)
straight(25)
sleep(2)
Sound.Speak("task end")

Re: "roboter" soll quadrat abfahren

Verfasst: Donnerstag 2. Mai 2019, 22:05
von Sirius3
Die Frage ist ja, warum Du um 80 drehst, wenn Du 90° haben willst?

Ansonsten ist das keine gute Fehlerbeschreibung. Was passiert? Was erwartest Du statt dessen?
Hast Du die einzelnen Teile getestet, bevor Du sie zu komplexeren Routinen zusammengebaut hast?

Re: "roboter" soll quadrat abfahren

Verfasst: Donnerstag 2. Mai 2019, 22:09
von __deets__
Wir haben deinen Roboter nicht. Entsprechend können wir auch nicht wissen, was der macht. Wie also genau sieht das Fehlverhalten aus? Und bitte setz den Code in Code Tags (knopf </> im vollständigen Editor).

Re: "roboter" soll quadrat abfahren

Verfasst: Donnerstag 2. Mai 2019, 22:13
von milaTheGreat
weil der roboter schon durch mehrere hände gegangen ist und nicht mehr wirklich genau auf 90 calibrierbar ist. ich hab durch testen rausgefunden das es wenn man 80 einstellt noch am ehesten an die 90grad ran kommt. stellt man 90 grad ein "überdreht" es ihn.
ich hab klar zuerst erstmal die funktionen am anfang getestet (das war der erste teil der aufgabe dass er erstmal gerade aus fahren soll), die haben funktioniert.
das programm lässt sich garnicht erst starten weil zB als fehlermeldung kam das bei zeile 35 gy=GyroSensor() ein defined block erwartet wurde
aber auch allg versteh nicht ganz wo mein denk/logikfehler ist dass das programm so nicht funktioniert

Re: "roboter" soll quadrat abfahren

Verfasst: Donnerstag 2. Mai 2019, 22:18
von __deets__
Nochmal: zeig deinen Code mit den dazugehörigen Tags. So gehen die in Python relevanten Einrückungen verloren. Und Fehlermeldungen nicht irgendwie aus dem Kopf zitieren. Etwas wie einen defined Block gibt es nicht. Entsprechend wenig kann man dazu sagen. Also bitte die gesamte Fehlermeldung.

Re: "roboter" soll quadrat abfahren

Verfasst: Donnerstag 2. Mai 2019, 22:42
von milaTheGreat

Code: Alles auswählen

#!/usr/bin/env python3
import ev3dev.ev3 as ev3
from time import sleep

wheel = 17.28                                       #umfang

def straight(line):
    degree = line / wheel * 360
    motor_left.run_to_rel_pos(position_sp=degree, speed_sp=150, stop_action="hold")
    motor_right.run_to_rel_pos(position_sp=degree, speed_sp=150, stop_action="hold")

def turn(sensorAngle):
    angleBeforTurn= gy.value()
    angleAfterTurn= angleBeforeTurn+sensorAngle
    if angleAfterTurn > angleBeforeTurn:
        motor_left.run_forever(speed_sp=150)
        motor_right.run_forever(speed_sp=-150)
    else:
        motor_left.run_forever(speed_sp=-150)
        motor_right.run_forever(speed_sp=150)
    turnAround = True
    while turnAround:
        angle = gy.value()				
        if angleBeforeTurn < angleAfterTurn:
            if angleAfterTurn < angle:
                motor_left.stop(stop_action="hold")
                motor_right.stop(stop_action="hold")
                turnAround = False
        else:
            if angle < angleAfterTurn:
                motor_left.stop(stop_action="hold")
                motor_right.stop(stop_action="hold")
                turnAround = False
			
gy = GyroSensor()
ts = TouchSensor()

gy.mode = "GYRO-ANG"
units = gy.units

motor_left = LargeMotor('outA')
motor_right = LargeMotor('outD')

Sound.beep()

i = 1
while i<=6:
	sleep(1)
	if(i==1 or i==2 or i==6):
		straight(25)
	else:
		straight(50)
	sleep(1)
	
	if(i==1 or i==6):
		turn(-80)
	else:
		turn(80)

sleep(1)
straight(25)
sleep(2)
Sound.Speak("task end")




Re: "roboter" soll quadrat abfahren

Verfasst: Donnerstag 2. Mai 2019, 22:47
von __deets__
Syntaktisch ist der Code ok, womit die Fehlermeldung schonmal dazu nicht passt. Bleibt das Verhalten. Ich würde mal auf die sehr verquaste while-Schleife tippen. Statt da so eine komische Konstruktion zu nutzen, die sehr schwer nachvollziehbar ist, schreib die betreffenden Anweisung einfach erstmal hintereinander. Und schau was das ändert.

Re: "roboter" soll quadrat abfahren

Verfasst: Donnerstag 2. Mai 2019, 22:56
von __deets__
Habe den Code mal eingedampft. Kannst ja mal selbst schauen, was da schief lief... hat was mit meiner Vermutung zu tun.

Code: Alles auswählen

from time import  sleep
def straight(line):
    print('straight', line)

def turn(angle):
    print('turn', angle)



i = 1
while i<=6:
	sleep(1)
	if(i==1 or i==2 or i==6):
		straight(25)
	else:
		straight(50)
	sleep(1)
	
	if(i==1 or i==6):
		turn(-80)
	else:
		turn(80)

sleep(1)
straight(25)
sleep(2)

Re: "roboter" soll quadrat abfahren

Verfasst: Freitag 3. Mai 2019, 06:11
von ThomasL
milaTheGreat hat geschrieben: Donnerstag 2. Mai 2019, 22:42

Code: Alles auswählen

import ev3dev.ev3 as ev3
from time import sleep
			
gy = GyroSensor()
ts = TouchSensor()
Bzgl. der Fehlermeldung, die beiden Funktionen sind nicht bekannt, da sie nirgends importiert oder definiert werden.