- Akku Tests und Balkonkraftwerk Speicher         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 30 von 30

Thema: Asuro Barcode erkennung

  1. #21
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    E-Bike
    Darf ich mir das so vorstellen: Es wird einer Linie gefolgt, gewissermassen "normal".
    An bestimmten Stellen ist die Linie aber in einem (barcode) Muster unterbrochen, und solche Stellen sind
    1 zu erkennen
    2 zu interpretiern
    3 ggf. stehenzubleiben
    ??
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #22
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2006
    Beiträge
    459
    Das Ganze erinnert mich doch stark an dieses Porjekt einer FH.

    Wenn Ihr es also erfolgreich hingekriegt habt, könnt Ihr nachher gleich zur Uni.

    Aber Scherz beiseite, vor kurzem habe ich mir sagen lassen, dass in der Schule heute sehr stark der Umgang mit dem Intenet gelehrt wird. Die Schüler bekommen relativ frei gestellte Aufgaben und sollen sich dann die Materiallien im Internet zusammensuchen.
    Und da viele Dinge in der Asuro Forschung schon einmal behandelt wurden und durch wissenschaftliche Arbeiten beschrieben wurden, könntet Ihr Glück haben und müsst das Rad nicht zu oft neu erfinden, sondern könnt am Stand der Forschung weiterarbeiten.

    Wenn Ihr die notwendigen Fähigkeiten im Umgang mit dem Internet erworben habt, könnt Ihr derem Ausprägung an der Suchfuntktion dieses Forums erbroben und werdet auf diesen Thread stoßen, in dem das Thema Asuro und Barcode relativ ausführlich behandelt wurde.



    Vieleicht lindert das euren Prüfungsstreß etwas,

    robo.fr

  3. #23
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo robo.fr und vor allem auch 12bg,

    genau den Thread hatte ich schon vor einiger Zeit vorgeschlagen.
    Da ist alles vorhanden!!!!

    - Beschreibung der auftretenden Probleme
    - Wie dagegen angegangen wird
    - Barcodedefinition
    - Druckvorlage für die Barcodes
    - Fertiges ASURO-Program

    12bg, nutzt das doch einfach: Asuro und Barcodes (Ist nochmal der Link, für den Fall, dass er erst beim 3.ten mal gesehen wird )

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  4. #24
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.066
    hallo Blombe,
    wir haben keinerlei interesse an irgendwelchen codes, die du hier völlig zusammenhanglos postest, sondern versuchen ein problem zu lösen. bitte trage etwas zu diesem problem bei, oder halte dich zurück.
    dein beitrag wurde erneut gelöscht.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  5. #25


    1 PID Regler
    Bei meinem Asuro brauchen die Motoren unterschiedlich Power für den Gleichlauf bzw. Geradeauslauf. Es ist dann relativ mühsam die richtigen Werte der
    MotorSpeed(left_speed, right_speed)
    Funktion für den Geradeauslauf zu finden. Darüber hinaus ändert sich dieses Verhalten mit schwächer werdender Batterie.

    Das motivierte mich, hierzu einen PID Regler zu programmieren.
    1.1 Konstantes Zeitintervall

    Zuerst habe ich einen PID Regler implementiert für ein konstantes Zeitintervall Ta=150ms (Stellungsalgorithmus Quelle: https://www.roboternetz.de/wissen/in...nik#PID-Regler).
    //Stellungsalgorithmus für links: e = leftSpeed - l_ticks; //Vergleich l_speed = l_yalt + q0*e + q1*l_ealt + q2*l_ealt2; //Reglergleichung l_ealt2 = l_ealt; l_ealt = e; l_yalt = l_speed;
    Dabei habe ich die vierer Odometriescheibe verwendet.
    1.1.1 Automatisch Finden der Konstanten q0, q1 und q2

    Es war mir zu mühsam die Werte für q0, q1 und q2 per Hand aus zu pingeln. Deshalb habe ich ein Programm für Asuro geschrieben, welches ihn die besten Konstanten selbst heraus finden läßt (trial and error). Als leftSpeed und rightSpeed habe ich 20 Ticks pro Sekunde vorgegeben (das ist langsam). Ich habe keinen Unterschied zwischen links und rechts gemacht. D.h. für beide Seiten habe ich erst mal die gleichen q0, q1 und q2 Werte genutzt. Jeder Fehler vom Vorgabewert (20 Ticks pro Sekunde) wurde registriert, quadriert und über die Zeit summiert. Das Programm ist damit auf der Suche nach q0, q1 und q2 mit dem kleinsten Fehlerquadrat.

    Um hier (16Bit integer statt double) klar zu kommen habe ich die Werte für q0, q1 und q2 mit 100 multipliziert. Das mußte ich bei der Anwendung im Code korrigieren:
    //Stellungsalgorithmus für links: e = leftSpeed - l_ticks; //Vergleich l_speed = l_yalt + (q0*e + q1*l_ealt + q2*l_ealt2)/100; //Reglergleichung l_ealt2 = l_ealt; l_ealt = e; l_yalt = l_speed;

    Nach ca. 20 Minuten rumprobieren wurden schließlich folgende Werte von und für meinen Asuro gefunden:
    q0=171
    q1=-20
    q2=-10

    1.2 Variables Zeitintervall

    Durch einfaches Umrechnen aus
    q0=Kp+Ki*Ta+Kd/Ta
    q1=-Kp-2*Kd/Ta
    q2=Kd/Ta
    ergibt sich dann ein PID Regler für ein variables Zeitintervall Ta.
    Kp=-(q1+2*q2) Ki=(q0+q1+q2)/Ta Kd=q2*Ta
    Für die q0, q1 und q2 Werte aus 1.1 ergibt sich bei Ta=150ms:
    Kp=40
    Ki=1 (eigentlich Ki=0.94)
    Kd=-1500

    Und hier die Zuweisungen von (Kp, Ki, Kd, Ta) -> (q0, q1, q2):
    q0=Kp+Ki*Ta+Kd/Ta; q1=-Kp-2*Kd/Ta; q2=Kd/Ta;
    Stimmts? Quelle: https://www.roboternetz.de/wissen/in...nik#PID-Regler

    Hier ist das Programm asuroAutoPID1.zip.

    __________________________________________________ ______________

    Fight till you die for your life

  6. #26
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.066
    thread wieder gesäubert... was ist denn heir nur los...

    hab ne runde schreibsperren verteilt. die spammer gehen mir auf den keks...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  7. #27
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    @Threadersteller: Durch das ganze Chaos hier weiß ich nicht inwieweit das Problem noch aktuell ist. Wenn du Fragen hast kann ich dir helfen da ich das letztes Jahr ausprogrammiert habe.

    Übrigens: Der Post von "123home" ist von der Seite http://home.arcor.de/Wolfgang.Rossne...uro/asuro.html geklaut.
    Grüße,
    Harri

  8. #28
    Neuer Benutzer Öfters hier
    Registriert seit
    12.06.2008
    Beiträge
    8
    Erst mal danke für das beseitigen der nervigen spamer!!

    und ebenfalls ein riesen großes dankeschön für die zahlreichen beiträge von euch und die angebotene hife =)

    Wir haben probleme von dem geposteten Code aus dem anderen. Er Funktioniert nicht bei uns es erscheinen nur viele fehler beim umwandeln in eine hex Datei.

    Code:
    /*/*Einstellungen um Asuro fit für die Barcode-Funktion zu machen.*/
    /*Geschwindigkeit links/rechts definieren=>damit Asuro geradeausfährt*/
    #define BC_SPEED 90
    /*Hell/Dunkel Schwelle für Odometrie.
    Linke Odometrie wird als Referenz verwendet*/
     
    #define BC_OLSCHWELLE 600
    #define BC_ORSCHWELLE 730
    /*Hell/Dunkel Schwelle für Barcode*/
    #define BC_LSCHWELLE 45
    
    
    /*Einstellungen um das Barcode zu ändern.*/
    /*ACHTUNG: Bei Veränderungen von BC_STRICH_ANZAHL müssen in der Funktion
    2 Anpassungen vorgenommen werden! Näheres siehe in der Funktion!*/
    /*Anzahl der Datenbits*/
    #define BC_DATENBITS_ANZAHL 3
    /*Anzahl der Striche(Startbit+Datenbits+Prüfbit inklusive Stoppbit)*/
    #define BC_STRICH_ANZAHL 5
    /*Wie oft pro Strich der Helligkeitswert gemessen werden soll
    ACHTUNG: dafür muss die Strichbreite angepasst werden*/
    #define BC_ABTASTUNGEN_PRO_STRICH 5
    /*Um im bin_erg[] eine 1 auszulösen, müssen pro Strich mindestens
    BC_ABTASTUNGEN_PRO_STRICH-2 Messwerte 1 sein. */
    #define BC_LOGIKSCHWELLE 3
    /*Anzahl der Werte im daten[] Array*/
    #define BC_MAX_WERTE 55
    /*Fehlercodes*/
    #define BC_FEHLER_PARITY 255
    #define BC_FEHLER_RICHTUNG 254
    
    unsigned char fkt_barcode_lesen(void)
    {
        unsigned int ldata[2]={0},odata[2]={0};
        unsigned int led_on[2]={0},led_off[2]={0};
        unsigned int links=0,rechts=0,ges=0;
    
        unsigned char flag_l=0,flag_r=0,n=0,startbit=0,summe=0,index=0,dez_erg=0,richtung=0;
        unsigned char odo_counter=0,counter_l=0,counter_r=0,speed_l=BC_SPEED,speed_r=BC_SPEED;
        unsigned char daten[BC_MAX_WERTE 55]={0},bin_erg[BC_STRICH_ANZAHL-1]={0};
        MotorDir(FWD,FWD);
        MotorSpeed(BC_SPEED 90,BC_SPEED 90);
        StatusLED(OFF);
    
        /*Wegstrecke(odocounter) ab Startbit messen*/
        while(odo_counter<BC_MAX_WERTE)
        {
    
            OdometrieData(odata);
            MotorSpeed(speed_l,speed_r);
    
            /*Bei jedem Tick daten[] Array auffüllen.*/
            if( (flag_l==0 && odata[0]>BC_OLSCHWELLE 600) ||
                (flag_l==1 && odata[0]<BC_OLSCHWELLE 600) )
            {
                counter_l++;
                FrontLED(ON);
                LineData(ldata);
                led_on[0]=ldata[0];
                led_on[1]=ldata[1];
    
                FrontLED(OFF);
                LineData(ldata);
                led_off[0]=ldata[0];
                led_off[1]=ldata[1];
    
                links=led_on[0]-led_off[0];
                rechts=led_on[1]-led_off[1];
                ges=(links+rechts)/2;
    
                if(ges<BC_LSCHWELLE 45)
                {
                    daten[odo_counter]=1;
                    if(startbit==0)
                    {
                        StatusLED(GREEN);
                        startbit=1;
                    }
                }
    
                if(flag_l==0)
                    flag_l=1;
    
                else
                    flag_l=0;
    
    
                if(startbit!=0)
                {
                    odo_counter++;
                }
            }
    
            if( (flag_r==0 && odata[1]>BC_ORSCHWELLE 730) ||
                (flag_r==1 && odata[1]<BC_ORSCHWELLE 730) )
            {
                counter_r++;
    
                if(flag_r==0)
                    flag_r=1;
    
                else
                    flag_r=0;
            }
    
            if(Gettime()%75==0 && (counter_l>3 || counter_r>3) )
            {
                if(counter_l<counter_r)
                {
                    speed_l=speed_l+1;
                }
                else if(counter_l>counter_r)
                {
                    speed_l=speed_l-1;
                }
                if( (counter_l>35 || counter_r>35) && startbit==0)
                    break;
            }
    
    
        }
    
        MotorDir(BREAK,BREAK);
        MotorSpeed(0,0);
    
        /*Binärzahl aufbauen + Prüfbit*/
         for(n=0;n<BC_MAX_WERTE;n++)
         {
    
            summe=summe+daten[n];
    
            /*Wenn BC_STRICH_ANZAHL verändert wird,
            muss hier ein entsprechender Eintrag erfolgen*/
            if((n+1)%BC_ABTASTUNGEN_PRO_STRICH==0)
            {
                if((n+1)==(BC_ABTASTUNGEN_PRO_STRICH*3)
                    ||
                    (n+1)==(BC_ABTASTUNGEN_PRO_STRICH*5)
                    ||
                    (n+1)==(BC_ABTASTUNGEN_PRO_STRICH*7)
                    ||
                    (n+1)==(BC_ABTASTUNGEN_PRO_STRICH*9))
                {
                    if(summe>=BC_LOGIKSCHWELLE)
                        bin_erg[index]=1;
                    else
                        bin_erg[index]=0;
    
                    index++;
    
                }
    
            summe=0;
            }
    
         }
    
        /*Richtung erkennen*/
        /*Wenn BC_STRICH_ANZAHL verändert wird,
        muss hier der Faktor angepasst werden.*/
         summe=0;
         for(n=(BC_ABTASTUNGEN_PRO_STRICH*9);n<(BC_ABTASTUNGEN_PRO_STRICH*11);n++)
         {
             summe=summe+daten[n];
         }
         if(summe>=(BC_ABTASTUNGEN_PRO_STRICH*2-BC_LOGIKSCHWELLE 3))
            richtung=1;
    
    
        /*Binärzahl umwandeln in Dezimalzahl oder Fehlercode zurückgeben*/
    
        /*alles OK => Dezimalzahl zurückgeben*/
        if((bin_erg[0]+bin_erg[1]+bin_erg[2])%2!=bin_erg[3] && richtung==1)
            dez_erg=4*bin_erg[0]+2*bin_erg[1]+1*bin_erg[2];
    
        /*Fehlercode BC_FEHLER_RICHTUNG->falsche Richtung*/
        else if((bin_erg[0]+bin_erg[1]+bin_erg[2])%2!=bin_erg[3] && richtung==0)
            dez_erg=BC_FEHLER_RICHTUNG 254;
    
        /*Prüfbit falsch*/
        else
            dez_erg=BC_FEHLER_PARITY 255;
    
    
        StatusLED(OFF);
    
        return dez_erg;
    }
    schon im vorraus nochmals vielen dank !

  9. #29
    Neuer Benutzer Öfters hier
    Registriert seit
    12.06.2008
    Beiträge
    8
    sorry, für das dumme gespamme aber hier halten sich einige klassenmitglieder für witzig.
    Bitte überlest diese Posts

  10. #30
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.066
    hallo 12bg, das gespamme geht mir auf die nerven. dein account ist hiermit gesperrt. bite eröffne einen neuen, und achte darauf dass du die seite nicht wieder offenlässt.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

12V Akku bauen