KMab
15.08.2014, 18:32
Hallo,
ich bin seit kurzem Besitzer eines Asuro und stehe zur Zeit vor dem Problem, dass er allein durch ein Labyrinth finden soll. Dabei gibt es nur rechte Winkel im Labyrinth und auch keine größeren Räume oder solche Späße. Mein Ansatz sah wie folgt aus: Er sollte solange geradeaus fahren bis er an eine Wand stößt, in diesem Fall soll er sich 90° nach rechts drehen und dort überprüfen ob er eine Wand findet. Wenn ja soll er sich 180° nach links drehen und wenn er auch dort eine Wand vorfindet (=Sackgasse) soll er sich noch einmal 90° nach links drehen. Dabei bin ich auf mein erstes Problem gestoßen: Diese Schrittfolge wird auch komplett durchlaufen wenn er nach dem ersten Mal drehen weiterfahren kann, dh. nach dem Rechtsabbiegen würde er sich bei der nächsten Wand 180° drehen und damit zurückfahren. Aus diesem Grund habe ich eine Zählvariable x eingeführt, die die Schleifendurchläufe nach der 90° Drehung nach rechts zählen soll und daraus ermittelt ob gleich nach der Drehung wieder eine Wand kommt oder ob er erst noch ein Stück fährt bevor er wieder anstößt. Und wenn letzteres eintritt, dann soll das Programm wieder von vorn beginnen und nicht bis zum Ende durchlaufen. Ok, um die eventuelle Verwirrung etwas zu beseitigen, hier mein Code:
#include "asuro.h"
int main(void)
{
Init();
void PrintInt(int wert)
{
char text[6] ={0};
itoa(wert,text,10);
SerWrite(text,strlen(text));
}
char MauerVORN,MauerRECHTS,MauerLINKS;
int S1,S2,S3;
int x;
int i;
while(1)
{
MauerVORN=0;
MauerRECHTS=0;
MauerLINKS=0;
x=0;
while (MauerVORN==0)
{
MotorDir(FWD,FWD);
MotorSpeed(150,150);
S1=PollSwitch();
S2=PollSwitch();
S3=PollSwitch();
if (S1!=0||S2!=0||S3!=0)
{MauerVORN=1;}
else
{MauerVORN=0;}
}
MotorDir(RWD,RWD);
MotorSpeed(120,120);
for (i=1;i<80;i++) {Sleep(255);}
MotorDir(FWD,RWD);
for (i=1;i<120;i++) {Sleep(255);}
while (MauerRECHTS==0)
{
x++;
MotorDir(FWD,FWD);
MotorSpeed(150,150);
S1=PollSwitch();
S2=PollSwitch();
S3=PollSwitch();
if (S1!=0||S2!=0||S3!=0)
{MauerRECHTS=1;}
else
{MauerRECHTS=0;}
}
PrintInt(x);
if (x>30/*???*/)
{
MauerLINKS=1;
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
for (i=1;i<80;i++) {Sleep(255);}
MotorDir(FWD,RWD);
for (i=1;i<200;i++) {Sleep(255);}
}
while (MauerLINKS==0)
{
MotorDir(FWD,FWD);
MotorSpeed(150,150);
S1=PollSwitch();
S2=PollSwitch();
S3=PollSwitch();
if (S1!=0||S2!=0||S3!=0)
{MauerLINKS=1;}
else
{MauerLINKS=0;}
}
if (x<30/*???*/)
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
for (i=1;i<80;i++) {Sleep(255);}
MotorDir(FWD,RWD);
for (i=1;i<120;i++) {Sleep(255);}
}
}
return 0;
}
Leider funktioniert es noch nicht ganz wie es soll. Asuro fährt immer nur kurz rückwärts und dreht sich um 90 oder 180°. Ich bin mit meinem Latein echt am Ende.
Man merkt vielleicht, dass ich noch Anfänger in C++ bin. In der Schule hatte ich nur Delphi. Da ist vieles einfacher.
Vielen Dank im Voraus für eure Hilfe.
Gruß KMab
ich bin seit kurzem Besitzer eines Asuro und stehe zur Zeit vor dem Problem, dass er allein durch ein Labyrinth finden soll. Dabei gibt es nur rechte Winkel im Labyrinth und auch keine größeren Räume oder solche Späße. Mein Ansatz sah wie folgt aus: Er sollte solange geradeaus fahren bis er an eine Wand stößt, in diesem Fall soll er sich 90° nach rechts drehen und dort überprüfen ob er eine Wand findet. Wenn ja soll er sich 180° nach links drehen und wenn er auch dort eine Wand vorfindet (=Sackgasse) soll er sich noch einmal 90° nach links drehen. Dabei bin ich auf mein erstes Problem gestoßen: Diese Schrittfolge wird auch komplett durchlaufen wenn er nach dem ersten Mal drehen weiterfahren kann, dh. nach dem Rechtsabbiegen würde er sich bei der nächsten Wand 180° drehen und damit zurückfahren. Aus diesem Grund habe ich eine Zählvariable x eingeführt, die die Schleifendurchläufe nach der 90° Drehung nach rechts zählen soll und daraus ermittelt ob gleich nach der Drehung wieder eine Wand kommt oder ob er erst noch ein Stück fährt bevor er wieder anstößt. Und wenn letzteres eintritt, dann soll das Programm wieder von vorn beginnen und nicht bis zum Ende durchlaufen. Ok, um die eventuelle Verwirrung etwas zu beseitigen, hier mein Code:
#include "asuro.h"
int main(void)
{
Init();
void PrintInt(int wert)
{
char text[6] ={0};
itoa(wert,text,10);
SerWrite(text,strlen(text));
}
char MauerVORN,MauerRECHTS,MauerLINKS;
int S1,S2,S3;
int x;
int i;
while(1)
{
MauerVORN=0;
MauerRECHTS=0;
MauerLINKS=0;
x=0;
while (MauerVORN==0)
{
MotorDir(FWD,FWD);
MotorSpeed(150,150);
S1=PollSwitch();
S2=PollSwitch();
S3=PollSwitch();
if (S1!=0||S2!=0||S3!=0)
{MauerVORN=1;}
else
{MauerVORN=0;}
}
MotorDir(RWD,RWD);
MotorSpeed(120,120);
for (i=1;i<80;i++) {Sleep(255);}
MotorDir(FWD,RWD);
for (i=1;i<120;i++) {Sleep(255);}
while (MauerRECHTS==0)
{
x++;
MotorDir(FWD,FWD);
MotorSpeed(150,150);
S1=PollSwitch();
S2=PollSwitch();
S3=PollSwitch();
if (S1!=0||S2!=0||S3!=0)
{MauerRECHTS=1;}
else
{MauerRECHTS=0;}
}
PrintInt(x);
if (x>30/*???*/)
{
MauerLINKS=1;
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
for (i=1;i<80;i++) {Sleep(255);}
MotorDir(FWD,RWD);
for (i=1;i<200;i++) {Sleep(255);}
}
while (MauerLINKS==0)
{
MotorDir(FWD,FWD);
MotorSpeed(150,150);
S1=PollSwitch();
S2=PollSwitch();
S3=PollSwitch();
if (S1!=0||S2!=0||S3!=0)
{MauerLINKS=1;}
else
{MauerLINKS=0;}
}
if (x<30/*???*/)
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
for (i=1;i<80;i++) {Sleep(255);}
MotorDir(FWD,RWD);
for (i=1;i<120;i++) {Sleep(255);}
}
}
return 0;
}
Leider funktioniert es noch nicht ganz wie es soll. Asuro fährt immer nur kurz rückwärts und dreht sich um 90 oder 180°. Ich bin mit meinem Latein echt am Ende.
Man merkt vielleicht, dass ich noch Anfänger in C++ bin. In der Schule hatte ich nur Delphi. Da ist vieles einfacher.
Vielen Dank im Voraus für eure Hilfe.
Gruß KMab