- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 31

Thema: Neuling: Odometrie

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2007
    Beiträge
    7
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Sorry passt zwar nicht wirklich zum Thema aber ich wollt nicht extra ne neues aufmachen. Ich hab meinen jetzt zu Weihnachten bekommen und wollt euch fragen ob man den Asuro auch mit C++ statt mit C programmieren kann, da C++ für Objektorientiertes Programmieren doch eigentlich besser ist.

    Danke schonmal im Voraus

  2. #12
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo Phil23

    Willkommen im RN-Forum. Hier gibt's 'nen Thread für die Weihnachtsasuros:
    https://www.roboternetz.de/phpBB2/viewtopic.php?t=26141

    Natürlich kann man den asuro auch in C++ programmieren:
    https://www.roboternetz.de/wissen/index.php/Avr-gcc

    Ob man einen kleinen 8-Biter allerdings mit objektorientiertem Code volldröhnen muss ist wohl eher eine philosophische Frage...

    Gruß

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

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    23.12.2007
    Ort
    AC
    Beiträge
    23
    Ich hab euch hier mal ein Video von dem Unfug den ASURO veranstaltet gemacht!
    Ich hoffe das hilft weiter

    http://www.youtube.com/watch?v=tW8aXWY6uuU

  4. #14
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Na, nun sieht's doch schon prima aus. Immerhin scheint er etwas zu regeln. So wie ich das erkennen kann, wird der rechte Motor immer langsamer bis der Wert für MotorSpeed() unter null sinkt. Weil die Werte aber nur einen Bereich von 0-255 haben, wird der nächste Wert unter 0 wieder als Vollgas interpretiert und der Motor dreht wieder voll auf. Möglicherweise sind die Seiten bzw. die Logik der Abfrage vertauscht. Deshalb wird auch die StatusLED nie mehr Grün. Die solltest du vor beginn der 50er-Schleife vielleicht auf Yellow setzen

    Ach, nun hab ich's mit der MotorSpeed() auch gecheckt, du verwendest static bei den Deklarationen. Aber die Auswertung der ODO-Daten durchschaue ich immer noch nicht. Du prüfst auf einen Wertesprung von Faktor 0,4 (oder so ähnlich), beachtest aber nicht, das die Werte stetig und nicht sprunghaft geändert werden. Soweit ich noch weiß bewegen sich die Werte zwischen 150 und 650. Eine gute Strategie ist deshalb zu prüfen, ob der Wert z.B. unter 300 oder über 500 ist. Jeder Wechsel zwischen diesen Grenze bedeutet einen Wechsel zwischen den Codesegmenten. Ein anderer Ansatz, der bei mir auch wunderbar funktionierte: Man speichert ca. 4-7 aufeinanderfolgende Werte. Wenn sie alle aufsteigend bzw. abfallend sind, hat man die Mitte eines Codesegments überschritten. Viele Wege führen zum Ziel...


    Gruß

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

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    30.10.2007
    Ort
    Meensen
    Alter
    35
    Beiträge
    77
    sieht aus wie meiner
    Da hängt das Rad bei kleineren Geschwindigkeiten, folglich fährt er nicht mehr mit der einen Seite. Hast du mal die Geschwindigkeit erhöht und den Asuro mal in der Hand gehalten, sodass die Räder in der Luft stehen um zu gucken ob die Räder in Ordnung sind?

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    23.12.2007
    Ort
    AC
    Beiträge
    23
    Danke! Ich bleibe am Ball.

    Habe auch hier mal eine Analyse meiner Radsensoren hochgeladen:
    http://www.gerth-ac.de/Asuro_MinMax.pdf
    Interessant ist eventuell dieser regelmäßige "Einschnitt" bei Right Odometer, aber damit beschäftige ich mich dann später.

    Hier die aktuelle Version:
    Code:
    #include "asuro.h"		// Konfigurationsdateien laden
    
    /* Funktionen definieren */
    
    void schlafen(unsigned int t)
    {
       unsigned int i;
       for(i=0; i<t; i++)
          {
             Sleep(72);
          }
    }
    
    /* Geradeausfahren */
    
    void GeradeAus()
    {
       static unsigned int i=0;
       unsigned int OdoDataInit[2];
       unsigned int OdoData[2];
       static unsigned int n0=0;
       static unsigned int n1=0;
       OdometrieData(OdoDataInit);
       unsigned int old0;
       unsigned int old1;
       static unsigned int spd0=200;
       static unsigned int spd1=200;
    
       for(i=0; i<50; i++)  // 50 mal Messen für exakteren Wert
       {
          OdometrieData(OdoData);
          /* Berechnung der Drehzahl des 0. Odosensors */
    
          if(OdoData[0]/old0 > 1.4 || OdoData[0]/old0 < 0.7) // Wenn Übergang n erhöht
          {
             n0++;
          }
    
          old0=OdoData[0];
    
          /* Berechnung der Drehzahl des 1. Odosensors */
    
          if(OdoData[1]/old1 > 1.4 || OdoData[1]/old1 < 0.7)
          {
             n1++;
          }
    
          old1=OdoData[1];
       }
       StatusLED(GREEN);
    
       /* Drehzahlen ins Verhältnis setzen und dann Geschw. ev. Erhöhen */
    
       if(n0<n1)
       {
          if(spd0<255)
          {
             spd0++;
          }
          else
          {
             spd1--;
          }
       }
       else if(n0>n1)
       {
          if(spd1<255)
          {
             spd1++;
          }
          else
          {
             spd0--;
          }
       }
       MotorDir(FWD,FWD);
       MotorSpeed(spd0,spd1);
    }
    
    
    /* Beginn des Hauptprogramms */
    
    int main (void){
    Init();				//Prozessor initialisieren
    
    while(1)			// Endlosschleife
    {
    
      GeradeAus();
    
    }
    
    /* Schluss ! */
    
    return 0;
    }
    Räder und Odometrie sind definitiv in Ordnung

    Möchte hier generell nochmal anmerken dass ich es echt klasse findet dass ihr hier Anfängern wie mir so unter die Arme greift
    Wenn ich wa mehr draufhab werd ich mich auch bemühen


    // Edit!
    Jetzt habe ich auch deine Editierung gesehen. Werde ich heute noch angehen

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    23.12.2007
    Ort
    AC
    Beiträge
    23
    Odometrie ist schon eine spannende Sache. Ich bleibe hartnäckig .

    Jetzt habe ich mir ein Programm nach Radbruchs zweitem Vorschlag (Zwischenspeicherung) geschrieben, das eigentlich komplett logisch ist (/sein sollte ) aber natürlich nicht läuft. Schade, dachte es sähe so schon aus!

    Hier der Code:
    Code:
    #include "asuro.h"		// Konfigurationsdateien laden
    
    /* Funktionen definieren */
    
    /* Geradeausfahren */
    
    void GeradeAus()
    {
    char e,f,h,i,j;               // Zähler
    unsigned int OdoData[2];      // Array für Odo Werte
    unsigned int save[5];         // Zwischenspeicher für Odo Wertereihe
    unsigned int wahr[5];         // Zähler
    static unsigned int spd0=170; // Geschwindigkeit
    static unsigned int spd1=170; // Geschwindigkeit
    unsigned int n[2];	      // Zähler
     
    for(e=0; e<10; e++)       // Anzahl der Messungen die durchgeführt werden
    {
       for(f=0; f<2; f++)     // Messung für links/rechts
       {
          for(h=0; h<2; h++)  // Zwei mal messen: Absteigend oder Aufsteigend?
          {
             for(i=0; i<5; i++) // Fünf mal messen pro Variable
             {
                OdometrieData(OdoData);
                save[i]=OdoData[f];
                if(i==4)        // Wenn Array voll: Checken ob Ab oder Auf
                {
                  for(j=0; j<4; j++)
                   {
                      if(h==0 && save[i]<save[i+1]) // Alter Wert kleiner als neuer? (Auf)
                      {
                         wahr[h]++;
                      }
                      else if(h==1 && save[i]>save[i+1]) // Neuer Wert größer als alter? (Ab)
                      {
                         wahr[h]++;
                      }
                   }
                }
             }
          }
          if(wahr[0]>2 && wahr[1]>2) // Umdrehung fand statt wenn beides zutraf!
          {
             n[f]++;
          }
       }
    }
    
    if(n[0]>n[1]) // gleiches Spiel wie immer!
    {
       if(spd0<255)
       {
          spd1++;
       }
       else
       {
          spd0--;
       }
    }
    else if(n[0]<n[1])
       {
          if(spd1<255)
          {
             spd0++;
          }
          else
          {
             spd1--;
          }
       }
       MotorDir(FWD,FWD);
       MotorSpeed(spd0,spd1);
    }
    
    /* Beginn des Hauptprogramms */
    
    int main (void){
    Init();				//Prozessor initialisieren
    
    while(1)			// Endlosschleife
    {
    
      GeradeAus();
    
    }
    
    /* Schluss ! */
    
    return 0;
    }
    ASURO fährt jetzt immer 8en, also quasi das gleiche wie im Video nur dass er nach einmal stehen bleiben bei dem einen rad und der darauf folgenden Beschleunigung da spd1=0 wird, das andere Rad bis auf 0 drosselt und das gleiche Spiel wieder von vorne beginnt. Das kann er schon ganz gut
    Würde mich freuen wenn ihr mal drüber guckt Gute Nacht!

  8. #18
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo teHIngo

    Würde mich freuen wenn ihr mal drüber guckt ... Gute Nacht!
    Na, du machst es dir einfach. Stellst deinen voll komplizierten Code rein und gehst ins Bett. Und wir können uns nun quälen. Da brauche ich etwas länger, bis ich da durchblicke. Meine Lösung zur Prüfung der aufsteigenden/abfallenden Wertefolgen sah mal so aus:

    Code:
    unsigned int data[2], count_l, count_r;
    
    void count(void){
    static unsigned int o1_l, o2_l,o3_l,o4_l, o1_r, o2_r, o3_r, o4_r;
    static unsigned char odo_bit_l, odo_bit_r;
    
        OdometrieData(data);
        if ((data[0]<o1_l) && (o1_l<o2_l) && (o2_l<o3_l) && (o3_l<o4_l)) {
            if (!odo_bit_l) { count_l ++; odo_bit_l=(1==1); StatusLED(YELLOW); }
        }
        if ((data[0]>o1_l) && (o1_l>o2_l) && (o2_l>o3_l) && (o3_l>o4_l)) {
            if (odo_bit_l) { count_l ++; odo_bit_l=(1==0); StatusLED(OFF); }
        }
        if ((data[1]<o1_r) && (o1_r<o2_r) && (o2_r<o3_r)) {
            if (!odo_bit_r) { count_r ++; odo_bit_r=(1==1); StatusLED(RED); }
        }
        if ((data[1]>o1_r) && (o1_r>o2_r) && (o2_r>o3_r)) {
            if (odo_bit_r) { count_r ++; odo_bit_r=(1==0); StatusLED(OFF); }
        }
        o4_l=o3_l; o3_l=o2_l; o2_l=o1_l; o1_l=data[0];
        o3_r=o2_r; o2_r=o1_r; o1_r=data[1];
    }
    count_l/r sind die Zähler, odo_bit_l/r der letze Status, ox_l/r die Werte der letzten Daten. Das ist sicher auch nicht das Ei des Kolumbus, funktioniert aber halbwegs zuverlässig. Im Stillstand ohne drehende Motoren kann man am Rad drehen und die Segmentwechsel an der StatusLED erkennen.

    ASURO fährt jetzt immer 8en
    Das liegt wohl daran, dass immer noch ein Überlauf der Werte stattfindet. Nun eben im Wechsel einmal links und einmal rechts. Ich schau mir morgen mal deinen Code genauer an. Ebenfalls gute Nacht.

    Gruß

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

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

    So scheint es halbwegs zu funktionieren. Allerdings dürften ein paar Segmentwechsel verlorengehen, weil wir die Seiten nacheinander prüfen(f-Schleife):
    Code:
    #include "asuro.h"      // Konfigurationsdateien laden
    
    /* Funktionen definieren */
    
    /* Geradeausfahren */
    
    void GeradeAus(void)
    {
    unsigned char e,f,i,j;        // Zähler
    unsigned int OdoData[2];      // Array für Odo Werte
    unsigned int save[5];         // Zwischenspeicher für Odo Wertereihe
    unsigned int wahr[2];         // Zähler
    unsigned int richtung[2];     // letze Flanke auf- oder absteigend?
    static unsigned int spd0=170; // Geschwindigkeit
    static unsigned int spd1=170; // Geschwindigkeit
    unsigned int n[2];         // Zähler
    
    for(e=0; e<10; e++)       // Anzahl der Messungen die durchgeführt werden
    {
       for(f=0; f<2; f++)     // Messung für links/rechts
       {
          	wahr[f]=0; // Löschen nicht vergessen
          	for(i=0; i<5; i++) // Fünf mal messen pro Variable
             {
                OdometrieData(OdoData);
                save[i]=OdoData[f];
                if(i==4)        // Wenn Array voll: Checken ob Ab oder Auf
                {
                  for(j=0; j<4; j++)
                   {
                      if(richtung[f] && (save[i]<save[i+1])) // Werte aufsteigend?
                      {
                         wahr[f]++;
                      }
                      else if(!richtung[f] && (save[i]>save[i+1])) // Werte Abfallend?
                      {
                         wahr[f]++;
                      } // if richtung
                   } //j
                } // if i==4
             } //i
    	      if(wahr[f]==5) // richtungwechsel fand statt wenn alle Werte auf/absteigend!
             {
    				n[f]++;
                richtung[f]=!richtung[f];  //letzte Werterichtung merken
             }
       } //f
    } //e
    if (n[0] == n[1]) // bei Zählergleichstand
    {
    	spd0=spd1=170; // starten wir neu
    	n[0]=n[1]=0;
    }
    else if(n[0]<n[1]) // gleiches Spiel wie immer!
    {
       if(spd0<255)
       {
          spd0++;
       }
       else if(spd1>1) // aber nun vorsichtshalber mit Begrenzung
       {
          spd1--;
       }
    } else
    {
       if(spd1<255)
       {
          spd1++;
       }
       else if(spd0>1)
       {
          spd0--;
       }
    }
       MotorDir(FWD,FWD);
       MotorSpeed(spd0,spd1);
    }
    
    /* Beginn des Hauptprogramms */
    
    int main (void){
    Init();            //Prozessor initialisieren
    
    while(1)         // Endlosschleife
    {
    
      GeradeAus();
    
    }
    
    /* Schluss ! */
    
    return 0;
    }
    Die Warnungen sind nun auch weg, die Indexe waren char, unsigned char war richtig.

    Gruß und gute Nacht

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

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    23.12.2007
    Ort
    AC
    Beiträge
    23
    Hallo radbruch

    herzlichen Dank für Deine Hilfe! Ich wollte mit meinem letzten Post keineswegs vorlaut oder fordernd sein, ich war nur etwas verzweifelt weil es wiedermal nicht klappte Aber ich bleibe natürlich am Ball und wenn ihr möchtet halte ich euch auf dem laufenden.

    Die Überarbeitung des Programmes hat mir sehr gefallen! Ich kann deine Korrekturen nachvollziehen, nur das richtung[f] und !richtung[f] ist mir nicht ganz klar, wohl aber, dass du damit eine Schleife umgehst.

    Allerdings muss ich dir - leider! - mitteilen, dass das Programm bei meinem Asuro immer noch nicht klappt. Er fährt nun im Kreis und hört damit auch nicht mehr auf, was aufgrund deiner guten Idee mit der if-Abfrage der Fall ist (spd wird niemals 0).
    Mir ist das ganz unerklärlich ehrlichgesagt, werde es mir aber noch mal durch den Kopf gehen lassen. Irgendwo muss ja ein logischer Fehler sein!
    Wenn mir einfällt warum es nicht klappt werde ich das hier sofort posten. Vielleicht setze ich mich mal an deinen ersten Vorschlag (Schwellwerte), aber erstmal habe ich den erhgeiz das hier endlich zum laufne zu bringen .

    Vielen Dank übrigens auch für deinen Tipp roboterheld. [... ohne Worte]

    Gruß
    tehingo

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests