Date: 30. September
Duration of activity: 3 hours
Groups members participating: Heine Stokholm, Michael Vilhelmsen and Mads Møller Jensen
Dagens opgaver:
- Opbyg LEGO-robotten og lav et program, der benytter og tester klassen BlackAndWhiteSensor.java
- Prøv programmet LineFollowerCal.java, der benytter BlackAndWhiteSensor klassen. (Optimér programmet så robotten følger linjen blødere og hurtigere
- Lav et program ColorSensor.java ved at ændre i BlackAndWhiteSensor.java. Test ColorSensor og se om et sådant program er brugbart
- Implementer ColorSensor i LineFollower så robotten stopper i en grøn målzone.
Efter en ombygning fra sidste uge har LEGO-robotten Thor skiftet udseende og ser nu således ud:
BlackAndWhiteSensor programmet går ud på, at man kalibrerer lyssensoren til en hvid farve og en sort farve. Programmet beregner så en median (thershold). Hvis målinger herefter er over threshold-værdien sige robotten: "White", og hvis en måling er under værdien siger robotten: "Black".
Vi har ændret lidt i programmet, så vi bruger LightSensor'ens readNormalizedValue() i stedet for den i forvejen brugte readValue(). readNormalizedValue() læser nemlig raw value (0-1032), hvorimod readValue() læser en procentvis værdi (0-100). Derved får vi mere præcision i målingerne.
LineFollower
Vi har uploaded LineFollowerCal.java med følgende resultat:
Videoen lyver lidt da Thor har problemer med at følge linjen den anden vej rundt og ryger ud i svinget.
ColorSensor
Color sensoren er en udvidelse af den tidligere omtalte b/w sensor. Den fungerer ved at man udover sort og hvid også måler en tredje værdi som ligger mellem sort og hvid som vi har kaldt grøn. Så kan man spørge sensoren om man er over hvid, grøn eller sort. Det giver dog problemer da lyssensoren registrerer den grønne værdi hver gang man er på vej væk fra stregen.
Three level lineFollower
Vores næste forsøg var at lave en three level lineFollower. Det vil sige at når vi registrede grøn ved vores lightsensor fik vi robotten til at køre ligeud. Det fik gjort den lidt mere flydende, men slet ikke optimalt. Derfor prøver vi nu en pid LineFollower.
Pid LineFollower
Vi har lavet et PID system jvf. artiklen A PID Controller for Lego Mindstorm Robots. Vi startede med at sætte værdierne Ki og Kd til 0. Robotten var altså nu kun afhængig af Kp. Vi fandt så en passende værdi, som gjorde at robotten kunne følge en linje uden at miste sporet, og uden at oscillere alt for meget. Denne værdi valgte vi så at kalde Kc. Herefter målte vi frekvensen af de oscillationer robotten foretog. Denne værdi kaldte vi for Pc. Til sidst fandt vi ud af at vores while-loop tog cirka 0.01 sekund at gennemløbe. Med disse tal kunne vi bruge Ziegler–Nichols metoden vha. følgende skema:
I koden kom det til at se således ud:
//critical value (Vi har fundet den vha forsøg)
int Kc = 60;
double Kp = Kc * 0.6;
//2*Kp*dT/Pc, (Pc og dT målt ved forsøg)
double Ki = (2*Kp*0.01) / 0.5;
//(Kp*Pc)/8dT
double Kd = (Kp*0.5)/(0.08);
Dette betyder at vi kan optimere robotten ved at tweake Tp og Kc, hvorefter de andre værdier vil tilpasse sig.
Robotten kom til at følge linjen fornuftigt ved brug af PID kontrollen:
Hele koden kan ses her: LineFollowerCS.java
STOP!
Vi skulle herefter forsøge at få robotten til at stoppe i den grønne målzone. Ved brug af kun en sensor var dette umuligt, da robotten hele tiden læste en grå værdi, svarende til den grønne. Vi valgte derfor at tilføje en ekstra sensor, som kunne måle en grøn værdi som ikke var i forbindelse med den sorte linje.
Vores robotdesign ser nu sådan ud:
Den ekstra kode vi har tilføjet til LineFollowerCS.java er følgende:
RCXLightSensor sensorLeft = new RCXLightSensor(SensorPort.S3);
...
sensorLeft.setFloodlight(true);
...
if(sensorLeft.getNormalizedLightValue() < 340 &&sensorLeft.getNormalizedLightValue() > 290)
{
stop++;
} else {
stop = 0;
}
if(stop > 30){
System.exit(0);
}
}
Dette gav følgende resultat:
I næste uge skal vi bruge disse egenskaber og modificerer dem til at bygge en robot, som kan deltage i en konkurrence kapløb mod andre robotter.
Vi har lavet et PID system jvf. artiklen A PID Controller for Lego Mindstorm Robots. Vi startede med at sætte værdierne Ki og Kd til 0. Robotten var altså nu kun afhængig af Kp. Vi fandt så en passende værdi, som gjorde at robotten kunne følge en linje uden at miste sporet, og uden at oscillere alt for meget. Denne værdi valgte vi så at kalde Kc. Herefter målte vi frekvensen af de oscillationer robotten foretog. Denne værdi kaldte vi for Pc. Til sidst fandt vi ud af at vores while-loop tog cirka 0.01 sekund at gennemløbe. Med disse tal kunne vi bruge Ziegler–Nichols metoden vha. følgende skema:
I koden kom det til at se således ud:
//critical value (Vi har fundet den vha forsøg)
int Kc = 60;
double Kp = Kc * 0.6;
//2*Kp*dT/Pc, (Pc og dT målt ved forsøg)
double Ki = (2*Kp*0.01) / 0.5;
//(Kp*Pc)/8dT
double Kd = (Kp*0.5)/(0.08);
Dette betyder at vi kan optimere robotten ved at tweake Tp og Kc, hvorefter de andre værdier vil tilpasse sig.
Robotten kom til at følge linjen fornuftigt ved brug af PID kontrollen:
Hele koden kan ses her: LineFollowerCS.java
STOP!
Vi skulle herefter forsøge at få robotten til at stoppe i den grønne målzone. Ved brug af kun en sensor var dette umuligt, da robotten hele tiden læste en grå værdi, svarende til den grønne. Vi valgte derfor at tilføje en ekstra sensor, som kunne måle en grøn værdi som ikke var i forbindelse med den sorte linje.
Vores robotdesign ser nu sådan ud:
Den ekstra kode vi har tilføjet til LineFollowerCS.java er følgende:
RCXLightSensor sensorLeft = new RCXLightSensor(SensorPort.S3);
...
sensorLeft.setFloodlight(true);
...
if(sensorLeft.getNormalizedLightValue() < 340 &&
{
stop++;
} else {
stop = 0;
}
if(stop > 30){
System.exit(0);
}
}
Dette gav følgende resultat:
I næste uge skal vi bruge disse egenskaber og modificerer dem til at bygge en robot, som kan deltage i en konkurrence kapløb mod andre robotter.
Ingen kommentarer:
Send en kommentar