@Herbert: Mach ein Array, also int links[5] und int rechts[5].
Dann schiebst du die Werte jeweils eins nach hinten, bevor du ganz vorne den aktuellsten Wert reintust.
Du hast dann eine schöne Zeitreihe in den Arrays, wobei [0] das aktuellste, und [4] der älteste Wert ist. Das Rauschen der Sensoren lässt sich hiermit ganz gut eliminieren, wenn du z.B. die ersten beiden Werte addierst sowie die letzten beide Werte addierst, und dann schaust, wie die Differenz der beiden ist (ist eine Minimalversion eines Tiefpasses!).
Hab vor Jahren mal ein Programm für die Kantenerkennung geschrieben, wobei die erste Funktion zum initialisieren aufgerufen wird, und die zweite um zu erkennen ob man über eine Kante gefahren ist(1==>Kante, 0==>keine Kante).
Ich mach es allerdings auf die einfache Art und Weise, also aktuellsten mit dem vorherigen Wert vergleichen.
Eleganter wäre es, eine längere Zeitspanne zu verwenden um das Rauschen auszugleichen(Tiefpass)==>siehe oben!
hs_abgrund.h
PHP-Code:
#ifndef HSASURO
#define HSASURO
/*Helligkeitsunterschied bei dem eine Kante erkannt wird*/
#define ABGRUND_DIFF 20
/*Variablen für Abgrunderkennung*/
int abgrund_ldata_ref[2];
/*Muss aufgerufen werden,
bevor die Funktion fkt_abgrund_erkennung verwendet wird.*/
void fkt_init_abgrund_erkennung(void);
/*Erkennt Kanten(z.B. beim Tisch). Am besten funktioniert die Erkennung
mit einer Vorwärtsgeschwindigkeit von 100.*/
unsigned char fkt_abgrund_erkennung(void);
unsigned char fkt_abgrund_erkennung(void)
{
int ldata[2],diff_l=0,diff_r=0,schnitt_l=0,schnitt_r=0;
unsigned char c=0;
for(c=0;c<10;c++)
{
LineData(ldata);
schnitt_l=schnitt_l+ldata[0];
schnitt_r=schnitt_r+ldata[1];
}
schnitt_l=schnitt_l/10;
schnitt_r=schnitt_r/10;
diff_l=abs(schnitt_l-abgrund_ldata_ref[0]);
diff_r=abs(schnitt_r-abgrund_ldata_ref[1]);
if(diff_l>ABGRUND_DIFF || diff_r>ABGRUND_DIFF)
{
FrontLED(OFF);
return 1;
}
return 0;
}
void fkt_init_abgrund_erkennung(void)
{
unsigned char c=0;
int schnitt_l=0,schnitt_r=0;
FrontLED(ON);
for(c=0;c<10;c++)
{
LineData(abgrund_ldata_ref);
schnitt_l=schnitt_l+abgrund_ldata_ref[0];
schnitt_r=schnitt_r+abgrund_ldata_ref[1];
}
abgrund_ldata_ref[0]=schnitt_l/10;
abgrund_ldata_ref[1]=schnitt_r/10;
}
#endif
Lesezeichen