-
        

Ergebnis 1 bis 10 von 10

Thema: Linienfolger Problem

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    10.05.2010
    Beiträge
    38

    Linienfolger Problem

    Anzeige

    Hallo,

    Weiss jemand warum mein Code nicht richtig funktioniert?

    Asuro soll einer schwarzen Linie mit Ecken und Gabelungen folgen.
    Beide Lichtsensoren sind bestenfalls ausserhalb der Linie.

    Code:
    #include <asuro.h>                                    
    #include <stdbool.h>
    
    //Prototyp
    bool isBlack(int seite);
    
    //Variable für Vergleichswerte der Lichtsensoren
    unsigned int black [2];
    
    unsigned int lineData [2];
    
    
    
    int main(void) {
        Init ();
        FrontLED (ON);
        MotorDir(FWD,FWD);
        
        unsigned int speed [2];
        
        unsigned int i;
        //255 Messungen auf schwarzem Untergrund
        for (i = 0; i < 255; i++) {
            LineData(black);
        }
        
        GoTurn (30,  0, 150); // Zum Start der Linie fahren
        
        while (1) {
            speed[0] = 150;
            speed[1] = 150;
            
            //Solange nicht beide Sensoren auf der Linie sind, also auf keiner Gabelung...
            while (isBlack(0) == false && isBlack(1) == false) {
                MotorSpeed(speed[0], speed[1]);
                
                if (isBlack(0)) {
                    speed[0] = 100;
                    speed[1] = 200;    
                } else if (isBlack(1)) {
                    speed[0] = 200;
                    speed[1] = 100;    
                } else {
                    speed[0] = 150;
                    speed[1] = 150;
                }
            }
            
            //Bei einer Gabelung solange nach rechts drehen bis Asuro gerade auf dem rechten "Ast" steht
            if (isBlack(0) && isBlack(1)) {
                while (isBlack(0)){
                    MotorSpeed(250, 0);
                } 
            }
        }
    
        return 0;
    }
    
    
    //Wenn Messung dunkler als Anfangsmessung + 10 als Toleranz
    bool isBlack(int seite) {
        LineData(lineData);
        
        if (lineData[seite] < black[seite] + 10) {
            return true;
        } else {
            return false;
        }
    }
    }
    Der Asuro fährt einfach immer gerade aus. Was ist das Problem?

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Ich wundere mich wie du das Program kompiliert bekommen habst. Weil du einer Variabele oder Konstante benutzt das noch nicht definiert oder deklariert ist in deiner code. Ein C-Compiler muss immer gesagt werden was es machen soll.

    for (i = 0; i < 255; i++) {
    LineData(noLine);
    Gab es keine kompilier warnungen/fehler in dem make ausgabe?

    Aber das vermutliche Problem ist black[]. Du verwendest es in dem function isBlack, wo du die helligkeit der Linie verglichts mit den black werten. Aber die sind nirgends in deine code mit einer wert definiert. Es könnte jeder mögliche wert bekommen haben bei das anschalten von Asuro. Nie darauf verlassen das es 0, oder 1, oder was auch ist.

    Code:
    unsigned int black [2];
    
    ...
    
    if (lineData[seite] < black[seite] + 10) {
    ...

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    10.05.2010
    Beiträge
    38
    Sorry das noLine sollte black sein...
    Hatte vorher noch eine Funktion die eine Sackgasse entdecken sollte drin, aber die hab ich wieder gelöscht. Und hab dabei nen fehler gemacht...


    Hab jetzt den Code oben angepasst.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Zitat Zitat von Double_A
    ...
    Hab jetzt den Code oben angepasst.
    Ok, aber keine werten gegeben an den array black. Ohne das hat den vergleichung in isBlack keinen sinn.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    10.05.2010
    Beiträge
    38
    Was meinst du?

    black fülle ich doch hiermit

    //255 Messungen auf schwarzem Untergrund
    for (i = 0; i < 255; i++) {
    LineData(black);
    }

    black ist ja auch global, und sollte auch in der Funktion zur Verfügung stehen, oder nicht?
    Oder hab ich was wichtiges vergessen? Das ist nähmlich mein erstes Asuro-Programm....

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Du hast recht. Ich habe das völlig ubersehen das es diese werten setzt. Ich hatte warscheinlich noch deine alte code im kopf.

    Nun den frage, macht er nun etwas anderes als gerade aus fahren?

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    10.05.2010
    Beiträge
    38
    Also die FrontLED schaltet sich schonmal ein und ich glaube die Messungen werden gemacht (das dauert ja fast nix oder?)

    Danach als es zur Linie fährt, fährt er einfach immer gerade aus...
    Am GoTurn sollte es eigentlich nicht liegen, hab die myasuro.h schon angepasst...

    Von der Logik her müsste ja eigentlich auch alles passen.
    Kannst du mal das Programm auf deinen Asuro laden und schauen was der macht? Vllt ist meiner ja defekt oder so...

    Die Strecke ist einfach eine Linie mit einem schwarzen Kasten am Anfang, indem sich die Sensoren beim Start befinden.


    Wenns trotzallem doch nicht klappen sollte, hab ich mir eine andere Logik überlegt und zwar dass ein Sensor immer auf der Linie sein soll und der andere immer z.B. Links von der Linie. Meinst du das könnte klappen?

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Mein Asuro ist noch in die Garage. Ich arbeite an eine funk-verbindung mit Xbee modulen. Ich muss das ganze erst gut testen. Vielleicht kan jemand anders dein program ausprobieren. Ich kan leider nur theoretisch helfen.

    Ob das geht ist von mir aus nicht einfach zu sagen. Das ist einer schwarze linie auf weissen untergrund? Und wie dick ist der linie? Im vergleich mit den liniensensor abstand. Beim fahren verursachen die motoren schwankungen in die messe ergebnissen. Vielleicht ist dein 10 wert zu wenig dammit er reagiert.

    Habst du schon ein program geschrieben das den beide linie helligkeiten zum rechner schikt. Dann kannst du besser be-urteilen wie er reagiert auf der rand einer linie. Und weisst du auch gleich wie gross die störungen sein. Den motoren drehen lassen wan er mit den rädern ein bisschen von den tisch aufgeheben ist (sondern rutscht er weg), und unter den Sensoren eine kurze linie strecke.

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Ich habe mir bisher nur den isBlack-Teil deines Programms angeschaut und ich verstehe nicht ganz, was du damit bezwecken willst. Zuerst liest du zig mal die Werte der Liniensensoren ein und letztlich wird doch eh nur der zuletzt gelesene Wert verwendet. Und wie kommst du eigentlich auf die +10-Toleranz bei der hell/dunkel-Entscheidung?

    Um eine halbwegs verlässliche Referenz für Dunkel zu erhalten würden ein paar Lesungen mit Mittelwertbildung ausreichen:

    LineData(black);
    LineData(black); // sicher ist sicher ;)
    for (i = 0; i < 5; i++) {
    Sleep(50);
    LineData(lineData);
    black[0]=(black[0]+lineData[0])/2;
    black[1]=(black[1]+lineData[1])/2;
    }

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    10.05.2010
    Beiträge
    38
    Die 10 Toleranz hab ich einfach mal so genommen...

    Die 255 Messungen habe ich gemacht weil ich irgendwo mal gelesen hab, dass die Sensoren am Anfang nicht gleich dir richtigen werte liefern...

    Aber danke für die Idee mit den Durchschnitt. Werd ich mal probieren wenn ich mal wieder einen Asuro hab...
    Die sind in der Schule >.<

    Und meinst du sollte ich statt der 10 einen prozenturalen Wert als Toleranz nehmen, 5% oder so...

Berechtigungen

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