-
Labyrinth
hallo möchte meinen asuro im labyrinth fahren lassen.
meine grundidee war:
stößt er gegen eine wand, soll er rückwärtsfahren und sich um 90 grad nach links drehen und weiterfahren. stößt er dann ein 2. mal gegen die wand soll er sich um 180 grad drehen und weiterfahren.
leider dreht sich mein asuro nur um ca. 60 grad und macht auch beim 2. mal anstoßen an die wand nur dies und dreht sich nicht um 180 grad. hier ist mal mein programm:
#include "asuro.h"
#include "myasuro.h"
int main(void)
{
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
if (PollSwitch())
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(RWD,BREAK);
Msleep(300);
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
}
if (PollSwitch())
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(RWD,BREAK);
Msleep(300);
MotorSpeed(100,100);
Msleep(200);
}
}
}
kann mir jemand meinen fehler zeigen???
-
es liegt an irgendwelchen zahlenwerten, dir dafür zuständig sind wie lange sich der asuro in einer betimmten bewegung aufhält, aber welche ist das??
oder muss ich vielleicht geschwindigkeiten verändern?
habe mir gedacht zum beispiel beim 1. if für die drehbewegung MOTORSPEED(0,150); dann fährt er nach links
und bei der 2. bewegung (für 180 grad) MOTORSPEED(150,150); MOTORDIE(RWD,FWD) dann müsste er genau doppelt so viel grad überbrücken wie beim ersten mal drehen, und dann müsste ich an sich doch nur mit den 150 varrieren, dass ich wirklich 90 grad bekomme. dann kann ich ja das mit RWD und BREAK weg lassen oder???
also:
#include "asuro.h"
#include "myasuro.h"
int main(void)
{
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
if (PollSwitch())
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(FWD,FWD);
MotorSpeed(0,150);
Msleep(300);
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
}
if (PollSwitch())
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
Msleep(300);
MotorSpeed(100,100);
Msleep(200);
}
}
}
könnte das so richtig sein???
-
Hi Asuro11,
es gibt hier im Forum ein extra Asuro unterforum. Aber ich versuch dir auch hier zu helfen.
Problem ist das Asuro nicht immer gleich lang brauch für Drehungen (unterschiedliche Reibung führt z.B. zu verzögerungen) daher ist eine zeitliche Zuordnung zwischen Winkel und Geschwindigkeit nicht so leicht möglich. Du könntest aber auf deinem Untergrund durch Versuche die Zeiten ändern. Ich markiere dir dazu unten die Stellen im Quelltext.
Für genaue Drehungen gibt es die Odometrie (das Ding mit dem Schwaz-Weiß Aufkleber auf den Rädern). Da ein direkter Einstieg in die Odometrie etwas kompliziert ist solltest du vll einstmal anfangen mit der erweiterten Befehlsbibliothek von m.a.r.v.i.n. Diese gibt es hier im Asuro Unterforum. Mit dieser kannst du direkt über einen C-Befehl Asuro um eine bestimmte Gradzahl drehen lassen.
Außerdem stimmt in deinem Programm etwas nicht: Du hast 2 gleiche if Bedingungen drin. Das ist ein Logikproblem. Du willst so weit ich verstehe beim ersten Anstoßen um 90Grad drehen und beim 2. um 180. Dabei müsste der Code so aussehen:
ACHTUNG! Ich habe nur den Code so verändert das beide Anweisungen wie gewollt ausgeführt werden. Werte sind nicht korrigiert!!
Code:
#include "asuro.h"
#include "myasuro.h"
int main(void)
{
int x=1; //X Variable als Zähler einführen und auf 1 setzen
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
if ((PollSwitch()) && (x=1)) //Wenn Tastendruck und x=1
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(FWD,FWD);
MotorSpeed(0,150);
Msleep(300); //80Grad Drehung
MotorDir(FWD,FWD); //Zeile kannste weg lassen
MotorSpeed(100,100); //Zeile kannste weg lassen
Msleep(200); //Zeile kannste weg lassen
x++; //x um 1 erhöhen (x wird 2)
}
if ((PollSwitch()) && (x=2)) //Wenn Tastendruck und x=2 (2. Tastendruck)
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(RWD,FWD);
MotorSpeed(150,150);
Msleep(300); //Drehung 90Grad (Siehe Bemerkung unten)
MotorSpeed(100,100);
Msleep(200); //+Drehung 90Grad(Siehe Bemerkung unten)
x--; //x um 1 verringern (x wird wieder 1)
}
}
}
Den Teil
Code:
MotorDir(RWD,FWD);
MotorSpeed(150,150);
Msleep(300); //Drehung 90Grad (Siehe Bemerkung unten)
MotorSpeed(100,100);
Msleep(200); //+Drehung 90Grad(Siehe Bemerkung unten)
Kanste ändern in
Code:
MotorDir(FWD,FWD);
MotorSpeed(0,150);
Msleep(300);
Msleep(300);
Im Text oben würde abwechselnd die erste if bedingung und die 2. if Bedinung eintreten also zuerst um 90Grad drehn dann um 180Grad drehn.
außerdem fehlt am ende die return 0; anweißung
Gruß
Thomas
-
ok danke, ist die x variable sozusagen ein zähler wie oft er jetzt an die wand gestoßen ist. oder?
-
genau das x++; erweitert die variable um 1 dann wird die 2. Schleife abgespielt. Das x--; in der 2. Schleife vermindert die variable um 1 und die erste Schleife wird wieder abgespielt.
-
habe jetzt das programm:
#include "asuro.h"
#include "myasuro.h"
int main(void)
{
int x=1; //X Variable als Zähler einführen und auf 1 setzen
Init();
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(200);
if ((PollSwitch()) && (x=1)) //Wenn Tastendruck und x=1
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(FWD,FWD);
MotorSpeed(0,195);
Msleep(300); //90Grad Drehung
x++; //x um 1 erhöhen (x wird 2)
}
if ((PollSwitch()) && (x=2)) //Wenn Tastendruck und x=2 (2. Tastendruck)
{
MotorDir(RWD,RWD);
MotorSpeed(100,100);
Msleep(300);
MotorDir(FWD,RWD);
MotorSpeed(195,195);
Msleep(300);
MotorSpeed(195,195);
Msleep(300); //Drehung 90Grad
//+Drehung 90Grad
x--; //x um 1 verringern (x wird wieder 1)
}
}
return 0;
}
aber die 2. klammer will er mmer noch nicht machen???
-
hat denn keiner meinen fehler entdeckt?
-
Gibts denn beim Compilen nen Fehler oder nur beim Ausführen?
-
ne nur beim ausführen...ist irgendein fehler im prorgramm denke ich...
-
habe mir überlegt anstatt mit x=1 und x=2 (also mit x++ und x--) nur mit x++ zu arbeiten. würde dann eben anstatt x=1 sagen wenn x ungerade ist mach die erste schleife. wenn x gerade dann die 2. gibt es denn einen befehl für gerade und ungerade??