torsdag den 24. september 2009

TØ 4: Sejway - balancerende robot

Tom Ørsnes, Mark Surrow, Harald Andertun - ca 3 timer.

Denne uge har vi arbejdet med en balancerede LEGO robot, lignende Philippe Hurbain's NXTway-robot. Idéen er at den skal fungere ligesom den velkendte selvbalancerende segway.

Målet med denne lab session var først at prøve SejwayBad.java af, hvor vi gerne skulle se robotten kører meget ustabilt og drejer voldsomt frem og tilbage. Herefter skulle vi afprøve Sejwat.java, som er en forbedring af SejwayBad.java. Vi skulle gerne kunne obsevere at Sejway.java virker bedre end SejwayBad.java (bedre balance).


Vi fik downloaded de 2 kode filer, men støte derefter på et problem. Vi kunne ikke forbinde til vores NXJ, da de libraries vi bruder til kommunikere med NXJen i OS X ikke virkede. Det viste sig at en af sidste uges opdateringer til OS X satte Java til at kører 64-bit som standard, hvorfor USB og Bluetooth (hhv. usblib og bluecore) ikke længere virkede. Løsningen var at tvinge Java til at starte NXJ applikationerne (f.eks. nxjbrowse) i 32-bit. Dette tog desværre noget tid at finde ud af.

Det gøres ved at indsætte
-d32 i den sidste linie i det script man ønsker at køre. Her er et eksempel fra nxjbrowse:
java -d32 -Dnxj.home="$NXJ_HOME" -DCOMMAND_NAME="$NXJ_COMMAND" -Djava.library.path="$NXJ_BIN" -classpath "$NXJ_CP_TOOL" lejos.pc.tools.NXJBrowser "$@"

SejwayBad.java forsøg:
Problemet med denne kode er at programmet kører for langt hver vej før den skifter retning. Det 'overreagerer' hver gang, og lærer ikke af sine fejl. Efter at have overreageret burde den korrigere nogle variable så den ikke korrigerer lige så meget næste gang.

SejwayBad.java har en variable int NEUTRAL = 37. Denne variable angiver lysstyrken læst af lyssensoren når robotten står i balance (nautral). I vores tilfælde var det for lavt. Da vi kørte programmet, kunne vi aflæse på displayet en værdi ca 400. Dette resulterede i at robotten straks væltede. Så for at få SejwayBad til at virke var vi nødt til at korrigere denne værdi.

Men pga. de problemer vi havde tidligere med USB-driveren og java, valgte vi at stoppe med SejwayBad og gå videre med den bedre kode (Sejway.java) som vi fået udleveret.

Sejway.java forsøg:
Sejway.java koden er bedre af to grunde. Den første er at programmet starter med at sætte den værdi der læses fra lyssensoren, som balance punkt (i modsætning til SejwayBad.java der havde en pre defineret værdi i koden). Den anden grund er at Sejway.java forsøger at tage højde for overkorrigering ved at huske hvormeget der sidst blev korrigeret med og ændre ud fra dette, hvormeget der korrigeres.

Vi lavede et forsøg med koden uden at have ændret i det, for at se hvor længe robotten kunne holde sig oprejst. Det var muligt for den at holde sig oprejst i et par sekunder, inden den væltede.

Herefter kiggede vi på koden for at se om vi kunne forbedre dette. Vi forsøgte os med at sætte PID variablen KP ned til 10. Det gjorde vi ud fra den obsevation at robotten i første korrigerede sin balance for kraftigt i de første par iterationer og endte med at "stille" sig på lyssensoren. Vi ville derfor nedsætte styrken med hvilken robotten startede med at korrigere, så den kunne nå selv at ændre på sin korrigtions styrke.
// PID constants
final int KP = 17;

Efter nogle forsøg endte vi på 17, hvilket viste sig at være den værdi der fik robotten til at klare sig bedst. Det var det ikke en forbedring på mere end et par sekunder, robotten kunne holde sig oprejst. Herefter nåede vi ikke længere.

Reflektion:
Vi skulle måske have kigget mere på hvordan algoritmen virkede og forsøgt at arbejde med den, såvel som PID værdierne. Vi skulle også have kigget på de andre konstakter, ud over KP.

En anden ting der viste sig vigtig var hvor godt man fik placeret robotten i sit balance punkt. Ulempen her er at der i et givet forsøg ikke er nogen garenti for at vi kan placere robotten på præcis samme måde, som i forgående forsøg og dette kan påvirke vores fortolkning af den effekt, som vores ændringer i koden har givet. F.eks. er det muligt at vores ændringer i KP konstanten ikke var grunden til at vores robot klarede det (en smugle) bedre, men grunden var at vi var bedre til at placere robotten i sit balance punkt ved starten af testen. Vi havde dog ikke tid til at udforske dette, grundte den "spildte" tid på USB/Bluetooth driverne.

torsdag den 17. september 2009

TØ 3: Test af sound sensor

Vi startede med at tilslutte en NXT sound sensor til vores LEGO 9797 bil. Derefter compilede vi SonicSensorTest.java og uploadede den til Killbot. Vi havde først tænkt at lave lidt forskellige tests og udfylde en tabel med de forskellige data, men vores display opdatering virkede til at være for langsom og unøjagtig til denne manuelle aflæsning. Tabellen ses herunder:

LYDFYSISK AFSTAND/CMMÅLT AFSTAND/CMOMGIVELSE
klap1050lidt støj
klap5030lidt støj
klap10040lidt støj
klap500?
lidt støj
Ringetone50?lidt støj
Ringetone50?lidt støj

Denne lyd sensor virker meget følsom. Den registrerer lufttræk og baggrundsstøj meget nemt. Derfor valgte vi at teste den i et lille rum i Zuse, med meget lidt baggrundsstøj, for at kunne aflæse værdierne bedre. For at få et klap med samme styrke hver gang, optog vi klappet på en iPhone. Hør klappet her. Vi ville teste om et klap udført fra samme afstand ville give den forventede måling. Det tilfredsstillende resultat ses i grafen:














Dernæst testede vi Clap Controlled Car. Bilen virkede helt efter hensigten, så længe klappet var højt nok (måling på over 90).

torsdag den 10. september 2009

TØ 2: Test af Ultrasonic Sensor

Under denne uges TØ fik vi endelig Lejos til at samarbejde med vores macs. Vi brugte lidt tid på øvelsen fra sidste uge, LineFollower.java, men fokuserede hovedsageligt på NXT ultrasonic sensoren. Herunder ses en test af vores linefollower :



Med SonicSensorTest.java testede vi sensoren under forskellige forhold (bl.a. trævæg kontra gipsvæg) og opdateringshastigheder. Resultatet ses i tabellen herunder:

Fysisk afstand (cm) Killbots målte afstand (cm) Forhold
30 29-30 svag støj mod hvidt papir
20 22 -"-
10 11-12 -"-
30 30 mod plastic
20 21-22 -"-
11 11-12 -"-
30 30 mod trævæg
11.5 13 mod glas
30 30 glas
120 120 væg
254 243 gips væg
244 243 -"-

Selve brugen af sensoren begrænses naturligvis idet man ikke kan benytte den hvis man har behov for at måle afstande længere end 243-254 cm. Men for os bør det ikke være en begrænsning, da vi arbejder med forholdsvis korte afstande og de målte afstande er ganske præcise.

På korte afstande (op til 30 cm) fik vi nogle flotte og korrekte målinger selvom vi ændrede sensorens reaktionstid til 1 millisekund. Men på længere afstande bliver sensoren begrænset af tiden som lyden er om at echo tilbage og målingerne svinger for meget, hvilket begrænser brugbarheden.

Tracker: Vi arbejdede også med koden Tracker.java og Car.java, der kontrollerede bilen ved brug af Ultrasonic Sensoren. I sin originale opsætning kørte bilen kun fremad og bagud. Når den kom tæt på en forhindring bremsede den og bakkede lidt. Programmet var på dette tidspunkt ikke tilstrækkeligt intelligent til at kunne køre ud af en blind vej.

Vi pillede lidt ved de forskellige variable, og tilføjede også ny funktionalitet til programmet. I Car klassen tilføjede vi følgende metode, eftersom vi ønskede at bilen skulle dreje lidt til venstre når den havde stødt på en forhindring og været nødt til at bakke lidt.

public static void turnleft(int rightPower)
{
rightMotor.controlMotor(rightPower, forward);
}

I Tracker klassen tilføjede vi et kald til turnleft() metoden, lige efter at bilen havde bakket lidt. På denne måde drejer bilen indtil den ser en ny mulighed for at køre lige ud.

Car.backward(power, power);
LCD.drawString("Backward", 0, 6);
Car.turnleft(power);


Problemet med den blinde vej var nu løst - se video :




fredag den 4. september 2009

Vi har nu fået løst problemet og kan uploade filer til robotten (Yay!). Problemet var mangel på dokumentation for 0.85 til OS X. Det er nemlig slet ikke nødvendigt at installere USB Drivere, build lejos_nxj, opdatere .jar filer eller redigere i build scripts (og hvad vi ellers var ude i) i den nye version da USB drivere osv. er inkluderet i lejos_nxj. Det var her problemet opstod - de guides vi har brugt er outdated til 0.85, da man ved at installere Fantom USB driveren selv, tilsydenladende ødelægger lejos_nxj installationen.

Det eneste man skal er at download lejos_nxj, unzippe det og sætte 4 environment variabler:
export NXJ_HOME=din_sti_til_nxj/lejos_nxj
export DYLD_LIBRARY_PATH=${NXJ_HOME}/bin
export PATH=${NXJ_HOME}/bin:${PATH}
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home (hvis den ikke er sat)

så kan man benytte lejos_nxj/bin/nxjbrowse til at uploade. (NB: nxjconsoleviewer ser ikke ud til at virke, ihvertfald ikke på Os X)

Eclipse Plugin virker stadig ikke (over USB, BT ikke prøvet), men det har ikke top priotet.

torsdag den 3. september 2009

TØ 1: Udlevering af LEGO og installation

Vi fik udleveret vores Lego sets og fik bygget bilen vi skulle lege med. Herefter kastede vi os over at få installeret leJOS værktøjerne. Vi bruge alle Macs og det skulle vise sig ikke at være specielt nemt at få til at kører. Efter at have fulgt guides på leJOS hjemmeside og guiden i README.html uden held, kiggede vi efter andre guides. Vi har fik afprøvet en del guides, men uden held. Her er nogle af dem:
http://tucsontechnics.blogspot.com/2009/05/installing-lejos-on-macbook-pro.html
http://lejos.sourceforge.net/forum/viewtopic.php?t=1186&start=0

Selvom der ikke har været problemer med at gøre som beskrevet i de forskellige guides og vi har fået installeret en USB driver (Fantom USB Driver), er der stadig problemer med at connecte til Brick'en. Vi har brugt en debug version af pccomm.jar (lejos_nxj/lib) og det viser sig at være ham her der giver problemer:
java.lang.NoClassDefFoundError: lejos/pc/comm/NXTConnector

Vi har oprettet et indlæg på leJOS forum og er ved at få hjælp til at løse problemet. En meget mere detaljeret beskrivelse af hvad vi har gjort og problem beskrivelse findes i indlæget her:
http://lejos.sourceforge.net/forum/viewtopic.php?t=1692