Innehållsförteckning:

Robotekniker: 8 steg
Robotekniker: 8 steg

Video: Robotekniker: 8 steg

Video: Robotekniker: 8 steg
Video: Голубая стрела (1958) фильм 2024, Juli
Anonim
Robotekniker
Robotekniker

Föreställ dig en sekund att du är en av astronauterna som landar på Mars. Du har en miljon saker att göra, prover att ta, experiment att köra, data att samla in, men en eller två gånger om dagen måste du springa runt de bostads- och/eller forskningsmoduler som du bor och arbetar i för att inspektera dem. Det är nödvändigt, någon måste se till att saken är i gott skick, att alla tusentals delar och delar fungerar och är på plats. Men tänk om det fanns en automatiserad hjälpare för att befria dig från några av dessa uppgifter. Tänk om det fanns en liten robot som kunde röra sig inuti modulerna för att se till att allt var på plats, fungerade och säkert.

Robotekniker till undsättning.

I huvudsak styr denna kod Robo-tekniker när den följer en ljus färgad bana på marken. Den kommer att följa denna väg tills den hittar en korsning i vägen eller en sväng, vilket kommer att leda till att ett foto tas för bildbehandling för att låta Robotekniker fatta ett beslut om var han ska gå nästa. Ljussprut- och bultsensorerna arbetar för att skydda Robotekniker från skador, och bultsensorerna styr när ett diagnostiskt foto kommer att tas. Sammantaget är Robo-Technician utformad för att zooma runt i Mar-modulerna, frigöra astronauternas tid medan de utför den grundläggande inspektionsuppgiften, och kräver bara mänsklig input när den hittar något fel.

Återigen som en varning, detta är ett pågående arbete. Koden, som den finns, fungerar men den har hicka, särskilt eftersom det är flera överlappande program inblandade. För att detta projekt ska fungera i ett verkligt Mars -uppdrag, måste en robot byggas för det specifika ändamålet, så igen antar jag att detta är en "proof of concept" -byggnad.

Det finns några saker du behöver för att få detta igång. Du behöver ett dyrt program, supportpaket för det programmet och lite bakgrund i kodning. Eftersom jag är student och några av bottenvåningskoden har tillhandahållits (för hallonpi) kommer jag inte att prata specifikt om upplägget. Du hittar alla länkar till den grundkoden nedan. Låt oss komma till materiallistan.

Hårdvara

  • Raspberry Pi (vi använde en version 3)
  • iRobot ®
  • någon form av hållaranordning för att hålla Raspberry Pi ansluten till Robo-Technician
  • Raspberry Pi -kamera (spelar ingen roll vilken typ, så länge har bra autofokus och bildupplösning)
  • någon form av stativ eller hölster för att hålla kameran vänd framåt på Robo-Technician
  • ett material som ska användas som en remsa, vit (eller mycket ljusfärgad), som hålls säkert på golvet. Det måste vara lite bredare än utrymmet mellan de två främre klippsensorerna.
  • 4 skyltar med mycket stor text (med orden BILD, HÖGER, TILLBAKA och VÄNSTER tryckt på dem)
  • Ark med färgat papper (minst tre och helst rött, grönt och blått)

programvara

  • Matlab (2018a och 2017b användes båda och verkar göra liten skillnad)
  • Raspberry Pi supportpaket för Matlab
  • Raspberry Pi -kod för anslutning till Matlab (länk till källkoden nedan)
  • Bildbehandlingsverktygslåda för Matlab (du kan i stort sett inte göra det här projektet utan verktygslådan)
  • VALFRITT: Matlab Mobile installerat på din telefon, vilket jag kommer att förklara senare

Steg 1: Konfigurera maskinvaran

ef.engr.utk.edu/ef230-2018-08/projects/roo…

Detta är länken till baskoden för att säkerställa att iRobot® kan kommunicera med Matlab, tillsammans med en grundläggande handledning. Som jag sa tidigare kommer jag inte att täcka den här specifika delen eftersom självstudien redan är mycket välplanerad. Jag kommer att nämna att när du har följt stegen på länken kan du använda Matlabs kommando "doc" för att titta på den medföljande informationen. Specifikt:

doc roomba

Och ytterligare en mycket viktig punkt.

När du laddar ner filerna från länken ovan lägger du in dem i mappen som jag beskrev ovan, eftersom Matlab kräver att användargenererade filer finns i den aktuella arbetsmappen.

Med det ur vägen, låt oss gå vidare till koden.

Steg 2: Hitta alla dessa sensorer

Hitta alla dessa sensorer
Hitta alla dessa sensorer
Hitta alla dessa sensorer
Hitta alla dessa sensorer

Ta en sekund och ge iRobot® en inspektion. Det är bra att veta var dessa är så att du har en uppfattning om de ingångar Robotekniker får, och du kommer att kunna ta reda på varför saken snurrar i cirklar istället för att följa den väg du ställer in (detta kan eller kanske inte har hänt). Du kommer uppenbarligen att se den stora fysiska stötsensorn på framsidan. Klippsensorerna är lite svårare att se, du måste vända på den och leta efter de fyra klara plastfönstren nära framkanten. Ljussensorerna är ännu mer dolda, men för nu räcker det med att säga live i det glänsande svarta bandet löpningarna runt framsidan av iRobot®, som ligger på framsidan av den fysiska stötsensorstången.

Det finns hjulfallssensorer, men dessa är oanvända i detta projekt, så vi går vidare med att testa sensorerna.

Steg 3: Testa för att ställa in parametrar

Testar för att ställa in parametrar
Testar för att ställa in parametrar

Innan vi kan skicka Robo-tekniker för att göra sitt jobb måste vi ta reda på dess specifika egenskaper och sensorintervall. Eftersom varje iRobot® är lite annorlunda och förändras under robotens livslängd måste vi ta reda på hur sensorerna läser över de områden det kommer att fungera i. Det enklaste sättet att göra detta är att ställa in dig en ljus färgad bana (Jag använde remsor av vitt skrivarpapper men allt som är ljust kommer att göra) på ytan som Robotekniker kommer att använda.

Starta Matlab och öppna ett nytt skript. Spara skriptet i samma mapp Jag beskrev tidigare och namnge det vad du vill (försök att hålla det kort, eftersom namnet på den här filen kommer att vara funktionsnamnet). Slå på roboten och använd roomba -variabelns inställningar från självstudien och skriv kommandona i kommandofönstret.

Se till att Raspberry Pi är ansluten till iRobot® och att datorn är ansluten till samma internetanslutning. Du kommer att lägga mindre tid på att dra ut håret och försöka ta reda på varför Matlab inte kommer att ansluta

r = roomba (nummer du ställer in)

Variabeln "r" i denna situation är inte nödvändig, du kan kalla det vad du vill, men det gör livet lättare att använda en variabel med en bokstav.

När sökvägen är konfigurerad och roomba har anslutits framgångsrikt, placera den framtida Robo-tekniker där en eller två av klippsensorerna är överst på banan. Uppenbarligen betyder det att de andra två eller tre är över toppen av ytan du valde.

Starta nu testsensorerna med kommandot:

r.testSensors

Tänk på att "r" är variabeln du definierade tidigare, så om det inte är "r" ändrar du "r". till vad du än bestämde dig för. Detta kommer att ta fram testsensorskärmen med massor av information.

För detta projekt fokusera på lightBumpers, stötfångare och klippavsnitt. Flytta Robo-tekniker runt och se till att se hur sensorerna förändras över olika ytor, eller hur nära ett objekt måste vara för att ligthBumper-värdena ska förändras etc. Håll dessa siffror i åtanke (eller skriv ner dem) eftersom du behöver dem för att ställa in dina parametrar på en sekund.

Steg 4: Starta koden

Först kommer du att bygga en funktion. Jag kallade det "sökväg" men igen, namnet är inte nödvändigt, men jag kommer att hänvisa till det som "sökväg" från och med nu.

Den övre delen av koden är att ställa in några användarinmatningsalternativ. Det bygger några listor som kommer att användas i in listdlg och tar sedan upp en listdialogruta. Detta gör det möjligt för användaren att välja vilken sökvägsfärg de vill följa, vilket spelar in senare.

list = {'Röd', 'Blå', 'Grön'}

problist = {'Olycka, Spara bild', 'Komponent på sin plats, Spara bild', 'Förväntat, Fortsätt'} pathcolor = listdlg ('PromptString', 'Välj en sökvägsfärg', … 'SelectionMode', 'singel', 'ListString', list) prob = 0; driv = ;

Variablerna "prob" och "driv" måste deklareras här eftersom de kommer att användas inuti funktionens huvud medan loop, men igen, om du vill byta namn på någon av dessa variabler eller ändra listvalen, är det bra så länge som du är konsekvent i resten av koden.

Steg 5: Överst på While Loop: Fysiska stötsensorer

Överst på medan loop innehåller den fysiska bump sensor logiken. I grund och botten, när Robo-tekniker stöter på något stannar den (eller för den främre stötsensorn backar den 0,1 meter) och positionerar sig sedan för att ta en bild. Låt oss täcka hastigheten och positionskontrolldelen först.

Om du testade alla sensorer på Robo-Technician i de föregående stegen vet du att bump-sensorerna har ett logiskt värde (0 eller 1) med noll som representerar sensorns normala, icke-tryckta läge. Tänk på det för koden.

medan true %main medan loop %får information om stötfångare S = r.getBumpers om S. left ~ = 0 r.stop elseif S.right ~ = 0 r.stop elseif S.front ~ = 0 r.stop end

Detta är den grundläggande delen "om det träffar något, sluta". Om sensorerna upptäcker en kollision, går den vidare till nästa del av koden, vilket justerar Roboteknikerns position för att få ett foto.

om S. left ~ = 0 %om loop tar stötfångarinformation och justerar kameran för foto r.turnAngle (5) paus (0,5) img = r.getImage %tar foto och visar bild (img) %dialogruta prob = listdlg (' PromptString ',' Hittade ett oväntat hinder, identifiera '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) paus (0.5) img = r. getImage image (img) prob = listdlg ('PromptString', 'Found an Onexpected Obstacle, Please Identify' …, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0,1) paus (0,5) img = r.getImage image (img) prob = listdlg ('PromptString', 'Hittade ett oväntat hinder, identifiera' …, 'SelectionMode', 'single', 'ListString', problist) slutet

I grund och botten, när bilden är tagen kommer en annan dialogruta att visas med tre alternativ. De två första alternativen sparar fotot i en angiven mapp, som jag täcker senare, medan det tredje alternativet helt enkelt stänger dialogrutan och fortsätter genom öglan. Om du inte kommer ihåg alternativen, ta en titt på föregående steg.

Nu infogade jag en kodsektion mellan bumpsensordelen och fotosparningsdelen. Detta tar lightBumper-värden och ställer in drivhastigheten till 0,025 meter/sekund (mycket långsam), vilket faktiskt inte är nödvändigt, men det minskar Robo-Technician som slår in i saker och så småningom sliter på de fysiska stötsensorerna.

L = r.getLightBumpers om L. vänster> 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 driv = 0.025 r.setDriveVelocity (0.025) else driv = 0.1 end

Detta skulle vara den del där värdena som du observerade (och förhoppningsvis skrev ner) tidigare spelar in

"L. (sensorns sida och riktning)> 100" baserades på de värden jag observerade, så om dina observationer är olika, ändra dessa siffror. Tanken är att om Robotekniker känner något några centimeter framför det, kommer det att sakta ner, mer än så är onödigt.

Nästa del är där foton sparas för senare.

%om första eller andra alternativet valdes i probdialogrutan, sparar bild om prob == 1 %om loop bygger filinformation för foto, skriver med tidsstämpel t = klocka; basnamn = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (mapp, basnamn); imwrite (img, fullFileName) stäng Figur 1 paus (2) elseif prob == 2 t = klocka; basnamn = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (mapp, basnamn); imwrite (img, fullFileName) close Figur 1 paus (2) slut

Alla filnamn och platser där foton sparas är valfria. Jag valde en mapp som är kapslad inuti roomba -mappen som jag skapade i introduktionssteget, men den kan vara var som helst du väljer. Fotona sparas också med tidsstämpeln, men det är inte särskilt nödvändigt (även om det skulle vara hypotetiskt användbart för ett Mars -uppdrag).

Med de fysiska stötsensorerna täckta kan vi gå vidare till klippsensorerna och följa vägen.

Steg 6: Följ vägen

Koden för klippsensorerna är inställd för att jämföra värden för de två främre och två sidosensorvärdena. Du måste ändra dessa värden (förmodligen) baserat på dina observerade värden. Du kommer antagligen också att behöva redigera dessa värden efter några testkörningar och ändra dem baserat på omgivande ljus, tid på dagen (beroende på hur väl upplyst testområdet är) eller när sensorfönstren är smutsiga.

Innan vi kommer till klippsensorkoden finns det dock ett kort kodsegment som jag infogade för att spola några av onödiga data från Matlab. Den här delen behövs inte, men jag använde den för att minska lagringsutrymmet som krävs för att köra programmet.

clear img clear t clear basename clear fullFileName clear folder

Nästa kodsegment är köttet i projektet. Det gör att Robotekniker kan följa den ljusa banan som har placerats på golvet. I ett nötskal försöker den styra sig själv så att de två främre klippsensorerna ligger över tröskeln, baserat på dina observerade värden, och låter programmet börja bildbehandlingsstegen lite senare.

C = r.getCliffSensors %om loop följer ett färgband (vitt) om C.leftFront> 2000 &&rightrightFront> 2000 %rak vägledning r.setDriveVelocity (driv) annars om C.leftFront 2000 %svänger höger om roboten går för långt vänster r.turnAngle (-2,5) elseif C.leftFront> 2000 && C.rightFront <2000%svänger vänster om roboten går för långt till höger r.turnAngle (2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 img = r.getImage end %kontrollerar om det finns en böjning i vägen om C. vänster> 2800 && C. right <2800 r.turnAngle (2.5) elseif C. left 2800 r.turnAngle (- 2.5) slut %platshållare för sökvägsbildigenkänning disp ('GETTING IMAGE') ändänd ände

Tänk på att de variabelnamn jag valde är valfria, men igen tror jag att det gör livet lättare att använda variabler med en bokstav när det är möjligt

För att förklara den mellersta delen av koden, när de två främre sensorerna rinner utanför banans kant (när det kommer till en korsning eller när den når slutet av banan) ser det ut om det finns något framför den. Du måste placera ett objekt på marken i slutet av sökvägen eller vid alla korsningar för att detta ska fungera.

När fotot är taget använder det bildigenkänning för att ta reda på vad de ska göra. Det finns också en platshållare i denna koddel:

%platshållare för sökvägsbildigenkänningsdispens ('GETTING IMAGE')

Jag använde detta för tillfället eftersom jag ville prata specifikt om den text- och färgbehandling som sker, vilket är i nästa steg.

Steg 7: Bildbehandling

Det finns två delar i bildbehandlingen. Först är färgigenkänningen, som beräknar färgintensiteten i bilden för att avgöra om textigenkänning ska fortsätta eller inte. Färgberäkningarna är baserade på vilket val som gjordes i den allra första dialogrutan i början (jag använde rött, blått, grönt men du kan välja vilken färg du vill, så länge medelvärdena för färgintensitet kan identifieras av Raspberry Pi -kamera).

img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) röd = medelvärde (medel (imgb (:,:, 1))); g = medelvärde (medelvärde (imgb (:,:, 2))); b = medelvärde (medelvärde (imgb (:,:, 3)));

Detta är intensitetskontrollen. Detta kommer att användas i nästa segment för att bestämma vad det vill göra.

om röd> g && röd> b om pathcolor == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img) om R. Words {1} == IMAGE || R. Words {2} == BILD || R. Words {3} == IMAGE t = klocka; basnamn = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (mapp, basnamn); imwrite (img, fullFileName) paus (2) elseif R. Words {1} == RIGHT || R.ord {2} == HÖGER || R. Words {3} == RIGHT r.turnAngle (-75) elseif R. Words {1} == LEFT || R.ord {2} == VÄNSTER || R. Words {3} == LEFT r.turnAngle (75) elseif R. Words {1} == BACK || R.ord {2} == BACK || R. Words {3} == BACK r.turnAngle (110) end else r.turnAngle (110) end end

Detta segment avgör om färgen som valdes i den första dialogrutan matchar färgen som kameran ser. Om det gör det körs textigenkänning. Det ser ut för att se vilket ord (IMAGE, BACK, HÖGER eller VÄNSTER) som visas och vänder sedan antingen (för höger och vänster), snurrar runt (för baksida) eller tar en bild och sparar det på samma sätt som tidigare.

Jag har bara tillhandahållit en enda del av koden för de olika färgerna

För att låta koden känna igen blått och grönt, kopierar du bara koden och ändrar logikkontrollen längst upp i segmentet och ställer in "pathcolor == (nummer)" för att motsvara färgvalen från den övre dialogrutan (för kod som den visas, blå skulle vara 2 och grönt skulle vara 3).

Steg 8: Den färdiga produkten

Den färdiga produkten
Den färdiga produkten

Nu bör Robotekniker zooma runt Mars-uppdragsmodulerna och rapportera tillbaka till astronauterna när något är på sin plats.

Kom ihåg att alla klippsensor- och lightBumper -värden måste ändras till dina observerade värden. Av erfarenhet har jag också funnit det bättre att testa det här projektet på ett mörkt golv och det är ännu bättre om det golvet är icke-reflekterande. Detta får kontrasten att öka mellan banan och golvet vilket gör det mer troligt att Robo-tekniker kommer att följa den korrekt.

Hoppas du tyckte om att ställa in en liten hjälpare för Mars -uppdraget och ha kul att bygga.

Rekommenderad: