mandag den 17. december 2007

Vejfinder 7

Blog7:

Varighed: 6 timer, Deltagere: Rolf og Janus

Dagens mål er at bygge selve GridBuilder-funktionaliteten i NXT'en og tilføje flere muligheder for debugging af systemet over BlueTooth.

Vi vil opnå vores mål idag ved at:

  • Tilføje og aktivere den nye sensor til robotten og til Core, så sensoren bliver startet op og kan bruges.
  • Udføre målinger på sensorerne for at se om de har samme lysfølsomhed (og dermed giver de samme værdier for de samme farver) som de andre sensorer vi har.
  • Bygge en passiv udgave af GridBuilder, der kigger på hvordan robotten bevæger sig og hvad "mapper light" ser.
  • Starte på at forberede den aktive udgave af GridBuilder - en udgave, som også til tider styrer motererne for at pege robotten i retninger, der endnu ikke er blevet udforsket.

Ny sensor

For at se om der skulle være sideveje på de vejstykker, som vi bevæger os på, er det nødvendigt med en sensor på den anden (venstre) side af robotten. Denne sensor blev placeret, så den sidder uden for vejen - dvs. præcis der, hvor en evt. sidevej ville være. Den kan bruges som input til den passive GridBuilder, så denne kan se om der har været en sidevej. (Sideveje til højre er ikke nødvendige at kigge efter, da LineFollower altid vil dreje ned af sådan en.)

Måling på sensorerne

Efter at have tilføjet mulighed for at aflæse sensor-input over BlueTooth kunne vi ret hurtigt se, at den nye sensor var under 400 når den var over græs og over 400 når den så vej. Som med alle de andre sensorer hardcoder vi disse værdier mens vi arbejder med projektet, senere laver vi muligvis en automatisk kalibreringsmetode. Under udviklingen har vi valgt at styre lysmiljøet omkring robotten ved at sætte en skærm op så direkte sollys ikke forstyrrer målingerne.

TachoNavigator

GridBuilderen baserer en del af sine valg på hvor robotten befinder sig og hvordan den vender. Derfor har vi udført en lang række tests af præcisionen af lejOS TachoNavigatoren.


Som det ses på billedet havde vi en del problemer med rotationen, mens afstandsmåling (længden af cirklerne) fungerede ganske fint.

Som det måske kan ses på billedet herover, havde vi problemer med at robotten pludselig "hoppede" i sin angivne position. Den beyndte uden videre at rapportere en ny position lige pludseligt; typisk ca. 5-10cm ved siden af den position, hvor den havde været et øjeblik før. Efter nogen søgen på LeJOS forummet kom vi frem til at dette skyldes en fejl i updatePosition()-metoden i den TachoNavigator, der er i version 0.4 af LeJOS. [updateposbug]

Lidt gransken i deres SVN repository viste sig at give pote, da changelog for TachoNavigator.java angav at de havde rettet netop denne fejl. Vi hentede den nye version af TachoNavigator.java fra SVN, og indsatte denne i vores project istedet for den, som følger med til version 0.4. Dette løste problemet med at robotten hoppede tilfældigt og gav desuden mulighed for at kalde updatePositon() mens robotten kører - ikke kun efter endt bevægelse som i den gamle udgave. Vi kan nu lave robotten om, så den drejer mere flydende, da vi ikke behøver at stoppe hele tiden for at aflæse positioner / vinkler.

Copy & paste af de 2 changelog afsnit der er interresante i den nye TachoNavigator vi hentede:

Revision 1093 - (view) (download) (annotate) - [select for diffs]
Modified Thu Nov 22 19:45:38 2007 UTC (8 weeks ago) by rogergla
File length: 14381 byte(s)
Diff to previous 921

Fixed bug in identified in forum - new algorithm for update position
Revision 1143 - (view) (download) (annotate) - [select for diffs]
Modified Mon Dec 3 18:46:36 2007 UTC (6 weeks, 3 days ago) by rogergla
File length: 15665 byte(s)
Diff to previous 1093

updatePosition()  now can be called at any time, even while the robot is moving.

GridBuilder

De informationer som GridBuilder har brug for er:

  1. Hvad ser den sensor, som er monteret til venstre på robotten? Ser den vej eller græs?
  2. Er vi igang med at dreje til højre eller kører vi ligeud?
  3. Hvor langt har vi kørt siden vi sidst fandt et nyt stykke vej?
Med disse informationer kan man se forskel på T-kryds, sving og lige veje. Det er dog uklart hvordan man kan se forskel på et fuldt kryds og et T-kryds. Dette bliver vi nødt til at tage højde for i softwaren.
To af disse stykker information kan hentes via henholdsvis isOnRoad() og isTurningRight() i GridBuilder-klassen. isOnRoad() er implementeret som en simpel test af sensorens normaliserede værdi.
isTurningRight(), derimod, er interessant fordi robotten hele tiden drejer både til højre og til venstre pga. LineFollowerBehaviours måde at følge vejen på. Det svære her er at finde ud af om robotten i øjeblikket har tendens til at køre til højre eller om dens generelle retning er at fortsætte ligeud. Dette er nemt at se for et menneske, men computere arbejder i hårde tal, så istedet valgte vi i starten at bruge et decaying average. Hvert sekund opdaterer isTurningRight() hvilken vinkel der er drejet siden sidst. Dette lægges sammen med det løbende gennemsnit. Ud fra dette vil det være muligt at se hvilken rotation (hvis nogen) robotten i øjeblikket er igang med at udføre.
Selve udregningen af denne vinkel kræver lidt kendskab til hvordan lejOS TachoNavigatoren sender rotationen tilbage. Efter lidt undersøgelser viste det sig at denne vinkel altid vil ligge i området fra -180 grader over 0 til +180 grader. Derfra skal der udføres lidt matematisk vinkelregning (i leastDifference(v,w)) for at finde den rent faktiske ændring imellem de to vinkler. Dette kan være lidt besværligt når der både er negative og positive tal og overflowing imellem disse med i udregningen.

Efter at have testet vores decaying average dreje-detekteringssystem, kom vi frem til at det ikke virkede efter hensigten. Måden som vores robot drejer fra side til side på, for at finde kanten af vejen, fik isTurningRight() til at returnere helt forkerte resultater. Dette resulterede i, at gridbuilder overhovedet ikke virkede, da den hele tiden mente at vi havde drejet; hvilket resulterede i at der blev sat alt for mange sving ind i banen.

Efter nogen overvejelse og tuning af systemet, blev det besluttet at afprøve en noget simplere løsning. Et nyt retningsbaseret dreje-detekteringssystem blev implementeret: Her husker vi på hvilken retning (N/S/Ø/V) som robotten sidst var på vej i, Hvis den kommer inden for +-20 grader af en af de andre retninger bliver retningen opdateret til den nye, og typen af sving (højre/venstre) bliver returneret.

Dette nye detekteringssystem skulle vise sig at være meget bedre end det forrige; faktisk så godt at vi nu uden fejl kan detektere alle svingene som robotten tager, med det resultat at kortet begynder at ligne det rigtige, når robotten kører på vejsystemet.

Video


Robotten søger efter hvilke plader kortet består af. Denne udgave af robotten kan kun lave højre-sving



Robottens data bliver fremvist på en skærm samtidigt med at de bliver opsamlet i robottens mapper-algoritme. (Grunden til at den tegnede cirkel afviger fra vejen, er at robotten ikke blev startet på midten af vejen men for enden, altså var robotten ikke fysisk der hvor TachoNavigator tror.)

Konklusion

Som det ses i videoen af MapMaker UIen, virker Gridbuilder ganske godt. Endnu finder den ikke sideveje til venstre, og derfor bliver det fundne kort til en oval. Men dette vil blive færdiggjort næste gang. Ud fra de to videoer og de andre tests vi har lavet idag, er det tydeligt at det her kommer til at virke, og at det bestemt er muligt at opbygge kortet i NXTen. Samtidigt har vi nu også testet vores UI, og kan bekræfte at den virker helt efter hensigten.

Noter

Ingen kommentarer: