Das ist mein erster Eintrag in diesem Forum. Ich habe von euren Darstellungen gelernt, vielen Dank! Nun möchte ich auch einen programmvorschlag beisteuern: Es benutzt im Gegensatz zu dem Programm von waste variable Entscheidungswerte für die Zählung der OdoFeld-Wechsel.
Code:
#include "asuro.h"
#include "stdlib.h"

	
int countChanges(int *d);
int findMd(int *d);

int popSize=500;			//Anzahl der Messwerte, die zur Regelung gesammelt werden



int main (void){
  
  int speedL = 200;
  int speedR = 200;  
  
  int odoIn[2];							//zum Einlesen der Odometriedaten
  int dL[popSize], dR[popSize];			//speichern Odometriedaten
  int changesDiff=0;						//Differenz der OdoFeldWechsel zw. l. & r. Rad
  
  Init();
  StatusLED(GREEN);
  MotorDir(FWD, FWD);
  MotorSpeed(speedL, speedR);
  
 
  while(1){
    int i;

    for (i=0; i<popSize; i++){
	  OdometrieData(odoIn);
	  dL[i] = odoIn[0];
	  dR[i] = odoIn[1];}
	  
	changesDiff=countChanges(dL)-countChanges(dR);  


   if (changesDiff>0){
     if (speedR<255&&speedL>0){
	    speedL--;
		speedR++;}}
	  
    else if (changesDiff<0){
	  if (speedL<255&&speedR>0){
	    speedL++;
		speedR--;}}

    MotorSpeed(speedL, speedR);}

  return 0;}
	  
	  



int countChanges(int* d){
  int i;
  int color;			    //0=black, 1=white
  int changes=0;			//Anzahl der OdoFeldWechsel
  int md=findMd(d);		//Helligkeits-Median
  
  if (d[0]<md) color=0;	//erster Messwert war schwarzes Feld
  else color=1;			//bzw weisses Feld
  
  for(i=0; i<popSize; i++){
    if (d[i]<md && color==1){			//Wechsel von weiss nach schwarz
	  color=0;						
      changes++;}
	  
	else if(d[i]>md && color==0){		//... von s nach w
      color=1;
	  changes++;}}
  
  return changes;}





int findMd(int* d){
  int i, j;
  int md=0;							//Median			
  int c;							//zählt den Rang des Wertes
    
  for (i=0; i<popSize; i++){
    c=0;
	
	for(j=0; j<popSize; j++){  
      if (i!=j && d[i]>d[j]) c++;}		    //Bestimmung der Helligkeits-Rangordnung
	  
	if (c>=popSize/2){ 						//wenn mind.s die Hälfte aller Werte kleiner sind
      if (md==0) md=d[i];						//...dann übernehme den Wert als Median
	  else md=(d[i]<md)?d[i]:md;}} 	    	//...finde den kleinsten Wert der oberen Hälfte
	
  return md;}
Es speichert 500 Odo-Werte und ermittelt den Median, also den Wert, unter dem min. 50% der Werte liegen. Damit fährt er meistens relativ gerade. Ich habe es für speed 90 - 200 getestet. probiert es mal aus und sagt mir was ihr davon haltet,

beste grüsse

florian


PS.: kann mir jemand von euch sagen, in welchem Takt die Odometriedaten eingelesen werden?


edit: hups, hatte RWD statt FWD bei MotorDir.