Innholdsfortegnelse:

Robotekniker: 8 trinn
Robotekniker: 8 trinn

Video: Robotekniker: 8 trinn

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

Tenk deg et sekund at du er en av astronautene som lander på Mars. Du har en million ting å gjøre, prøver å ta, eksperimenter som skal kjøres, data som skal samles inn, men en eller to ganger om dagen må du løpe rundt beboelses- og/eller forskningsmodulene du bor og arbeider i for å inspisere dem. Det er nødvendig, noen må sørge for at tingen er i god form, at alle de tusenvis av deler og deler fungerer og er på plass. Men hva om det var en automatisert hjelper for å avlaste deg fra noen av disse oppgavene. Hva om det var en liten robot som kunne bevege seg rundt i modulene for å sikre at alt var på plass, fungerte og trygt.

Robo-tekniker til unnsetning.

I hovedsak styrer denne koden Robo-Technician når den følger en lys bane på bakken. Den vil følge denne banen til den finner et veikryss i banen eller en sving, som vil be om et bilde som skal tas for bildebehandling for å la Robotekniker ta en beslutning om hvor de skal gå videre. Lysbump- og støtsensorene beskytter Robo-Technician mot skade, og støtsensorene kontrollerer når et diagnostisk bilde skal tas. Til sammen er Robo-tekniker designet for å zoome rundt i Mar-modulene, frigjøre astronautenes tid mens de utfører den grunnleggende inspeksjonsoppgaven, og krever bare menneskelig innspill når den finner noe galt.

Igjen som en advarsel, dette er et arbeid som pågår. Koden, slik den eksisterer, fungerer, men den har hikke, spesielt siden det er flere overlappende programmer involvert. For at dette prosjektet skal fungere i et faktisk Mars -oppdrag, må det bygges en robot for det spesifikke formålet, så igjen antar jeg at dette er et "proof of concept" -bygg.

Det er noen ting du trenger for å få dette i gang. Du trenger et dyrt program, støttepakker for det programmet, og litt bakgrunn i koding. Siden jeg er student, og noen av koden i første etasje er gitt (for bringebærpi), vil jeg ikke snakke spesifikt om oppsettet. Du finner alle koblingene for den grunnkoden nedenfor. La oss komme til materialelisten.

Maskinvare

  • Raspberry Pi (vi brukte en versjon 3)
  • iRobot ®
  • en slags holdeenhet for å holde Raspberry Pi festet til Robo-Technician
  • Raspberry Pi -kamera (spiller ingen rolle hva slags, så lenge har godt autofokus og bildeoppløsning)
  • en slags stativ eller hylster for å holde kameraet vendt fremover på Robo-Technician
  • et materiale som skal brukes som en stripe, hvit (eller veldig lys), som holdes godt på gulvet. Den må være litt bredere enn mellomrommet mellom de to fremre klippesensorene.
  • 4 skilt med veldig stor tekst (med ordene BILDE, HØYRE, TILBAKE og VENSTRE trykt på dem)
  • Ark med farget papir (minst tre og helst rødt, grønt og blått)

Programvare

  • Matlab (2018a og 2017b ble begge brukt og ser ut til å gjøre liten forskjell)
  • Raspberry Pi -støttepakke for Matlab
  • Raspberry Pi -kode for tilkobling til Matlab (lenke til kildekoden nedenfor)
  • Bildebehandlingsverktøykasse for Matlab (du kan stort sett ikke gjøre dette prosjektet uten verktøykassen)
  • VALGFRITT: Matlab Mobile installert på telefonen din, som jeg vil forklare senere

Trinn 1: Konfigurere maskinvaren

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

Dette er lenken til grunnkoden for å sikre at iRobot® kan kommunisere med Matlab, sammen med en grunnleggende opplæring. Som jeg sa før, vil jeg ikke dekke denne spesifikke delen siden opplæringen er veldig godt lagt opp allerede. Jeg vil nevne at når du har fulgt trinnene på lenken, kan du bruke Matlabs kommando "doc" til å se over den inkluderte informasjonen. Nærmere bestemt:

doc roomba

Og enda et veldig viktig poeng.

Når du laster ned filene fra lenken ovenfor, legger du dem i mappen jeg beskrev ovenfor, siden Matlab krever at brukergenererte filer er i den gjeldende arbeidsmappen.

Med det ute av veien, la oss gå videre til koden.

Trinn 2: Finne alle disse sensorene

Finner alle disse sensorene
Finner alle disse sensorene
Finner alle disse sensorene
Finner alle disse sensorene

Ta et øyeblikk og gi iRobot® en inspeksjon. Det er godt å vite hvor disse er, så du har en ide om inputene Robotekniker får, og du kan finne ut hvorfor tingen snurrer i sirkler i stedet for å følge banen du setter opp (dette kan eller kanskje ikke skjedde). Du vil åpenbart se den store fysiske støtsensoren på forsiden. Cliffsensorene er litt vanskeligere å se, du må snu den og se etter de fire, klare plastvinduene i nærheten av forkanten. Lysstøtsensorene er enda mer skjult, men for nå er det nok å si live i det skinnende svarte båndet løpene rundt forsiden av iRobot®, som er på forsiden av den fysiske støtsensorstangen.

Det er hjulfallssensorer, men disse er ubrukte i dette prosjektet, så vi går videre til testing av sensorene.

Trinn 3: Testing for å angi parametere

Testing for å angi parametere
Testing for å angi parametere

Før vi kan sende Robo-tekniker for å gjøre jobben sin, må vi finne ut de spesifikke egenskapene og sensorområdene. Siden hver iRobot® er litt annerledes og endrer seg i løpet av robotens levetid, må vi finne ut hvordan sensorene leser over områdene den skal operere i. Den enkleste måten å gjøre dette på er å sette opp en lysfarget bane (Jeg brukte strimler med hvitt skriverpapir, men alt som er lyst vil gjøre) på overflaten som Robo-tekniker skal bruke.

Start Matlab og åpne et nytt skript. Lagre skriptet I SAMME MAPPEN JEG BESKRIVET TIDLIGERE og navngi det hva du vil (prøv å holde det kort, siden navnet på denne filen vil være funksjonsnavnet). Slå på roboten og bruk roomba -variabeloppsettet fra opplæringen, og skriv inn kommandoene i kommandovinduet.

Sørg for at Raspberry Pi er koblet til iRobot® og at datamaskinen er koblet til den samme internettforbindelsen. Du vil bruke mindre tid på å trekke ut håret og prøve å finne ut hvorfor Matlab ikke vil koble seg til

r = roomba (nummer du setter opp)

Variabelen "r" i denne omstendigheten er ikke nødvendig, du kan kalle det hva du vil, men det gjør livet lettere å bruke en enkelt bokstavvariabel.

Når banen er konfigurert, og roomba er vellykket tilkoblet, plasserer du den fremtidige Robo-tekniker der en eller to av klippesensorene er over toppen av banen. Det betyr åpenbart at de to eller tre andre er over toppen av overflaten du valgte.

Start nå testsensorene med kommandoen:

r.testSensors

Husk at "r." Er variabelen du definerte tidligere, så hvis det ikke er "r", endre "r". til det du bestemte deg for. Dette vil bringe opp testsensorskjermen med massevis av informasjon.

For dette prosjektet fokuserer du på lysstøtfangere, støtfangere og klippeseksjoner. Flytt Roboteknikeren rundt og sørg for å se hvordan sensorene endrer seg over forskjellige overflater, eller hvor nært et objekt må være for at ligthBumper-verdiene skal endres osv. Husk disse tallene (eller skriv dem ned) fordi du trenger dem til å angi parametrene dine på et sekund.

Trinn 4: Start koden

Først vil du bygge en funksjon. Jeg kalte det "bane", men igjen, navnet er ikke nødvendig, men jeg vil referere til det som "bane" fra nå av.

Den øverste delen av koden setter opp noen brukerinntastingsalternativer. Den bygger noen lister som vil bli brukt i in listdlg og tar deretter opp en dialogboks med lister. Dette gjør at brukeren kan velge hvilken stifarge han ønsker å følge, noe som spiller inn senere.

list = {'Rød', 'Blå', 'Grønn'}

problist = {'Ulykke, lagre bilde', 'komponent på plass, lagre bilde', 'forventet, fortsett'} pathcolor = listdlg ('PromptString', 'Velg en stifarge', … 'SelectionMode', 'singel', 'ListString', list) prob = 0; driv = ;

"Prob" og "driv" variablene må deklareres her, ettersom de vil bli brukt inne i funksjonens hoved mens loop, men igjen, hvis du vil gi nytt navn til noen av disse variablene eller endre listevalgene, er det greit så lenge du er konsekvent i resten av koden.

Trinn 5: Toppen av While Loop: Fysiske støtsensorer

Toppen av mens -sløyfen inneholder den fysiske støtsensorlogikken. I utgangspunktet når Robo-tekniker støter på noe den stopper (eller for den fremre støtsensoren sikkerhetskopierer den 0,1 meter), og posisjonerer seg deretter for å ta et bilde. La oss først dekke hastigheten og posisjonskontrolldelen.

Hvis du testet alle sensorene på Robo-Technician i de foregående trinnene, vet du at støtsensorene har en logisk verdi (0 eller 1) med null som representerer sensorens normale, ikke trykte posisjon. Husk det for koden.

mens true %main mens loop %mottar støtfangerinformasjon S = r.getBumpers hvis S. venstre ~ = 0 r.stopp elseif S.right ~ = 0 r.stopp elseif S.front ~ = 0 r.stopp ende

Dette er den grunnleggende delen "hvis den treffer noe, stopp". Hvis sensorene oppdager en kollisjon, beveger den seg til neste del av koden, som justerer Robo-teknikerens posisjon for å få et bilde.

hvis S. venstre ~ = 0 %hvis loop tar støtfangerinformasjon og justerer kameraet for foto r.turnAngle (5) pause (0,5) img = r.getImage %tar bilde og viser bilde (img) %dialogboks prob = listdlg (' PromptString ',' Fant en uventet hindring, vennligst identifiser '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) pause (0.5) img = r. getImage image (img) prob = listdlg ('PromptString', 'Found an Unexpected Obstacle, Identify' …, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) pause (0.5) img = r.getImage image (img) prob = listdlg ('PromptString', 'Found an Unexpected Obstacle, Please Identify' …, 'SelectionMode', 'single', 'ListString', problist) end

I utgangspunktet, når bildet er tatt, vil en annen dialogboks vises med tre alternativer. De to første alternativene lagrer bildet i en spesifisert mappe, som jeg dekker senere, mens det tredje alternativet bare lukker dialogboksen og fortsetter gjennom løkken. Hvis du ikke husker alternativene, kan du ta en titt på forrige trinn.

Nå satte jeg inn en kodeseksjon mellom støtsensordelen og fotolagringsdelen. Dette tar lightBumper-verdier og setter kjørehastigheten til 0,025 meter/sekund (veldig sakte), noe som faktisk ikke er nødvendig, men det reduserer Robo-Technician som slår inn i ting og til slutt sliter ut de fysiske støtsensorene.

L = r.getLightBumpers hvis L. venstre> 100 || L.leftFront> 100 || L.rightFront> 100 || L.høyre> 100 driv = 0,025 r.setDriveVelocity (0,025) annet driv = 0,1 ende

Dette ville være delen der verdiene du observerte (og forhåpentligvis skrev ned) tidligere spiller inn

"L. (side og retning av sensor)> 100" var basert på verdiene jeg observerte, så hvis observasjonene dine er forskjellige, endre disse tallene. Tanken er at hvis Robo-tekniker føler noe noen få centimeter foran det, vil det bremse, mer enn det er unødvendig.

Den neste delen er hvor bildene lagres til senere.

%hvis første eller andre alternativ ble valgt i prob -dialog, lagrer bilde hvis prob == 1 %hvis loop bygger filinfo for foto, skriver med tidsstempel t = clock; basenavn = 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 = fullfil (mappe, grunnnavn); imwrite (img, fullFileName) close Figur 1 pause (2) elseif prob == 2 t = klokke; basenavn = 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 = fullfil (mappe, grunnnavn); imwrite (img, fullFileName) close Figur 1 pause (2) slutt

Alle filnavnene og stedene der bildene lagres er valgfrie. Jeg valgte en mappe som er nestet inne i roomba -mappen jeg opprettet i introduksjonstrinnet, men den kan være hvor som helst du velger. Bildene lagres også med tidsstempelet, men det er ikke spesielt nødvendig (selv om det ville være hypotetisk nyttig for et Mars -oppdrag).

Med de fysiske støtsensorene dekket, kan vi bevege oss inn på klippesensorene og følge stien.

Trinn 6: Følg banen

Koden for klippesensorene er satt opp for å sammenligne verdier for de to front- og to sidesensorverdiene. Du må endre disse verdiene (sannsynligvis) basert på de observerte verdiene. Du må også sannsynligvis redigere disse verdiene etter noen få testkjøringer og endre dem basert på omgivelseslyset, tidspunktet på dagen (avhengig av hvor godt opplyst testområdet er) eller når sensorvinduene er skitne.

Før vi kommer til klippesensorkoden, er det imidlertid et kort kodesegment jeg satte inn for å spyle noen av unødvendige data fra Matlab. Denne delen er ikke nødvendig, men jeg brukte den til å kutte ned på lagringsplassen som kreves for å kjøre programmet.

clear img clear t clear basename clear fullFileName clear folder

Det neste kodesegmentet er kjøttet fra prosjektet. Det lar Robo-tekniker følge den lyse banen som er plassert på gulvet. I et nøtteskall prøver den å styre seg selv slik at de to fremre klippesensorene er over terskelen, basert på dine observerte verdier, og lar programmet starte bildebehandlingstrinnene litt senere.

C = r.getCliffSensors %hvis sløyfe følger et fargebånd (hvitt) hvis C.leftFront> 2000 &&rightrightFront> 2000 %rett vei veiledning r.setDriveVelocity (driv) elseif C.leftFront 2000 %svinger til høyre hvis roboten går for langt venstre r.turnAngle (-2,5) elseif C.leftFront> 2000 && C.rightFront <2000%svinger til venstre hvis roboten går for langt til høyre r.turnAngle (2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 img = r.getImage end %sjekker om det er en sving i banen hvis C. venstre> 2800 && C.right <2800 r.turnAngle (2.5) elseif C.left 2800 r.turnAngle (- 2.5) ende %plassholder for banebildgjenkjenning disp ('GETTING IMAGE') ende ende ende

Husk at variabelnavnene jeg valgte er valgfrie, men igjen tror jeg det gjør livet lettere å bruke variabler med én bokstav når det er mulig

For å forklare den midterste delen av koden, når de to frontsensorene løper utenfor kanten av banen (når det kommer til et kryss eller når det når enden av banen) ser det ut for å se om det er noe foran det. Du må plassere et objekt på bakken ved enden av banen eller i kryss for at dette skal fungere.

Når bildet er tatt, bruker det bildegjenkjenning for å finne ut hva du skal gjøre. Det er også en plassholder i denne delen av koden:

%plassholder for banebildegjenkjenning ('GETTING IMAGE')

Jeg brukte dette for øyeblikket fordi jeg ønsket å snakke spesifikt om teksten og fargebehandlingen som skjer, som er i neste trinn.

Trinn 7: Bildebehandling

Det er to deler i bildebehandlingen. Først er fargegjenkjenningen, som beregner fargeintensiteten i bildet for å bestemme om tekstgjenkjenning skal fortsette eller ikke. Fargeberegningene er basert på hvilket valg som ble gjort i den aller første dialogboksen i begynnelsen (jeg brukte rød, blå, grønn, men du kan velge hvilken farge du vil, så lenge middelverdiene for fargeintensitet kan gjenkjennes 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 = gjennomsnitt (gjennomsnitt (imgb (:,:, 1))); g = gjennomsnitt (gjennomsnitt (imgb (:,:, 2))); b = gjennomsnitt (gjennomsnitt (imgb (:,:, 3)));

Dette er intensitetskontrollen. Dette vil bli brukt i det neste segmentet for å bestemme hva det vil gjøre.

hvis rød> g && rød> b hvis pathcolor == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img) hvis R. Words {1} == IMAGE || R. Words {2} == BILDE || R.ord {3} == BILDE t = klokke; basenavn = 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 = fullfil (mappe, grunnnavn); imwrite (img, fullFileName) pause (2) elseif R. Words {1} == RIGHT || R.ord {2} == HØYRE || R. Words {3} == RIGHT r.turnAngle (-75) elseif R. Words {1} == LEFT || R.ord {2} == VENSTRE || R. Words {3} == LEFT r.turnAngle (75) elseif R. Words {1} == BACK || R.ord {2} == TILBAKE || R. Words {3} == BACK r.turnAngle (110) end else r.turnAngle (110) end end

Dette segmentet avgjør om fargen som ble valgt i den første dialogboksen samsvarer med fargen kameraet ser. Hvis det gjør det, kjører det tekstgjenkjenning. Det ser ut for å se hvilket ord (IMAGE, BACK, RIGHT eller LEFT) som vises og deretter enten svinger (for høyre og venstre), snurrer rundt (for bak) eller tar et bilde og lagrer det på samme måte som tidligere.

Jeg har bare gitt en enkelt del av koden for de forskjellige fargene

For å la koden gjenkjenne blått og grønt, kopierer du bare koden og endrer logikksjekken øverst i segmentet og angir "pathcolor == (nummer)" for å svare til fargevalgene fra den øverste dialogboksen (for koden slik den vises, ville blå være 2 og grønn være 3).

Trinn 8: Det ferdige produktet

Det ferdige produktet
Det ferdige produktet

Nå bør Robo-Technician zoome rundt Mars-oppdragsmodulene og rapportere tilbake til astronautene når noe er på sin plass.

Husk at alle cliff sensor- og lightBumper -verdiene må endres til det du observerer. Av erfaring har jeg også funnet det bedre å teste dette prosjektet på et mørkt gulv, og det er enda bedre hvis gulvet ikke er reflekterende. Dette får kontrasten til å øke mellom banen og gulvet, noe som gjør det mer sannsynlig at Robo-tekniker vil følge den riktig.

Håper du likte å sette opp en liten hjelper for Mars -oppdraget, og ha det gøy å bygge.

Anbefalt: