-
        

Ergebnis 1 bis 6 von 6

Thema: linienfolgeprogramm

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    27.07.2010
    Beiträge
    31

    linienfolgeprogramm

    Anzeige

    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:

    Code:
    #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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    29.12.2008
    Ort
    Landshut
    Beiträge
    31
    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

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Code:
    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.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    27.07.2010
    Beiträge
    31
    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

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    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.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.03.2010
    Beiträge
    161
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •