Duration of activity: 3 timer
group members participating:
Henrik Jørgensen
Michael Schiønning
William Thorsen
Mål
Målet med denne øvelsesgang er at gennemføre øvelserne til denne uges ugeseddel Sequential and reactive control strategies1
Plan
Planen for denne uge er:
- Påmontere robottens lyssensor
- Udarbejde ugens øvelser
- Påbegynd blogindlæg
Resultat af øvelser
Opgave 1
Til den første opgave skulle vi teste hvor godt det udleverede program BlackWhiteSensor.java2 var i stand til at afmåle forskellige lyse og mørke overflader. Måden hvorpå programmet virker på er, at via metoden calibrate tages der målinger over en hhv. hvid og sort overflade. Dette indstiller så standardværdien for sort og hvid. efter at have taget en hvid og en sort måling bliver grænseværdien mellem sort og hvid udreget som medianen mellem de to værdier. Altså har vi at blackWhiteThreshold =(blackLightValue + whiteLightValue)/2.
I stedet for at kaste os ud i et nyt program til at teste BlackWhiteSensor.java med tog vi blot LineFollowerCal.java, som forklares i næste opgave. Selvom de værdier fra lyssensoren teoretisk set burde ligge fra 0-100 lå vores målinger fra 37-62. Et bud på hvorfor vi ikke kommer helt tæt på 0 og 100 kunne være at de afmålte overflader enten ikke var klare nok (i det hvide tilfælde) samt at lokalets naturlige lys kunne påvirke de sorte målinger.
Opgave 2
I denne opgave skulle vi arbejde med programmet LineFollowerCal.java3, som gør brug af calibrate metoden fra foregående program. Efter at metoden light får en måling fra sensoren sættes de til standardværdien for sort og hvid. Efterfølgende går LineFollowerCal ind i et loop, hvor der kontinuert tages prøver med lyssensoren samt kraft bliver tilført moteren alt efter om mplingen registrerer hvid eller sort.
Når programmet modtager en måling fra lyssensoren vurderes den til at være enten sort, hvis den er under den udregnede grænseværdi. Ellers er den hvid. I tilfædet af en sort registrering tilføjes kraft til robottens venstre motor og den drejer til højre. Registreres der en hvid måling i stedet tilføjes den højre motor samme kraft og vi drejer til venstre. Resultatet er at robotten er i stand til at følge en linje mellem en sort og en hvid overflade ved konstant oscillering.
Opgave 3
I denne opgave skulle vi lave en ColourSensor klasse (Her navngivetBGWSensor.java4) som ud over at kunne registrere sort og hvid også kunne se farven grøn. Dette blev lavet med at ganske enkelt viderudvikle den allerede udgivne BlackWhiteSensor.java. Vi havde allerede fundet ud af at hvid og sort henholdsvis ligger på over 60 og under 40. En scanning af et stykke grønt papir fortalte os at grøn var 49-51 afhænging af nuancen af grøn. Så vi lavede endnu et threshold imellem sort og hvid til programmet, som kunne printe ud hvis den kunne se en lysværdi som matchede grøn.
Opgave 4
Siden vi nu kan registre om en farve er grøn kan vi modificere den udleverede Linefollower5 program. Vi bruger vores new class så vi kan måle grønt. Vi udvider det tjek som skal se om robotten har krydset mellem den sorte og hvide side af linjen. I det ekstra tjek stopper robotten, hvis den ser en grøn farve.
Vi fandt hurtigt ud af at robotten kunne finde på at registrere grøn når den kørte langs linjen i det øjeblik den skiftede fra den sorte til den hvide side.
else if (sensor.green()) {
if(seen > 50) {
Car.stop(); // Must be green then
LCD.drawString("GREEN!!", 0, 4);
Thread.sleep(3000);
seen = 0;
break;
Som det ses oven for sørgede vi for at robotten først stoppede efter at den havde taget 50 målinger af grøn i træk ved hjælp af en counter. Ydermere bliver counteren sat til 0, såfremt en sort eller hvid måling foretages imellem de grønne.
Opgave 5
Her skulle vi prøve at implementere en PID-controller6 som i uge 3
LineFollower.java kunne relativt let blive implementeret after at gense den gamle pseudokode7.
Kp = 1000
Ki = 100
Kd = 10000
offset = 45
Tp = 50
integral = 0
lastError = 0
derivative = 0
Loop forever
LightValue = read light sensor
error = LightValue - offset
integral = integral + error
derivative = error - lastError
Turn = Kp*error + Ki*integral + Kd*derivative
Turn = Turn/100
powerA = Tp + Turn
powerC = Tp - Turn
MOTOR A direction=forward power=PowerA
MOTOR C direction=forward power=PowerC
lastError = error
end loop forever
Kalibreringen af PID er mangelfuld, men funktionsdygtig:
Vi lagde ud med at at sætte Ki = 0 og Kd = 0, dernest kalibrere Kp indtil bilen oscilerede omkring linjen. Herefter udregnede vi kI og kD (Ziegler–Nichols methoden) som foreslået i [7]. Dette resulterede dog i vilde udsving i den tildelte kraft til den enkelte motor. Vi kalibrerede da selv disse værdier ved trial and error indtil bilen kunne gennemføre banen.Der efterlades bestemt plads til forbedringer i kalibreringen.
Opgave 6
Vi fik udleveret en NXT Color Sensor og programmet ColourSensorSensor.java8. Dette brugte vi til at tjekke om vi kan se forskellige farver. Vi brugte de 3 farver vi har arbejdet med til denne lektion, altså Sort, Hvid og Grøn og vi fik disse resultater.
| Hvid | ||
| Raw value | Calculated value | |
| Rød | 650 | 162 |
| Grøn | 285 | 150 |
| Blå | 530 | 160 |
| Light | 590 | 155 |
| Colour value: 6 |
| Sort | ||
| Raw value | Calculated value | |
| Rød | 60 | 0 |
| Grøn | 60 | 0 |
| Blå | 60 | 0 |
| Light | 60 | 0 |
| Colour value: 7 |
| Grøn | ||
| Raw value | Calculated value | |
| Rød | 500 | 60 |
| Grøn | 530 | 92 |
| Blå | 435 | 42 |
| Light | 500 | 60 |
| Colour value: 1 |
Sensoren kunne fint finde ud af hvad farve var hvad, men det var ret svært at gennemskue
hvordan det faktisk gjorde det.
Dernæst brugte vi vores "Stop at Green" kode til at teste om denne sensor også kan bruges
Resultatet var tilfredsstillende, dog havde sensoren det praktiske problem at den , ulig lyssensorem, skulle være meget tættere på at være vinkelret mellem selve sensoren og overfladen før den ville stoppe på det grønne felt.
Konklusion
I denne uge har vi monteret lyssensoren på vores robot og fået et indblik i, hvordan den fungerer. Dette er bl.a. gjort ved at teste forholdene mellem sort og hvid via målinger fra BlackWhiteSensor. Ved at bruge kaliberingen har vi kunnet påvirke robottens motorer og været i stand til at få den til at følge en linje imellem en sort og en hvid overflade. Ydermere har vi fået sensoren til at opfatte en tredje farve ved at ændre på grænseværdierne i programmet. Derved har det været muligt at kunne få robotten til at stoppe på et grønt felt efter at have fulgt linjen mellem hvid og sort.
Vi har også erfaret at siden sensoren registrerer lysværdier og ikke egentlige farver kræver det lidt ekstra benarbejde at sikre os at robotten kun stopper på det grønne felt og ikke tidligere i løbeta f en overgang mellem den hvide og sorte del af banen.
Derudover har vi lært, mere, om hvordan en PID-controller kan bruges til at mindste robottens oscillering samt udfordringerne med at finde ud af hvilke variabler der skal ændres og med hvor meget. Endeligt har vi stiftet bekendsskab med farvesensoren og erfaret at man skal tage højde for vinklen mellem den målte overflade og sensoren før vi kunne registrere den grønne farve.
1 http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson4.dir/Lesson.html↩
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://drive.google.com/?authuser=0#folders/0B22Duz_kNMvWTjByYlEtc2NHQjg↩
5 LineFollowerStop.java i linket https://drive.google.com/?authuser=0#folders/0B22Duz_kNMvWTjByYlEtc2NHQjg↩
6 https://docs.google.com/file/d/0B22Duz_kNMvWaHlKejIwY0hURUU/edit↩
7 http://www.inpharmix.com/jps/PID_Controller_For_Lego_Mindstorms_Robots.html↩
8 http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson4.dir/ColorSensorTest.java↩
No comments :
Post a Comment