PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme: Linienverfolgung, Odometrie, Ausweichen bei Kolis.



alma
17.03.2009, 15:08
Hallo,
bin ganz neu auf dem Gebiet "Asuro". Derzeit arbeite ich für ein Schulprojekt an einem Asuro. Abgeben muss ich morgen :(
Leider klappt das Programm noch nicht 100%ig wie ich mir das Vorstelle.
Bislang habe ich nur fleißig im Forum gelesen, jedoch komm ich wirklich nicht weiter.

Der Roboter soll nur mit der asuro.h lib einer Linie folgen, einen Gegenstand bemerken und ausweichen, sowie bei ähnlichen Werten der Sensoren (gerade Linie oder normaler Untergrund) mithilfe der Odometrie geradeaus fahren.

Hier mein Quelltext:

//////////////////////////////////////////////////////////////////////////////////////
------------------aktuellste----------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////////


#include "asuro.h" //Sebastians ultra kram

int main(void)
{

unsigned int data[2];
unsigned int a,v;
unsigned char taste;
unsigned int ododata[2];
Init();

FrontLED(ON);

while(1){
if(PollSwitch()>0)
{
if(PollSwitch()>0)
{
a=0;
taste=PollSwitch();
if(taste==1)
{
while(a<=300)
{
a++;
Sleep(255);
MotorDir(RWD,RWD);
MotorSpeed(120,80);
}
do
{
LineData(data);
MotorDir(FWD,FWD);
MotorSpeed(80,80);
StatusLED(YELLOW);
BackLED(ON,ON);

}while((data[0]-6<data[1])&&(data[0]>data[1]-27));
//mögliche Änderung:}while((data[0]-15 < data[1])&&(data[0] > data[1]-45));
}
else if(taste==32)
{
while(a<=300)
{
a++;
Sleep(255);
MotorDir(RWD,RWD);
MotorSpeed(80,120);
}

do
{
LineData(data);
MotorDir(FWD,FWD);
MotorSpeed(80,80);
StatusLED(YELLOW);
BackLED(ON,ON);

}while((data[0]-6<data[1])&&(data[0]>data[1]-27));
//mögliche Änderung:}while((data[0]-15 < data[1])&&(data[0] > data[1]-45));
}
else if((taste>1)&&(taste!=32))
{
while(a<=300)
{
a++;
Sleep(255);
MotorDir(RWD,RWD);
MotorSpeed(160,80);
}

do
{
LineData(data);
MotorDir(FWD,FWD);
MotorSpeed(80,80);
StatusLED(YELLOW);
BackLED(ON,ON);
data[0];
data[1];
}while((data[0]-6<data[1])&&(data[0]>data[1]-27));
//mögliche Änderung:}while((data[0]-15 < data[1])&&(data[0] > data[1]-45));
}

}
}
else
{
LineData(data);
if((data[0]-5 > data[1])&&(data[0]-15 < data[1]))
{
MotorDir(FWD,FREE);
MotorSpeed(130,220);
StatusLED(RED);
BackLED(OFF,ON);
}

if(data[0]-15 > data[1])
{
MotorDir(FWD,FREE);
MotorSpeed(160,220);
StatusLED(RED);
BackLED(OFF,ON);
}


if((data[0] < data[1]-25)&&(data[0] > data[1]-45))
{
MotorDir(FREE,FWD);
MotorSpeed(220,130);
StatusLED(GREEN);
BackLED(ON,OFF);
}

if(data[0] < data[1]-45)
{
MotorDir(FREE,FWD);
MotorSpeed(220,160);
StatusLED(GREEN);
BackLED(ON,OFF);
}

if((data[0]-5 < data[1])&&(data[0] > data[1]-25))
{
v=120;

OdometrieData(ododata);
if(ododata[0]>=ododata[1])
{v=v+5;}
else
{v=v-5;}
MotorDir(FWD,FWD);
MotorSpeed(120,v);
StatusLED(YELLOW);
BackLED(ON,ON);
}


else;


}
}
return 0;
}

Was sagt ihr zu dem Quelltext?
Wo könnte der Fehler liegen?
Das "maken" udn flashen klappt., aber irgendwie bockt der Asuro. Aber spielt es auf, bzw. schaut es euch an;)

Freue mich auf euere Antworten.
Vielen dank schonmal!

Auch wenn man das Programm nicht optimal ist und es bessere gibt, wäre ich froh, wenn ich dieses Pagramm auf dem Asuro zum laufen bekäme. Das ist dann wenigstens das eigene;)


Gruß

radbruch
17.03.2009, 16:46
Hallo

Die Schrägstriche am Programmanfang hättest du besser für Kommentare im Programm verwendet. Das hier funzt so nicht:


OdometrieData(ododata);
if(ododata[0]>=ododata[1])
{v=v+5;}
else
{v=v-5;}

Die Werte kann man nicht direkt vergleichen denn sie stehen für das an den Codescheiben reflektierte Licht das die Sensoren einfangen.

Für das Fahren ohne Strich würde ich eine Zeitfunktion verwenden weil die Odometrie nicht einfach zu programieren ist und die Genauigkeit unter Umständen nicht merklich besser als bei Zeitfunktionen ist. Wichtig bei Zeitfunktionen ist aber die richtige Wahl der MotorSpeed()-Parameter.

Hier würde ich umformulieren:

while(a<=300)
{
a++;
Sleep(255);
MotorDir(RWD,RWD);
MotorSpeed(160,80);
}


in

MotorDir(RWD,RWD);
MotorSpeed(160,80);
while(a<=300)
{
a++;
Sleep(255);
}
Das hier ist vielleicht auch kritisch:

if(PollSwitch()>0)
{
if(PollSwitch()>0)
{
a=0;
taste=PollSwitch();
Obwohl zweimal auf PollSwitch() > 0 geprüft wird könnte taste trotzdem 0 sein!

Testen kann ich leider nicht, vielleicht könnest du die Fehlfunktion genauer beschreiben.

Gruß

mic