Øvelsens varighed: 3 timer
Gruppemedlemmer: Annette, Samuel og Rasmus
Mål
Målet for denne øvelse er at bruge NXT til at bygge og programmere tre Braitenberg køretøjer og derved få en bedre forståelse af hvordan de virker.
Baggrundsinfo
Valentino Braitenberg's Vehicles
Braitenberg's vehicles consist of the simplest sort of wheeled robots in which sensors that are sensitive to different stimuli are wired directly to motors that drive the wheels. In these models, we assume that the sensor generates a signal that is proportional to the stimulus. In the simplest vehicle (see Vehicle 1 below) we imagine a sensor sensitive to light and assume that the more light that falls on face the sensor the faster the motor turns. The wire running from the sensor to the motor is labeled positive (+) indicating that sensor stimulates the motor to turn. Things become more interesting when we have multiple sensors and multiple motors.
(Fra: http://www.cs.brown.edu/people/tld/courses/cs148/02/introduction.html )
Fremgangsmåde
1. Vehicle 1
Det første køretøj som ses i Figur 1 er udstyret med en sensor og en motor. Jo større værdi der detekteres af sensoren desto hurtigere kører motoren.
Figur 1 - Braitenbergs vehicle 1
Dette princip bruges til at afprøve vores egen udgave af Braitenbergs vehicle 1. Den kan ses i Figur 2. I stedet for en lyssensor har den en lydsensor, så den vil køre hurtigere jo højere lyden er, i den retning lyden kommer fra. Da det vil være vanskeligt for bilen at undgå at vælte har den to hjul styret af to motorer, men hver motor får tilført samme power beregnet ud fra sensorværdien.
Figur 2 - Vores vehicle 1
Reguleringen af hastigheden er proportional med styrken som lydsensoren opfanger. Den læste værdi for lyden konverteres til en værdi for power til begge motorer og bilen kører lige fremad. Konverteringen foregår vha. en constant som ses beregnet i Figur 3. De indkommende sensorværdier ligger mellem 0 og 100 og det skal passes ind i intervallet mellem maksimum power og minimum power som ligger mellem 60 og 100. 60 er valgt så de bilen kører fremad ved lav hastighed selvom der ikke laves høje lyde. Desuden ganges med 100 for at forblive i integers.
Figur 3 - Beregning af constant
Convert() metoden som ses i Figur 4 har lydværdien som parameter og her bruges constant værdien beskrevet ovenfor til at konvertere lydværdien. For at kompensere for faktoren i constant divideres med 100. Derudover sørger if sætningerne for at vi holder os imellem de 0 og 100 i motorkraft i tilælde af at lyden bliver så den overskrider eller kommer under grænserne for hvad der kan sendes ud på motorerne.
Figur 4 - convert() metoden
Til sidst er tilbage at bruge værdien konverteret fra en værdi for lyden til en værdi for motor power og sende den til motorerne. Car klassen fra de tidligere øvelser bruges igen som den er. Som det ses bruger vi metoden backward og det skyldes at motorene sidder omvendt af hvad de gør, på den robot Car klassen er lavet til.
Figur 5 - Bilen styres vha. den målte lydstyrke
Test
Testen udføres ved at sætte bilen på gulvet. Når programmet startes vil den begynde at køre langsomt fremad. Forventningen er at den vil speede kraftigt op når vi klapper eller råber. Hele koden til vehicle 1 projektet kan findes her: http://www.daimi.au.dk/~u071252/DL/Practice7/SoundSpeedCar.java
2. Vehicle 2a
Vehicle 2a har som det ses på Figur 6 to sensorer. Størrelsen af den målte værdi fra den venstre sensor bruges til at beregne hvor meget power der skal til venstre motor og størrelsen af den målte værdi fra den højre sensor bruges til at beregne hvor meget power der skal til højre motor.
Figur 6 - Braitenbergs vehicle 2a
Vores udgave af dette køretøj følger dette princip, men da der kun er en lydsensor til rådighed bruges her lyssensorer. Bilen er vist i Figur 7 og den har venstre lydsensor der peger ca. 45 grader mod venstre og den højre lydsensor der peger ca. 45 grader mod højre.
Figur 7 - Vores vehicle 2a
I koden til vehicle 2a er der en konstant som bruges i convert() metoden. Denne metode er fuldstændig ligesom ved vehicle 1 og konstanten er beregnet på samme måde. Forskellen ligger i while loopen der udføres indtil escape knappen aktiveres. Den ser ud som vist i Figur 8 for vehicle 2a.
Figur 8 - Regulering af power til de to motorer
Værdierne fra de to sensorer aflæses og konverteres til en værdi til motorerne. Jo større lysstyrke desto større værdi til motorerne. Hvis der sendes størst power til venstre motor fordi lyset har størst intensitet her vil det resultere i at bilen drejer mod højre, det vil sige væk fra lyskilden. Den samlede kode til vehicle 2a projektet findes her: http://www.daimi.au.dk/~u071252/DL/Practice7/Vehicle2.java
Test
Testen består i at stille bilen på gulvet og påvirke den med lys fra en af siderne og forventningen er at bilen kører den modsatte vej.
3. Vehicle 2b
Vehicle 2b har ligesom vehicle 2a to sensorer og varierer også power til motoren ud fra værdierne fra sensorerne, men her går venstre sensor til højre motor og højre sensor til venstre motor. Ændringen fra vehicle 2a foregår udelukkende i koden så der henvises igen til Figur 7.
Figur 9 - Braitenbergs vehicle 2b
Den eneste forskel i koden kan ses i Figur 10, hvor power til venstre motor før blev beregnet ud fra sensor 1’s værdi beregnes den nu ud fra sensor 2’s værdi. Den samlede kode til vehicle 2b kan findes her: http://www.daimi.au.dk/~u071252/DL/Practice7/Vehicle3.java
Figur 10 - Kode til vehicle 2b
Test
Nu vil en stor sensorværdi fra venstre sensor resultere i mere power til højre motor og at bilen derfor drejer mod venstre. Forventningen til testen er derfor at vehicle 3 nu vil køre mod døråbningen, når den startes i et mørkt rum.
4. Flere tråde
På nuværende tidspunkt sker al udførsel i programmet fra main tråden. Venstre sensor aflæses og der beregnes en værdi til motoren og højre sensor aflæses og der beregnes en værdi til motoren, efterfølgende outputtes værdierne til de to motorer. Det kunne være interessant at se om det har nogen indflydelse hvis aflæsning af sensorværdierne og den efterfølgende beregning og styring af den tilhørende motor deles op i tråde. Det vil sige de nævnte aktiviteter skal foregå i en klasse der arver fra Thread() og der oprettes en tråd til hver sensor.
Nu vil thread scheduleren sørge for at tildele hver tråd udførselstid og spørgsmålet er om disse skift vil få indflydelse på hvordan bilen opfører sig. Forventningen er at det ikke vil have nogen betydning fordi skiftene sker så hurtigt og vores lyskilde er permanent. Derimod kunne der muligvis blive problemer i tilfælde af at der sker et lysglimt som er så kort at det sker lige i den timeslice hvor tråden til den anden sensor der vender væk er aktiv og så vil den reagere på lysglimtet i stedet for. Her er det dog nok ikke trådenes time slicing der er det største problem, men måske i lige så høj grad det interval som sensorerne kan opdatere deres værdier i.
Test
Programmet til vehicle 2b skrives om så det der lå i while loopen nu sker i en ’SensorThread’. Der oprettes en left SensorThread og en right SensorThread. Hvor Car.java klassen tidligere har kunnet bruges direkte har det været nødvendigt at lave en separat metode til at styre venstre motor og en til at styre højre motor, da kontrollen sker i forskellige time slices. Forventningen er stadigvæk at bilen vil køre mod døråbningen i et mørkt rum. Koden til dette projekt kan ses i http://www.daimi.au.dk/~u071252/DL/Practice7/V3/SensorThread.java http://www.daimi.au.dk/~u071252/DL/Practice7/V3/Vehicle3.java.
Resultater
1. Vehicle 1
Testen er udført som beskrevet ovenfor og som forventet speeder bilen kraftigt op når der laves høje lyde som klap eller tramp i gulvet. Dette kan ses her: http://www.youtube.com/watch?v=3Ro79z-tLsY
2. Vehicle 2a
Testen er udført i et mørkt lokale uden vinduer med døren stående åben og ganske som forventet kører bilen væk fra døren og altså væk fra lyskilden.
3. Vehicle 2b
Testen er igen udført i et mørkt lokale uden vinduer med døren stående åben. Som forventet kører bilen mod døråbningen og altså imod lyskilden. Dette kan ses her: http://www.youtube.com/watch?v=rk6ttAPf7DI
4. Flere tråde
Som ventet kørte bilen uden problemer mod døråbningen i det mørke rum så det har ikke ændret noget at lave det flertrådet.
Konklusion
Der blev lavet tre biler med egenskaber som Braitenbergs Vehicles 1, 2a og 2b. Vehicle 1 speedede op når den detekterede høje lyde proportionalt med værdien for lyden. 2a kørte i den modsatte retning af lys og 2b kørte i retningen af lys.
Derudover blev det undersøgt om det har nogen indvirkning på bilens opførsel når udførsel af programmet ikke sker i main tråden, men der laves en tråd til hver sensor som også sørger for at sætte en værdi for power til motoren. Der er ikke nogen synlig forskel på opførslen og det var heller ikke forventet.
Referencer
1. Opgaveoplægget: http://www.legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson7.dir/Lesson.html
2. Braitenberg Vehicles intro: http://www.cs.brown.edu/people/tld/courses/cs148/02/introduction.html
3. Vehicle1 kode: http://www.daimi.au.dk/~u071252/DL/Practice7/SoundSpeedCar.java
4. Vehicle2 kode: http://www.daimi.au.dk/~u071252/DL/Practice7/Vehicle2.java
5. Vehicle3 kode: http://www.daimi.au.dk/~u071252/DL/Practice7/Vehicle3.java
6. Vehicle3thread kode: http://www.daimi.au.dk/~u071252/DL/Practice7/V3/SensorThread.java http://www.daimi.au.dk/~u071252/DL/Practice7/V3/Vehicle3.java
7. Vehicle1 film: http://www.youtube.com/watch?v=3Ro79z-tLsY
8. Vehicle2b film: http://www.youtube.com/watch?v=rk6ttAPf7DI
Ingen kommentarer:
Send en kommentar