tirsdag den 18. marts 2014

Lesson 6 - Combining sensors

Date: 14/03 2014 + 18/3 2014
Duration of activity: 9.15 - 14.30 + 9.15 - 14.15
Group members participating: Pætur, Christian og Søren


Goal: At gennemføre ugens opgaver [1].
Plan: Gå opgaverne sekventielt igennem.
Results: Vi har gennemført alle opgaverne.

Vehicle 1
Start with vehicle 1. As sensor use a sound sensor to implement a vehicle that moves faster forward the louder the environment sound is. Use two motors to drive the vehicle and apply the same power to the two motors. The main issue is how to map sensor values to motor power. If raw sensor values are used, the mapping should be from the range 0, 1023 to the motor power range, i.e. 0, 100.

I programmeringen af denne første opgave tog vi soundSensor.readValue() værdierne, som er en repræsentation af lydniveauet fra 0-100, og mappede dette til power for begge hjul, ved at bruge Car klassen:

Figur 1: Engangskode til Vehicle 1.

Vi erfarede at når bilen først var kommet i gang med at køre fremad på gulvet, stoppede den ikke igen, da larmen fra motorerne blev opfanget af lydsensoren med en værdi på omkring 90, og dermed gav motorerne en power på omkring 90. Når man holdt bilen op i luften, opfangede lydsensoren tilsyneladende ikke støjen fra bilens egne motorer, og så snart lydkilden (i vores tilfælde en mobiltelefon) ikke længere udsendte lyd, stoppede motorerne med at køre, ganske som forventet. Derfor må det have noget at gøre med den måde som lyden bliver reflekteret på og opfanget af lydsensoren, som er anderledes når bilen er på gulvet, der bevirker denne ændring. Vi forsøgte at placere lydsensoren på forskellige måder på bilen for at se, om det ville ændre på den måde lydsensoren opfangede lyden på. Se billederne herunder. Vi kunne have normaliseret power værdien, men vi går videre til næste opgave.


Figur 2: Billede af vehicle 1 med lydsensoren pegende fremad


Figur 3: Billede af vehicle 1 med lydsensoren pegende opad

Also try to map to motor powers between -100, 100 and interpret negative motor powers as moving the motors backwards. How would you describe the resulting behaviours?

Vi prøvede at programmere dette hvor bilen kører bagud når readValue() værdien er mindre end 50 (0-49) og bilen kører fremad når værdien er større end 50 (50-100).
Værdierne fra lydmålingerne fordelte vi på et spænd mellem -100 og 100 som følgende kode viser. Se kodeudsnit herunder.


Figur 4: Vehicle1_v2.java

Når værdien sound er 0 kører bilen bagud med en power på 100, når værdien sound er 50 holder bilen stille (power = 0), og når sound er 100 kører bilen frem med en power på 100. Følgende simple graf illustrerer dette.


Figur 5: X-aksen angiver sound.readValue() og y-aksen den power som bliver sendt til motorerne. Positive værdier er en angivelse af, at bilen kører fremad og negative at den kører bagud.



Vi erfarede at bilen kørte lidt frem og tilbage: når vi startede bilen kørte den baglæns (fordi sound.readValue > 50), men støjen fra motorerne fik hurtigt værdien sound.readValue til at stige til over 50, hvilket betød at gjorde at readValue() værdien kom over 50, hvor bilen begyndte at køre frem. Men til vores overraskelse blev den ikke ved med at køre fremad som i første Vehicle 1 forsøg. En forklaring kan være, at larmen fra motorerne afhænger af power til motorerne, hvorved bilen ikke går i selvsving og kører fremad hele tiden som i forrige opgave.

In the vehicles of Figure 1 all connections are marked with a +. This means the more of the measured quantity, e.g. sound, the more motor power. These connections are called exitatory connections. Braitenberg also use connections marked with a - to mean an inhibitory connection, the more the less. Implement this kind of connection and investigate the behaviour with an inhibitory connection on vehicle 1. How would you describe the resulting behaviour?

Vi har sådan set lavet både en excitatory (50-100) og inhibitory (0-49) forbindelse i forrige opgave, hvormed vi springer denne opgave over. Resultatet i vores tilfælde med forrige opgave var, at bilen kørte lidt frem og tilbage, og at det afhang meget af den støj som motorerne udsendte.

Try to play music and make mappings from the sound sensor to the two motors that will make the vehicle "dance" to the music, like you see in the beginning of the video in Figure 2.

I vores program fra før (kode i figur 4), har vi en dead-zone når power ikke er høj nok, lad os antage at bilen først kører ved en power på 50 og derover (når power = 50 er  sound.readValue() = 75 og derfor står bilen teoretisk set stille når sound.readValue() returnerer mellem 25 og 75).
Vi springer over at lave en test af den præcise power hvorved bilen bevæger sig fremad. Vi antager at denne er 50. Vi ændrer koden fra figur 4, så bilen altid kører bagud eller fremad med en power på 50-100. Derved får vi forhåbentligt en mere dansende robot:


Figur 6: Vehicle1_dance.java

Vehicle 2
In the two vehicles, 2a and 2b, use e.g. two light sensors mounted in the front, Figure 3. Again make sure to define the mappings between sensor range and motor power. Try with both excitatory and inhibitory connections and describe the resulting behaviours, e.g. as in Figure 4.

Når vi bruger en excitatory forbindelse gælder at jo mere lys jo hurtigere kører bilen. Om bilen kører imod eller væk fra lyset afhænger af, om vi bygger forbindelser som i vehicle 2a eller 2b. Vi gik ud fra koden fra Braitenberg’s vehicle [2], men i stedet for at sætte power proportional til kvadratet by lys-værdien -200:

motorizq.setSpeed((sluzizq.readValue()*sluzizq.readValue()) - 200);

anvendte vi bare lysværdien x 2. Dette var fordi i Braitenberg’s måde at omsætte lysværdi til motor-power kører bilen meget hurtigt, når der er meget lys og meget langsomt når der er lidt lys. På vores måde kører den knapt så hurtigt når det er lyst, men også knap så langsomt når der er mørkt. Vi fik lysværdier mellem 15-35, dvs. at hjulene får en power på mellem 30-70. Dette var passende til vores kontekst, da vi ikke fik bilen til at køre ind i en kasse som Braitenberg men bare rundt i et lokale med dagslys og lys fra lysstofrør.


Figur 6: Vehicle 2

Put a lamp on top or rear of your vehicle 2a or 2b with two light sensors and try to see what happens when several vehicles are put close together e.g. on a floor in a dark room, Figure 5.

Vi prøvede at lave dette med 2 biler med lys monteret bag på bilerne. Bil 2 der fulgte lyset på bil 1 kørte for hurtigt og kørte baglygten på bil 1 af. Vi skulle nok have brugt en inhibitory forbindelse, så bil 2 ikke kørte op i bil 1 men kørte langsommere jo mere lys der er, dvs. jo tættere den er på at køre op i bagenden på bil 1. Desuden skulle den forreste bil styres af en lygte fra en mobiltelefon, og lyset fra telefonen blev derfor ikke kun opfanget af bil 1 men også af bil 2.
For at få bilerne til at køre efter hinandens lys var vi nødt til at gå ind i et mørkt rum, da lysstyrken på de påsatte pærer var noget lavere end det omgivende lys i labbet. Det betød, at vi var nødt til at ændre vores power-værdi, således at bilen ville reagere på svagere lys end ved kørsel i labbet generelt. Ved at sætte grænsen for hvornår bilen skal reagere på lys ned, betød det også, at bilen ikke fungerede så snart der flød dagslys ind af vinduerne, da dette lys så ville give en power på næsten max.

In Tom Deans description the variables MAX_LIGHT and MIN_LIGHT are updated over all the sample values obtained during the lifetime of the vehicle. If the vehicle is existing for a long time under different light conditions we might only want to collect these values over the last N samples. Make changes to your program so that this is possible. How will you set up an experiment that shows if your changes to the program also influences the behavior of the vehicle?

For at lave dette program lavede vi en min og max value variable for den venstre og højre lyssensor. Vi startede med at have max som en lav værdi og min som en høj værdi og ændrede disse når en hhv. lavere eller højere værdi blev fundet. Vi lavede en normalizeLeft() og en normalizeRight() metode ud fra info fra slides fra forelæsningen [4], og vi satte motor power efter figur

Figur 7 - Ud fra dette lavede vi normalizeLeft() og normalizeRight()


Figur 8 - Ud fra dette satte vi motor power via normalizeLeft() og normalizeRight()

Vi fandt ud, af denne metode ikke er den rigtige måde at gøre bilen adaptiv fordi min og max kun bliver ændret hvis lyssensoren henholdsvis måler en lysværdi som er mindre end min eller større end max. Derfor er den kun adaptiv fra mørke til lysere omgivelser, men ikke omvendt. En måde som gør bilen adaptiv, som vi kunne have implementeret, er ved at lave en liste med f.eks. 100 lysmålinger, hvor nye lysmålinger bliver tilføjet og gamle bliver fjernet dynamisk. I hvert gennemløb af while-løkken tager man den mindste og den største værdi i denne liste og sætter dem til henholdsvis min og max. Det at have en liste som hele tiden bliver ændret dynamisk gør, at hvis bilen er i et mørkt rum i 100 omløb i while-løkken, så har min og max ændret sig, så de passer til et mørkt lokale .

Two ultrasonic sensors can also be used in vehicle 2a and 2b, e.g. mounted as in Figure 6. Watch the video in [3] and try to explain why the vehicle bumps into objects. Can you improve on that?

To mulige årsager til at bilen kører ind i objekter er, at de to ultrasonic sensorer peger ligefrem, og derfor ved den ikke hvilken vej den skal dreje for at undgå objekterne; den anden årsag er at, at de to ultrasonic sensoren sidder for langt ude i siderne, og derfor skal bilen reagere tidligt for at kunne nå at dreje uden at støder ind i objekterne. Vi valgte ikke at arbejde videre med denne opgave, da Vehicle 3 arbejder både med lys og ultrasonic sensoren.

Vehicle 3
In Figure 7 vehicle 3 is shown. It has two kinds of sensors. Try to use light and ultrasonic sensors (or maybe sound sensors to give the Party Finder from Lesson 3 another try). How would you combine the different motor power values coming from the two sensors?


Figur 9: Vehicle 3

Vi prøvede først at forbinde lyssensorerne og ultrasonic sensoren som vist i ovenstående tegning: bilen kører imod lyset via en krydskoblet exibitory forbindelse og væk fra objekter via en inhibitory forbindelse. Dette betyder at bilen speeder en del op på det ene hjul når den er tæt på et objekt i den modsatte side. Vi erfarede at bilen ofte kørte ind i objekter på denne måde. Derfor prøvede vi at forbinde ultrasonic sensoren krydskoblet med en exibitory forbindelse i stedet for, så når bilen er tæt på et objekt i venstre eller højre side reduceres farten for det modsatte hjul:



Conclusion:
Vi har gennemført ugens opgaver.

References:


tirsdag den 11. marts 2014

Lesson 5 - Self balancing robot

Date: 07/03 2014 and 11/03 2014
Duration of activity: 9.15-16.30 and 9.15-12.15
Group members participating: Pætur, Christian og Søren


Goal: At gennemføre ugens opgaver [1].
Plan: Gå opgaverne sekventielt igennem.
Results: Vi har gennemført alle opgaverne.


Self-balancing robot with light sensor
Use the LEGO model suggested by Phillippe Hurbain, [2], and the java program from Brian Bagnall, [3] to start experiments with a self-balancing robot. Under the headline Usage Phillippe Hurbain describes under which conditions the NXTway works best. Try to follow some of his advices.


Vi fandt det svært at få robotten, se figur 1, til at balancere mere end et par sekunder af gangen, uanset under hvilke forhold vi kørte robotten: mørkt rum / rum kun oplyst af lysstofrør med gardinerne trukket for og i forhold til underlag, om det var et uensartet gulvtæppe eller bordplade (se figur 1 for bordplade). Det viste sig hurtigt, at hvis ikke robotten var i 100 % balance når man startede programmet, ville den aldrig komme til at balancere, da den så “lærte” at starthældningen (offset) var det forkerte og dermed forsøgte at nå denne ude-af-balance hældning. Dette førte os til næste opgave, hvor vi igennem et GUI kunne ændre offsettet.



Figur 1 - Robotten vi byggede udfra LEGO model af Phillippe Hurbain [2].


Choice of parameters on-the-fly
During the development of a balancing robot a lot of adjustment of constants is needed. This can be done by editing the Java source code, compile and transfer it to the NXT before the next trial. To speed up this trial and error process a wireless communication could be established between PC and NXT so the constants of the program can be changed on-the-fly.
An example of such a pair of programs, one program for the PC and one for the NXT, is PCcarController.java and BTcontrolledCar.java. The PCcarController is a GUI that runs on the PC. It establish a Bluetooth connection to the NXT and use wireless communication to drive a simple car with different values of power to the motors and for different durations. The BTcontrolledCar waits for a connection to be established, receives the values of power and duration and make the car drive controlled by the received values. When the car stops BTcontrolledCar reads the tacho counters (the Car class from Lesson 2 has been extended with a method counter, Car.java) and sends the value for display in the GUI.


A similar setup can be used to make it possible to choose parameters for the balance controller from a GUI on the PC.


Vi ændrede PCcarController.java så GUI’et kom til at se ud som følger, hvor vi kunne ændre på KP, KI, KD samt offset over bluetooth. For at ændre offsettet indtaster man eksempelvis 2 eller -2 for at ændre offsettet med 2 i den ene eller anden retning.



Figur 2 - Billede af GUI til styring af balanceparametre


I BTcontrolledCar.java instantierede vi en tråd, som hele tiden kørte og tjekkede på, om nye værdier var blevet modtaget:


Selvom vi nu kunne ændre offsettet over bluetooth, havde vi ikke held med at få robotten til at balancere i mere en 2-3 sekunder. Efter at have eksperimenteret med forskellige værdier af KP, KI, KD samt offset uden held, fik vi et hint af en af de andre grupper, som havde prøvet at montere større hjul med stor succes. Vi monterede derfor også et sæt større hjul, og fik straks en mere stabil og selvbalancerende robot. Det krævede naturligvis en rekalibrering af KP, KI og KD værdierne, da de værdier, som lyssensoren målte, havde ændret sig som følge af den større afstand til bordet. Med de større hjul fik vi robotten til at balancere i minimum 3 minutter, link til video.



Figur 3 - Robotten vi byggede udfra LEGO model af [2] men med større hjul.


Eftersom lyssensoren blev hævet nogle centimeter over bordet efter udskiftning af hjulene, blev robotten også mere påvirkelig overfor ændringer i overfladen, hvilket betød, at hvis man holdt sin hånd på bordet blot 10 cm fra lyssensoren, kunne man se en ændring i robottens opførsel. Derfor besluttede vi os for at flytte lyssensoren længere ned mod bordet, således at afstanden igen var den samme som med de små hjul. Det viste sig til vores store overraskelse, at robotten opførte sig på samme måde som med de små hjul: robotten var meget svær at få til at balancere. Hvorfor mon det? Følgende er vores gæt på et svar.


Jo tættere lyssensoren er på overfladen, jo mindre er det område sensoren måler på. Hvis robotten derfor rykker sig lidt når lyssensoren er tæt på overfladen, vil forskellen i gammel bordfladeområde som lyssensoren ‘ser’ vs. nyt bordfladeområde som lyssensoren ‘ser’ være procentvis stor. Hvis lyssensoren er længere væk fra bordfladen vil den procentvise ændring i bordfladeomårdet ved samme udsving være mindre da bordfladeområde-arealet er større, og dermed tror vi at lyssensorværdien vil ændre sig knap så radikalt, som fører til en mere stabil bil.. Se følgende figur:



Fordelen ved, at lyssensoren sidder tæt på overfladen er, at den ikke er så let påvirkelig overfor omgivelserne. Fordelen ved, at lyssensoren sidder længere væk fra overfladen er, at vi dermed får vi en robot som er mere stabil og som forsøger at korrigere mindre da vi flyttede sensoren op. Det skyldes, at området som sensoren måler er væsentlig større når sensoren er længere væk fra overfladen, og dermed skal der større ændringer til i overfladen før robotten lader sig påvirke. Derimod er sensoren lettere påvirkelig når afstanden til overfladen er stor, og derfor fungerer robotten også bedst under mørke, kontrollerede forhold hvor der ikke er noget omgivende lys der kan interferere med det røde lys som sensoren selv udsender.


Self-balancing robots with color sensor
The NXT Segway with rider, [6]. use a color sensor to measure the position of the robot. Try that as an alternative to the light sensor. And maybe the physical structure of this robot is better that the structure in [2] and [3]. Maybe it is worth to try it.


Vi prøvede med color sensoren i stedet for lyssensoren i vores første build af robotten, se figur 1, men til dette build virkede color sensoren ligeså ringe som lyssensoren: vi kunne kun få robotten til at balancere i 2-3 sekunder. Efter at vi ændrede robotten til som den ses i figur 3 prøvede vi af tidsmæssige årsager ikke color sensoren igen.


Self-balancing robots with gyro sensor
Both the robots in [2] and [3] use the light sensor to measure the distance to the surface. In [4] and [5] other more reliable types of sensors are used to measure the tilt of the robot during balancing.


Vi prøvede ikke at bruge gyroskoper til at få robotten til at balancere.


Conclusion:
Vi kom igennem alle opgaver bortset fra den, hvor vi skulle bruge gyrosensoren. Vi fandt ud at det er en nødvendighed at kunne justere konstanterne kp, ki og kd “on the fly” ved brug af Bluetooth, og ligeledes det samme med offsettet, da det ellers ville tage lang tid at uploade programmet på ny for blot korrigere konstanterne. Vi fandt også ud af, at det er meget nemmere at få robotten til at balancere med store hjul end med små hjul. Her var tiden 3 minutter (and counting) vs. 2-3 sekunder.



Der arbejdes hårdt i labbet


References:
[2] Philippe Hurbain, NXTway
[3] Brian Bagnall, Maximum Lego NXTBuilding Robots with Java Brains, Chapter 11, 243 - 284.
The chapter contains a java program Sejway.java that can be used as a starting point for experiments with a self-balancing LEGO robot.
[4] Robotic Ideas & Instructions, AnyWay - Build a SegWay in under an hour!

[6] nxtprograms, NXT Segway with Rider