PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : linienfolgeprogramm



tortelini66
29.08.2010, 16:24
Hi Leute,
ich habe jetzt seit ca 2 wochen meinen asuro und bin wirklich sehr zufrieden!!!
Hab jetzt alles ein wenig ausprobiert und mich seit gestern an ein linienprogramm herangewagt.
folgendes ist dabei herausgekommen:



#include "asuro.h"

/***
*einfache Routine, zum folgen einer Linie
**/
int linie_finden(void) {
int lData[2];

if ((lData[0] < 50) && (lData[1] < 50)) { //linie verlassen, vorgang zum wiederfinden gestartet
MotorDir (FWD,FWD);
MotorSpeed (200,0);
}
//wenn linie gefunden, gib 1 zurück
return(1);
}

/***
*einfache routine zum wiederfinden einer linie
**/
int linie_fahren( void ) {
int lData[2];

while(1) {
LineData(lData); // Einlesen der Messwerte

if ((lData[0] < 50) && (lData[1] < 50)) return(1);


if (lData[0] > 100) { //Links hell, also hat links die Linie verlassen
MotorDir (FWD,RWD); //LINKS mehr Gas geben --> rechtskurve
MotorSpeed (200,0); //LINKS mehr Gas geben
}
else {
MotorDir(RWD,FWD);
MotorSpeed(0,200);
}
}
}


/***
*komplettes programm, zum folgen und wiederfinden einer Linie
**/
int main(void)
{
int lData[2]; // Speicher für die Messwerte zur Verfügung stellen
int verloren;

Init();

while(1) {

FrontLED(ON);


verloren = linie_fahren();

if (verloren == 1) linie_finden();

}
}






es funktioniert schon gut, aber wer es ausprobiert wird merken, das noch nicht so richtig rund läuft.
Ich komme aber einfach nicht drauf, wie ich das verbessern kann!
Vielleicht kann mir ja jemand einen kleinen denkanstoß geben.

MfG tortelini66


Ps:bitte nicht über mein programm lachen, es ist echt neuland für mich

Chrissi_P
29.08.2010, 20:37
Hi,
du weist verloren den rückkabewert von linie_fahren zu. linie_fahren fehlt aber das return!
linie_finden fehlt wird nicht verwendet. Ich vermute, in der while schleife is was mit den Funktionsaufrufen schiefgelaufen.

die regelung mit brutalem umschalten zwischen 200 und 0 ist auch ziemlich grob.
eine bessere lösung wäre vielleicht, in einer endlosschleife Linedata abzufragen, und in kleinen schritten nachzuregeln

ich hoffe, ich konnte helfen
LG Chrissi

TobiKa
29.08.2010, 21:22
int linie_finden(void) {
int lData[2];

if ((lData[0] < 50) && (lData[1] < 50))

Du überprüfst ob die Werte in lData kleiner als 50 sind, hast lData aber nach den Definition nie Werte zugewiesen! Somit ist es nur Zufall ob der Wert nun kleiner als 50 ist oder nicht.

tortelini66
30.08.2010, 06:37
die regelung mit brutalem umschalten zwischen 200 und 0 ist auch ziemlich grob. eine bessere lösung wäre vielleicht, in einer endlosschleife Linedata abzufragen, und in kleinen schritten nachzuregeln

Das verstehe ich nicht ganz

Valen
30.08.2010, 09:44
Durch umschalten von Vorwärts Geschwindigkeit auf Rückwärts wird den Strom durch den Motoren blockiert und entstehen damit Störungen in dem Bordspannung und analoge Referenzspannung. Das beeinflusst den LineData Messung nachteilig. (es wackelt) Chrissi-P meint das umschalten sollte gleichmäßiger passieren. Aber es könnte auch einfacher. Nur nicht von FWD 200 auf RWD 0 gehen, aber auf zbs. FWD 50. Weil den Motor mit einen kleinen wert noch nicht gerade anfangt zu laufen wegen Interne Reibung. Das ist ähnlich wie "Fuß vom Gas halten" versus "auf Rückwärts umschalten auf den Autobahn". Mit FWD 50 (diese "Drehung-anfang"-Wert ist unterschiedlich für jeder Motor und Getriebe, vielleicht höher für dich) wurdest du bremsen auf den MotorReibung. Wann diese Reibung nicht reichst den Linie zu halten kannst du mit wert 0 versuchen, oder dazwischen.

Aber ich denke Tobika hat das richtige Antwort. Linie_finden arbeitet mit werten die niemals gemessen sind mit LineData, und sind deshalb sicher Quatsch. Eine LineData(lData) vorne von if sollte reichen.

s.frings
01.09.2010, 20:30
Ich hatte ganz gute Erfahrung gemacht, zum Lenken jeweils einen Motor auf halbe PWM Leistung zu drosseln, bis die Linie wieder mittig gesehen wird.

Wie stark man den Motor drosselt kommt ein bischen darauf an, wie eng die zu erwartenden Kurven sind. Sind die kurven Enger, als diese es zulässt, dann verliert der Roboter den soll-Kurs.