Dato:
28-02-2013
Varighed:
Fælles lab: 5 timer
Blog: 4 timer
Deltagere:
Steffen Høi
Nikolaj Mols Hansen
Martin Vang
Ulrik Sahl Lystbæk
Nikolaj Mols Hansen
Martin Vang
Ulrik Sahl Lystbæk
Status
Vi har monteret NXT lyssensoren, som beskrevet i LEGO Mindstorm Education NXT Base Set 9797.
Mål
Målet for denne øvelsesgang er at lave opgaverne for "Week 5 - Sequential and reactive control strategies"1 og derigennem lære hvordan NXT lyssensoren kan bruges til at få
LEGO 9797 bilen til at følge en sort linje og stoppe for enden af linjen, når billen kører ind i "målzonen", der i dette tilfælde er et stykke grønt rektangulært papir for enden af linjen. Ideen er at vi skal bruge lyssensoren til at opfange tre forskellige farver. Desuden er målet også at oprette et blogindlæg for denne laboratoriesession.
Plan
- Montere NXT lyssensoren på LEGO 9797 bilen.
- Løse opgaverne for "Week 5 - Sequential and reactive control strategies"1.
- Udarbejdelse af blogindlæg for "Week 5 - Sequential and reactive control strategies"1.
Opgaver
Black White Detection
Vi har monteret NXT lyssensoren som beskrevet i LEGO Mindstorms Education NXT Base Set 9797 manualen s. 32 til 34.Til at afprøve den udleverede klasse BlackWhiteSensor.java2, brugte vi det udleverede program LineFollowerCal.java3. LineFollowerCal.java3 bruger calibrate metoden fra BlackWhiteSensor.java2 til, at indstille standardværdier for hvid og sort. Metoden light fra BlackWhiteSensor.java2 bruges til at få en måling fra sensoren, som BlackWhiteSensor.java2 er konstrueret med. Når lyssensoren er kalibreret, fortsætter LineFollowerCal.java3 til et loop, hvor der udover at blive tilført kraft til motorerne bliver taget prøver med lyssensoren, og de prøver bliver udskrevet på LCD'et. Derfor kunne vi bruge programmet til også at teste forholdene mellem målinger for sort og hvid.
Selvom værdierne fra lyssensoren teoretisk ligger mellem 0 til 100, ligger de målinger, vi har registreret mellem 39-60. Den laveste værdi er for sort, og den højeste er for hvid.
Line Follower with Calibration
Programmet LineFollowerCal.java3 har vi brugt og beskrevet lidt i afsnittet "Black White Detection" ovenover. Derfor beskriver vi ikke hele programmet igen, men kun den del der ikke er beskrevet endnu. Den essentielle del som programmet gør, der ikke er beskrevet, er når motorerne tilføres kraft i loopet. Motorerne tilføres kraft på baggrund af om sensoren har taget en måling, som vurderes at være sort, fordi værdien er tættere på den kalibrerede sorte værdi end den hvide. Hvis den er sort føres der kraft til den venstre motor, således at bilen drejer til højre. Hvis ikke må målingen antages at være hvid, og programmet handler symmetrisk til den anden retning. Dvs. at den højre motor tilføres den samme kraft, som den venstre hvis det havde været en sort måling.Resultatet er at bilen kan følge en linje mellem sort og hvid ved konstant at oscillere fra side til side.
ColorSensor with Calibration
I denne opgave har vi lavet en klasse, som vi har kaldt BWOURSENSOR.java4 i stedet for "ColorSensor.java", fordi vi synes, det var mere oplagt, da det er en lyssensor, vi anvender, og vi på den måde ikke kommer til at forveksle den med farvesensoren.
Som tidligere nævnt fik vi farveværdierne 39 og 60 for henholdsvis sort og hvid. Vi målte farveværdien fra det grønne kvadrat som der senere skal standses på til at være 47. I stedet for at kalibrere hver gang, vi skulle afprøve programmet, har vi hardcoded de tre værdier for farverne i BWOURSENSOR.java4.
I stedet for at have en grænseværdi mellem sort og hvid, har vi ændret det til, at der nu er to grænseværdier. Én mellem sort og grøn og én mellem grøn og hvid. Idéen bag udregningen er fuldstændig den samme, men udvidet til at grøn er et interval mellem sort og hvid, som vist nedenfor.
greenWhiteThreshold = (greenLightValue + whiteLightValue)/2;
greenBlackThreshold = (greenLightValue + blackLightValue)/2 + 5;
For at vurdere om farven er sort, skal værdien af en måling være mindre end greenBlackThreshold og for at vurdere om den er hvid, skal den være større end greenWhiteThreshold. Til at finde ud af om farven er grøn, har vi tilføjet metoden green, som ses her:
int temp = ls.readValue();
return (temp >= greenBlackThreshold && temp <= greenWhiteThreshold);
Det eneste der sker er, at der afgøres, om værdien af målingen ligger indenfor det interval, som angiver, at den er grøn.
Line Follower that stops in a Goal Zone
Fra det ovenstående emne "ColorSensor with Calibration", har vi muligheden for at se om farven på en måling er grøn. Nu forsøger vi at stoppe på et grønt felt efter at have fulgt en sort-hvid linje. LineFollow2.java5 er vores modificerede udgave af den udleverede LineFollowerCal.java3. I LineFollow2.java5 anvender vi BWOURSENSOR.java4 til, at se når farven grøn aflæses.Vores første idé var at stoppe, når én måling blev registreret til at være grøn, men når den kører mellem den sorte og hvide linje, vil den vurdere farven til at være grøn, når målingen ligger tilstrækkeligt meget på både sort og hvid. Til gengæld er det ikke lang tid det sker, fordi den oscillerer meget, og som følge deraf, vil der hurtigt komme enten en sort eller en hvid måling hurtigt efter. Derfor satte vi bilen til først at stoppe, hvis der havde været fem grønne målinger i træk. På den måde kørte bilen fint rundt, og stoppede på det grønne felt, hvilket man også kan se i nedenstående video.
PID Line Follower
PID controllers handler om at lave en blødere/mindre oscillation for vores linje-følgende robot. Vores tilgang var at implementere selve algoritmen for så at prøve os lidt frem. Efter lidt usystematisk forsøgen, mest for at se om vores algoritme gjorde som den burde, viste det sig dog, at vi havde forbedret hastigheden af gennemløbet med godt 7% power (vi har valgt udelukkende at se på, hvor stort power-output vi var i stand til at sætte på motorerne i gennemsnit, som måling for hvor "hurtigt" vi kom igennem banen).Altså kan vi allerede, uden korrekt at "tune" vores algoritme komme frem til, at vi kan opnå en ganske betragtelig forbedring vha. PID. Hvor vi har valgt at lade vores kode være som den er, synes vi dog, at det er interessant at se på, hvordan vi kunne gribe opgaven an, hvis vi havde brug for at opnå en endnu større forbedring.
Billedet ovenfor beskriver en basal PID. Med den udleverede kode svinger power på motor A og B med +/- alt efter den samlede error. Dette betyder, at vi er nødt til at se på, hvor meget vores samlede error kan blive - en total error på over 100+% er uønsket, hvis vi gerne vil igennem banen.
I vores tilfælde gik vi efter at lade error kontrollere omkring 25% af vores totale power, og lade vores basis fremdrift være 75%. Til at starte med, fandt vi en skaleringsfaktor, der gjorde at vi kunne oscillere os nogenlunde igennem banen. Derefter satte vi den en smule ned, og introducerede i og d. Da det var den forholdsmæssige forskel på værdierne i artiklen, vi arbejdede ud fra, valgte vi at sætte i=1/100*p og d=1/10*p. Dette gav os den ønskede forbedring, dog med den bemærkning at vi nulstiller i hver gang, vi ser en sort streg. En systematisk fremgangsmåde, der sikkert giver et godt resultat, vil være at halvere p. Derefter sættes i lidt op (oprindeligt sat til 0) og d tilpasses for at lave en dæmpende effekt.
Vores kode kan ses i LineFollow3.java6. Nedenstående video viser, hvordan bilen fulgte den sorte linje efter at programmet blev uploadet til den.
Color Sensor
I denne opgave har vi lavet programmet LineFollow4.java7, som er en modificeret udgave af den udleverede LineFollowerCal.java3. Som den første strategi for at løse opgaven, valgte vi at trække alle tre farver. Vi beregnede gennemsnittet af de tre farver og delte den med 2.55, som er en hundrededel af maksimumsskalaen for en RGB farve. Vores intention med den beregning var, at vi nu havde et gennemsnit af nuancen inden for alle tre farveskalaer, og vi ville give en mere præcis værdi til den samme algoritme, som vi brugte i forrige opgave i forbindelsen med sort/hvid-sensoren. De første test viste sig hurtigt, at det ikke var tilfældet, og efter en række test opdagede vi, at det skyldtes hastigheden på farvesensoren. Tiden det tog for farvesensoren at tage alle tre målinger betød, at robotten havde bevæget sig en betydelig del imellem hver måling, og derfor blev det meget upræcist.Ud fra de første resultater kom vi til den konklusion, at vi enten skulle ændre måden robotten bevægede sig på, og derved få den til at bevæge sig langsommere og mere forsigtigt fremad, eller også skulle vi forbedre timingen på sensoren. Vi fandt ud af, at sensoren var meget hurtig til at foretage målinger inden for en farveskala, hvilket betød at vi ligesom ved sort/hvid-sensoren kunne foretage målinger inden for kun en af skalaerne og navigere på samme måde.
Vi diskuterede evt. fremtidige forbedringer, og den mest åbenlyse var at undersøge, hvilken af de tre farver, der giver det bedste resultat. En mere kompleks forbedring kunne være at benytte den bedste farve til at navigere med og lokalisere hvilke områder, der er problematiske for denne farve. Ved målinger der ligger inden for det problematiske område, vil man så stoppe robotten og undersøge området nærmere med de to andre farver for at danne en mere præcis måling.
Konklusion
Denne uge har vi monteret lyssensoren på LEGO 9797 bilen og fået indblik i hvordan denne fungerer ved at lave ugens opgaver. Dette har vi blandt andet gjort ved at foretage målinger med BlackWhiteSensor og teste forholdene mellem sort og hvid. Ved at bruge programmet BlackWhiteSensor.java2 har vi set, hvordan vi kan kalibrere lyssensoren og derved indstille standardværdier for sort og hvid og via programmet registrere lysværdierne med lyssensoren. Ud fra de registrerede målinger har vi, via programmet, kunnet påvirke de to motorer alt efter, om det var sort eller hvid, der blev registreret. På den måde har vi kunnet få vores robot til at følge den sorte linje ved konstant at oscilere fra side til side. Endvidere har vi fået lyssensoren til at kunne registrere tre farver; sort, hvid og grøn ved at lave grænseværdier i programmet BWOURSENSOR.java4 ud fra de lysværdier, vi registrerede for de forskellige farver. Dette har vi kunne bruge til få robotten til at stoppe ved et mål i form af et grønt rektangulært område. Vi har derigennem set, hvilke udfordringer, der kan kan være med at registrere en farve, hvis lysværdi ligger mellem sort og hvid samt kommet frem til en løsning på dette. Derudover har vi erfaret, hvordan vi med en PID controller kan få robotten til at oscilere mindre, samt at det kan være en udfordring, at finde ud af præcist, hvilke variabler man skal ændre på, og hvor meget man skal ændre på disse for at få det bedste resultat. Til slut har vi stiftet bekendtskab med NXT farvesensoren, hvor vi har erfaret at det er nødvendigt at tage højde for hastigheden på farvesensoren, når man skal tage målinger med denne. Det kunne enten være ved at få robotten til at bevæge sig langsommere, forbedre timingen på sensoren eller foretage målinger inden for kun én farveskala.____________________________________________________________________________________________________________
1. https://services.brics.dk/java/courseadmin/DigitalControl/pages/Week+5+-+Sequential+and+reactive+control+strategies
2. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson4.dir/BlackWhiteSensor.java
3. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson4.dir/LineFollowerCal.java
4. https://sites.google.com/site/digikaison/BWOURSENSOR.java
5. https://sites.google.com/site/digikaison/LineFollow2.java
6. https://sites.google.com/site/digikaison/LineFollow3.java
7. https://sites.google.com/site/digikaison/LineFollow4.java








