Varighed: 4 timer
Tilstedeværende: Morten, Jonas, Simon
Siden sidst:
Vi har fået BlueTooth forbindelse til NXT enheden. Dette gør at vi nu kan uploade vores kode til NXT'en uden at skulle forbinde den via USB. Der ud over kan vi nu også, vha. de i LeJos givet værktøjer, aflæse sensor værdier live på en PC.
Goal:
Målet med denne lab session er at udforske lys sensoren og derved få en bedre forståelse af hvordan den virker og hvordan den kan bruges som en del af en robot.
For at opnå vores mål har vil valgt at følge de opgaver stillet i NXT Programming, Lesson 4, da vi mener at disse opgave dækker brugen af lys sensoren.
Plan:
Planen for denne session er følgende:
- Sikre at alle i gruppen har mulighed for at uploade programmer til robotten.
- Ombygge robotten så den får en lyssensor sat på sig.
- Teste lyssensoren, samt kalibrere input.
- Test af programmet LineFollowerCal.java, for at undersøge hvordan man kan gøre brug af lyssensoren.
- Implementation af en ColorSensor, som kan genkende, hvid, sort og blå.
- Implementation af en bil som kører langs en sort linje for at stoppe i et blåt målfelt.
- Hvis der er tid, implementeres der en bil med en PID controller efter artiklen [1]
Results:
punkt 1 og 2:
Det gik forholdsvis nemt med at sikre sig, at de andre i gruppen kunne uploade til robotten. Det gik også nemt med at ombygge robotten.
punkt 3:
Lyssensoren blev testet ved, at køre programmet BlackWhiteTest.java. Her bruges metoden calibrate() i klassen BlackWhiteSensor.java. Kalibreringen sker ved at man først sætter sensoren over noget sort, trykker på enter og derefter på noget hvidt og trykker på enter. De to værdier, som sensoren opfanger bliver sat som henholdsvis sort og hvid internt i sensorklassen. Disse værdier kan sensoren så bruge til automatisk at udregne et threshold mellem hvid og sort.
Resultatet af testen, som blev udført på et hvidt bord med sort gaffa tape, blev derfor at BlackWhiteSensor.java fungerer godt og den kan kende forskel på sort og hvid, hvor sort fik værdien ~30 og hvid en værdi på ~55.
punkt 4:
Programmet blev testet. Det får bilen til at følge en linje ved, at oscillere omkring en sort linje. Når der ses hvid, drejes til venstre, når der ses sort drejes til højre. Under forsøget blev følgende observeret:
Resultatet af testen, som blev udført på et hvidt bord med sort gaffa tape, blev derfor at BlackWhiteSensor.java fungerer godt og den kan kende forskel på sort og hvid, hvor sort fik værdien ~30 og hvid en værdi på ~55.
punkt 4:
Programmet blev testet. Det får bilen til at følge en linje ved, at oscillere omkring en sort linje. Når der ses hvid, drejes til venstre, når der ses sort drejes til højre. Under forsøget blev følgende observeret:
- Når bilen følger en lige streg, gøres dette uden problemer.
- Når bilen følger en streg som drejer, sker det uden problemer når det er venstresving. Er det derimod højresving kan den ikke følge svinget og drejer af mod venstre.
Disse observationer er vigtige til en fremtidig implementation af en bil som skal følge en linje
punkt 5:
Der er blevet implementeret en ny sensorklasse, ColorSensor.java. Klassen har en metode, calibrate(), som beder brugeren om, først at sætte lyssensoren på sort, derefter på hvid og til sidst på blå. Disse tre værdier bliver så brugt til at udregne et skel, mellem sort og blå og hvid og blå.
Så, hvis den aflæste værdi er mellem de to skel, registreres den som blå, hvis den er over hvid-blå skellet registreres den som hvid og er den under sort-blå skellet registreres den som sort.
Resultatet fra testen er at robotten godt kan skelne mellem sort, hvid og blå. Der opstår dog en situation på skellet mellem den sorte linje og det hvide bord, hvor farven bliver opfatte som blå. Dette er noget som skal der skal tages højde for i de fremtidige implementationer.
punkt 6
Der blev implementeret en klasse, LineFollowerCol.java , der har samme logik som LineFollowerCal.java.
Dog bliver det her stoppet hvis farven blå ses. For at tage højde for den ovenfor nævnte situation, hvor blå ses mellem skellet sort og hvis, har vi valgt at sige, at blå skal ses over 11 gange i træk før det stoppes. Da vi sover 10 msec. i slutningen af kontrol loopet, skal lys sensoren se blå i ~110 msec. i træk før robotten stopper.
Som forventet fulgte bilen, som i punkt 4, linjen fint. Strategien for at registrer den blå farve virkede også efter planen.
punkt 7
Vi implementerede vores PID controller i klassen, LineFollowerPID.java. Vi implementerede vores PID controller efter den given pseudo i [1]. Da tiden løb fra os fik vi desvære ikke testet koden nok til at finde de optimale værdier til konstanterne i algoritmen. Men det vi nåede frem til lod til at virke. Se videoerne for den opførsel vi opnåede.
Vi måtte udvide bilen med en ekstra lys sensor for at kunne se om bilen var i det blå felt. Hvis ikke gjorde dette stoppede bilen med mellemrum, hvis den kørte for længe på skellet mellem det hvide og sorte.
Status:
Alt i alt har vi fået en go basis viden omkring lys sensoren om dens kunden og dens begrænsninger. Den af os implementeret lys sensor, ville nok kræve lidt justering, evt. læse raw værdier. For skellet mellem mørk og lyse farver er relativt lille, 30-55. Dette giver ikke et særlig stort spektre at skelne farver i.
Vi ville gerne have udforsket PID controlleren lidt mere, så dette kunne evt. gøres i næste lab session, hvis tiden tillader det.
Litteratur
[1], A PID Controller For Lego Mindstorms Robots.
Der er blevet implementeret en ny sensorklasse, ColorSensor.java. Klassen har en metode, calibrate(), som beder brugeren om, først at sætte lyssensoren på sort, derefter på hvid og til sidst på blå. Disse tre værdier bliver så brugt til at udregne et skel, mellem sort og blå og hvid og blå.
Så, hvis den aflæste værdi er mellem de to skel, registreres den som blå, hvis den er over hvid-blå skellet registreres den som hvid og er den under sort-blå skellet registreres den som sort.
public void calibrate() {For at teste vores implementation af farve sensoren, skrev vi klassen ColorTest.java , som gør det samme som BlackWhiteTest.java blot hvor farven blå nu også kan ses.
blackLightValue = read("black");
whiteLightValue = read("white");
blueLightValue = read("blue");
blackBlueThreshold = (blackLightValue + blueLightValue) / 2;
whiteBlueThreshold = (whiteLightValue + blueLightValue) / 2;
}
public boolean black() {
return (ls.readValue() < blackBlueThreshold);
}
public boolean white() {
return (ls.readValue() > whiteBlueThreshold);
}
public boolean blue(){
return (ls.readValue() > blackBlueThreshold) && (ls.readValue() < whiteBlueThreshold);
}
Resultatet fra testen er at robotten godt kan skelne mellem sort, hvid og blå. Der opstår dog en situation på skellet mellem den sorte linje og det hvide bord, hvor farven bliver opfatte som blå. Dette er noget som skal der skal tages højde for i de fremtidige implementationer.
punkt 6
Der blev implementeret en klasse, LineFollowerCol.java , der har samme logik som LineFollowerCal.java.
Dog bliver det her stoppet hvis farven blå ses. For at tage højde for den ovenfor nævnte situation, hvor blå ses mellem skellet sort og hvis, har vi valgt at sige, at blå skal ses over 11 gange i træk før det stoppes. Da vi sover 10 msec. i slutningen af kontrol loopet, skal lys sensoren se blå i ~110 msec. i træk før robotten stopper.
Som forventet fulgte bilen, som i punkt 4, linjen fint. Strategien for at registrer den blå farve virkede også efter planen.
punkt 7
Vi implementerede vores PID controller i klassen, LineFollowerPID.java. Vi implementerede vores PID controller efter den given pseudo i [1]. Da tiden løb fra os fik vi desvære ikke testet koden nok til at finde de optimale værdier til konstanterne i algoritmen. Men det vi nåede frem til lod til at virke. Se videoerne for den opførsel vi opnåede.
Vi måtte udvide bilen med en ekstra lys sensor for at kunne se om bilen var i det blå felt. Hvis ikke gjorde dette stoppede bilen med mellemrum, hvis den kørte for længe på skellet mellem det hvide og sorte.
Status:
Alt i alt har vi fået en go basis viden omkring lys sensoren om dens kunden og dens begrænsninger. Den af os implementeret lys sensor, ville nok kræve lidt justering, evt. læse raw værdier. For skellet mellem mørk og lyse farver er relativt lille, 30-55. Dette giver ikke et særlig stort spektre at skelne farver i.
Vi ville gerne have udforsket PID controlleren lidt mere, så dette kunne evt. gøres i næste lab session, hvis tiden tillader det.
Litteratur
[1], A PID Controller For Lego Mindstorms Robots.