Autonomous agents

Chalmers University of Technology

 

Mahiar Hamedi, Markus Erlandsson, Anders Ryberg

 

 

Lasernavigerande robot.

 

Abstract

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.

 

Utförande

 

Konstruktion

 

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.

 

Mjukvara

 

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).

 


 

Resultat och diskussion

 

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.

 

Referencer

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

 

Hosted by www.Geocities.ws

1