Thursday, March 14, 2013

Week 7

Dato:

14-03-2013

Varighed:

Fælles lab: 5 timer
Blog: 3 timer

Deltagere:

Steffen Høi
Nikolaj Mols Hansen
Martin Vang
Ulrik Sahl Lystbæk

Status

Vi har forsøgt at få LEGO-robotten til at balancere vha. farvesensoren og gyrosensoren med NXT Intelligent Brick placeret horisontalt, hvilket var det, vi manglede at lave fra sidste uge. Desuden har vi bygget Braintenberg køretøjer med udgangspunkt i "figur 1"1 og programmeret dem inspireret af det, der stod beskrevet i de to noter af Tom Dean2.

Mål

Målet for denne laboratoriesession er at lave de resterende opgaver fra Week 6 ("Self-balancing robot with color sensor" og "Self-balancing robots with gyro sensor")3 samt at lave opgaverne for "Week 7 - Embodied Agents" og derigennem få et indblik i hvordan man kan lave Braintenberg køretøjer vha. NXT. Desuden er målet også at oprette et blogindlæg for denne laboratoriesession.

Plan

  • Løse opgaverne "Self-balancing robot with color sensor" og "Self-balancing robots with gyro sensor" fra "Week 6 - Communication and Embedded Systems"3.
  • Løse opgaverne for "Week 7 - Embodied Agents"4.
  • Udarbejdelse af blogindlæg for denne laboratoriesession.

Opgaver


Self-balancing robot with color sensor

Sidste uge udskiftede vi lyssensoren på vores LEGO-robot med en farvesensor og begyndte på at teste, om vi kunne få den til at balancere ved brug af farvesensoren. Efter at have testet videre på dette denne laboratoriesession, har vi erfaret at farvesensoren kan bruges lige så godt som lyssensoren. Den kan stadig balancere nogenlunde, men ikke særlig længe uden hjælp. Det er altså ikke lykkedes os at forbedre robottens evne til at balancere ved skiftet mellem disse to sensorer.

Self-balancing robot with gyro sensor

Før vi forsøgte med at bruge gyrosensoren til at få vores LEGO-robot til at balancere, afprøvede vi hvordan gyrosensoren virker5. Vi monterede den på toppen af vores robot så den pegede op ad, og startede med at prøve på at få gyrosensoren til at kalibrere, men vi kunne ikke få den til at kalibrere rigtigt. Problemerne vi fik med kalibreringen var fordi, vi forventede, at den skulle kalibreres til at have et udgangspunkt på 0, og man derefter kunne bruge den til at tage målinger på vinklen i forhold til udgangspunktet. Efter at have brugt en del tid på dette, besluttede vi os for at gå videre til denne uges opgaver. Vi fandt efterfølgende ud af at udgangspunktet ikke behøver at være 0, men at det skal bruges til at regne ændringen ud i forhold til målingen. Derudover kan gyrosensoren ikke give en værdi for, hvilken vinkel den befinder sig i i forhold til startpositionen, men den kan bruges til at finde accelerationen i en given retning.

Vehicle 1

Med udgangspunkt i Tom Deans noter om Braitenbergs køretøjer har vi lavet et program til en robot med 2 motorer og én lydsensor. Styrken, der tilføjes motorerne, er i denne opgave ens, hvilket vil sige at bilen enten kører lige frem eller bakker lige.
Vi startede med at mappe de rå værdier fra lydsensoren til en værdi mellem 0 til 100 og bruge det som styrke til motorerne. Derfor kunne den kun køre frem til at starte med, men efter at have ændret mapningen til at ligge mellem -100 til 100, brugte vi de negative værdier til at angive hastigheden, hvormed bilen skulle bakke.


Da vi startede på opgaven, havde vi placeret lydsensoren tæt på motorerne, men støjen fra motorerne påvirkede dens opførsel meget. Når den først begyndte at køre frem med høj hastighed, gjorde støjen fra motorerne at den fortsatte frem i samme tempo hele tiden. Derfor flyttede vi lydsensoren op på toppen, et godt stykke fra motorerne.
Den rå værdi som hentes fra lydsensoren kan ligge mellem 0 til 1023. Derfor startede vi med at bruge de værdier som min. og maks. til normaliseringen fra målingsværdi, til styrkeværdi til motoren. Med de værdier skulle der meget støj til at få bilen til at køre frem. Dette kunne som beskrevet af Braitenberg skyldes, at min og maks målingsværdierne ikke er realistiske i det miljø, vi tester vores robot. Derfor vil vi mens programmet kører løbende opdatere min. og maks. værdierne i forhold til de målinger der er taget. Dette gør vi ved at tjekke om hver måling er større end maks. eller mindre end min. Hvis den er større end maks. opdateres maks til målingens værdi. Hvis den er mindre end min. opdateres min. til målingens værdi. På den måde normaliseres sensor-målingerne ud fra det miljø robotten befinder sig i.

Den excitatoriske udgave bevægede sig aldrig tilbage med fuld styrke, da der hele tiden var lidt støj, f.eks. fra bilens motorer. Til gengæld kom den let til at bevæge sig hurtigt frem fordi, så snart en lydmåling lå over middel af min. og maks. værdierne, fik motorerne meget styrke frem. Den inhibitoriske udgave bevægede sig modsat af den excitatoriske. Programmet vi har skrevet til vehicle 1 kan ses i Vehicle1.java6.


Vehicle 2

Programmet vi har lavet til vehicle 2 ligner meget programmet fra vehicle 1. Den største forskel er at lydsensoren er skiftet ud med 2 lyssensorer, og de to motorer får styrke fra hver sin sensor. Derudover har vi tilføjet et array, som indeholder de seneste N målingsværdier7, og maks. og min. værdierne findes ud fra dette array. Vi lavede nogle forsøg med at tage robotten ud i skarpt sollys og bagefter tilbage i et mørkt rum. Der var en tydelig forbedring, når vi brugte arrayet til at begrænse maks og min værdierne. Hvis arrayet ikke blev brugt, havde robotten svært ved at tilpasse sig det nye miljø.

Den excitatoriske udgave kører væk fra lyset, hvilket kan ses i videoen her:


Den inhibitoriske kører mod lyset, hvilket kan ses i videoen her:


Vores program til vehicle 2 kan ses i Vehicle2.java8.

Vechicle 3

Til denne opgave monterede vi en ultrasonicsensor på bilen foruden de sensorer, som vi havde monteret på den i forrige opgave. Dvs. den nu har 2 lyssensorer, 1 ultrasonicsensor og 2 motorer. For at få målingerne fra ultrasonicsensoren med i bilens opførsel, normaliserede vi værdien fra dens målinger særskilt, mens vi stadig normaliserede værdien fra hver lyssensor, der bruges til hver sin motor. Den normaliserede værdi fra ultrasonicsensoren, bruger vi til at påvirke begge motorstyrker ens. Det betyder ikke at begge motorer får samme styrke, fordi de er også påvirket af hver sin lyssensor.
For at udregne en motorstyrke som er påvirket af både lyssensorerne og ultrasonicsensoren, har vi gjort følgende:

  1. Lyssensormålingerne og ultrasonicsensormålingerne har vi særskilt normaliseret til at ligge mellem 0 og 100.
  2. Den motorstyrke, der tilføjes, udregnes således: En normaliseret lyssensormålig - (100 - en normaliseret ultrasonicsensormåling).
Dette gør at bilen stadig enten følger lyset eller går væk fra lyset alt efter, om vi har brugt en excitatorisk eller inhibitorisk tilslutning mellem motorerne og lyssensorerne, samt at den holder afstand til genstande (så længe den kører lige frem). Resultatet kan ses i videoen nedenunder.

Koden til Vehicle 3 kan ses i Vehicle3.java9.

Konklusion

Denne uge har vi eksperimenteret videre med at få LEGO-robotten til at balancere vha. farvesensoren og gyrosensoren. Resultatet af dette var, at vi kunne få robotten til at balancere nogenlunde, men ikke særlig længe uden hjælp vha. farvesensoren, ligesom vi kunne det med lyssensoren fra sidste gang. Vi fik monteret gyrosensoren på robotten, men vi fik den aldrig robotten til at balancere ved at benytte denne. Dette skyldtes, at vi havde nogle problemer med at få den til at kalibrere til 0, som vi forventede, at den skulle, men vi erfarede senere at udgangspunktet ikke behøvede at være 0, og at vi i stedet for skulle have kigget på ændringen af en måling i forhold til udgangspunktet.
Vi har endvidere bygget Braintenberg køretøjer med udgangspunkt i figur 1 og programmeret dem inspireret af det, der stod beskrevet i de to noter af Tom Dean. Dette har vi gjort ved at bruge forskellige sensorer individuelt, men også ved at kombinere dem. Lydsensoren har vi brugt til at lave et køretøj, der bevæger sig enten hurtigere desto højere lyden fra omgivelserne er, eller modsat alt efter om forbindelserne er excitatoriske eller inhibatoriske. Desuden har vi brugt to lyssensorer til at styre, hver sin motor, hvor lyssensoren bestemmer, hvor meget power motoren skal have. Den excitatoriske udgave kørte væk fra lyset og den inhibatoriske kørte mod lyset. Til sidst monterede vi, foruden de to lyssensorer, ultrasonicsensoren på bilen, og implementerede en måde hvorpå, vi kunne kombinere de forskellige power-værdier til motorerne, som kom fra de forskellige sensorer.
____________________________________________________________________________________________________________

1. http://legolab.cs.au.dk/DigitalControl.dir/NXT/pictures.dir/vehicles.gif
2.
http://www.cs.brown.edu/people/tld/courses/cs148/02/introduction.html
http://www.cs.brown.edu/people/tld/courses/cs148/01/vehicles/vehicles.htm
3. https://services.brics.dk/java/courseadmin/DigitalControl/pages/Week+6+-+Communication+and+Embedded+Systems
4. https://services.brics.dk/java/courseadmin/DigitalControl/pages/Week+7+-+Embodied+Agents
5. http://lejos.sourceforge.net/nxt/nxj/api/lejos/nxt/addon/GyroSensor.html
6. https://sites.google.com/site/digikaison/Vehicle1.java
7. https://sites.google.com/site/digikaison/Measurement.java
8. https://sites.google.com/site/digikaison/Vehicle2.java
9. https://sites.google.com/site/digikaison/Vehicle3.java

Thursday, March 7, 2013

Week 6

Dato:

07-03-2013

Varighed:

Fælles lab: 5 timer
Blog: 3 timer

Deltagere:

Steffen Høi
Nikolaj Mols Hansen
Martin Vang
Ulrik Sahl Lystbæk

Status

Vi har forsøgt at få LEGO-robotten til at balancere vha. lyssensoren og farvesensoren og sat NXT Intelligent Brick horisontalt på robotten. Desuden har vi fået lavet en brugergrænseflade, så vi kan ændre variablerne for PID kontrollen løbende under runtime. Vi mangler at eksperimentere videre med at få LEGO-robotten til at balancere med farvesensoren, samt at prøve at få LEGO-robotten til at balancere vha. gyro-sensoren.

Mål

Målet for denne øvelsesgang er at lave opgaverne for "Week 6 - Communication and Embedded Systems"1 og derigennem eksperimentere med, hvordan man laver en selvbalancerende LEGO-robot inspireret af Steve Hassenplug's originale Legway kontrolleret af RCX'en2. Desuden er målet også at oprette et blogindlæg for denne laboratoriesession.

Plan

  • Løse opgaverne for "Week 6 - Communication and Embedded Systems"1.
  • Udarbejdelse af blogindlæg for "Week 6 - Communication and Embedded Systems"1.

Opgaver


Self-balancing robot with light sensor

Til denne opgave har vi samlet robotten, så den er som LGO modellen, efter Phillippe Hurbains3 anvisninger. Vi har brugt programmet Segway.java4 fra Brian Bagnall for, at få robotten til at stå. Når programmet startes, skal robotten holdes i balancerende tilstand for, at der er et udgangspunkt til at udregne størrelsen af fejl på målinger og derefter rette op efter.
Vi har lavet få justeringer på robotten for at hjulene sidder mere stramt, men ellers er vores første forsøg med  den standard beskrevne LGO model og koden fra Brian Bagnall. Resultatet af dette kan ses i videoen her:




Som det kunne ses på videon, var den ikke god til at stå lige. For at forbedre den, startede vi med at flytte lyssensoren længere op, og bagefter justerede vi de forskellige variabler i programmet. Det blev aldrig helt godt, men det blev bedre end den første udgave. Vores modificerede udgave af Segway programmet af Brian Bagnall kan ses i Segway.java. Da vi har flyttet lyssensoren længere op, har vi bl.a. forsøgt at ændre på konstanten 1.8F, som ganges på error. En video af den samme robot med den modificerede variable kan ses i nedenstående video:


Choice of parameters on-the-fly

For at have lettere ved hurtigt at ændre på konstanterne, hovedsageligt til PID kontrollen, til vores balancerende robot, modificerede vi GUI'en og kommunikationen fra PCcarController.java5 og BTcontrolledCar.java6. Først afprøvede vi dog programmerne PCcarController.java og BTcontrolledCar.java. Til BTcontrolledCar.java lavede vi et LeJOS NXT Project i Eclipse, som også indeholdt Car.java7. Til PCcarController.java lavede vi et LeJOS PC Project i Eclipse. Dette virkede fint, og vi fortsatte ved at tilpasse det til Sejway.java8, så vi under runtime af programmet har mulighed for at justere de ønskede konstanter. På samme tidspunkt byggede vi også robotten lidt om, så NXT Intelligent Brick blev placeret horisontalt i stedet for vertikalt. Denne udgave af robot ses på nedenstående billede:



Til vores kombination af Sejway.java og kommunikationen fra PCcarController.java og BTcontrolledCar.java lavede vi to projekter. Et LeJOS PC Project med klassen SejwayController.java9 til at have en GUI, som kan bruges til at uploade nye værdier til det program, der kører på robotten. GUI'en er en kopi af den fra PCcarController.java, men lidt modificeret. Resultatet ses på nedenstående billede:


Det andet, et LeJOS NXT Project som indeholder Sejway.java, der er programmet fra den ovenstående opgave, men nu med kommunikation, SejwayCommunicationImpl.java10, som står for at læse værdier der sendes fra PC-applikationen samt SejwayValues.java11, som indkapsler de variabler, der modtages fra PC-applikationen.

Der er ikke meget opfindsomhed i det kode, vi har lavet i forhold til de eksempler, vi har fået udleveret. Den største forskel er, at BTcontrolledCar.java venter på noget fra PC-applikationen og reagerer så på det, hvorimod vores Sejway.java hele tiden skal forsøge at balancere, mens den tjekker, om der er sendt data fra PC applikationen. Hvis der ikke er sendt noget, skal den vende tilbage til at balancere, og hvis der er sendt noget, skal den hente det og opdatere konstanterne til PID kontrollen og fortsætte med at balancere igen.
Vi bruger metoden available fra DataInputStream12 til at tjekke om PC-applikationen har sendt noget data, der venter på at blive læst.
Når vi sender data fra PC-applikationen til NXT-applikationen, sender vi hver gang alle de variable, vi har valgt, som skal være mulige at justere fra PC-applikationen. Alternativt kunne vi have nøjedes med at sende dem, der var blevet opdateret, men så skulle vi til at sende data med, som angiver hvilke variable, der er sendt og tjekke på det. Derfor vurderede vi, at det både var lettere og hurtigere at sende dem alle med hver gang.
PC-applikationen gjorde det lettere med at prøve at få robotten til at balancere, men vi fik den aldrig helt til at balancere helt perfekt. Vi håber på, at vi på et tidspunkt får tid til at gå tilbage til en udgave af LineFollower.java med PID kontrol, så vi kan lave en PC-applikation til den.

Self-balancing robot with color sensor

Vi har udskiftet lyssensoren på den balancerende robot med en farvesensor og prøvet på programmet fra ovenstående opgave. Det virker umiddelbart på samme niveau som med lyssensoren, vi har brugt indtil nu. Dvs. robotten stadig kan balancere nogenlunde, men ikke særligt længe uden hjælp. Vi har ikke nået at teste meget med farvesensoren, så vi fortsætter herfra i næste uge.

Self-balancing robots with gyro sensor

Denne opgave mangler vi at lave, hvilket vi vil gøre i næste uge.

Konklusion

Denne uge har vi eksperimenteret med hvordan, man kan få LEGO-robotten til at balancere vha. NXT lyssensoren samt farvesensoren ved at have arbejdet med opgaverne omhandlende disse. Vi har  desuden prøvet med forskellige opstillinger, hvor vi bl.a. har ændret på afstanden mellem sensorerne og den flade, vi har forsøgt at få LEGO-robotten til at balancere på, samt placeret NXT Intelligent Brick både horisontalt og vertikalt. Desuden har vi også forsøgt at slukke lyset for at gøre lokalet så mørkt som muligt, hvilket vi så havde en lille effekt på robottens evne til at balancere vha. lyssensoren og farvesensoren. Vi har endvidere etableret en trådløs baseret forbindelse mellem PC og NXT, så vi via en grafisk brugergrænseflade, som vi også har udviklet i denne uge, kan ændre på konstanterne i PID kontrollen løbende under runtime. Dette vil uden tvivl blive en stor hjælp for os senere hen, da det gør processen med at prøve sig frem med at justere på værdierne en del nemmere. Gennem vores arbejde med denne uges opgaver, har vi fået robotten til at balancere nogenlunde, men ikke særlig længe uden hjælp. Dette vil vi arbejde videre med i næste uge, hvor vi vil lave videre på opgaven med at få robotten til at balancere via farvesensoren, samt lave opgaven omhandlende balance vha. gyro-sensoren.

______________________________________________________________________________________________________

1. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson5.dir/Lesson.html
2. http://www.teamhassenplug.org/robots/legway/
3. http://www.philohome.com/nxtway/nxtway.htm
4. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson5.dir/Sejway.java
5. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson5.dir/PCcarController.java
6. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson5.dir/BTcontrolledCar.java
7. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson5.dir/Car.java
8. http://dl.dropbox.com/u/995376/Sejway.java
9. http://dl.dropbox.com/u/995376/SejwayController.java
10. http://dl.dropbox.com/u/995376/CommunicationImpl.java
11. http://dl.dropbox.com/u/995376/SejwayValues.java
12. http://lejos.sourceforge.net/nxt/nxj/api/java/io/DataInputStream.html