PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit der Linienverfolgung



Hohenloher
17.03.2010, 19:54
Hey also ich hab ein Problem mit der Linienverfolgung zw mehrere:

1. der linke Fototransistor gibt nicht den gleichen Wet wie der rechte aus so dass der Asuro immer leicht bzw stärker im Kreis fährt
2. erkennt er somit auch keine Linien um diese zu verfolgen
3. kann es auf an dem Programm liegen wen ja was muss ich ändern das es besser funktioniert.


#include "asuro.h"
int main(void)

{
int a;
a=120; //Grundgeschwindigkeit
int b;
b=200; //Abiegegeschwindigkeit
int c; // Zählfunktion
c=0;
int d; // Rückfahrzeit
d=0;
int e; //Rechenzeit
e=10;

unsigned Data[2];
Init();

while(1)
{c++;
if (PollSwitch()>0)
{
if (PollSwitch()==32/*rechter Taster gedrückt*/) //Kollisionstaster
{
MotorSpeed(b/*links*/,0/*rechts*/);
StatusLED(RED)
;} //drehe nach rechts
else if (PollSwitch()==1)//linkter Taster gedrückt
{
MotorSpeed(0/*links*/,b/*rechts*/);
StatusLED(RED)
;} //drehe nach links
else if(PollSwitch()!=0>1<32)
{

for(d=0;d<100;d++)
{MotorDir(RWD,RWD);
MotorSpeed(b,b);
BackLED(ON,ON)
;}
;}

;}
else
{Init();
FrontLED(ON);
LineData(Data);
if(Data[0]<Data[1])
{MotorSpeed(a,b); /*Rechts*/
StatusLED(RED);}
else if (Data[0]>Data[1])
{MotorSpeed(b,a);
StatusLED(YELLOW);} /*Links*/
else if(Data[0]==Data[1])
{MotorSpeed (a,a);
StatusLED(GREEN);}
;}

;}

return(0);
}



Ich hoffe ihr könnt mir helfen.
Mit freundlichen Grüßen
Max

Valen
17.03.2010, 20:45
PollSwitch()!=0>1<32Das geht einfach nicht. Du muss einer compilier fehler von make bekommen haben. Logische stellungen mussen ein fur eins uberpruft werden. Man kan sie nicht auf dieser weise zusamen knüpfen. Man kan aber mehrere stellungen mit logische operatoren kombinieren. Aber nur die auswertungen werden logisch kombiniert.

Vielleicht meinst du etwas wie:

PollSwitch()!=0 /*PollSwitch is wert nicht gleich nul*

UND PollSwitch()>1 /* PollSwitch() wert grösser als 1 */

UND PollSwitch()<32 /* PollSwitch() wert kleiner als 32 */

Im c-code sieht das aus als:



if ( (PollSwitch()!=0) && (PollSwitch()>1) && (PollSwitch()<32) )
...
/* nur wen jeder von diesen 3 war ist macht er was nach If komt. Fehlt einer? Dan gehts nicht */

Hier, lies mal ein bisschen weiter uber logische operatoren im c-sprache:

http://www.rn-wissen.de/index.php/C-Tutorial#Logische_.28boolsche.29_Operatoren

Hohenloher
21.03.2010, 19:09
Ich habe das Programm nach diesem Vorschlag abgeändert allerdings fährt er nur Rückwärts während derTaster gedrückt ist was kann noch am Programm falsch sein ??

Valen
22.03.2010, 00:54
Nah klär. Auf nur eine stelle in dein program wird die motor richtung geändert (auf rückfährt). Nachdem er zuruckgefahren hat von einer obstruktion muss er doch wieder forwärts gehen, oder? Auf welche stelle war das am besten?


for(d=0;d<100;d++)
{MotorDir(RWD,RWD);Wieso machst du dass 100 mal? Das dauert nur ein sehr kurzes augenblick. Es fahrt kaum zuruck. Warten muss man mit Sleep.

Und diesen 2-ten Init() nach dem else?? Wieso?

[EDIT]Ok, Init() setzt auch die motorrichtung wieder im forwärts zustand und den geschwindigkeit auf nul. Er tut aber viel mehr was nicht nötig ist, und vielleicht auch unwunschlich. (wie backleds oder statusled an/aus)

Hohenloher
23.03.2010, 20:08
Also ich hab jetzt alles Entstört allerdings ist die Linienverfolgung noch sehr ungenau mit dem bloßen Vergleich der Lichtwerte.
was könnte man hierran noch ändern??

Valen
23.03.2010, 23:05
Ein bisschen weniger unterschied in geschwindigkeit werten beim drehen, vielleicht?

Aber besser... Die linien sensoren geben NICHT den selben wert zurück bei den selbe beleuchtung. Deshalb muss es immer korrigieren wen du mit:

Data[0]<Data[1]

die helligkeiten vergleicht. Einer von beiden ist von anfang ab schon höher dan den andere seite. Asuro soll erst lernen wieviel das unterschied is auf ein egalen untergrund (das was nicht aus sieht als einer linie). Danach beim linie-entlang fahren muss es nach jeden messung diesen underschied wert von die Data[0]-Data[1] differenz abtrennen. Dan habst du ein richtige balancierte reglung.

Hohenloher
25.03.2010, 20:16
ok das werde ich einmal aus probieren