KUNGLIGA TEKNISKA HÖGSKOLAN
Programmera en NXT Robot
Med hjälp utav NXC
Peyman Torabi 2012-09-03 E-post: peymant@kth.se Introduktionskurs i datateknik (II1310)
Sammanfattning
Uppgiften var att analysera samt korrigera den felaktiga koden som kommer med en liten Lego NXT robot. Målet är att få roboten att följa ett svart streck med hjälp av sin sensor.
Innehållsförteckning
1. Inledning ... 3
1.1 Bakgrund ... 3
1.2 Syfte och målsättning ... 3
2. Genomförande ... 3
3. Resultat ... 3
4. Analys ... 4
5. Diskussion ... 5
Referenser ... 6
Bilagor ... 6
1. Inledning
Målet var att få en liten NXT robot att följa en svart linje med hjälp ut av en sensor som satt på den.
För att kunna få roboten att fungera använde vi oss av NXC som programmeringsspråk samt BricxCC som kompilerings program.
Vi ska då kunna korrigera /lägga till, samt testa den nya koden på roboten och då lära oss om processen av att utveckla enkla program.
1.1 Bakgrund
Att kunna skriva, analysera, samt korrigera kod är något som är något som alla ingenjörer borde kunna och denna uppgift låter oss prova på just detta.
1.2 Syfte och målsättning
Att komma igång med att programmera lite grundläggande kod i NXC samt lära sig hur man ändrar och lägger till sin egen kod till befintlig kod.
2. Genomförande
Vi laddade ned de nödvändiga programmen och drivrutinerna för att få allt att fungera. Vi testade sedan snabbt genom att kompilera koden och skicka det till roboten för att se att allt var i sin ordning. Efter detta så påbörjade vi arbetet.
Vi spenderade en stor del tid med att gå igenom koden steg för steg och följa den för att få en bild av hur allt fungerar och vad allt gör. För att få en klar bild över hur allt är uppbyggt av den som skrev koden till att börja med.
Det visade sig att vi inte behövde ändra så mycket kod som vi först trott men det började med att jag programmerade om en del samtidigt som min kompis kollade på och gav sin egen åsikt om det hela.
Vi båda testade en del olika saker innan vi kom fram till den lösning som vi ansåg att vara bäst.
Vi testkörde programmet gång på gång för att försäkra oss om att det inte är en tillfällighet att koden fungerar och att inga buggar finns närvarande som vi annars skulle missat.
En detaljerade överblick av hur vi fixade koden kommer i resultatet nedan.
3. Resultat
Vilka resultat gav laborationen? Redovisa med en tabell som innehåller radnummer från orginalkoden, ändringar av koden/ny kod och kommentarer.
Rad Orginal Kod Modifierad Kod Kommentar
115 dance(); //dance(); Kommenterade bort Dance från main klassen som gjorde så att roboten inte
följde några andra kommandon.
69 lightIntensity = SensorRaw(IN_1);
lightIntensity = SensorRaw(IN_3);
Ändrade så att roboten läser in data från Input port nummer 3 och inte 1.
Sensorn är kopplad till 3.
87 OnFwd(OUT_A, SpeedSlow);
OnFwd(OUT_B, SpeedSlow);
Bytade motor från A till B. Detta ändrar robotens kontroll då den följer
den svarta linjen.
91 OnFwd(OUT_B, SpeedFast);
OnFwd(OUT_A, SpeedFast);
Bytade motor från B till A. Detta ändrar robotens kontroll då den följer
den svarta linjen.
34 string
groupMembers[]
= {
"Person"
};
string
groupMembers[] = {
"Peyman", "Svante"
};
La till våra namn i arrayen som håller namn
4. Analys
Vi hittade en väldigt snabb lösning till problemet. Genom att snabbt ändra vilka motorer som aktiveras när så lyckades vi få fram ett bra resultat. Tydligen var vår metod inte den eftersökta metoden som man skulle använt sig av men det fungerade minst lika bra.
while(true) {
if(finished == true) {
Off(OUT_AB);
break;
}
readLightSensor();
if(lightIntensity < TopThreshold) {
OnFwd(OUT_A, SpeedSlow);
} else {
OnFwd(OUT_B, SpeedSlow);
}
readLightSensor();
if(lightIntensity > BotThreshold) {
OnFwd(OUT_A, SpeedFast);
} else {
OnFwd(OUT_B, SpeedFast);
} }
I början så aktiverades samma motor, motor A i första if satsen, om ljusets intensitet är under TopThreshold, även om det var sant eller falskt. Vi ändrade så att Motor A aktiveras om det är sant men annars aktiveras motor B om det är flaskt. Vilket får roboten att svänga åt andra hållet, i hopp om att hitta strecket.
Om ljusets intensitet är däremot större än bottom threshold så kommer A att gasa på men annars tar B över igen i hopp om att finna linjen igen.
Resultatet är att roboten går i princip i sicksack och håller sig då på linjen utan problem och korrigerar sig automatiskt då lightintensity går upp. (alltså ser sensorn då det ljusa golvet och inte den mörka tejpen)
Sensorn var ju givetvis också kritisk för att roboten skulle fungera så det var nödvändigt att
kontrollera att roboten får in datan från sensorn som var kopplad till Input 3, i koden togs
data in från Input 1 från början, vilket var en motor och inte sensorn.
5. Diskussion
I detta fall så lärde jag mig att inte överanalysera koden och försöka tänka enkelt, för då hittar man även en enkel lösning på problemet. Vi hade endast några små problem med koden och löste dessa relativt snabbt.
Jag fick en bra överblick över hur labbar kommer att vara längre in i min utbildning, samt komma igång med att skriva rapporter igen.
NXC och lego NXT var ett roligt sett att prova på något praktiskt utan att ha en bakgrund inom programmering. (Jag har en grundläggande bakgrund i Java dock)
Vi hade gott om tid och det som kanske saknades var en längre och mer utmanande bana för robotarna att följa, men annars var det väldigt bra.
Jag trodde att vi skulle få programmera mer och inte bara ändra ett fåtal stycken av koden, men som sagt, så löste vi problemet på ett enklare sätt än det som förväntades. (Tydligen I alla fall)
Referenser
Vi använde oss av det material som gavs på bilda:
https://bilda.kth.se/courseId/8498/content.do?id=19121762
Samt lego NXC API: http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/index.html