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!