PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6 sucht und sammelt coladose



RP6conrad
23.09.2008, 22:21
Siehe mal das video an von meinen RP6 : er sucht und sammelt leere coladose. Das ganse naturlich nicht um nach eine party auf zu raumen, aber für unsere Wettkampf "Roborama". Da muss der Robby so schnell wie moglich 6 coladose suchen und nach eine bestimmte Stelle retournieren. Aber auch beim letzte Wettkampf war der RP6 gans gutt. Da hatte wir eine Teambuilding organisiert mit 3 verschiedene Aufgabe. Am 9uhr die (unbekannte) Aufgaben bekommen , am 15 h fangt der Wettkamp an !

http://video.google.com/videoplay?docid=-2147991936793688895

Teambuilding :

www.robotmc.org

ACU
25.09.2008, 14:32
Cool, hast du gut gemacht!

Kannst du sagen, wie die Erkennung Software mäßig funktioniert?
Ich denke du suchst peilst die Mitte an, indem du das lokale Minimum der Messwerte ermittelst oder?

MfG
ACU

RP6conrad
25.09.2008, 19:04
An sich ist das relatif einfach : Der servo von Sharp IR fahrt verschieden positionen an. Dan wirt der ADC Wert eingelesen und gespeichert in eine Array. Am ende von Servoweg (pos 0 = 1 mS, pos 10 = 2 mS) wird der Array untersucht auf min. Werte. Das gibt dan 2 min. Variabelen : Eine ist der minimale Abstand das die Sharp IR hat gesehen, das andere ist die Servopos. die hiermit zusammen hangt. Mit diesen Werten wird dan der RP6 in die Richtung gesteuert wo das ein coladose sein soll O:) . Hiebei die code von scanning :
int8_t Blik[14]={80,80,80,80,80,80,80,80,80,80,80,80,80,80,}; //meetwaarden Sharp IR onder
int8_t BlikMax=80; //hoogst gemeten waarde Blik sensor
uint8_t imaxR=0; //positie hoogste gemeten waarde Blik

int8_t Wand[14]={80,80,80,80,80,80,80,80,80,80,80,80,80,80,}; //meetwaarden Sharp IR boven
int8_t WandMax=80; //hoogst gemeten waarde Wand sensor
uint8_t imaxL=0; //positie hoogste gemeten waarde Wand

int16_t SharpVoor=0 ; //ADC2 ingang van M32
int16_t SharpAchter=0; //ADC3 ingang van M32

uint8_t up=1;
uint8_t i=0;
uint8_t state=0; //toestand blik zoeken
uint8_t refresh=2; //Data volledige scan beschikbaar : refresh==2
void ScanR(uint8_t min,uint8_t max,uint8_t time)
{
if (getStopwatch3()>time)
{
getAllSensors(); //ADC ingangen via I2C van basis halen
SharpVoor = readADC(ADC_3);//ADC3 ingang van M32 lezen
SharpAchter = readADC(ADC_2);//ADC2 ingang van M32 lezen

//if(((adc0-adc1)>25)&((adc0-adc1)<500)) Blik[i]=adc0;else Blik[i]=0; //Blik detectie
if (adc0<100)adc0=100;
if (adc1<100)adc1=100;
Blik[i]=7500/adc0;
Wand[i]=7500/adc1; //Wand detectie

statusLEDs.byte=0b000000;
if (Blik[i]<70) statusLEDs.LED1=1;
if (Blik[i]<50) statusLEDs.LED2=1;
if (Blik[i]<40) statusLEDs.LED3=1;
if (Wand[i]<70) statusLEDs.LED4=1;
if (Wand[i]<50) statusLEDs.LED5=1;
if (Wand[i]<40) statusLEDs.LED6=1;
updateStatusLEDs();
clearLCD();
writeStringLCD("Blik Wand");
setCursorPosLCD(1,0);
writeIntegerLengthLCD(BlikMax,DEC,2);
setCursorPosLCD(1,5);
writeIntegerLengthLCD(imaxR,DEC,2);
setCursorPosLCD(1,9);
writeIntegerLengthLCD(WandMax,DEC,2);
setCursorPosLCD(1,14);
writeIntegerLengthLCD(imaxR,DEC,2);


if (min==max) i=min;
else
{
if (up)i++ ;
else i--;
}
servo(2,(10+i));//Servo 2 = stekker 4
setStopwatch3(0);
if(i<=min) up=1;
if(i>=max)up=0;
Wand[max+1]=Wand[max]; //waarde invoeren uiterste stand +1


if((i==min)|(i==max))//Alleen update van Max waarden indien einde scanbereik
{
if (refresh<2) refresh++;
BlikMax=100;

imaxR=0;
WandMax=100;
imaxL=0;
writeString_P("Blik RAW :");
for(uint8_t j=min;j<=max;j++)
{
writeInteger(Blik[j],DEC);
writeChar(',');
}
writeChar('\n');
for(uint8_t j=0;j<=12;j++)
{
if((j<min)|(j>max)){Blik[j]=100;Wand[j]=100;}
if ((abs(Blik[j]-Wand[j+1])<18)) Blik[j]=90;
if (Blik[j]<BlikMax) {BlikMax=Blik[j];imaxR=j;}
if (Wand[j]<WandMax) {WandMax=Wand[j];imaxL=j;}
}
writeString_P("Blik DET :");
for(uint8_t j=min;j<=max;j++)
{
writeInteger(Blik[j],DEC);
writeChar(',');
}
writeChar('\n');
writeString_P("Wand RAW:");
for(uint8_t j=min;j<=max;j++)
{
writeInteger(Wand[j],DEC);
writeChar(',');
}
writeChar('\n');


//writeInteger(BlikMax,DEC);
//writeChar(',');
//writeInteger(imaxR,DEC);
//writeChar(',');
//writeInteger(state,DEC);
//writeChar(',');
//writeInteger(WandMax,DEC);
//writeChar(',');
//writeInteger(imaxL,DEC);

}
}
}