Tuesday, March 18, 2014

Embedded Systems Lesson 6

Date: 13/3 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 Embodied Agents1


Plan

Planen for denne uge er:
  • Bygge den NXT Braitenberg robotten udfra beskrivelsen i ugeseddelen.
  • Gennemgå ugens øvelser.


Resultat af øvelser 

Vi lagde ud med at bygge basis køretøjet udfra beskrivelsen og de to .lxf filer.

Vehicle 1


Ved brug af en lyssensor skulle vi implementere opførslen af det mest simple Braitenberg køretøj (Vehicle 1). Her forbindes en sensor "direkte" til motoren og genererer et signal proportionelt med sensorens input. Dvs. at jo stærkere lys sensoren opfanger, jo hurtigere kører motoren. For at opnå bedst mulig opløsning valgte vi at normalisere lydsensorens rå værdier til et motor interval. Da SoundSensor klassen ikke direkte understøtter rå værdier måtte vi tilgå disse direkte på SensorPort klassen.

SensorPort.S1.readRawValue();

Før dette virkede som forventet måtte porten dog klargøres for rå værdier:

// Manually setup sensorport for raw sound readings.
SensorPort.S1.setTypeAndMode(SensorConstants.TYPE_LIGHT_ACTIVE, SensorConstants.MODE_RAW);

Først normaliserede vi til intervallet [0; 100] hvor vi som forventet for exitatory forbindelsen imellem sensor og motor observerede at køretøjet, når det lys, bevægede sig fremad i en hastighed proportionel med lysstyrken. Omvendt gik det da vi ændrede forbindelsen til inhibitory, hvor hastigheden var omvendt proportionel med lysstyrken. Da kørte bilen med fuld styrke i mørke indtil den så lys.

Den dansende robot forsøgte vi at fremmane ved at normalisere fra det større rå interval [0; 1023] og ned til Car.forward() metodens interval [-100; 100] således

public int normalizeToRange(int light) {
    int output = 200 -((light - MAX_LIGHT) * 200) / (MIN_LIGHT - MAX_LIGHT);
 
    if(output > 100) output = 100;
    else if(output < -100) output = -100;
    return output;
}


MIN_LIGHT og MAX_LIGHT representerer minimum og maximum værdierne for de lysværdier vi forventer at få fra lyssensoren. Disse afhænger af sensoren og de lysforhold der er tilstede hvor denne arbejder.

At sætte musik til bilen vil få den til at danse, muligvis pga af de forskellige temposkift I sangen (NB: video er gået tabt I produktion )

Kode her2

Vehicle 2a og 2b

Vi monterede endnu en lyssensor foran, vinklet til hver sin side med 45 grader og forsøgte os med begge konfigurationer (2a og 2b). Styringen implementerede vi udfra Vehicle 1 og

I konfiguration 2a i exitatory tilstand observerede vi at robotten drejede væk fra lyset. I inhibitory tilstand søgte robotten imod lyset.

I konfiguration 2b observerede vi det omvendte af 2a; I exitatory tilstand drejede robotten imod lyset, jo kraftigere jo hurtigere. I inhibitory ville den ikke "se ind i lyset", den drejede væk.




main loop ( aner ikke om dette skal med? )
while (true) {
    int s4 = SensorPort.S1.readRawValue();
    int s1 = SensorPort.S4.readRawValue();

    // Update min/max light values
    if(s1 < MAX_LIGHT) MAX_LIGHT = s1;
    if(s4 < MAX_LIGHT) MAX_LIGHT = s4;
    if(s1 > MIN_LIGHT) MIN_LIGHT = s1;
    if(s4 > MIN_LIGHT) MIN_LIGHT = s4;

    average_s1 = alpha * s1 +(1-alpha) * average_s1;
    average_s4 = alpha * s4 +(1-alpha) * average_s4;

    LCD.drawString("Raw: " + s1 + ":" + s4, 0, 0);

    int s4n = s4 > average_s4 ? normalizeToRange(s4) : 0;
    int s1n = s1 > average_s1 ? normalizeToRange(s1) : 0;

    LCD.drawString("Norm: " + s1n +":" + s4n, 0, 1);

    Car.forward(s4n, s1n);
}



Opdatering af MIN_LIGHT og MAX_LIGHT over tid udførte vi i main loop
Vi observerede ingen udtalt ændring i robottens opførsel ved automatisk at opdatere værdierne af set MIN_LIGHT og MAX_LIGHT. 

Koden kan findes i fodnote 2. 

Vehicle 3

Denne nåede vi ikke at eksperimentere med.


Konklusion


I dennne uge har vi, med udgangspunkt i Braintenberg bygget to robotter med dertilhørende program på baggrund af Tom Deans noter. Lydsensoren blev brugt til vehicle 1, som havde en extiatory og en inhibitory metode. Dette samme var tilfælde for lyssensoren. Altså har vi en robot, der bevæger sig hurtigere desto højere en lyd den kan opfange fra omgivelserne.




















1 http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson6.dir/Lesson.html
2 https://docs.google.com/folderview?id=0B22Duz_kNMvWUk9ZS2NzYzRmZ2M&usp=docslist_api#

Tuesday, March 11, 2014

Embedded Systems Lesson 5

Date: 6/3 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 Communcation and Embedded Systems1

Plan

Planen for denne uge er:
  • Ombygge robotten til balanceøvelserne
  • Udarbejde ugens øvelser
  • Påbegynde blogindlæg  
Resultat af øvelser 

Opgave 1

I denne opgave har vi samlet vores robot efter Phillipe Hubains anvisning2 samt brugt Brian Bagnalls klasse Sejway.java3 til at få vores robot til at kunne balancere. Når det udleverede program startes skal robotten holdes i en oprejst balancerende tilstand. Når Enter trykkes endnu en gang afmåles og huskes det udgangspunkt robotten befinder sig i. Derefter kan den udregne størrelse af den fejl i de efterfølgende målinger og derefter hvor kraftigt den skal korrigere sin balance.


Opgave 2 

For lettere at kunne ændre på konstanterne når vi arbejder med balancering og PID fik vi sat en Bluetooth forbindelse op imellem vores NXT robot og en PC. Vi tog udgangspunkt i den udleverede klasse PCcarController.java4 og kunne ligeledes modificere klassen at styre vores parametere i robotten. Dette gøres ved først at justere de nødvendige text fields så vi har ki, kd, kp og scale. 



Ellers lå arbejdet i at ændre hvad rækkefølge output stream sender værdierne og selvfølgelig også sende de nytilføjede værdier, et eksempel er 

String kpText = kpField.getText();
float kpFloat = Float.parseFloat(kpText);
dos.writeFloat(kpFloat);
dos.flush();
Dette laver en string med hvad der er i tekstfeltet, parser det til en float (vi blev opfordret til at bruge floats)
derefter sende den nye floatværdi så vi kan flushe og gøre klar til næste.

Den endelige klasse kan ses her5

For at kunne kommunuikere med vores PCControllerBalance.java klasse tog vi den udleverede BTcontrolledCar.java og modificerede6 den til at inkludere en række handlers til at håndtere de PID-værdier vi sender via Bluetooth.

Denne BTcontrolledPID.java implementerede vi i den oprindelige Sejway.java6 klasse for så at kunne begynde vores balancejusteringer

Neden for ses vores balancerende robot efter de første PID justeringer er gjort via den trådløse forbindelse. Klippet blev optaget i et mørkt rum da det blev foreslået af Phillipe Hurbain, at et bedre resultat kunne opnås, hvis robotten tog sine målinger i et mørkt rum.





Opgave 3

Til den tredje opgave skulle vi prøve og erstatte lyssensoren med vores colour sensor fra sidste uge. Til at starte med satte vi colour sensoren på i samme højde som vores lyssensor, men ldet virkede som om, at sensoren først var i stand til at registrere noget før det var for sent og robotten var ved at vælte.

Da vi så flyttede sensoren tættere på jorden, lig med hvad vi gjorde de tidligere uger,  begyndte robotten at være i stand til at kunne balancere i meget kort tid. Vi erkendte derefter, at man højest sandsynligt skulle re-justere PID variablerne påny, da sensoren ikke reagerer helt på samme måde som lyssensoren. Da dette var sidst på dagen nåede vi ikke at justere særligt meget.

Opgave 4

Vi nåede ikke at tage hul på opgaven omkring brugen gyro-sensoren til at balancere med.

Konklusion 

I denne uge har vi arbejdet med, hvordan vi får vores NXT robot til at kunne balancere vha.  lys og farvesensoren. Endvidere har vi arbejdet med hvilke begrænsninger det medbringer. Skulle man følge Hurbains råd er det en nogle rimeligt specifikke krav der, muligtvis, skal opfyldes. F.eks. en ikke uniform overflade samt et mørkt rum osv. Vi har også lært, hvordan man etablerer en Bluetooth forbindelse mellem robot og PC, hvilket gør justeringer af en PID-controller uanmindeligt meget mindre molboagtigt. Vi har fået vores robot til at kunne balancere i en anelse længere  tid end den oprindeligt udleverede klasse, men ellers blev størstedelen af dagen brugt på at sætte Bluetooth-forbindelsen ordentligt op.



1 http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson5.dir/Lesson.html
2 http://www.philohome.com/nxtway/nxtway.htm
3 http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson5.dir/Sejway.java
4 http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson5.dir/PCcarController.java
5 https://docs.google.com/file/d/0B2MYdpHIaaatTEd1MXhxYk15c0E/edit
6 https://drive.google.com/folderview?id=0B22Duz_kNMvWOG9kYUU1b3FaZzQ&usp=gmail#

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