PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe beim Ausweichmuster



bole
18.03.2007, 11:21
Moin zusammen,


Wir arbeiten in der Schule momentan mit dem Asuro als projekt, der zusammen bau und der test einzelner programme( kollision, linie) hat wunderbar funktioniert, nun sollen unser ASURO einer linie folgen, einen Hinderniss auf der Linie ausweichen und die Linie wieder suchen und dieser folgen. Folgendes haben wir bis jetzt erreicht, doch irgendwie wissen wir nicht wie wir aus der void crash wieder in die main funktion zurück kommen. quasi endlosschleife der main...


#include "asuro.h"


//Kollisionserkennung

Crash(void)
{
unsigned int t1,t2;

//doppelte Schalterabfrage
t1 = PollSwitch();
t2 = PollSwitch();

if(t1 > 0 && t2 > 0 && t1 == t2)
{
//ASURO zurückfahren
MotorSpeed(180,180);
MotorDir(RWD,RWD);
Msleep(200);

//nach links drehen
MotorDir(RWD,FWD);
Msleep(180);


MotorSpeed(240,240); /*Vorwärts immer, rückwärts nimmer! */
MotorDir(FWD,FWD);
Msleep(1000);

//nach rechts drehen
MotorDir(FWD,RWD);
Msleep(180);

MotorSpeed(240,240); /*Vorwärts immer, rückwärts nimmer! */
MotorDir(FWD,FWD);
Msleep(1500);

//nach rechts drehen
MotorDir(FWD,RWD);
Msleep(180);

MotorSpeed(240,240); /*Vorwärts immer, rückwärts nimmer! */
MotorDir(FWD,FWD);
Msleep(1500);

}
}

int main(void)
{
//ASURO initialisieren
Init();

unsigned int data[2],data_ref[6];
int speed_left,speed_right;
int degree5;
int keepinline;
int j,i=0;
int leave=0;

FrontLED(ON); //Linienverfolgungs-LED ein

//hell 0
//dunkel 1023

//Variablen initialisieren
data_ref[0] = 35;//60|35
data_ref[1] = 35;//60|35
speed_left = 202;//109
speed_right= 200;//100
degree5 = 29;//80
keepinline = 15;

//Geschwindigkeit einstellen
MotorSpeed(speed_left,speed_right);

while(1)
{
LineData(data);//Sensordaten einlesen
MotorDir(FWD,FWD);//vorwŠrts fahren
Crash();//Kollisionserkennung

//beide Sensoren befinden sich au§erhalb der wei§en Linie
//-> Linie muss wieder gefunden werden
if(data[0] < data_ref[0] && data[1] < data_ref[1])
{
BackLED(ON,ON);//Anzeige fŸr Liniensuche
j=17;
leave=0;

while(1)
{
//nach rechts drehen und Linie suchen
for(i=0;i<j;i++)
{
MotorDir(FWD,RWD);
Msleep(degree5);//Drehbewegung fŸr degree5 msec zulassen
MotorDir(BREAK,BREAK);
//kurze Programmunterbrechung, damit ASURO tatsŠchlich
//zum Stillstand gekommen ist
Msleep(keepinline);
LineData(data);//Sensoren einlesen
//Wenn ein Sensor im Bereich der Linie ist, Liniensuche
//verlassen
if(data[0] > data_ref[0] || data[1] > data_ref[1])
{
leave = 1;
break;
}
}

if(leave==1) break;

//nach links drehen und Linie suchen
for(i=0;i<35;i++)//35(41)
{
//Funktionsweise wie oben
MotorDir(RWD,FWD);
Msleep(degree5);
MotorDir(BREAK,BREAK);
Msleep(keepinline);
LineData(data);
if(data[0] > data_ref[0] || data[1] > data_ref[1])
{
leave = 1;
break;
}
}

if(leave==1) break;

//Šndern der Drehweite von 175 auf 355 Grad
j=35;
}//while

BackLED(OFF,OFF);//Liniensuche-Status-LEDs ausschalten

}
// HELL DUNKEL
else if(data[0] > data_ref[0] && data[1] < data_ref[1])
{
// DUNKEL HELL
while(data[0] > data_ref[0] && data[1] < data_ref[1])
{
//nach rechts fahren
MotorDir(BREAK,FWD);
LineData(data);//Sensoren einlesen
Crash();//Kollisionserkennung
}
}
//Funktionsweise wie oben
else if(data[0] < data_ref[0] && data[1] > data_ref[1])
{
while(data[0] < data_ref[0] && data[1] > data_ref[1])
{
//nach links fahren
MotorDir(FWD,BREAK);
LineData(data);
Crash();
}
}
}

return 0;
}

könnt ihr uns vielleicht weiter helfen?

Danke schonmal
2 verzweifelte schüler

radbruch
18.03.2007, 13:11
Hallo

Euer Code erinnert mich an alte Goto-Zeiten, vermutlich ist er "natürlich" gewachsen und sieht deshalb entsprechend chaotisch aus. Ihr solltet etwas ausputzen und die einzelnen Aktionen aus der Hauptschleife in selbstständige Funktionen umwandeln.

Für Schleifen, die auf eine Abbruchbedingung warten, ist meiner Meinung nach eine do .. while-Konstruktion leserlicher als eure while .. Break-Versionen.

Für Programme, die schrittweise ausgeführt werden sollen (oder testweise nur zum Ablauf festlegen und späterem umformulieren), sind Schrittketten mit case praktisch und zudem gut zu debuggen. (ein Beispiel (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=26570) aus den ersten Tagen meiner asuro-Ehe. main() ist hier nur die Steuerung der Schrittkette.)

Gruß

mic

bole
18.03.2007, 13:46
so nu bin ich wieder allein vorm rechner^^

danke fuer die schnelle antwort! ich werd mir dein beispiel mal anschauen und dann mal gucken was ich an unserm code noch so verbessern kann..*g*

hoffe mal das wird was...

danke nochmal

bole

radbruch
18.03.2007, 14:07
Hallo


hoffe mal das wird was...
Das wird sicher was, euer Code sieht schon jetzt sehr vielversprechend aus. Ich bin absichtlich nicht auf den Code selbst eingegangen, weil ich denke, ihr habt es so weit geschafft, der Rest wird euch auch gelingen. Was mir aufgefallen ist: Was passiert, wenn der weitere Verlauf der Linie nicht im Drehbereich des asuros liegt? Sollten nicht besser die Werte für die 5°-Drehung für links und rechts getrennt definiert werden? Was passiert bei einer Kollision beim Suchen?

Bei Kommentaren im Quellcode solltet ihr Sonderzeichen und Umlaute meiden. Sie werden nicht richtig angezeigt (nur bei mir?) und manche C-Compiler verweigern dadurch den Dienst und brechen mit einer Fehlermeldung ab.

Gruß

mic