Autonomous agents
Chalmers University of Technology
Mahiar Hamedi, Markus Erlandsson, Anders Ryberg
Lasernavigerande robot.
A robot with 3d vision was constructed. The robot used a laser line and a
camera to identify the visible objects relative 3d positions.
The strategy of the robot was to manoeuvre through the gaps between
obstacles and avoid obstacle collisions.
Inledning
I projektet gjordes en robot som kan se djup och röra sig bland, och
undvika, hinder i ett rum. Detta åstadkoms mha en webbkamera, samt en linje
ljuskälla som var placerad ovanför kameran. Ljuskällan lyste alltså en linje
framför roboten. Denna kunde sedan identifieras på kamerabilden, och på så sätt
kunde koordinater för objekt framför roboten bestämmas. Detta användes för att
få roboten att navigera mellan olika objekt. Roboten gick på hjul som drevs med
servomotorer.
För att lösa uppgiften
införskaffades en aluminiumplatta som stomme. Dessutom köptes en webbkamera
(Philips vesta pro), ty vi ville få in en kontinuerlig bild i datorn för
realtids behandling.
En röd laser (vattenpass
laser) som kunde sända ut ljus i ett plan användes som navigations ljus.
Vi köpte också in två
servomotorer, som vi byggde om så att de kontinuerligt kunde snurra runt
(information om hur detta går till finns att hämta på adressen:
Hacking a servo by Kevin Ross: http://www.rdrop.com/~marvin/explore/servhack.htm
Dessa kunde vi sedan styra
från seriellporten på datorn mha ett kontrollerkort.
Lämpliga hjul införskaffades
också. Med dessa komponenter gjordes alltså själva konstruktionen som kan ses
på bilderna nedan

Figur 1 - Roboten med en laserlinje projicerad på ett hinder mha den gula laser vattenpasset

Figur 2 - Roboten bakifrån

Figur 3 - Roboten uppifrån
En extern dator användes för
att styra roboten. Mellan dator och robot hade vi därför kablar, till servo,
styrningen och kraft, samt för att ta in kamera bilden i datorn.
Roboten programmerades i C++
i Linux (programmet kan laddas ner här RobotProgramm.cpp)
I datorprogrammet började vi
med att bearbeta bilden från kameran. För att läsa in bilden ifrån C använde vi
programmet camstream för philips kameran. Information finns att hämta på:
Linux support for
Philips USB webcams: <http://www.smcc.demon.nl/webcam/>
Programming Guide
for Linux USB Device Drivers: <http://usb.in.tum.de/usbdoc/>
Som Indata från kameran var
info i alla pixlar, om intensitet för färgerna röd, grön och blå. För att försöka
filtrera fram linjen, och få bort bakgrundsljus, så gjordes en ny behandlad
bild där vi subtraherat en del av den gröna och blå färgen. Efter detta, gjorde
vi en loop som gick igenom varje vertikal pixel rad och tog fram var maximum
intensitet låg för Alla rader. Detta gjorde vi för att endast få fram den del
av bilden som utgjordes av linjen från laserljuset. Ett filter gjordes också
efter detta som tog bort troliga störpixlar.
Vi ville nu kunna
identifiera enskilda objekt i bilden. Dessa borde nu utgöras av sammanhängande
linjer. Varje brytpunkt i bilden antogs nu utgöra kanten på ett objekt och alla
sammanhängande linjer i bilden sparade undan som ett objekt.
Genom att mäta kamerabildens
och laserns vinklar, och lägen, så kunde varje linje översättas till lägen i
alla tre dimensioner, i förhållande till roboten. Programmet tog ut verkliga
rumskoordinater för kanter för de identifierade objekten. Koordinater för den
del av objekten som var närmast roboten beräknades också. Datorn hade alltså nu
fått en tredimensionell bild av hindren som låg framför den, som den kunde
navigera efter. Bilderna uppdaterades ca tio gånger per sekund.
rörelse strategier
Vi ville att roboten alltid skulle
ta sig igenom det största gap mellan objekt som syns i dess synfält. Om gapen
inte var tillräckligt stora så snurrar roboten runt tills den hittar
tillräckligt stora gap. För att ta fram det största gapet krävs det att man
beräknar euklidiska avstånden mellan kanterna på objekten. För det största
gapet (tillräckligt stor för att roboten ska kunna ta sig igenom) beräknas en
vinkel mellan roboten och mittpunkten på gapet. Robotens motorhastigheter
ställs nu in så att roboten rör sig i den riktning som definieras av vinkeln.
Sambandet mellan vinkel och motorhastigheter antogs vara linjär, (därmed kan
robotens rörelse mot gapet ses som en proportionell reglering).
Roboten identifierade och
tog sig bra mellan hindren.
Ett stort problem var dock
att Servostyrning hade dålig precision. Det kunde hända att roboten ibland inte
körde mot den vinkel som definierade gapets mittpunkt så att roboten hamnade
nära ett av hindren till gapets. När roboten nu kom tillräckligt nära detta hinder
så gick den in i ett felkorrigringsläge där den backade och snurrade så att den
riktade sig in mellan gapet. Denna felkorrigerings strategi fungerade mycket
bra och roboten hade mycket bra precision och kunde utföra manövern väldigt
nära hindren.
Känsligheten för fel i
laserns vinkel var sådan, att ett fel i laserns belysning i höjdled på en
centimeter gav ett fel i avståndsbedömningen på omkring fyra cm. Därför är det
ju naturligtvis bra om både kamera och ljuskälla är relativt fixerade. Detta
förhållande förbättras förstås också om man har en bra höjd och vinkel skillnad
mellan laser och kamera. Om vinkel skillnaden mellan dessa är för stor, så ser
man dock ej lika långt.
Man bör alltså utnyttja
kamerans synfält så att man i bildens underkant kan se ljuslinjens projektion
på marken, och i överkant precis kan se objekt som befinner sig på det närmsta
avstånd man vill kunna se.
Det hade också varit
önskvärt att ha en kamera med ett bredare synfält i sidled än den vi använde,
möjligtvis kan detta problem lösas med hjälp av extra optiska linser framför
kameran. Ett sådant alternativ kan vara en lins som ger en då kallad ”fish eye
view” denna bild kan sedan transformeras till en platt bild innan behandling
och perspektivering.
Trots vårt datorprograms
försök att filtrera bort bakgrundsljus, så fungerade den dåligt i ljusa rum.
Därför körde vi i ganska mörka rum. En lösning på det problemet skulle kunna
vara att använda en ljuskälla och kamera som arbetade i infrarött. Då skulle
man ju ej heller kunna se ljuslinjen med ögat.
Många framtida tillägg är
möjliga för roboten. Man skulle t.ex. kunna tänka sig att mjukvaran följer alla
objekt som den ser och bygger upp en 3d mesh över rummet eftersom varje objekts
alla tre koordinater kan bestämmas.
Roboten skulle då kunna ha
mer avancerade strategier som att exempelvis lokalisera objekt med vissa 3d
utseenden.
Slutligen framförs ett tack till
Anders Gidenstam, för hjälp med linux drivrutiner
till kameran
Ian Sillitoe (Borås universitet) för teknisk rådgivning
främst angående lasern
Peter Nordin (fysisk resursteori Chalmers Tekniska
Högskola), för handledning