Indholdsfortegnelse:

Robotekniker: 8 trin
Robotekniker: 8 trin

Video: Robotekniker: 8 trin

Video: Robotekniker: 8 trin
Video: Век ЖИВИ, век УЧИСЬ! Итальянская хозяюшка показала, как они готовят МЯСО на РОЖДЕСТВО! 2024, Juli
Anonim
Robotekniker
Robotekniker

Forestil dig et øjeblik, at du er en af de astronauter, der lander på Mars. Du har en million ting at lave, prøver at tage, eksperimenter, der skal køres, data at indsamle, men en eller to gange om dagen skal du løbe rundt i beboelses- og/eller forskningsmodulerne, som du bor og arbejder i for at inspicere dem. Det er nødvendigt, nogen skal sikre, at tingen er i god form, at alle de tusinder af stykker og dele fungerer og er på plads. Men hvad nu hvis der var en automatiseret hjælper til at aflaste dig fra nogle af disse pligter. Hvad hvis der var en lille robot, der kunne bevæge sig rundt inde i modulerne for at sikre, at alt var på plads, fungerede og sikkert.

Robotekniker til undsætning.

I det væsentlige styrer denne kode Robo-Technician, da den følger en lys sti på jorden. Den vil følge denne sti, indtil den finder et kryds i stien eller et sving, som får et foto til at blive taget til billedbehandling, så Roboteknikeren kan tage en beslutning om, hvor han skal gå videre. Lysbump- og bumpsensorerne beskytter Robo-Technician mod skader, og bump-sensorerne kontrollerer, hvornår et diagnostisk foto vil blive taget. Alt i alt er Robo-Technician designet til at zoome rundt i Mar's moduler, frigøre astronauternes tid, mens de udfører den grundlæggende inspektionsopgave, og kræver kun menneskelig input, når den finder noget galt.

Igen som en advarsel er dette et igangværende arbejde. Koden, som den findes, fungerer, men den har hikke, især da der er flere overlappende programmer involveret. Også for at dette projekt kunne fungere i en egentlig Mars -mission, skulle der bygges en robot til det specifikke formål, så igen gætter jeg på, at dette er en "proof of concept" -bygning.

Der er et par ting, du skal bruge for at få dette til at køre. Du skal bruge et dyrt program, supportpakker til det program og lidt baggrund i kodning. Da jeg er studerende, og nogle af stueetagen-koden er blevet leveret (til hindbærpi), vil jeg ikke specifikt tale om opsætningen. Du kan finde alle links til denne basiskode herunder. Lad os komme til materialelisten.

Hardware

  • Raspberry Pi (vi brugte en version 3)
  • iRobot ®
  • en slags holdeenhed for at holde Raspberry Pi fastgjort til Robo-Technician
  • Raspberry Pi kamera (er ligegyldigt hvilken slags, så længe har godt autofokus og billedopløsning)
  • en slags stativ eller hylster for at holde kameraet vendt fremad på Robo-Technician
  • et materiale, der skal bruges som en strimmel, hvid (eller meget lys), der holdes sikkert på gulvet. Det skal bare være lidt bredere end mellemrummet mellem de to forreste klintsensorer.
  • 4 skilte med meget stor tekst (med ordene BILLEDE, HØJRE, TILBAGE og VENSTRE trykt på dem)
  • Ark med farvet papir (mindst tre og gerne rødt, grønt og blåt)

Software

  • Matlab (2018a og 2017b blev begge brugt og synes ikke at gøre nogen forskel)
  • Raspberry Pi supportpakke til Matlab
  • Raspberry Pi -kode til forbindelse til Matlab (link til kildekoden angivet nedenfor)
  • Billedbehandlingsværktøjskasse til Matlab (du kan stort set ikke udføre dette projekt uden værktøjskassen)
  • VALGFRIT: Matlab Mobile installeret på din telefon, som jeg vil forklare senere

Trin 1: Opsætning af hardwaren

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

Dette er linket til basiskoden for at sikre, at iRobot® kan kommunikere med Matlab, sammen med en grundlæggende vejledning. Som jeg sagde før, vil jeg ikke dække denne specifikke del, da selvstudiet allerede er meget godt lagt op. Jeg vil nævne, at når du har fulgt trinene på linket, kan du bruge Matlabs kommando "doc" til at se de medfølgende oplysninger. Specifikt:

doc roomba

Og endnu et meget vigtigt punkt.

Når du downloader filerne fra ovenstående link, LÆG DEM I MAPPEEN, JEG BESKRIVET OVER, da Matlab kræver, at brugergenererede filer er i den aktuelle arbejdsmappe.

Med det ude af vejen, lad os gå videre til koden.

Trin 2: Find alle disse sensorer

Find alle disse sensorer
Find alle disse sensorer
Find alle disse sensorer
Find alle disse sensorer

Tag et øjeblik, og giv iRobot® en inspektion. Det er godt at vide, hvor disse er, så du har en idé om de input, Roboteknikeren modtager, og du vil kunne finde ud af, hvorfor tingen snurrer i cirkler i stedet for at følge den vej, du konfigurerer (dette kan eller måske ikke er sket). Du vil naturligvis se den store fysiske bump sensor på forsiden. Cliffsensorerne er lidt sværere at se, du bliver nødt til at vende den og se efter de fire klare plastvinduer nær forkanten. Lysbumpsensorerne er endnu mere skjulte, men for nu er det nok at sige live i det skinnende sorte bånd løbene rundt på forsiden af iRobot®, som er på forsiden af den fysiske bump sensor bar.

Der er hjulfaldssensorer, men disse er ubrugte i dette projekt, så vi går videre til testning af sensorerne.

Trin 3: Test for at indstille parametre

Test for at indstille parametre
Test for at indstille parametre

Inden vi kan sende Roboteknikeren af sted for at gøre sit job, skal vi finde ud af dens særlige finesser og sensorintervaller. Da hver iRobot® er lidt anderledes og ændrer sig i løbet af robotens levetid, er vi nødt til at finde ud af, hvordan sensorerne læser over de områder, den vil operere i. Den nemmeste måde at gøre dette på er at oprette en lysfarvet sti (Jeg brugte strimler af hvidt printerpapir, men alt, hvad lyse farver gør) på overfladen, som Roboteknikeren vil betjene.

Start Matlab, og åbn et nyt script. Gem scriptet I SAMME MAPPE I BESKRIVET TIDLIGERE, og navngiv det, hvad du vil (prøv dog at holde det kort, da navnet på denne fil vil være funktionsnavnet). Tænd robotten, og brug roomba -variabelopsætningen fra selvstudiet, og indtast kommandoerne i kommandovinduet.

Sørg for, at Raspberry Pi er tilsluttet iRobot®, og din computer er forbundet til den samme internetforbindelse. Du vil bruge mindre tid på at trække dit hår ud for at finde ud af, hvorfor Matlab ikke vil oprette forbindelse

r = roomba (nummer du har konfigureret)

Variablen "r" i denne omstændighed er ikke nødvendig, du kan kalde det, hvad du vil, men det gør livet lettere at bruge en enkelt bogstavvariabel.

Når stien er konfigureret, og roomba er blevet tilsluttet korrekt, skal du placere den fremtidige Robo-tekniker, hvor en eller to af klippesensorerne er over toppen af stien. Det betyder naturligvis, at de to andre eller tre er over toppen af den overflade, du har valgt.

Start nu testsensorerne med kommandoen:

r.testSensorer

Husk, at "r." Er den variabel, du definerede tidligere, så hvis det ikke er 'r', skal du ændre 'r'. til hvad du end besluttede dig for. Dette vil bringe testsensorskærmen frem med masser af information.

I dette projekt fokuseres på lightBumpers, kofangere og klippesektioner. Flyt Roboteknikeren rundt og sørg for at se, hvordan sensorerne ændrer sig over forskellige overflader, eller hvor tæt et objekt skal være for at ligthBumper-værdierne kan ændre sig osv. Husk disse tal i tankerne (eller skriv dem ned), fordi du har brug for dem til at indstille dine parametre på et sekund.

Trin 4: Start af koden

Først vil du bygge en funktion. Jeg kaldte det "sti", men igen er navnet ikke nødvendigt, men jeg vil nu referere til det som "sti".

Den øverste del af koden er at opsætte nogle brugerinputindstillinger. Det bygger nogle lister, der vil blive brugt i in listdlg og åbner derefter en dialogboks med en liste. Dette giver brugeren mulighed for at vælge hvilken stifarve, han ønsker at følge, hvilket spiller ind senere.

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

problist = {'Tilskadekomst, Gem billede', 'Komponent ude af sted, Gem billede', 'Forventet, Fortsæt'} pathcolor = listdlg ('PromptString', 'Vælg en stifarve', … 'SelectionMode', 'single', 'ListString', list) prob = 0; driv = ;

Variablerne "prob" og "driv" skal deklareres her, da de vil blive brugt inde i funktionens main while loop, men igen, hvis du vil omdøbe nogen af disse variabler eller ændre listevalgene, er det fint, så længe du er konsekvent i resten af koden.

Trin 5: Toppen af While Loop: Fysiske stødsensorer

Toppen af while loop indeholder den fysiske bump sensor logik. Grundlæggende, når Robo-tekniker støder på noget, den stopper (eller for den forreste stødsensor bakker den op på 0,1 meter), så positionerer den sig for at tage et billede. Lad os først dække hastigheds- og positionskontroldelen.

Hvis du testede alle sensorerne på Robo-Technician i de foregående trin, ved du, at bump-sensorerne har en logisk værdi (0 eller 1) med nul, der repræsenterer sensorens normale, ikke-trykte position. Husk det for koden.

mens true %main mens loop %modtager kofangerinformation S = r.getBumpers hvis S. venstre ~ = 0 r.stop elseif S.right ~ = 0 r.stop elseif S.front ~ = 0 r.stop end

Dette er den grundlæggende "hvis det rammer noget, stop" -delen. Hvis sensorerne registrerer en kollision, bevæger den sig til den næste del af koden, som justerer Robo-teknikerens position for at få et foto.

hvis S. venstre ~ = 0 %hvis loop tager kofangerinformation og justerer kameraet til foto r.turnAngle (5) pause (0,5) img = r.getImage %tager foto og viser billede (img) %dialogboks prob = listdlg (' PromptString ',' Fundet en uventet forhindring, identificer venligst '…,' 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 Please' …, '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, Identify Please' …, 'SelectionMode', 'single', 'ListString', problist) end

Grundlæggende, når billedet er taget, vises en anden dialogboks med tre muligheder. De to første muligheder gemmer fotoet i en bestemt mappe, som jeg senere vil dække, mens den tredje mulighed blot lukker dialogboksen og fortsætter gennem løkken. Hvis du ikke kan huske mulighederne, skal du tage et kig på det forrige trin.

Nu indsatte jeg en kodesektion mellem bumpsensordelen og fotobesparelsesdelen. Dette tager lightBumper-værdier og sætter drevhastigheden til 0,025 meter/sekund (meget langsom), hvilket faktisk ikke er nødvendigt, men det reducerer Robo-Technician's slag i ting og til sidst slider de fysiske stødsensorer.

L = r.getLightBumpers hvis L. venstre> 100 || L. venstre forside> 100 || L.rightFront> 100 || L.right> 100 driv = 0,025 r.setDriveVelocity (0,025) else driv = 0,1 ende

Dette ville være den del, hvor de værdier, du observerede (og forhåbentlig skrev ned) tidligere spiller ind

"L. (sensorens side og retning)> 100" var baseret på de værdier, jeg observerede, så hvis dine observationer er forskellige, skal du ændre disse tal. Ideen er, at hvis Roboteknikeren fornemmer noget et par centimeter foran den, vil den bremse, mere end det er unødvendigt.

Den næste del er, hvor fotos gemmes til senere.

%hvis første eller anden mulighed blev valgt i prob -dialog, gemmer billede hvis prob == 1 %hvis loop bygger filinfo til foto, skriver med tidsstempel t = ur; 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 = fullfile (mappe, basenavn); imwrite (img, fullFileName) luk Figur 1 pause (2) elseif prob == 2 t = ur; 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 = fullfile (mappe, basenavn); imwrite (img, fullFileName) close Figur 1 pause (2) slut

Alle filnavne og placeringer, hvor fotos gemmes, er valgfrie. Jeg valgte en mappe, der er indlejret inde i roomba -mappen, jeg oprettede i introduktionstrinnet, men den kan være hvor som helst du vælger. Fotos gemmes også med tidsstemplet, men det er ikke specielt nødvendigt (selvom det ville være hypotetisk nyttigt til en Mars -mission).

Med de fysiske stødsensorer dækket kan vi bevæge os ind på klippesensorerne og følge stien.

Trin 6: Følg stien

Koden til klippesensorerne er indstillet til at sammenligne værdier for de to forreste og to sidesensorværdier. Du skal ændre disse værdier (sandsynligvis) baseret på dine observerede værdier. Du skal sandsynligvis også redigere disse værdier efter et par testkørsler og ændre dem baseret på omgivende lys, tidspunkt på dagen (afhængigt af hvor godt oplyst testområdet er) eller når sensorvinduerne er snavsede.

Inden vi kommer til cliff sensor -koden, er der imidlertid et kort kodesegment, jeg har indsat for at skylle nogle af de unødvendige data fra Matlab. Denne del er ikke nødvendig, men jeg brugte den til at skære ned på den lagerplads, der kræves for at køre programmet.

clear img clear t clear basename clear fullFileName clear folder

Det næste kodesegment er projektets kød. Det giver Roboteknikeren mulighed for at følge den lyse sti, der er placeret på gulvet. I en nøddeskal forsøger den at styre sig selv, så de to forreste klippesensorer er over tærsklen, baseret på dine observerede værdier, og giver programmet mulighed for at begynde billedbehandlingstrinnene lidt senere.

C = r.getCliffSensors %hvis sløjfe følger et farvebånd (hvidt), hvis C.leftFront> 2000 && C.rightFront> 2000 %retningsvejledning r.setDriveVelocity (driv) elseif C.leftFront 2000 %drejer til højre, hvis robotten går for langt venstre r.turnAngle (-2,5) elseif C.leftFront> 2000 && C.rightFront <2000%drejer til venstre, hvis robotten går for langt til højre r.turnAngle (2.5) elseif C.leftFront <2000 && C.rightFront 100 || L. venstre forside> 100 || L.rightFront> 100 || L.right> 100 img = r.getImage end %kontrollerer, om der er en bøjning i stien, hvis C. venstre> 2800 && C.right <2800 r.turnAngle (2.5) elseif C.left 2800 r.turnAngle (- 2.5) ende %stedholder til sti billede genkendelse disp ('GETTING IMAGE') ende ende ende

Husk, at de variabelnavne, jeg valgte, er valgfri, men igen tror jeg, at det gør livet lettere at bruge variabler med enkelt bogstav, når det er muligt

For at forklare den midterste del af koden, når de to forreste sensorer løber ud af kanten af stien (når det kommer til et kryds eller når det når enden af stien) ser det ud til at se, om der er noget foran det. Du skal placere et objekt på jorden for enden af stien eller i alle kryds for at dette kan fungere.

Når billedet er taget, bruger det billedgenkendelse til at finde ud af, hvad de skal gøre. Der er også en pladsholder i denne sektion af kode:

%pladsholder til stiabilledgenkendelse ('GETTING IMAGE')

Jeg brugte dette for øjeblikket, fordi jeg ville tale specifikt om den tekst- og farvebehandling, der opstår, som er i det næste trin.

Trin 7: Billedbehandling

Der er to dele til billedbehandlingen. Først er farvegenkendelsen, som beregner farveintensiteten i billedet for at afgøre, om der skal fortsættes til tekstgenkendelse eller ej. Farveberegningerne er baseret på, hvilket valg der blev foretaget i den allerførste dialogboks i begyndelsen (jeg brugte rød, blå, grøn, men du kan vælge, hvilke farver du vil have, så længe middelværdierne for farveintensitet kan genkendes af 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 = middelværdi (gennemsnit (imgb (:,:, 1))); g = middelværdi (middelværdi (imgb (:,:, 2))); b = middelværdi (middelværdi (imgb (:,:, 3)));

Dette er intensitetskontrollen. Dette vil blive brugt i det næste segment til at beslutte, hvad det vil gø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} == BILLEDE || R. Words {2} == BILLEDE || R.ord {3} == BILLEDE t = ur; 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 = fullfile (mappe, basenavn); imwrite (img, fullFileName) pause (2) elseif R. Words {1} == HØJRE || R.ord {2} == HØJRE || 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} == TILBAGE || R.ord {2} == TILBAGE || R. Words {3} == BACK r.turnAngle (110) end else r.turnAngle (110) end end

Dette segment afgør, om den farve, der blev valgt i den første dialogboks, matcher den farve, kameraet ser. Hvis det gør det, kører det tekstgenkendelse. Det ser ud til at se, hvilket ord (BILLEDE, BACK, HØJRE eller VENSTRE) vises og derefter enten vender (til højre og venstre), drejer rundt (til bagside) eller tager et billede og gemmer det på samme måde som tidligere.

Jeg har kun leveret et enkelt afsnit af koden til de forskellige farver

For at tillade koden at genkende blå og grøn, skal du blot kopiere koden og ændre logikkontrollen øverst i segmentet og indstille "pathcolor == (tal)" til at svare til farvevalgene fra den øverste dialogboks (for kode, som den vises, ville blå være 2 og grøn ville være 3).

Trin 8: Det færdige produkt

Det færdige produkt
Det færdige produkt

Nu skulle Roboteknikeren zoome rundt på Mars-missionsmodulerne og rapportere tilbage til astronauterne, når noget er på sin plads.

Husk, at alle værdierne for cliff sensor og lightBumper skal ændres til, hvad dine observerede værdier er. Af erfaring har jeg også fundet det bedre at teste dette projekt på et mørkt farvet gulv, og det er endnu bedre, hvis gulvet ikke er reflekterende. Dette får kontrasten til at stige mellem stien og gulvet, hvilket gør det mere sandsynligt, at roboteknikeren vil følge den korrekt.

Håber du nød at oprette en lille hjælper til Mars -missionen og have det sjovt med at bygge.

Anbefalede: