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.
Lesezeichen