"roboter" soll quadrat abfahren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
milaTheGreat
User
Beiträge: 3
Registriert: Donnerstag 2. Mai 2019, 21:14

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")
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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).
milaTheGreat
User
Beiträge: 3
Registriert: Donnerstag 2. Mai 2019, 21:14

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
milaTheGreat
User
Beiträge: 3
Registriert: Donnerstag 2. Mai 2019, 21:14

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")



__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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)
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten