PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausor mit Programm geradeaus fahren



janse
04.05.2010, 16:44
Mein Asuro fährt leicht schräk.
Kan ich den Asuro mit einem Programm zum geradeaus fahren bringen?
Geht das z.B. mit den Fototransitoren? wen ja wie?

mtzE
04.05.2010, 16:50
Halli Hallo,
Erstmal solltest du dir angewöhnen zu erst die Suchfunktion zu benutzen bevor du frägst :P

1.
https://www.roboternetz.de/phpBB2/viewtopic.php?t=53890

2.
Es gibt ein Programm (hat glaub ich Waste geschrieben einfach mal bei seinen Threads guckn) das dir die Geschwindigkeiten der Motoren so optimiert das er durchgehend geradeaus fahren sollte.. Einfach mal danach hier im Forum suchen :) habe den Link gerade nicht gefunden..

MfG. mtzE

s.frings
04.05.2010, 17:35
Zähle die Impulse der Odometrie Sensoren, während der Roboter fährt. Wenn eine Seite weniger impulse hat, als die andere, gib diesem Motor etwas mehr Power.

Das ist eine einfache Lösung, funktioniert aber nur für geraeaus Kurs. Zum Kurven Fahren empfehle ich das Lenkrad-Modell. Bei Mittelstellung soll das Verhältnis der beiden Drehzahlen 1 sein. AUsgehend davon kann man nach links oder rechts lenken. Du misst in regelmäßigen Intervallen (z.B. 100ms) die Geschwindigkeit der beiden Räder und vergleichst sie mit dem Soll-Wert. Bei Abweichung korriegierst Du mit einem P-Regler (siehe Wissens-Sammlung zum Thema Regelungstechnik). Wenn das gut klappt, dann baue dies zu einem PD Regler aus.

harry3
25.05.2010, 01:07
Ich hab in meinem Funktionsarchiv für Asuro einen Regler gefunden, den ich damals programmiert habe.
Der Code alleine ist so noch nicht lauffähig, aber alles schreib ich hier nicht hinein, denn selberdenken schadet nicht!




void fkt_geradeaus_fahren(int speed, unsigned char (*funktion)(void))
{

unsigned char mspeed_l=0,mspeed_r=0,flag_l=0,flag_r=0;
int y=0,e=0,odata[2]={0},counter_l=0,counter_r=0;
unsigned long int tregeln=0;

if(speed>0 && speed<=255)
{
MotorDir(FWD,FWD);
mspeed_l=speed;
mspeed_r=speed;
}
else if(speed<0 && speed>=(-255))
{
MotorDir(RWD,RWD);
mspeed_l=-speed;
mspeed_r=-speed;
}
else
{
return;
}

while(funktion()==0)
{
MotorSpeed(mspeed_l,mspeed_r);
OdometrieData(odata);
//Stellgröße anhand Regelabweichung berechnen

if(odata[0]<ODOMETRIE_L && flag_l==0)
{
counter_l++;
flag_l=1;
}
else if(odata[0]>ODOMETRIE_L && flag_l==1)
{
counter_l++;
flag_l=0;
}


if(odata[1]<ODOMETRIE_R && flag_r==0)
{
counter_r++;
flag_r=1;
}
else if(odata[1]>ODOMETRIE_R && flag_r==1)
{
counter_r++;
flag_r=0;
}

if(Gettime()>tregeln)
{
e=counter_l-counter_r;
y=abs(e*G_KP);

//Stellgröße gegen Grenzwerte prüfen
if(y>G_KORR_MAX)
y=G_KORR_MAX;

if(e<0)
{
if((int)(mspeed_r+abs(speed)-mspeed_l-y)<0)
{
mspeed_r=0;
mspeed_l=abs(speed);
}
else if((int)(mspeed_r+abs(speed)-mspeed_l-y)>255)
{
mspeed_r=255;
mspeed_l=abs(speed);
}
else
{
mspeed_r=mspeed_r+abs(speed)-mspeed_l-y;
mspeed_l=abs(speed);
}
}

else if(e>0)
{
if((int)mspeed_l+abs(speed)-mspeed_r-y<0)
{
mspeed_l=0;
mspeed_r=abs(speed);
}
else if((int)mspeed_l+abs(speed)-mspeed_r-y>255)
{
mspeed_l=255;
mspeed_r=abs(speed);
}
else
{
mspeed_l=mspeed_l+abs(speed)-mspeed_r-y;
mspeed_r=abs(speed);
}
}

tregeln=Gettime()+100;
counter_l=counter_l*G_I_FAKTOR;
counter_r=counter_r*G_I_FAKTOR;
}

}


if(speed>0)
MotorDir(RWD,RWD);
else
MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(100);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
return;
}