PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Labyrinth



asuro11
16.04.2009, 18:02
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???

asuro11
16.04.2009, 18:21
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???

Flash2over
17.04.2009, 00:56
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!!



#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


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


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

asuro11
17.04.2009, 13:31
ok danke, ist die x variable sozusagen ein zähler wie oft er jetzt an die wand gestoßen ist. oder?

Flash2over
17.04.2009, 23:55
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.

asuro11
26.04.2009, 16:28
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???

asuro11
28.04.2009, 14:40
hat denn keiner meinen fehler entdeckt?

Flash2over
29.04.2009, 22:33
Gibts denn beim Compilen nen Fehler oder nur beim Ausführen?

asuro11
30.04.2009, 14:31
ne nur beim ausführen...ist irgendein fehler im prorgramm denke ich...

asuro11
04.05.2009, 16:56
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??

Flash2over
04.05.2009, 22:07
du kannst auch in der ersten schleife anstatt
x++;
x=2; schreiben und in der zweiten anstatt
x--;
x=1;

und pack das
Msleep(200); vor

if ((PollSwitch()) && (x=1)) //Wenn Tastendruck und x=1 raus

asuro11
05.05.2009, 22:49
und dann müsste es gehen?
werde es mal morgen versuchen (heute ist vielleicht bissle spät ;))

kann es auch sein, dass das x=1 und x=2 daruaf bezogen ist wieviel taster gedrückt sind. nicht dass das dann so ist dass bei 2 gedrückten tastern x=2 ist... aber dürfte eig. nicht sein...

Flash2over
05.05.2009, 23:16
nene dürfte schon stimmen, muss morgen auch mal testen hab den asuro schon weggepackt^^

asuro11
09.05.2009, 13:57
kann ich denn sozusagen einen timer einbauen? dass die 2 if schleife nur abgespielt werden soll wenn er innerhalb von z.b. 10 sek. zum 2. auf die wand trifft?
weil so passiert es bei 2 linkskurven, dass er links fährt, gerade aus, und anstatt dann einfach links dreht er um 180grad und fährt zurück. daher möchte ich sagen dass nur wenn er innerhalb einer bestimmten zeit das 2. mal dagegen fährt 180grad dreht...

geht das?

asuro11
10.05.2009, 12:02
mhhhh..... kann keiner helfen?