Përmbajtje:

Robo-Teknik: 8 hapa
Robo-Teknik: 8 hapa

Video: Robo-Teknik: 8 hapa

Video: Robo-Teknik: 8 hapa
Video: ROBOROCK S8 VS ROBOROCK S7 COMPARISON - Differences - Features 2024, Korrik
Anonim
Robo-Teknik
Robo-Teknik

Imagjinoni për një sekondë që jeni një nga astronautët që zbarkoni në Mars. Ju keni një milion gjëra për të bërë, mostra për të marrë, eksperimente për të ekzekutuar, të dhëna për të mbledhur, por një ose dy herë në ditë ju duhet të vraponi rreth vendbanimeve dhe/ose moduleve të kërkimit ku jetoni dhe punoni për t'i inspektuar ato. Necessaryshtë e nevojshme, dikush duhet të sigurohet që sendi është në gjendje të mirë, që të gjitha mijëra pjesët dhe pjesët të punojnë dhe të jenë në vend. Por, çka nëse do të kishte një ndihmës të automatizuar për t'ju çliruar nga disa nga ato detyra. Po sikur të kishte një robot të vogël që mund të lëvizte brenda moduleve për t'u siguruar që gjithçka ishte në vend, funksiononte dhe ishte e sigurt.

Robo-Teknik në shpëtim.

Në thelb, ky kod kontrollon Robo-Teknikun pasi ndjek një rrugë me ngjyra të lehta në tokë. Ai do të ndjekë këtë rrugë derisa të gjejë një kryqëzim në shteg ose një kthesë, e cila do të bëjë që një fotografi të merret për përpunimin e imazhit për të lejuar Robo-Teknikun të marrë një vendim se ku të shkojë më tej. Sensorët e përplasjes dhe përplasjes së dritës funksionojnë për të mbrojtur Robo-Teknikun nga dëmtimi, dhe sensorët e përplasjes kontrollojnë kur do të merret një fotografi diagnostike. Të gjithë së bashku, Robo-Tekniku është krijuar për të zmadhuar modulet e Marit, duke liruar kohën e astronautëve gjatë kryerjes së detyrës themelore të inspektimit, duke bërë thirrje vetëm për ndihmën e njerëzve kur gjen diçka të gabuar.

Përsëri si paralajmërim, kjo është një punë në progres. Kodi, siç ekziston, funksionon, por ka lemzë, veçanërisht pasi ka shumë programe të mbivendosura të përfshira. Gjithashtu, që ky projekt të funksionojë në një mision aktual në Mars, një robot do të duhej të ndërtohej për atë qëllim specifik, kështu që përsëri mendoj se ky është një ndërtim "dëshmi e konceptit".

Ka disa gjëra që do t'ju duhen për të filluar dhe funksionuar. Ju do të keni nevojë për një program të shtrenjtë, pako mbështetëse për atë program dhe një sfond të vogël në kodim. Meqenëse jam student, dhe disa nga kodet e katit përdhes janë dhënë (për mjedrën pi), nuk do të flas konkretisht për pajisjen. Më poshtë mund të gjeni të gjitha lidhjet për atë kod bazë. Le të kalojmë në listën e materialeve.

Hardware

  • Raspberry Pi (ne përdorëm një version 3)
  • iRobot
  • një lloj pajisje mbajtëse për ta mbajtur Raspberry Pi të lidhur me Robo-Teknikun
  • Kamera Raspberry Pi (nuk ka rëndësi se çfarë lloj, për sa kohë që ka fokus të mirë automatik dhe rezolucion të imazhit)
  • një lloj stende ose këllëfi për ta mbajtur kamerën përballë Robo-Teknikut
  • një material për t'u përdorur si një shirit, i bardhë (ose me ngjyrë shumë të lehtë), që mbahet mirë në dysheme. Duhet të jetë pak më e gjerë se hapësira midis dy sensorëve të shkëmbinjve të përparmë.
  • 4 shenja me tekst shumë të madh (me fjalët IMAGE, RIGHT, BACK, dhe LEFT të shtypura mbi to)
  • Fletë letre me ngjyrë (të paktën tre dhe mundësisht e kuqe, jeshile dhe blu)

Softuer

  • Matlab (2018a dhe 2017b u përdorën të dyja dhe duket se bëjnë pak ndryshim)
  • Paketa mbështetëse Raspberry Pi për Matlab
  • Kodi Raspberry Pi për lidhje me Matlab (lidhje me kodin burimor të dhënë më poshtë)
  • Kutia e veglave të përpunimit të imazhit për Matlab (ju nuk mund ta bëni këtë projekt pa kutinë e veglave)
  • OPSIONALE: Matlab Mobile i instaluar në telefonin tuaj, të cilin do ta shpjegoj më vonë

Hapi 1: Konfigurimi i pajisjes

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

Kjo është lidhja për kodin bazë për të siguruar që iRobot® mund të komunikojë me Matlab, së bashku me një udhëzues bazë. Siç thashë më parë, unë nuk do ta mbuloj këtë pjesë specifike pasi që tutoriali është përgatitur tashmë shumë mirë. Unë do të përmend se pasi të keni ndjekur hapat në lidhje, mund të përdorni komandën "doc" të Matlab për të parë informacionin e përfshirë. Konkretisht:

doc roomba

Dhe një pikë shumë e rëndësishme.

Kur shkarkoni skedarët nga lidhja e mësipërme, V PNI TYRE N F DOSJEN E P DRSHKRUAR MO sipër, pasi Matlab kërkon që skedarët e krijuar nga përdoruesit të jenë në dosjen aktuale të punës.

Me këtë jashtë rrugës, le të kalojmë te kodi.

Hapi 2: Gjetja e të gjithë atyre sensorëve

Gjetja e të gjithë atyre sensorëve
Gjetja e të gjithë atyre sensorëve
Gjetja e të gjithë atyre sensorëve
Gjetja e të gjithë atyre sensorëve

Merrni një sekondë dhe jepni një inspektim iRobot®. Goodshtë mirë të dish se ku janë këto, kështu që të kesh një ide për inputet që merr Robo-Tekniku dhe do të jesh në gjendje të kuptosh pse gjëja po rrotullohet në qarqe në vend që të ndjekësh rrugën që do të vendosësh (kjo mund të ose mund të mos ketë ndodhur). Ju padyshim që do të shihni sensorin e madh të përplasjes fizike në pjesën e përparme. Sensorët e shkëmbit janë pak më të vështirë për tu parë, do t'ju duhet ta përmbysni dhe të kërkoni katër dritaret plastike të qarta pranë buzës së përparme. Sensorët e goditjes së dritës janë edhe më të fshehura, por tani për tani do të jetë e mjaftueshme për të thënë drejtpërdrejt në brezin e zi të ndritshëm që kalon në pjesën e përparme të iRobot®, e cila është në pjesën e përparme të shiritit të sensorit të përplasjes fizike.

Ka sensorë të rënies së rrotave, por këta janë të papërdorur në këtë projekt, kështu që ne do të kalojmë në testimin e sensorëve.

Hapi 3: Testimi për të vendosur parametrat

Testimi për të vendosur parametrat
Testimi për të vendosur parametrat

Para se të dërgojmë Robo-Teknikun për të bërë punën e tij, duhet të kuptojmë tiparet e tij specifike dhe gamën e sensorëve. Meqenëse çdo iRobot® është pak më ndryshe dhe ndryshon gjatë jetës së robotit, ne duhet të kuptojmë se si lexojnë sensorët në zonat ku do të funksionojë. Mënyra më e lehtë për ta bërë këtë është të krijoni një shteg me ngjyra të lehta (Kam përdorur shirita letre të bardhë printeri, por çdo gjë me ngjyrë të hapur do të bëjë) në sipërfaqen që do të veprojë Robo-Tekniku.

Nisni Matlab dhe hapni një skenar të ri. Ruani skriptin N THE FAMILJAMEN E NJJT I P IRSHKRUAM më parë dhe emërtojeni atë që dëshironi (megjithatë përpiquni ta mbani të shkurtër, pasi emri i këtij skedari do të jetë emri i funksionit). Ndizni robotin dhe përdorni konfigurimin e ndryshores roomba nga tutoriali, duke shtypur komandat në dritaren e komandës.

Sigurohuni që Raspberry Pi të jetë i kyçur në iRobot® dhe kompjuteri juaj është i lidhur me të njëjtën lidhje interneti. Do të kaloni më pak kohë duke nxjerrë flokët duke u përpjekur të kuptoni pse Matlab nuk do të lidhet

r = roomba (numri që keni vendosur)

Ndryshorja "r" në këtë rrethanë nuk është e nevojshme, mund ta quani si të doni, por e bën jetën më të lehtë të përdorni një ndryshore të vetme të shkronjave.

Pasi shtegu të jetë konfiguruar dhe dhoma është lidhur me sukses, vendosni Robo-Teknikun e ardhshëm ku një ose dy nga sensorët e shkëmbit janë mbi krye të shtegut. Natyrisht kjo do të thotë që dy ose tre të tjerët janë mbi sipërfaqen që keni zgjedhur.

Tani ndizni sensorët e provës me komandën:

r.testSensorët

Mbani në mend se "r." Është ndryshorja që keni përcaktuar më herët, kështu që nëse nuk është "r" ndryshoni "r". për çdo gjë që keni vendosur. Kjo do të sjellë ekranin e sensorit të testit me një ton informacioni.

Për këtë projekt përqendrohuni në dritat Parakolp, parakolp dhe pjesët e shkëmbinjve. Lëvizni Robo-Teknikun duke u siguruar që të shikoni sesi ndryshojnë sensorët në sipërfaqe të ndryshme, ose sa afër një objekti duhet të jetë që vlerat e ligth-it të ndryshojnë, etj. Mbani në mend këto numra (ose shkruani ato) sepse ju duhen për të vendosur parametrat tuaj në një sekondë.

Hapi 4: Fillimi i Kodit

Së pari ju do të ndërtoni një funksion. Unë e quajta "rrugë", por përsëri, emri nuk është i nevojshëm, por tani e tutje do t'i referohem si "rrugë".

Pjesa e sipërme e kodit është vendosja e disa opsioneve të hyrjes së përdoruesit. Ndërton disa lista që do të përdoren në in listdlg dhe më pas sjell një kuti dialogu të listës. Kjo i lejon përdoruesit të zgjedhë ngjyrën e rrugës që dëshiron të ndjekë, e cila hyn në lojë më vonë.

lista = {'E kuqe', 'Blu', 'E gjelbër'}

problist = {'Rasti, ruaj imazhin', 'Komponenti jashtë vendit, ruaj imazhin', 'pritet, vazhdo'} pathcolor = listdlg ('PromptString', 'Select a Path Color',… 'SelectionMode', 'single', 'ListString', list) prob = 0; driv = ;

Variablat "prob" dhe "driv" duhet të deklarohen këtu pasi ato do të përdoren brenda lakut kryesor të funksionit, por përsëri, nëse doni të riemërtoni ndonjë nga këto ndryshore ose të ndryshoni përzgjedhjet e listës, është mirë për aq kohë sa ju jeni konsistent në pjesën tjetër të kodit.

Hapi 5: Në krye të lakut Ndërsa: Sensorët e përplasjes fizike

Pjesa e sipërme e lakut while përmban logjikën e sensorit fizik të goditjes. Në thelb, kur Robo-Tekniku has në diçka që ndalon (ose për sensorin e përplasjes së përparme mbështetet 0.1 metër), atëherë pozicionohet për të bërë një fotografi. Le të mbulojmë së pari pjesën e kontrollit të shpejtësisë dhe pozicionit.

Nëse i keni testuar të gjithë sensorët në Robo-Teknikun në hapat e mëparshëm, do të dini që sensorët e përplasjes kanë një vlerë logjike (0 ose 1) me zero që përfaqëson pozicionin normal, jo të shtypur të sensorit. Mbani në mend këtë për kodin.

ndërsa e vërtetë %kryesore ndërsa laku %marrin informacion parakolp S = r.getBumpers nëse S.left ~ = 0 r.ndaloni tjetër S. S. drejtë ~ = 0 r.ndaloni tjetër S. S. ballë ~ = 0 r.ndalim fund

Kjo është pjesa bazë "nëse godet diçka, ndalo". Nëse sensorët zbulojnë një përplasje, atëherë ai kalon në pjesën tjetër të kodit, e cila rregullon pozicionin e Robo-Teknikut për të marrë një fotografi.

nëse S.left ~ = 0 %nëse loop merr informacionin e parakolpit dhe rreshton kamerën për fotografinë r.turnAngle (5) pauzë (0.5) img = r.getImage %merr fotografi dhe shfaq imazhin (img) %kutinë e dialogut prob = listdlg (' PromptString ',' Gjetur një pengesë të papritur, Ju lutemi identifikoni '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) pauzë (0.5) img = r. imazhi i imazhit (img) prob = listdlg ('PromptString', 'Gjetur një pengesë të papritur, Ju lutemi identifikoni'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) pauzë (0.5) img = r.get Imazhi i imazhit (img) prob = listdlg ('PromptString', 'Gjetur një pengesë të papritur, Ju lutemi identifikoni'…, 'SelectionMode', 'single', 'ListString', list prob prob) fund

Në thelb, pasi të merret imazhi, një kuti tjetër dialogu do të shfaqet me tre opsione. Dy opsionet e para e ruajnë foton në një dosje të caktuar, të cilën do ta mbuloj më vonë, ndërsa opsioni i tretë thjesht mbyll kutinë e dialogut dhe vazhdon përmes lakut. Nëse nuk i mbani mend opsionet, hidhini një sy hapit të mëparshëm.

Tani kam futur një pjesë të kodit midis pjesës së sensorit të përplasjes dhe pjesës së ruajtjes së fotografisë. Kjo merr vlerat e dritës së Parakolpit dhe vendos shpejtësinë e vozitjes në 0.025 metra/sekondë (shumë e ngadaltë), e cila në fakt nuk është e nevojshme, por zvogëlon goditjen e gjërave nga Robo-Tekniku dhe përfundimisht konsumimin e sensorëve të përplasjes fizike.

L = r.getLightBumpers nëse L.majtas> 100 || L.leftF front> 100 || L. RightFront> 100 || L.right> 100 driv = 0.025 r.setDriveVelocity (0.025) tjetër driv = 0.1 fund

Kjo do të ishte pjesa ku vlerat që vëzhguat (dhe me shpresë i shënuat) më parë hyjnë në lojë

"L. (ana dhe drejtimi i sensorit)> 100" u bazua në vlerat që vëzhgova, kështu që nëse vëzhgimet tuaja janë të ndryshme, ndryshoni këto numra. Ideja është se nëse Robo-Tekniku ndjen diçka disa centimetra para tij, ai do të ngadalësohet, më shumë se kaq është e panevojshme.

Pjesa tjetër është ajo ku ruhen fotografitë për më vonë.

%nëse opsioni i parë ose i dytë është zgjedhur në dialogun prob, ruan imazhin nëse prob == 1 %nëse loop ndërton informacionin e skedarit për foto, shkruan me vulën kohore t = orë; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); dosje = 'E: / UTK / Klasat / bien 18 / ef230 / irobot / imazhe'; fullFileName = skedar i plotë (dosje, emër bazë); imwrite (img, fullFileName) close Figura 1 pauzë (2) elseif prob == 2 t = orë; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); dosje = 'E: / UTK / Klasat / bien 18 / ef230 / irobot / imazhe'; fullFileName = skedar i plotë (dosje, emër bazë); imwrite (img, fullFileName) mbyll Figura 1 pauzë (2) fund

Të gjithë emrat e skedarëve dhe vendet ku ruhen fotografitë janë opsionale. Zgjodha një dosje që është e vendosur brenda dosjes roomba të krijuar në hapin e hyrjes, por mund të jetë kudo që ju zgjidhni. Gjithashtu, fotografitë ruhen me vulën kohore, por kjo nuk është veçanërisht e nevojshme (megjithëse do të ishte hipotetikisht e dobishme për një mision në Mars).

Me sensorët e përplasjes fizike të mbuluara, ne mund të lëvizim mbi sensorët e shkëmbit dhe rrugën që ndjekim.

Hapi 6: Ndjekja e Rrugës

Kodi për sensorët e shkëmbit është krijuar për të krahasuar vlerat e dy vlerave të sensorit të përparmë dhe dy anësor. Ju do të duhet të ndryshoni këto vlera (ndoshta) bazuar në vlerat tuaja të vëzhguara. Ju gjithashtu do të keni nevojë të modifikoni këto vlera pas disa testeve dhe t'i ndryshoni ato bazuar në dritën e ambientit, kohën e ditës (varësisht se sa mirë është ndriçuar zona e provës) ose kur dritaret e sensorit janë të ndotura.

Sidoqoftë, para se të arrijmë te kodi i sensorit të shkëmbit, ekziston një segment i shkurtër i kodit që kam futur për të pastruar disa nga të dhënat e panevojshme nga Matlab. Kjo pjesë nuk është e nevojshme, por e kam përdorur për të zvogëluar hapësirën e kërkuar për të drejtuar programin.

qartë img qartë t qartë bazename qartë dosje të qartë të plotëFileName

Segmenti tjetër i kodit është mishi i projektit. Ai lejon Robo-Teknikun të ndjekë rrugën me ngjyra të lehta që është vendosur në dysheme. Me pak fjalë, ajo përpiqet të drejtojë veten në mënyrë që dy sensorët e përparmë të shkëmbit të jenë mbi pragun, bazuar në vlerat tuaja të vëzhguara, dhe lejon programin të fillojë hapat e përpunimit të imazhit pak më vonë.

C = r.getCliffSensors %nëse loop ndjek një brez ngjyrash (e bardhë) nëse C.leftFront> 2000 && C.rightFront> 2000 %udhëzim në rrugën e drejtë r.setDriveVelocity (driv) elseif C.leftF front 2000 %kthehet djathtas nëse roboti shkon shumë larg majtas r.turnAngle (-2.5) elseif C.leftF front> 2000 && C.rightFront <2000%kthehet majtas nëse roboti shkon shumë djathtas r.turnAngle (2.5) elseif C.leftFront <2000 && C. RightFront 100 || L.leftF front> 100 || L. RightFront> 100 || L.right> 100 img = r.get Imazhi i fundit %kontrollon për të parë nëse ka një kthesë në shteg nëse C.left> 2800 && C. right <2800 r.turnAngle (2.5) elseif C.left 2800 r.turnAngle (- 2.5) fundi %i mbajtësit të vendit për shpërndarjen e imazhit të shtegut ("MERRJA E IMAZHIT") fundi i fundit

Mbani në mend se emrat e ndryshoreve që zgjodha janë opsionale, por përsëri mendoj se e bën jetën më të lehtë të përdorësh variabla me një shkronjë kur është e mundur

Për të shpjeguar pjesën e mesme të kodit, kur dy sensorët e përparmë dalin nga buza e shtegut (kur bëhet fjalë për një kryqëzim ose kur arrin në fund të shtegut) duket për të parë nëse ka diçka para tij Me Ju do të duhet të vendosni një objekt në tokë në fund të shtegut ose në ndonjë kryqëzim që kjo të funksionojë.

Pasi të merret fotografia, ajo përdor njohjen e figurës për të kuptuar se çfarë të bëjë. Ekziston një mbajtës vendi në këtë pjesë të kodit gjithashtu:

%mbajtës i vendit për njohjen e imazhit të shtegut disk ('MERRNI IMAGE')

E përdor këtë për momentin sepse doja të flisja në mënyrë specifike për përpunimin e tekstit dhe ngjyrave që ndodh, i cili është në hapin tjetër.

Hapi 7: Përpunimi i imazhit

Ekzistojnë dy pjesë të përpunimit të imazhit. Së pari është njohja e ngjyrave, e cila llogarit intensitetin e ngjyrës në figurë për të vendosur nëse do të vazhdojë apo jo në njohjen e tekstit. Llogaritjet e ngjyrave bazohen në zgjedhjen e bërë në atë kuti të parë dialogu në fillim (kam përdorur të kuqe, blu, jeshile, por ju mund të zgjidhni ngjyrat që dëshironi, për aq kohë sa vlerat mesatare për intensitetin e ngjyrave mund të njihen nga Kamera Raspberry Pi).

img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) e kuqe = mesatare (mesatare (imgb (:,:, 1))); g = mesatarja (mesatarja (imgb (:,,, 2)))); b = mesatarja (mesatarja (imgb (:,,, 3))));

Ky është kontrolli i intensitetit. Kjo do të përdoret në segmentin tjetër për të vendosur se çfarë dëshiron të bëjë.

nëse e kuqe> g && e kuqe> b nëse ngjyra e ngjyrës == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img) nëse R. Fjalët {1} == IMAGE || R. Fjalët {2} == IMAGE || R. Fjalët {3} == IMAGE t = ora; basename = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); dosje = 'E: / UTK / Klasat / bien 18 / ef230 / irobot / imazhe'; fullFileName = skedar i plotë (dosje, emër bazë); shkruaj (img, fullFileName) pauzë (2) elseif R. Fjalë {1} == E DREJTA || R. Fjalët {2} == E DREJTA || R. Fjalët {3} == DREJTA r.turnAngle (-75) tjetërse R. Fjalët {1} == Majtas || R. Fjalët {2} == Majtas || R. Fjalët {3} == LEFT r.turnAngle (75) përndryshe R. Fjalët {1} == Kthehu || R. Fjalët {2} == Kthehu || R. Fjalët {3} == KTHIM r.turnAngle (110) fund tjetër r.turnAngle (110) fund fund

Ky segment vendos nëse ngjyra që është zgjedhur në kutinë e parë të dialogut përputhet me ngjyrën që po shikon kamera. Nëse e bën, funksionon njohja e tekstit. Duket për të parë se cila fjalë (IMAGE, BACK, Djathtas ose LEFT) shfaqet dhe pastaj ose kthehet (për të djathtën dhe të majtën), rrotullohet (për pjesën e pasme) ose merr një fotografi dhe e ruan atë në të njëjtën mënyrë si më parë.

Unë kam dhënë vetëm një pjesë të vetme të kodit për ngjyrat e ndryshme

Për të lejuar që kodi të njohë blu dhe jeshile, thjesht kopjoni kodin dhe ndryshoni kontrollin logjik në krye të segmentit dhe vendosni "pathcolor == (numri)" që të korrespondojë me përzgjedhjet e ngjyrave nga kutia e lartë e dialogut (për Kodi siç shfaqet, blu do të jetë 2 dhe jeshile do të jetë 3).

Hapi 8: Produkti i Përfunduar

Produkti i Përfunduar
Produkti i Përfunduar

Tani Robo-Tekniku duhet të zmadhojë modulet e misionit në Mars dhe të raportojë tek astronautët kur diçka nuk është në vend.

Mos harroni, të gjitha vlerat e sensorit të shkëmbit dhe dritës së parakolpit duhet të ndryshohen në vlerat tuaja të vëzhguara. Gjithashtu, nga përvoja kam gjetur më mirë ta testoj këtë projekt në një dysheme me ngjyrë të errët dhe është edhe më mirë nëse ai dysheme nuk është reflektues. Kjo bën që kontrasti të rritet midis shtegut dhe dyshemesë, gjë që e bën më të mundshme që Robo-Tekniku ta ndjekë atë në mënyrë korrekte.

Shpresoj se ju ka pëlqyer krijimi i një ndihmësi të vogël për misionin në Mars dhe argëtohuni duke ndërtuar.

Recommended: