Programmering av LEGO NXT robot

KUNGLIGA TEKNISKA HÖGSKOLAN
Programmering av LEGO
NXT robot
Laborationsrapport för programering av robot
för att följa svartmarkerad linje på maken
Hannes Rabo
2015-08-30
[email protected]
Introduktionskurs i datateknik (II0310)
Programmering av LEGO NXT robot
Hannes Rabo
2015-08-30
Sammanfattning
Denna laborationsrapport är på en programmeringslaboration av en LEGO NXT robot där roboten
programmerades för att följa en svart linje på golvet. Laborationen ger en kort introduktion till
programmeringen av denna typ av robot samt olika koncept inom programmering i allmänhet. Koden
skrevs i Brick Command Center vilket också hanterade kommunikationen mellan datorn och roboten.
Resultatet blev en robot som kunde utföra tidigare nämnda uppgift utan problem trots vissa problem
med upplägget av hur problemet skulle lösas. Detta gav dock en insikt i ingenjörsarbetet och hur små
förändringar kan ge stora förändringar samt hur många sätt som kan finnas för att lösa ett problem.
Båda dessa faktorer visade tydligt vikten av att förstå tankegången hos andra programmerare då en
uppgift löses kollaborativt.
Innehållsförteckning
1. Inledning .............................................................................................................................................. 3
1.1 Bakgrund ....................................................................................................................................... 3
1.2 Syfte och målsättning .................................................................................................................... 3
2. Genomförande .................................................................................................................................... 3
3. Resultat................................................................................................................................................ 5
4. Analys .................................................................................................................................................. 5
5. Diskussion ............................................................................................................................................ 6
Referenser ............................................................................................................................................... 7
Bilagor...................................................................................................................................................... 7
Institution
Högskola eller universitet
Sida 2 av 7
Programmering av LEGO NXT robot
Hannes Rabo
2015-08-30
1. Inledning
I denna laboration programmerar vi en LEGO NXT robot för att följa en svart linje på marken och
känna av stötar mot hinder. Roboten använder sig av en ljussensor för att känna av det
svartmarkerade området på marken och två trycksensorer för att känna av när roboten slår i ett
hinder. Då ett hinder påträffas ska robotens motorer stängas av, namnen på medlemmar i gruppen
skrivas ut på skärmen och högtalaren ska spela en kort melodi.
1.1 Bakgrund
Programmering kan vara en stor del av en ingenjörs arbete och ett enkelt sätt att lösa problem med
hjälp av en dator. Det är därför en viktig del av utbildningen på KTH och en nödvändig kunskap som
ingenjör. Denna laboration visar på ett simpelt sätt proceduren med att skapa ett program
kollaborativt och programmering i allmänhet men introducerar även denna specifika robots
funktioner och hur de kan användas för att få en robot att utföra en specifik uppgift. I detta fall
handlade det om att få roboten att följa en markerad svart linje på golvet med hjälp av en ljussensor.
1.2 Syfte och målsättning
Syftet är att på ett roligt och relativt enkelt sätt introducera programmering i form av
parprogrammering. Den introducerar även de tillvägagångsätt som används i ingenjörsrollen samt de
arbetssätt och system som används vid KTH. Uppgiften visar även tydligt hur små förändringar och fel
i koden kan ha mycket stora utslag på hur en robot fungerar om den ska utföra sina uppgifter som
förväntat. Detta ger då en insikt i hur stor noggrannhet som krävs och den planering som behövs för
att skriva ett pålitligt och fungerande program.
2. Genomförande
Nedan följer det tillvägagångssätt som vi använde vid lösandet av uppgiften
1. Nedladdning av programvara, drivrutiner och kod.
Första steget i denna laboration är att ladda ner drivrutiner, utvecklingsmiljö och kod för den
roboten. Dessa hämtades från kth hemsidan bilda under kursmaterial.
(https://www.bilda.kth.se/courseId/12708)
2. Installation
Efter att alla filer packats upp från det komprimerade formatet var drivrutinerna tvungna att
installeras på datorn för att kunna kommunicera med roboten medan utvecklingsmiljön
kunde startas direkt utan installation. Utvecklingsmiljön som användes var Brick Command
Center.
3. Anslutning
Roboten ansluts till datorn via en USB-sladd och efter detta kunde utvecklingsmiljön startas.
Vid start skall kommunikationsporten USB väljas för att den ska hitta roboten som är
ansluten till datorn enligt tidigare instruktion.
4. Inladdande av kod i utvecklingsmiljön.
Efter att utvecklingsmiljön har startats kan den delvis färdiga koden laddas in i programmet
antingen genom att den dras in i fönstret från ett annat filhanteringsprogram (ex. vis
explorer.exe) eller genom att välja file --> open och sedan navigera till filen.
Institution
Högskola eller universitet
Sida 3 av 7
Programmering av LEGO NXT robot
Hannes Rabo
2015-08-30
5. Kodgranskning
Fösta steget i redigeringen av koden för en funktionell robot var att noggrant läsa igenom all
kod och leta efter uppenbara misstag eller stavfel samt logiska fel. Dessa kan då direkt
korrigeras innan ytterligare steg i metoden genomförs. Den programmeringsmetod som
användes vid all programmering i uppgiften var parprogrammering vilket innebär att en
person sitter och skriver kod medan en andra person samtidigt övervakar och snabbt kan
hitta eventuella stavfel samt felaktiga tankegångar. Eventuella problem som uppkommer kan
även effektivt diskuteras inom gruppen.
6. Kompilering
När koden har redigerats och uppenbara felstavningar plockats bort kan koden föst
kompileras genom att klicka på f5 (eller välja Compile --> Compile). Eventuella fel i koden
kommer nu att generera felmeddelanden om de inte redan har åtgärdats (ej logiska fel).
7. Korrigering av eventuella fel angivna i felmeddelandet
Efter att man försökt kompilera programmet och det genererat felmeddelanden så kan
radnumren uppsökas och efter felmeddelandet korrigeras. Eftersom fel på rader innan
angivet radnummer inte alltid genererar ett fel på den rad de befinner sig på är det även
viktigt att kolla på dessa rader ifall felet inte upptäcks direkt. Detta gäller speciellt fel med
antalet parenteser eller utsättandet av semikolon som avslutar alla satser i programspråket
som används (NXC).
8. Kompilering och överladdning av program till robot
Steg sex och sju genomförs ända tills det inte längre generas några felmeddelanden och
kompileringen blir lyckad. Programmet kan då överföras till roboten genom att klicka f6 (eller
välja Compile --> Download).
9. Kontroll av beteende och allmän funktion
Kör programmet genom att navigera till filen på roboten och använda den orangea
mittenknappen för att starta den. Kontrollera att roboten fungerar och rör sig och notera
även hur eftersom det kan användas i den vidare analysen av hur koden fungerar.
10. Förändring av kod till ett fungerade upplägg
Förändra koden för att den ska fungera för den specifika uppgiften (se resultat för
förändringar som gjordes i denna labb). Kompilera och överför koden till roboten.
11. Testkörning
Placera roboten med ljussensorn på det svarta sträcket, navigera till filen och klicka på den
orangea mittenknappen för att exekvera koden. Roboten bör följa linjen utan att sensorn
hamnar utanför mer än mycket korta perioder åt gången. Roboten skall även kunna följa
svängar på sträcket åt både höger och vänster.
Institution
Högskola eller universitet
Sida 4 av 7
Programmering av LEGO NXT robot
Hannes Rabo
2015-08-30
3. Resultat
Denna tabell visar förändring av koden där Rad nr. anger radnummer som förändrats i originalkoden,
andra kolumnen i tabellen anger den nya koden för den specificerade raden och kommentarsfältet
ger en inblick i varför koden behövde ändras
Rad
nr.
2
Kod ersatt med:
Kommentar
#define SpeedSlow 50
34
string groupMembers[] = {
35
36
45
”Hannes”,
”Max”
TextOut( 0, (LCD_LINE1 – 8 * i), names[i]);
76
lightIntensity = SensorRaw(IN_3);
94
OnFwd(OUT_A, SpeedFast);
98
OnFwd(OUT_B, SpeedSlow);
115
//dance();
Roboten kunde inte svänga tillräckligt
snabbt med den högre hastigheten (80)
Fel datatyp (int) för att lagra namn då
dessa lagras som textsträngar (string)
Nummer ersatt av namn 1
Nummer ersatt av namn 2
Subtraktionen av 16 placerade texten två
raden ovanför vad som var meningen.
Detta togs därför bort.
Fel port. Porten för den ena trycksensorn
hade angivits istället för den korrekta som
hörde till ljussensorn.
Roboten ska svänga till höger i detta fall
(på linjen). Hjul A ska därför snurra snabbt.
Roboten ska svänga till höger i detta fall
(på linjen). Hjul B ska därför snurra
långsamt.
Funktionen som utförde dansen var onödig
då den inte utförde någon uppgift som var
aktuell för denna labb utan endast
försvårade framfarten.
Efter dessa förändringar fungerade roboten enligt de specificerade kriterierna (se inledning för
labbeskrivning). Uppgiften kunde då utföras utan onödiga rörelser och enligt ett mönster som var
effektivt.
4. Analys
Laborationsresultatet blev lyckat då roboten utan problem kunde utföra uppgiften med gott resultat.
Koden hade följande funktioner och uppbyggnad:


Definition av variabler och makron/konstanter
Överst definierades alla variabler och konstanter som krävdes och användes senare i koden.
Detta innefattade konstanter för hastigheter och radnummer på skärmen samt variabler för
ljudsignalen, gruppmedlemmar, ljusintensitet samt en variabel för enkel avbrytning
huvudloopen i programmet.
void printNamesToScreen(string names[])
Denna funktion innehåller ett förenklat sätt att skriva ut namn/textsträngar till skärmen på
rätt rader. Varje textsträng som skickas som parameter till funktionen i vektorn kommer att
få en unik rad (såvida det inte finns fler textsträngar än rader)
Institution
Högskola eller universitet
Sida 5 av 7
Programmering av LEGO NXT robot





Hannes Rabo
2015-08-30
void dance()
Denna funktion har inte någon aktiv uppgift i detta program och skulle helt kunna uteslutas.
Den får roboten att rotera åt höger i tre sekunder.
task readTouchSensors()
Denna funktion körs i en separat tråd och kontrollerar ifall någon av trycksensorerna har
aktiverats. Om så är fallet så avbryter den huvudloopen och avslutar programmet.
void readLightSensor()
Hämtar värdet från ljussensorn och sparar det i en variabel som alla funktioner kommer åt
task followLine()
Funktion som kör i separat tråd som innehåller huvudloopen och både hittar samt följer
sträcket. Ett högt värde från ljussensorn innebär att den befinner sig över sträcket och i detta
fall kommer loopen att styra roboten åt höger. Är värdet där emot under konstanten
BotThreshold så befinner den sig utanför sträcket och kommer styra åt vänster. Detta får
följden att den alltid kommer försöka befinna sig på den högra kanten av strecket. Om
variabeln bool finnished skulle ändras till true så kommer denna funktion och tillhörande
tråd att avslutas.
task main()
Startfunktionen för programmet där sensorer ställs in och andra trådar för följning av linjen
startas.
5. Diskussion
Under laborationen var det från början svårt att inse på vilket sätt som roboten var tänkt att lösa
uppgiften. Eftersom vår utgångspunkt var att roboten skulle följa det svarta strecket som om det
vore ett det korrekta området och alltså inte behövde svänga så började vi med att försöka lösa
uppgiften på fel sätt. Senare löste vi istället uppgiften genom att se på problemet som att roboten
skulle följa kanten på strecket vilken överensstämde med upplägget på koden och därför gjorde
lösningen mycket enkel att genomföra. Jag fick därför en insikt i ett alternativt sätt att tänka på
problemet och på så sätt komma fram till en enklare lösning. Alternativa och lättare lösningar är
viktiga att ha med sig i bakhuvudet som ingenjör då det alltid krävs effektivisering av system för att
de ska kunna fungera enligt alla önskemål och krav. För att hitta funktionen som var tänkt i just det
här programmet så hade vi som metod att skriva ut variabelvärden från koden till skärmen under
exekveringen. Vi konverterade bland annat heltalsvärdet från ljussensorn till en textsträng och skrev
ut den för att kunna analysera vilka värden som den funktionen genererade och när. För att göra
upptäckandet av nya fel samt ge tillfälle till diskussion användes även metoden parprogrammering
vilken innebar att programmeringen gjordes två och två. En person kunde i detta fall sitta och läsa
koden som den andra skrev för att sedan kommentera på eventuella fel. Detta gjorde att felsökning
kunde bli mycket effektivare då fel oftast omedelbart upptäcktes av den andra personen.
Det programspråk som användes vid laborationen (NXC) har stora likheter med C även om det finns
vissa skillnader. Det gör att det även ger en introduktion till språket C vilket har många andra
användningsområden i industrin och större applikationer och program. Detta gjorde det fungerade
som ett bra alternativ till just C för nybörjare eftersom det även innehöll förenklingar av vissa
koncept som separata trådar.
Institution
Högskola eller universitet
Sida 6 av 7
Programmering av LEGO NXT robot
Hannes Rabo
2015-08-30
Referenser
Lab-PM
https://bilda.kth.se/courseId/12708/content.do?id=23767349
Bilagor
Figur 1 Dagboksinlägg om robotlaborationen
Institution
Högskola eller universitet
Sida 7 av 7