Mobot#

Artikel door Cosku Acay, Edwin Cho, Kenneth Li en Nishant Pol. PDF.

Projectbeschrijving#

In de Mobot-competitie van Carnegie Mellon moeten robots door een reeks van 14 poorten die zijn geplaatst over een 255 voet lange gebogen witte lijn op een buitenstoep. Het parcours omvat twee steile hellingen en een beslispuntgebied waar de robot de juiste route moet kiezen om in seriële volgorde door 14 poorten te gaan. Aangezien de lijn buiten ligt en onder Pittsburghs weer, moet de robot in uiteenlopende omstandigheden functioneren. Dit jaar was het regenachtig en winderig op de wedstrijddag. Meer informatie is te vinden op http://www.cs.cmu.edu/mobot/mobot.html

Mobot Mobot

Mobot (full size)Mobot (full size)

Oplossing met de CMUcam4#

We kozen ervoor de lijnvolgtaak met de CMUcam4 aan te pakken omdat deze minimale hardware vereiste en een interface had die goed geschikt was voor het volgen van een lijn.

Mobot hardware Mobot hardware (full size)

De CMUcam4 legt een beeld van de lijn vast met 30 frames per seconde en voert het kleurtrackingbeeld naar de Arduino Mega via een van de drie seriële lijnen. De Arduino Mega verwerkt dit beeld vervolgens (zie Softwarebeschrijving hieronder) en levert commando’s voor motorsnelheid en bochten aan de PID-controller via een andere seriële lijn. De PID-controller levert de Arduino Mega op zijn beurt encoderwaarden voor zowel het rechter- als linkerwiel, waardoor we onze positie en koers ten opzichte van poort 0 kunnen bijhouden.

De PID-controller (MD-25) wordt gemaakt door Robot-Electronics in het VK. Het drijft twee vertraagde DC-borstelmotoren aan met magnetische encoders op de motoras. Het LCD-scherm is voor debugdoeleinden. We hadden twee voedingsrails, 12V voor motoren en 5V voor logica, die dezelfde aarde deelden en beide gevoed werden vanuit één enkele 12V oplaadbare batterij.

We waren aanvankelijk van plan een prototype te maken van een houten basis om ons snel in de programmeerfase te krijgen, en vervolgens aan een snellere, betrouwbaardere basis zoals een RC-auto te werken. We ontdekten echter dat het prototype zeer betrouwbaar en gemakkelijk te gebruiken was, dus hielden we het voor het uiteindelijke ontwerp. Het waterdicht maken van de behuizing bestond uit een laag cellofaanfolie onder een laag verpakkingstape. Regen lekte echter door de verpakkingstape, maar gelukkig niet door de cellofaanfolie. De camera was bedekt met een vierkant plastic van een Ziploc-zak, aangezien we ontdekten dat het “filter” het vermogen van de camera verbeterde om kleine stukjes van de lijn te negeren die er voor de camera uitzagen als het achtergrondbeton.

Beschrijving van het algoritme#

Achtergrond#

We gebruiken de CMUcam4 in de kleurvolgmodus met de YUV-modus ingeschakeld, wat ons een binaire beeldweergave van de lijn geeft. De camerasoftware filtert alles weg wat niet wit is (d.w.z. de achtergrond) en plaatst een “aan”-pixel waar een lijn is (waar het wit is). We gebruiken de YUV-modus zodat kleurtracking ongevoelig is voor de lichtintensiteit, zodat onze robot onder een breed scala aan omstandigheden kan functioneren, zowel binnen als buiten.

Lijnvolgen#

De CMUcam4 levert onze Arduino-chip een binair beeld van 80 bij 60. We nemen 10 gelijkmatig verdeelde pixelrijen uit het beeld en berekenen het zwaartepunt van de “aan”-pixels (zie hier: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Vervolgens gaan we ervan uit dat de lijn op het zwaartepunt ligt. Door dit op 10 verschillende rijen in het beeld te doen, krijgen we een goede benadering van de lijn door de punten te verbinden. We kunnen deze gegevens vervolgens gebruiken door te bepalen hoe ver elk punt op de lijn zich bevindt van de verticale lijn die in het midden van het beeld ligt, om een waarde te krijgen die aangeeft hoe gebogen de lijn is. Dit kan worden gezien als iets als het vinden van de oppervlakte tussen de raaklijn en een curve en die oppervlakte gebruiken om te bepalen hoeveel we moeten draaien. Het teken bepaalt of de bocht naar links of rechts is, terwijl de grootte bepaalt hoeveel we moeten draaien om de lijn te volgen. Zoals je zou verwachten, ligt de lijn recht voor de robot en is deze een rechte lijn als we een oppervlakte van nul meten. Als de grootte van de oppervlakte groot is, moet de robot draaien om te proberen de grootte van deze oppervlakte te minimaliseren.

Beslispunten#

Om te bepalen of de robot zich op een beslispunt bevindt, nemen we de gegevens die de camera verzamelt bij het lijnvolgen en controleren we hoeveel gemiddelde middelpunten er in de zwarte ruimte verschijnen. Dit werkt op basis van de aanname dat het gemiddelde punt tussen twee lijnen niet op een van beide lijnen zou moeten liggen, tenzij de lijnen dezelfde lijn zijn. Als de robot meerdere gemiddelde punten in de zwarte ruimte detecteert, kan hij concluderen dat er hier twee lijnen moeten zijn. Vervolgens selecteert hij de juiste bocht en stuurt hij zijn draaiing in die richting totdat hij nog maar één lijn ziet.

Ga naar https://github.com/cacay/Mobot om een vereenvoudigde versie van onze code te zien, of hier voor een lokale kopie.