INHOUDSOPGAWE:

Robo-tegnikus: 8 stappe
Robo-tegnikus: 8 stappe

Video: Robo-tegnikus: 8 stappe

Video: Robo-tegnikus: 8 stappe
Video: Основные ошибки при возведении перегородок из газобетона #5 2024, Julie
Anonim
Robo-tegnikus
Robo-tegnikus

Stel jou 'n oomblik voor dat jy een van die ruimtevaarders is wat op Mars beland. U het 'n miljoen dinge om te doen, monsters om te neem, eksperimente om uit te voer, data om in te samel, maar u moet een of twee keer per dag deur die woon- en/of navorsingsmodules waarin u woon, werk en inspekteer. Dit is nodig, iemand moet seker maak dat die ding in 'n goeie toestand is, dat al die duisende stukke en onderdele werk en op hul plek is. Maar wat as daar 'n outomatiese helper was om van hierdie pligte ontslae te raak. Wat as daar 'n klein robot in die modules kon rondbeweeg om seker te maak dat alles in plek is, werk en veilig is?

Robo-tegnikus tot die redding.

Hierdie kode beheer die Robo-Technician in wese omdat dit 'n ligte pad op die grond volg. Dit sal hierdie pad volg totdat dit 'n aansluiting in die pad of 'n draai vind, wat 'n foto sal neem wat geneem moet word vir beeldverwerking sodat die Robo-Technician 'n besluit kan neem oor waarna hy gaan. Die lig- en stampsensors werk om die Robo-Technician teen skade te beskerm, en die stampsensors bepaal wanneer 'n diagnostiese foto geneem sal word. Die Robo-tegnikus is saamgestel om in die modules van die Mar in te zoem, wat die ruimtevaarders se tyd vrystel terwyl hulle die basiese taak van inspeksie verrig, maar slegs om menslike insette te vra as daar iets verkeerd is.

Weereens as 'n waarskuwing, is dit 'n werk aan die gang. Die kode, soos dit bestaan, werk, maar dit het hik, veral omdat daar verskeie oorvleuelende programme betrokke is. Vir hierdie projek om in 'n werklike Mars -missie te werk, moet 'n robot vir daardie spesifieke doel gebou word, dus ek dink weer dat dit 'n 'proof of concept' -konstruksie is.

Daar is 'n paar dinge wat u nodig het om dit aan die gang te kry. U benodig 'n duur program, ondersteuningspakkette vir die program en 'n bietjie agtergrond in kodering. Aangesien ek 'n student is, en sommige van die kode op die grondvloer is verskaf (vir die framboos pi), sal ek nie spesifiek oor die opset praat nie. U kan al die skakels vir die basiskode hieronder vind. Kom ons gaan na die materiaallys.

Hardeware

  • Framboos Pi (ons het 'n weergawe 3 gebruik)
  • iRobot ®
  • 'n soort houtoestel om die Raspberry Pi aan die Robo-Technician vas te hou
  • Raspberry Pi -kamera (maak nie saak watter soort nie, solank dit goeie outofokus en beeldresolusie het)
  • 'n soort staander of holster om die kamera vorentoe op die Robo-Technician te hou
  • 'n materiaal om te gebruik as 'n strook, wit (of baie lig), wat stewig teen die vloer gehou word. Dit moet net effens wyer wees as die ruimte tussen die voorste twee kransensors.
  • 4 tekens met baie groot teks (met die woorde BEELD, REGS, TERUG en LINKS daarop gedruk)
  • Velle gekleurde papier (ten minste drie en verkieslik rooi, groen en blou)

Sagteware

  • Matlab (2018a en 2017b is albei gebruik en dit blyk min verskil te maak)
  • Raspberry Pi -ondersteuningspakket vir Matlab
  • Framboos Pi -kode vir verbinding met Matlab (skakel na die bronkode wat hieronder verskaf word)
  • Gereedskapskas vir beeldverwerking vir Matlab (u kan hierdie projek byna nie sonder die gereedskapskas doen nie)
  • OPSIONEEL: Matlab Mobile is op u telefoon geïnstalleer, wat ek later sal verduidelik

Stap 1: Die opstel van die hardeware

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

Dit is die skakel na die basiskode om te verseker dat die iRobot® met Matlab kan kommunikeer, tesame met 'n basiese handleiding. Soos ek al voorheen gesê het, sal ek hierdie spesifieke gedeelte nie dek nie, aangesien die tutoriaal reeds baie goed uiteengesit is. Ek sal noem dat sodra u die stappe op die skakel gevolg het, u die 'doc' -opdrag van Matlab kan gebruik om die ingesluit inligting na te gaan. Spesifiek:

doc roomba

En nog 'n baie belangrike punt.

As u die lêers van die bogenoemde skakel aflaai, plaas dit in die vouer wat ek hierbo beskryf het, aangesien Matlab vereis dat gebruikers gegenereerde lêers in die huidige werkmap moet wees.

Met dit uit die weg, laat ons na die kode gaan.

Stap 2: Soek al die sensors

Soek al die sensors
Soek al die sensors
Vind al die sensors
Vind al die sensors

Neem 'n rukkie en ondersoek die iRobot®. Dit is goed om te weet waar dit is, sodat u 'n idee het van die insette wat die Robo-tegnikus ontvang, en u sal kan agterkom waarom die ding in sirkels draai in plaas van die pad wat u opstel (dit kan of moontlik nie gebeur het nie). U sal duidelik die groot fisiese stampsensor aan die voorkant sien. Die kransensors is 'n bietjie moeiliker om te sien; u moet dit omdraai en soek na die vier, deurskynende plastiekvensters naby die voorkant. Die ligstampsensors is nog meer verborge, maar vir eers is dit genoeg om te sê in die glansende swart band die lopies om die voorkant van die iRobot®, wat aan die voorkant van die fisiese stampsensorstaaf is.

Daar is wieldaalsensors, maar dit is ongebruik in hierdie projek, so ons gaan voort om die sensors te toets.

Stap 3: Toets om parameters in te stel

Toets om parameters te stel
Toets om parameters te stel

Voordat ons die Robo-Technician kan stuur om sy werk te verrig, moet ons die spesifieke eienaardighede en sensorreeks uitvind. Aangesien elke iRobot® 'n bietjie anders is en oor die lewensduur van die robot verander, moet ons uitvind hoe die sensors lees oor die gebiede waarin dit werk. Die maklikste manier om dit te doen, is om 'n ligte pad op te stel (Ek het repies wit drukkerpapier gebruik, maar enigiets wat ligkleurig is) op die oppervlak wat die Robo-Technician sal gebruik.

Begin Matlab en maak 'n nuwe script oop. Stoor die skrif in dieselfde vouer wat ek vroeër beskryf het en noem dit wat u wil (probeer dit kort hou, aangesien die naam van hierdie lêer die funksienaam sal wees). Skakel die robot aan en gebruik die roomba -veranderlike opstelling uit die tutoriaal en tik die opdragte in die opdragvenster.

Maak seker dat die Raspberry Pi gekoppel is aan die iRobot® en dat u rekenaar aan dieselfde internetverbinding gekoppel is. U sal minder tyd daaraan spandeer om u hare uit te trek en te probeer uitvind waarom Matlab nie kan koppel nie

r = roomba (nommer wat jy opgestel het)

Die veranderlike "r" in hierdie omstandighede is nie nodig nie; u kan dit noem wat u wil, maar dit maak die lewe makliker om 'n enkele letter veranderlike te gebruik.

Sodra die pad opgestel is en die roomba suksesvol verbind is, plaas die toekomstige Robo-Technician waar een of twee van die kransensors bo-op die pad is. Dit beteken duidelik dat die ander twee of drie bo die oppervlak is wat u gekies het.

Begin nou die toetssensors met die opdrag:

r.testSensors

Hou in gedagte dat die "r." Die veranderlike is wat u vroeër gedefinieer het, dus as dit nie 'r' is nie, verander die 'r'. oor wat jy ook al besluit het. Dit sal die toetssensorskerm met baie inligting opduik.

Fokus vir hierdie projek op die ligte -buffers, bumpers en kranse. Beweeg die Robo-tegnikus om en kyk hoe die sensors oor verskillende oppervlaktes verander, of hoe naby 'n voorwerp moet wees om die ligthBumper-waardes te verander, ens. Hou hierdie getalle in gedagte (of skryf dit neer) omdat u het hulle nodig om u parameters binne 'n sekonde in te stel.

Stap 4: Begin die kode

Eerstens bou u 'n funksie. Ek het dit 'pad' genoem, maar weereens, die naam is nie nodig nie, maar ek sal dit voortaan as 'pad' noem.

Die boonste gedeelte van die kode is 'n paar gebruikersinvoeropsies. Dit bou 'n paar lyste wat in die in listdlg gebruik sal word en bring dan 'n lysdialoogvenster oop. Hierdeur kan die gebruiker kies watter padkleur hy wil volg, wat later in die spel kom.

list = {'Rooi', 'Blou', 'Groen'}

problist = {'Ongeval, stoor prentjie', 'Onderdeel buite plek, stoor prent', 'Verwag, gaan voort'} pathcolor = listdlg ('PromptString', 'Kies 'n padkleur', … 'Seleksiemodus', 'enkel', 'ListString', list) prob = 0; dryf = ;

Die "prob" en "driv" veranderlikes moet hier verklaar word, aangesien dit binne die funksie se hoof terwyl lus gebruik sal word, maar weer, as u een van hierdie veranderlikes wil hernoem of die lyskeuses wil verander, is dit goed so lank as jy is konsekwent in die res van die kode.

Stap 5: Top van die While Loop: fisiese stampsensors

Die bokant van die terwyl -lus bevat die fisiese stamp sensor logika. As die Robo-tegnikus iets raakloop, stop hy (of vir die stampsensor aan die voorkant 0,1 meter), dan posisioneer hy homself om 'n foto te neem. Laat ons eers die snelheids- en posisiebeheergedeelte bedek.

As u al die sensors op die Robo-Technician in die vorige stappe getoets het, weet u dat die stampsensors 'n logiese waarde (0 of 1) het met nul wat die normale posisie van die sensor nie aandui nie. Hou dit in gedagte vir die kode.

terwyl true %main terwyl lus %buffer inligting ontvang S = r.getBumpers as S. links ~ = 0 r.stop elseif S.right ~ = 0 r.stop elseif S.front ~ = 0 r.stop end

Dit is die basiese gedeelte "as dit iets raak, stop". As die sensors 'n botsing opspoor, beweeg dit na die volgende gedeelte van die kode, wat die posisie van die Robo-tegnikus weer aanpas om 'n foto te neem.

as S.links ~ = 0 %as lus bumper -inligting neem en kamera inpas vir foto r.turnAngle (5) pouse (0.5) img = r.getImage %neem foto en vertoon beeld (img) %dialoogvenster prob = listdlg (' PromptString ',' 'n Onverwagte hindernis gevind, identifiseer asseblief '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) pause (0.5) img = r. getImage image (img) prob = listdlg ('PromptString', 'Found a Unxpected 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 Unxpected Obstacle, Identify Please' …, 'SelectionMode', 'single', 'ListString', problist) end

Sodra die prentjie geneem is, verskyn 'n ander dialoogkassie met drie opsies. Die eerste twee opsies stoor die foto in 'n gespesifiseerde vouer, wat ek later sal dek, terwyl die derde opsie die dialoogkassie eenvoudig sluit en deur die lus gaan. As u nie die opsies kan onthou nie, kyk dan na die vorige stap.

Nou het ek 'n kode -afdeling ingevoeg tussen die stamp sensor gedeelte en die foto stoor gedeelte. Dit neem lightBumper-waardes en stel die rysnelheid op 0,025 meter/sekonde (baie stadig), wat eintlik nie nodig is nie, maar dit verminder wel die Robo-Technician wat in dinge klop en uiteindelik die fisiese stampsensors verslyt.

L = r.getLightBumpers as L. links> 100 || L.links Voor> 100 || L.rightFront> 100 || L. regs> 100 dryf = 0,025 r.setDriveVelocity (0,025) anders ry = 0,1 einde

Dit is die deel waar die waardes wat u vroeër waargeneem het (en hopelik neergeskryf het) ter sprake kom

Die "L. (sy en rigting van sensor)> 100" was gebaseer op die waardes wat ek waargeneem het, dus verander u getalle as u waarnemings verskil. Die idee is dat as die Robo-tegnikus iets 'n paar sentimeter voor hom aanvoel, dit sal vertraag, meer as dit onnodig is.

Die volgende gedeelte is waar foto's gestoor word vir later.

%as die eerste of tweede opsie in prob -dialoog gekies is, stoor beeld as prob == 1 %as lus lêerinligting vir foto bou, skryf met tydstempel t = klok; basenaam = 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 (map, basenaam); imwrite (img, fullFileName) close Figuur 1 pouse (2) elseif prob == 2 t = klok; basenaam = 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 (map, basenaam); imwrite (img, fullFileName) sluit Figuur 1 pouse (2) einde

Al die lêername en liggings waar die foto's gestoor word, is opsioneel. Ek het 'n gids gekies wat in die roomba -lêergids lê wat ek in die inleidingsstap geskep het, maar dit kan oral wees waar u wil. Die foto's word ook met die tydstempel gestoor, maar dit is nie veral nodig nie (alhoewel dit hipoteties nuttig sou wees vir 'n Mars -missie).

As die fisiese stampsensors bedek is, kan ons na die kransensors beweeg en die pad volg.

Stap 6: Volg die pad

Die kode vir die kransensors is opgestel om die waardes van die twee voor- en twee sysensorwaardes te vergelyk. U moet hierdie waardes (waarskynlik) verander op grond van u waargenome waardes. U sal hierdie waardes waarskynlik ook na 'n paar toetslopies moet wysig en dit verander op grond van die omringende lig, tyd van die dag (afhangende van hoe goed die toetsarea verlig is) of wanneer die sensorvensters vuil is.

Voordat ons egter by die kransensorkode kom, is daar 'n kort kodesegment wat ek ingevoeg het om sommige van die onnodige data uit Matlab te verwyder. Hierdie deel is nie nodig nie, maar ek het dit gebruik om die stoorplek wat nodig is om die program uit te voer, te verminder.

duidelik img duidelik t duidelik basenaam duidelik fullFileName duidelike vouer

Die volgende kodesegment is die vleis van die projek. Dit stel die Robo-tegnikus in staat om die ligte pad wat op die vloer geplaas is, te volg. In 'n neutedop probeer dit om homself te stuur, sodat die voorste twee kransensors bo die drumpel is, gebaseer op u waargenome waardes, en die program toelaat om die beeldverwerkingsstappe 'n bietjie later te begin.

C = r.getCliffSensors %as lus 'n kleurband volg (wit) as C.leftFront> 2000 & C.rightFront> 2000 %reguit pad begeleiding r.setDriveVelocity (aandrywing) anders as C.leftFront 2000 %regs draai as robot te ver gaan links r.turnAngle (-2.5) elseif C.leftFront> 2000 &&rightFront <2000%draai links as robot te ver regs gaan r. TurnAngle (2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.links Voor> 100 || L.rightFront> 100 || L.right> 100 img = r.getIdage end %beeld kyk of daar 'n buiging in die pad is as C.links> 2800 && C.right <2800 r.turnAngle (2.5) elseif C.links 2800 r.turnAngle (- 2.5) eind %plekhouer vir padbeeldherkenning disp ('GETTING IMAGE') end end end

Hou in gedagte dat die veranderlike name wat ek gekies het opsioneel is, maar ek dink weer dat dit die lewe makliker maak om enkel letter veranderlikes te gebruik indien moontlik

Om die middelste gedeelte van die kode te verduidelik, kyk die twee voorste sensors na die rand van die pad (as dit by 'n kruising kom of as dit aan die einde van die pad kom) om te sien of daar iets voor is. U moet 'n voorwerp op die grond aan die einde van die pad of by enige kruising plaas.

Sodra die foto geneem is, gebruik dit beeldherkenning om uit te vind wat om te doen. Daar is ook 'n plekhouer in hierdie kode -afdeling:

%plekhouer vir padbeeldherkenning ('VERKRYGING VAN BEELD')

Ek het dit tans gebruik omdat ek spesifiek wou praat oor die teks en kleurverwerking wat plaasvind, wat in die volgende stap is.

Stap 7: Beeldverwerking

Daar is twee dele aan die beeldverwerking. Eerstens is die kleurherkenning, wat die kleurintensiteit in die prent bereken om te besluit of daar met teksherkenning voortgegaan moet word of nie. Die kleurberekeninge is gebaseer op die keuse wat gemaak is in die heel eerste dialoogkassie aan die begin (ek het rooi, blou, groen gebruik, maar u kan kies watter kleure u wil, solank die gemiddelde waardes vir kleurintensiteit herken kan word Framboos 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]) rooi = gemiddelde (gemiddelde (imgb (:,:, 1)))); g = gemiddelde (gemiddelde (imgb (:,:, 2))); b = gemiddelde (gemiddelde (imgb (:,:, 3)));

Dit is die intensiteitstoets. Dit sal in die volgende segment gebruik word om te besluit wat dit wil doen.

as rooi> g && rooi> b as pathcolor == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img) as R. Words {1} == BEELD || R. Woorde {2} == BEELD || R. Woorde {3} == BEELD t = klok; basenaam = 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 (map, basenaam); imwrite (img, fullFileName) pouse (2) elseif R. Words {1} == REGS || R. Woorde {2} == REGS || R. Words {3} == REGS r.turnAngle (-75) anders as R. Words {1} == LEFT || R. Woorde {2} == LINKS || R. Words {3} == LEFT r.turnAngle (75) elseif R. Words {1} == TERUG || R. Woorde {2} == TERUG || R. Words {3} == BACK r.turnAngle (110) end else r.turnAngle (110) end end

Hierdie segment besluit of die kleur wat in die eerste dialoogkassie gekies is, ooreenstem met die kleur wat die kamera sien. As dit wel gebeur, word teksherkenning uitgevoer. Dit kyk of die woord (BEELD, TERUG, REGS of LINKS) verskyn, en draai dan (regs en links), draai om (agter) of neem 'n foto en stoor dit op dieselfde manier as vroeër.

Ek het slegs 'n enkele gedeelte van die kode vir die verskillende kleure verskaf

Om die kode blou en groen te laat herken, kopieer die kode en verander die logiese kontrole bo -aan die segment en stel die "pathcolor == (getal)" in ooreenstemming met die kleurkeuses uit die boonste dialoogkassie (vir die kode soos dit vertoon word, sou blou 2 wees en groen 3).

Stap 8: Die voltooide produk

Die voltooide produk
Die voltooide produk

Nou moet die Robo-Technician om die Mars-sendingmodules rondzoom en aan die ruimtevaarders rapporteer as iets verkeerd is.

Onthou dat al die kransensor- en lightBumper -waardes verander moet word na wat u waargenome waardes is. Uit ervaring het ek dit ook beter gevind om hierdie projek op 'n donkerkleurige vloer te toets, en dit is nog beter as die vloer nie-reflekterend is. Dit vergroot die kontras tussen die pad en die vloer, wat dit meer waarskynlik maak dat die Robo-tegnikus dit korrek sal volg.

Hoop jy het dit geniet om 'n klein helper op te stel vir die Mars -missie, en om pret te hê met die bou daarvan.

Aanbeveel: