KUNGLIGA TEKNISKA HÖGSKOLAN Felsökning av mjukvara Programmering av en NXT-robot Max Kufa [03/08-13] mkufa@kth.se Introduktionskurs i datateknik (II1310)
Sammanfattning Syftet med laborationen var att felsöka och korrigera felaktig mjukvara till en NXC robot. Till vår hjälp så hade vi programmet BricxCC och koden som vi skulle rätta till, samt fyra timmar att kontinuerligt testköra och ändra mjukvaran i roboten ett flertal gånger. Resultatet ska bli att roboten kan följa en svart linje. När eller om roboten krockar, så ska ett par trycksensorer märka detta, och roboten kommer att därefter skriva ut gruppmedlemmarnas namn på displayen, ett mål som vi relativt enkelt uppnådde även om problem med bl.a. programmeringsspråk och allmänt förstående av uppstod. Innehållsförteckning Sammanfattning...2 1. Inledning...3 1.1 Bakgrund...3 1.2 Syfte och målsättning...3 2. Genomförande...3 3. Resultat...4 4. Analys...5 5. Diskussion...5 Bilagor...7 Institution Kungliga Tekniska Högskolan Sida 2 av 7
1. Inledning I denna labboration så arbetar vi i NXC för att få en mindstormsrobot att fungera korrekt, och på de följande raderna så kan vi läsa mer om varför denna laboration utförts. (Utöver att några studenter ville ha ett bättre betyg) 1.1 Bakgrund I dag så är vi beroende av mjukvaran. Mjukvaran kontrollerar nästan allt, från de vardagliga mobilerna, trafiksignalerna och snabbkassorna på konsum, till raketer och kärnvapen. Man kan påstå att mjukvaran är en av dagens civilisationers grundstenar. Och det är bl.a. ingenjörernas jobb att se till att allt detta fungerar. 1.2 Syfte och målsättning Syftet är att programmera i par, samt ge ett smakprov av arbetssättet i framtiden för studenterna. Fast kanske viktigare, så ska studenterna lära sig hur mjukvara reagerar på fel i koden och hur man ska gå tillväga för att korrigera programmet. 2. Genomförande På grund av att varken jag eller min tänkta medlaborant lyckats få med sig en dator till labborationen, så var vi tvungna att gruppera om oss med andra laboranter som hade datorer. Min nya medlaborant och jag hade redan gått igenom Lab-PM:et privat, samt att datorn redan hade BricxCC installerat. Därmed så kunde vi hoppa över dessa två moment. Det absolut första som gjordes var att rensa roboten från tidigare programvara. Detta åstadkom vi genom att installera om drivrutinerna i roboten. Nästa steg var att få koden att kompileras. Vi var inte särskilt intresserade i vad koden gjorde om den ändå inte kunde laddas ner på roboten. De första felmeddelandena som dök upp pekade på att problemet låg på rad 34-37. Vi märkte snabbt att denna array var av typen int, när tydligen det som behövdes för att spara gruppmedlemmarnas namn var en array av typen string. Utöver det så krävdes det gruppmedlemmarnas namn i arrayen. Koden skvallrade om att namnen skulle visas upp på displayen när trycksensorerna trycktes in. Efter korrektion och kompilering så laddades programmet ner till roboten. Utöver att roboten for omkring överallt vid testkörningen, så fann vi en någorlunda lustig bugg som visade sig på displayen. Namnen skrev ut på varandra. D.v.s. att namnen Max och Tobias överlappade varandra, och det slutade med att den enda gruppmedlemmens namn blev Maxias. Eftersom jag programmerat robotar tidigare, så tog det inte lång tid att lista ut att roboten inte förstod att namnen skulle skrivas ut på två olika rader. Detta problem antog vi låg på rad 46 då TextOut måste onekligen vara det commando som skriver ut medelandet. Den originella koden hade en underlig ekvation som vi inte förstod varför den fanns. Det slutade med att vi skrev en egen kod: TextOut(0,LCD_LINE2, names[0]); Institution Kungliga Tekniska Högskolan Sida 3 av 7
TextOut(0,LCD_LINE3, names[1]); Då uppgiften inte specificerade någonting annat utöver att displayen skulle visa våra namn, så lät vi koden stå som den gjorde, även om den medför flera problem som vi kunde ignorera. Notera denna kod senare blev ändrad då vi fått hjälp av en lärare när det gällde den mystiska ekvationen. Se diskussionen och rad 46. Vi kommenterade bort allt som hade med dance(); att göra, då den snarare var ett virus än något som faktiskt hjälpte oss med uppgiften. Efter en testkörning så insåg vi att roboten inte reagerade alls på ljussensorn. Roboten läste av information från fel port på rad 76. Den sista och den besvärligaste ändringen vi gjorde var att fullständigt skriva om den funktion som sade åt roboten hur den skulle reagera på svart eller vitt underlag. Se diskussionen rad 91-100. 3. Resultat Det vi ämnade att göra var en robot som uppfyllde de mål som sattes upp för oss. Även om det inte blev en graciös lösning när vi gjorde arbetet själva, så nådde vi de uppsatta målen, vilket var tillräckligt för oss. Men för att göra vårt arbete så fullständigt som möjligt så tog vi hjälp av en lärare och fick fram en bättre optimerad robot. Under så kan finns en tabell som innehåller den slutgiltiga mjukvaran. 2-3 #Define SpeedSlow 35 #Define SpeedFast 70 34-37 String groupmember = { Tobias, Sänkte robotens hastighet Ändrade arraytypen från int till String Max }; 46 TextOut(0,LCD_LINE2-8xi, names[i]); Ändrade ekvationen som skrev ut namnen på olika rader på displayen. 76 lightintensity = SensorRaw(IN_3); Roboten försökte att läsa av information från port 1 tidigare. Dock så va port 1 kopplad till en trycksensor och inte till en ljussensor. 91-100 If(lightIntensity < TopThreshold) { OnFwd(Out_A, SpeedFast); OnFwd(Out_B, SpeedSlow); else{ OnFwd(Out_A, SpeedSlow); Skrev om den löjliga koden som gav mig och min partner huvudvärk. Istället för att kolla efter olika färger på golvet, så lät vi roboten se om golvet var vitt eller inte. OnFwd(Out_B, SpeedFast); 50-55, 126 /* -kod- */ Kommenterade allt som hade med funktionen dance() att göra så att dance() aldrig kördes. Institution Kungliga Tekniska Högskolan Sida 4 av 7
4. Analys Jag har tidigare erfarenheter av programmering och robotar, dock så har jag aldrig programmerat i NXC. Men som tur är så var NXC väldigt likt java, så att vi lyckades klura ut hur vi skulle koda. Dock så uppstod det problem, då NXC trots allt inte är java. T.ex. så fastnade vi vid korrektion av gruppmedlemmar[]; Vi samarbetade vi bra i gruppen även om vi fastnade ett flertal gånger. Det berodde på att jag inte programmerat på ett bra tag samt att min medlaborant aldrig har programmerat tidigare, så jag undervisade mer än arbetade med roboten. Det fanns ett flertal funktioner som styrde roboten. De mest anmärkningsvärda är antagligen den iffunktion som bestämmer var roboten ska åka. Det finns även en while-loop som skriver ut text på skärmen ifall roboten krockade i något. Fast den som jag tycker är mest intressant är ändå den funktion som sparar läser av och sparar data från ljussensorn, antagligen för att el är det som intresserar mig och inte mjukvaran. Värt att notera var att det fanns ett virus i koden som kallades dance(); Dess enda uppgift var att förstöra vårt arbete, och klassas därmed som virus enligt den här laboranten. 5. Diskussion Diskutera kortfattat laborationens syfte och mål. Vilka problem uppstod? Vad har du lärt dig? Kommer du ha nytta av detta i dina framtida studier eller i ditt framtida yrke? Vad har du för åsikter om programvaran och NXC? Diskutera också kort det tillvägagångssätt och de lösningsmetoder ni använde er av under laborationen. Ett löjeväckande problem var när vi rättade ett fel som inte var ett fel. Tydligen så gjorde denna ändring så att kompilatorn buggade, och vi var tvungna att kopiera all kodning som vi skrivit och öppna ett nytt dokument. Loopen på rad 47 orsakade en del problem p.g.a. hur NXC roboten använder sin display. Vi kom på en lösning på problemet (som kan återfinnas i genomförande ), men tyvärr så slog det oss att denna lösning inte fungerade om det fanns mer än två personer i gruppen. Vi fick senare hjälp och fick det förklarat för oss att vi dessutom skrev ut våra namn två gånger p.g.a. en while loop som skrev ut ett visst antal namn på skärmen. Displayen verkar använda sig av en int för att bestämma på vilken rad texten ska skrivas på, något vi i gruppen hade missat, något som dessutom förklarade den förvirrande ekvationen på rad 46. Men med hjälp av läraren, genom att återställa all gammal kod som hade med problemet att göra, och korrigera det på rätt sätt. Dessutom så var if funktionen som bestämde hur roboten skulle reagera mot olika underlag onödigt komplicerad. Vi försökte flera gånger att förstå hur den fungerade, inverterade statements och så vidare. Det slutade med att vi skrev vår egen kod. Institution Kungliga Tekniska Högskolan Sida 5 av 7
Jag betvivlar att NXC används i dagens företag, men det är en nyttig träning för nybörjare när det gäller att komma in i programmeringstänket. Dock så kommer jag att hålla mig borta från BricxCC med tanke på att den inte kan kompilera ordentligt. Institution Kungliga Tekniska Högskolan Sida 6 av 7
Bilagor Institution Kungliga Tekniska Högskolan Sida 7 av 7