Tuesday, March 4, 2014

Embedded Systems Lesson 4

Date: 27/2 2014
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 valueCalculated value
Rød650162
Grøn285150
Blå 530160
Light590155
Colour value: 6


Sort
Raw valueCalculated value
Rød600
Grøn600
Blå 600
Light600
Colour value: 7



Grøn
Raw valueCalculated value
Rød50060
Grøn53092
Blå 43542
Light50060
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