Mobot#
Artikel av Cosku Acay, Edwin Cho, Kenneth Li och Nishant Pol. PDF.
Projektbeskrivning#
I Carnegie Mellons Mobot-tävling måste robotar passera en serie av 14 grindar placerade över en 255 fot lång böjd vit linje på en trottoar utomhus. Banan inkluderar två branta ramper och ett beslutspunktsområde där roboten måste välja rätt väg för att passera 14 grindar i följd. Eftersom linjen är utomhus och i Pittsburghs väder måste roboten fungera under en mängd olika förhållanden. I år var det regnigt och blåsigt på tävlingsdagen. Mer information finns på http://www.cs.cmu.edu/mobot/mobot.html


Lösning med CMUcam4#
Vi valde att angripa linjeföljningsuppgiften med CMUcam4 eftersom den krävde minimal hårdvara och hade ett gränssnitt väl lämpat för att spåra en linje.

CMUcam4 fångar en bild av linjen vid 30 bilder per sekund och matar färgspårningsbilden till Arduino Mega via en av de tre seriella ledningarna. Arduino Mega bearbetar sedan denna bild (se Programvarubeskrivning nedan) och levererar motorhastighets- och svängkommandon till PID-styrenheten via en annan seriell ledning. PID-styrenheten förser i sin tur Arduino Mega med enkoderräkningar för både höger och vänster hjul, vilket gör att vi kan hålla reda på vår position och riktning i förhållande till grind 0.
PID-styrenheten (MD-25) tillverkas av Robot-Electronics i Storbritannien. Den driver två växlade DC-borstmotorer med magnetiska enkodrar på motoraxeln. LCD-skärmen är för felsökningsändamål. Vi hade två strömskenor, 12V för motorer och 5V för logik, som delade samma jord och båda hämtade från ett enda 12V uppladdningsbart batteri.
Vi planerade från början att göra en prototyp av en träbas för att snabbt komma in i programmeringsfasen och sedan arbeta på en snabbare, mer tillförlitlig bas som en radiostyrd bil. Vi fann dock att prototypen var mycket tillförlitlig och lätt att arbeta med, så vi behöll den för den slutliga designen. Vattentätningen av kroppen bestod av ett lager cellofanplast under ett lager packtejp. Regnet läckte dock genom packtejpen men lyckligtvis inte genom cellofanplasten. Kameran täcktes av en fyrkant av plast från en Ziploc-påse eftersom vi fann att ”filtret” förbättrade kamerans förmåga att ignorera små partier av linjen som, för kameran, såg ut som den bakomliggande betongen.
Algoritmbeskrivning#
Bakgrund#
Vi använder CMUcam4 i färgspårningsläge med YUV-läge aktiverat, vilket ger oss en binär bildrepresentation av linjen. Kameraprogramvaran filtrerar bort allt som inte är vitt (dvs. bakgrunden) och sätter en ”på”-pixel där det finns en linje (där den är vit). Vi använder YUV-läge så att färgspårningen är okänslig för ljusets intensitet, så att vår robot kan fungera under en mängd olika förhållanden inklusive inomhus och utomhus.
Linjeföljning#
CMUcam4 förser vårt Arduino-chip med en 80 gånger 60 binär bild. Vi samplar 10 jämnt fördelade pixelrader från bilden och beräknar tyngdpunkten för ”på”-pixlar (se här: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Vi antar sedan att linjen ligger på tyngdpunkten. Genom att göra detta på 10 olika rader i bilden får vi en bra approximation av linjen genom att förbinda punkterna. Vi kan sedan använda dessa data genom att ta reda på hur långt varje punkt på linjen är från den vertikala linje som ligger i bildens mitt för att få ett värde som representerar hur böjd linjen är. Detta kan ses som ungefär att hitta arean mellan tangentlinjen och en kurva och använda den arean för att avgöra hur mycket vi behöver svänga. Tecknet avgör om svängen är vänster eller höger, medan storleken avgör hur mycket vi behöver svänga för att följa linjen. Som du kan förvänta dig är linjen, om vi mätte noll area, direkt framför roboten och är en rak linje. Om areans storlek är stor behöver roboten svänga för att fortsätta försöka minimera storleken på denna area.
Beslutspunkter#
För att avgöra om roboten är vid en beslutspunkt tar vi den data som kameran samlar in från linjeföljningen och kontrollerar hur många genomsnittliga mittpunkter som förekommer i svart utrymme. Detta fungerar baserat på antagandet att den genomsnittliga punkten mellan två linjer inte bör ligga på någon av linjerna, om inte linjerna är samma linje. Om roboten upptäcker flera genomsnittliga punkter i det svarta utrymmet kan den dra slutsatsen att det måste finnas två linjer här. Sedan väljer den den lämpliga svängen och biaserar sin sväng mot den riktningen tills den bara ser en linje.
Gå till https://github.com/cacay/Mobot för att se en förenklad version av vår kod eller här för en lokal kopia.

