Turinys:

Robo-technikas: 8 žingsniai
Robo-technikas: 8 žingsniai

Video: Robo-technikas: 8 žingsniai

Video: Robo-technikas: 8 žingsniai
Video: Toksiški Santykiai. Išsiskyrimo skausmas. Kaip gyventi be to, kurį mylėjau?8 žingsniai link išgyjimo 2024, Liepa
Anonim
Robo-technikas
Robo-technikas

Akimirkai įsivaizduokite, kad esate vienas iš astronautų, nusileidusių Marse. Turite atlikti milijoną dalykų, imti mėginius, atlikti eksperimentus, rinkti duomenis, tačiau vieną ar du kartus per dieną turite apeiti gyvenamąsias patalpas ir (arba) tyrimų modulius, kuriuose gyvenate ir dirbate, kad juos patikrintumėte. Tai būtina, kažkas turi užtikrinti, kad daiktas būtų geros formos, kad visi tūkstančiai detalių ir dalių veiktų ir būtų vietoje. Bet kas būtų, jei būtų automatinis pagalbininkas, kuris atleistų jus nuo kai kurių pareigų. O kas, jei būtų mažas robotas, galintis judėti modulių viduje, kad įsitikintų, jog viskas yra vietoje, veikia ir yra saugi.

Robo-technikas į pagalbą.

Iš esmės šis kodas valdo „Robo-Technician“, nes eina šviesiu keliu žemėje. Jis eis šiuo keliu, kol suras kelio sankryžą arba posūkį, kuris paragins padaryti nuotrauką apdoroti vaizdus, kad robotų technikas galėtų nuspręsti, kur eiti toliau. Šviesos smūgio ir smūgio jutikliai apsaugo „Robo-Technician“nuo pažeidimų, o smūgio jutikliai kontroliuoja, kada bus padaryta diagnostinė nuotrauka. Apskritai, „Robo-Technician“yra skirtas priartinti „Mar“modulius, atlaisvinant astronautų laiką atliekant pagrindinę tikrinimo užduotį, tik raginant padėti žmogui, kai jis nustato kažką negero.

Dar kartą įspėju, kad tai nebaigtas darbas. Kodas, koks jis yra, veikia, bet turi žagsėjimo, ypač todėl, kad dalyvauja kelios persidengiančios programos. Be to, norint, kad šis projektas veiktų tikroje Marso misijoje, tam konkrečiam tikslui reikės sukurti robotą, todėl vėlgi manau, kad tai yra „koncepcijos įrodymas“.

Norėdami tai padaryti, turite atlikti keletą veiksmų. Jums reikės brangios programos, tos programos palaikymo paketų ir šiek tiek kodavimo. Kadangi esu studentas ir kai kurie pirmo aukšto kodai buvo pateikti („aviečių pi“), aš konkrečiai nekalbėsiu apie sąranką. Visas to pagrindinio kodo nuorodas rasite žemiau. Eikime į medžiagų sąrašą.

Techninė įranga

  • „Raspberry Pi“(mes naudojome 3 versiją)
  • iRobot ®
  • tam tikras laikymo įtaisas, kad „Raspberry Pi“būtų pritvirtintas prie „Robo-Technician“
  • „Raspberry Pi“fotoaparatas (nesvarbu, koks jis yra, nes turi gerą automatinį fokusavimą ir vaizdo skiriamąją gebą)
  • tam tikras stovas ar dėklas, kad „Robo-Technician“laikytų fotoaparatą į priekį
  • medžiaga, naudojama kaip juostelė, balta (arba labai šviesi), tvirtai laikoma prie grindų. Jis turi būti šiek tiek platesnis nei tarpas tarp dviejų priekinių uolų jutiklių.
  • 4 ženklai su labai dideliu tekstu (su žodžiais IMAGE, RIGHT, BACK ir LEFT)
  • Spalvoto popieriaus lapai (mažiausiai trys, pageidautina raudona, žalia ir mėlyna)

Programinė įranga

  • „Matlab“(„2018a“ir „2017b“buvo naudojami ir, atrodo, mažai skiriasi)
  • „Raspberry Pi“palaikymo paketas, skirtas „Matlab“
  • „Raspberry Pi“kodas prisijungimui prie „Matlab“(nuoroda į toliau pateiktą šaltinio kodą)
  • Vaizdo apdorojimo įrankių rinkinys „Matlab“(jūs beveik negalite atlikti šio projekto be įrankių rinkinio)
  • PASIRENKAMA: jūsų telefone įdiegta „Matlab Mobile“, kurią paaiškinsiu vėliau

1 veiksmas: nustatykite aparatūrą

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

Tai yra pagrindinio kodo nuoroda, užtikrinanti, kad „iRobot®“gali bendrauti su „Matlab“, kartu su pagrindine pamoka. Kaip jau sakiau anksčiau, šios konkrečios dalies neaptarinėsiu, nes pamoka jau yra labai gerai išdėstyta. Paminėsiu, kad atlikę nuorodos veiksmus, galite naudoti „Matlab“komandą „doc“, kad peržiūrėtumėte įtrauktą informaciją. Konkrečiai:

daktaras Roomba

Ir dar vienas labai svarbus momentas.

Kai atsisiųsite failus iš aukščiau esančios nuorodos, ĮDĖKITE JUS Į APRAŠYMĄ, KURĮ APRAŠYJU, nes „Matlab“reikalauja, kad vartotojo sukurti failai būtų dabartiniame darbo aplanke.

Kai tai atsitiks, pereikime prie kodo.

2 žingsnis: suraskite visus tuos jutiklius

Rasti visus tuos jutiklius
Rasti visus tuos jutiklius
Rasti visus tuos jutiklius
Rasti visus tuos jutiklius

Skirkite sekundę ir patikrinkite „iRobot®“. Gera žinoti, kur jie yra, todėl turite supratimą apie įvestis, kurias gauna „Robo-Technician“, ir galėsite suprasti, kodėl dalykas sukasi ratais, o ne eiti nustatytu keliu (tai gali arba galėjo nebūti). Akivaizdu, kad priekyje pamatysite didelį fizinio smūgio jutiklį. Uolos jutiklius yra šiek tiek sunkiau pamatyti, turėsite jį apversti ir ieškoti keturių skaidrių plastikinių langų šalia priekinio krašto. Šviesos smūgio jutikliai yra dar labiau paslėpti, tačiau kol kas užteks pasakyti, kad tiesioginė blizgančios juodos juostos eina aplink „iRobot®“priekį, esantį fizinio smūgio jutiklio juostos priekyje.

Yra ratų kritimo jutikliai, tačiau jie nenaudojami šiame projekte, todėl pereisime prie jutiklių bandymo.

3 veiksmas: testavimas nustatant parametrus

Testavimas nustatant parametrus
Testavimas nustatant parametrus

Kad galėtume išsiųsti „Robo-Technician“atlikti savo darbą, turime išsiaiškinti konkrečias jo keistenybes ir jutiklių diapazonus. Kadangi kiekvienas „iRobot®“yra šiek tiek kitoks ir keičiasi per visą roboto gyvenimą, turime išsiaiškinti, kaip jutikliai nuskaito sritis, kuriose jis veiks. Lengviausias būdas tai padaryti yra nustatyti šviesios spalvos kelią (Aš naudojau balto spausdintuvo popieriaus juosteles, bet viskas, ką padarys šviesios spalvos) ant paviršiaus, kurį veiks „Robo-Technician“.

Paleiskite „Matlab“ir atidarykite naują scenarijų. Išsaugokite scenarijų tame pačiame aplanke, kurį aprašiau EARLIER, ir pavadinkite jį taip, kaip norite (vis dėlto stenkitės, kad jis būtų trumpas, nes šio failo pavadinimas bus funkcijos pavadinimas). Įjunkite robotą ir naudokite „roomba“kintamojo sąranką iš mokymo programos, įvesdami komandas į komandų langą.

Įsitikinkite, kad „Raspberry Pi“yra prijungtas prie „iRobot®“ir jūsų kompiuteris prijungtas prie to paties interneto ryšio. Jūs praleisite mažiau laiko ištraukdami plaukus, bandydami išsiaiškinti, kodėl „Matlab“neprisijungs

r = roomba (numeris, kurį nustatėte)

Kintamasis „r“šiuo atveju nėra būtinas, jį galite pavadinti kaip norite, tačiau tai palengvina gyvenimą naudojant vienos raidės kintamąjį.

Kai kelias bus nustatytas ir „roomba“bus sėkmingai prijungtas, būsimąjį „Robo-Technician“pastatykite ten, kur vienas ar du uolos jutikliai yra virš kelio. Akivaizdu, kad tai reiškia, kad kiti du ar trys yra virš jūsų pasirinkto paviršiaus.

Dabar paleiskite bandymo jutiklius naudodami komandą:

r.testSensors

Atminkite, kad „r.“Yra kintamasis, kurį apibrėžėte anksčiau, taigi, jei tai nėra „r“, pakeiskite „r“. kad ir ką nuspręstumėte. Tai parodys bandymo jutiklio ekraną su daugybe informacijos.

Šiame projekte sutelkite dėmesį į „LightBamper“, buferius ir uolų dalis. Perkelkite „Robo-Technician“ir būtinai stebėkite, kaip jutikliai keičiasi skirtinguose paviršiuose arba kaip arti turi būti objektas, kad pasikeistų šviestuvo buferio vertės ir pan. Turėkite omenyje šiuos skaičius (arba užsirašykite), nes reikia, kad jie per sekundę nustatytų jūsų parametrus.

4 žingsnis: kodo paleidimas

Pirmiausia sukursite funkciją. Aš tai pavadinau „keliu“, bet vėlgi, pavadinimas nebūtinas, bet nuo šiol jį vadinsiu „keliu“.

Viršutinėje kodo dalyje nustatomos kai kurios vartotojo įvesties parinktys. Jis sukuria kai kuriuos sąrašus, kurie bus naudojami sąraše „listdlg“, ir tada parodo sąrašo dialogo langą. Tai leidžia vartotojui pasirinkti, kuria kelio spalva jis nori sekti, o vėliau pasirodys.

sąrašas = {'Raudona', 'Mėlyna', 'Žalia'}

problist = {'Avarija, išsaugoti vaizdą', 'Komponentas ne vietoje, išsaugoti vaizdą', 'Tikimasi, tęsti'} pathcolor = listdlg ('PromptString', 'Pasirinkite kelio spalvą', … 'SelectionMode', 'single', 'ListString', list) prob = 0; variklis = ;

Čia reikia deklaruoti kintamuosius „prob“ir „driv“, nes jie bus naudojami funkcijos pagrindinėje ciklo viduje, tačiau vėlgi, jei norite pervardyti bet kurį iš šių kintamųjų arba pakeisti sąrašo pasirinkimus, viskas gerai, kol likusioje kodo dalyje esate nuoseklus.

5 veiksmas: „ciklo viršuje“: fiziniai smūgių jutikliai

Nors ciklo viršuje yra fizinio smūgio jutiklio logika. Iš esmės, kai „Robo-Technician“susiduria su tuo, ką jis sustabdo (arba priekinio smūgio jutikliui jis sukuria 0,1 metro atsarginę kopiją), tada nusifotografuoja. Pirmiausia padengiame greičio ir padėties valdymo dalį.

Jei ankstesniuose veiksmuose išbandėte visus „Robo-Technician“jutiklius, žinosite, kad smūgio jutiklių loginė vertė (0 arba 1) yra lygi nuliui, o tai reiškia įprastą, nespaustą jutiklio padėtį. Turėkite tai omenyje dėl kodo.

nors tiesa %main, o kilpa %gauna buferio informaciją S = r.getBamperiai, jei S. kairė ~ = 0 r. stop stopif S. right ~ = 0 r. stop elseif S. front ~ = 0 r. stop end

Tai yra pagrindinė dalis „jei kažkas atsitrenkia, sustabdyk“. Jei jutikliai aptinka susidūrimą, jis pereina į kitą kodo dalį, kuri pakoreguoja „Robo-Technician“padėtį, kad gautų nuotrauką.

jei S.left ~ = 0 %, jei kilpa paima buferio informaciją ir sulygiuoja fotoaparatą r.turnAngle (5) pauzė (0.5) img = r.getImage %fotografuoja ir rodo vaizdą (img) %dialogo langas prob = listdlg (' „PromptString“, „Rasta netikėtų kliūčių, prašome identifikuoti“…, „SelectionMode“, „single“, „ListString“, problemist) elseif S.right ~ = 0 r.turnAngle (-5) pause (0.5) img = r. getImage image (img) prob = listdlg ('PromptString', 'Found a netikėta kliūtis, prašome identifikuoti' …, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) pristabdyti (0.5)

Iš esmės, kai vaizdas bus nufotografuotas, pasirodys kitas dialogo langas su trimis parinktimis. Pirmosios dvi parinktys išsaugo nuotrauką nurodytame aplanke, kurį vėliau padengsiu, o trečiasis variantas tiesiog uždaro dialogo langą ir tęsia ciklą. Jei neprisimenate parinkčių, peržiūrėkite ankstesnį veiksmą.

Dabar įkišau kodo skyrių tarp smūgio jutiklio dalies ir nuotraukų išsaugojimo dalies. Tai paima „LightBumper“vertes ir nustato važiavimo greitį iki 0,025 metro per sekundę (labai lėtai), o tai iš tikrųjų nėra būtina, tačiau tai sumažina „Robo-Technician“smūgį į daiktus ir galiausiai susidėvi fizinius smūgio jutiklius.

L = r.getLightBumpers, jei L.kairė> 100 || L.leftFront> 100 || L.rightFront> 100 || L. dešinė> 100 pavarų = 0,025 aps. R

Tai būtų ta dalis, kurioje atsiras vertybės, kurias anksčiau stebėjote (ir, tikiuosi, užsirašėte)

„L. (jutiklio kraštas ir kryptis)> 100“buvo pagrįstas mano pastebėtomis vertėmis, todėl jei jūsų pastebėjimai skiriasi, pakeiskite šiuos skaičius. Idėja yra ta, kad jei robotas-technikas pajus ką nors kelis centimetrus priešais jį, jis sulėtės, be to, tai nereikalinga.

Kita dalis yra vieta, kur nuotraukos išsaugomos vėlesniam laikui.

%jei pirmoji ar antroji parinktis buvo pasirinkta prob dialogo lange, išsaugo vaizdą, jei prob == 1 %jei kilpa sukuria failo informaciją nuotraukai, rašo su laiko žyma t = clock; bazinis pavadinimas = 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 (aplankas, bazinis pavadinimas); imwrite (img, fullFileName) uždaryti 1 pav. pauzė (2) elseif prob == 2 t = laikrodis; bazinis pavadinimas = 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 (aplankas, bazinis pavadinimas); imwrite (img, fullFileName) uždaryti 1 pav. pauzė (2) pabaiga

Visi failų pavadinimai ir vietos, kur nuotraukos išsaugomos, yra neprivalomi. Aš pasirinkau aplanką, įterptą įžanginio žingsnio sukurto „roomba“aplanko viduje, tačiau jis gali būti bet kurioje jūsų pasirinktoje vietoje. Be to, nuotraukos išsaugomos su laiko žyma, tačiau tai nėra ypač būtina (nors hipotetiškai tai būtų naudinga Marso misijai).

Uždengus fizinius smūgio jutiklius, galime pereiti prie uolos jutiklių ir sekti kelią.

6 žingsnis: eikite keliu

Uolos jutiklių kodas nustatytas dviejų priekinių ir dviejų šoninių jutiklių verčių palyginimui. Turėsite pakeisti šias vertes (tikriausiai) pagal pastebėtas vertes. Taip pat tikriausiai turėsite redaguoti šias vertes po kelių bandymų ir pakeisti jas pagal aplinkos apšvietimą, paros laiką (priklausomai nuo to, kaip gerai apšviesta bandymo zona) arba kai jutiklio langai yra nešvarūs.

Tačiau prieš pereidami prie uolos jutiklio kodo, įterpiau trumpą kodo segmentą I, kad išplautumėte kai kuriuos nereikalingus „Matlab“duomenis. Ši dalis nereikalinga, bet aš ją naudojau, kad sumažintų saugyklą, reikalingą programai paleisti.

clear img clear t clear basename clear fullFileName clear folder

Kitas kodo segmentas yra projekto mėsa. Tai leidžia „Robo-Technikui“sekti ant grindų pastatytą šviesios spalvos kelią. Trumpai tariant, jis bando nukreipti save taip, kad priekiniai du uolos jutikliai būtų virš ribos, atsižvelgiant į jūsų pastebėtas vertes, ir leidžia programai pradėti vaizdo apdorojimo veiksmus šiek tiek vėliau.

C = r.getCliffSensors %, jei kilpa eina pagal spalvų juostą (balta), jei C.leftFront> 2000 && C.rightFront> 2000 %tiesaus kelio nukreipimo r.setDriveVelocity (pavaros) elseif C.leftFront 2000 %sukasi į dešinę, jei robotas eina per toli kairė r.turnAngle (-2,5) elseif C.leftFront> 2000 && C.rightFront <2000%pasuka į kairę, jei robotas eina per toli į dešinę r.turnAngle (2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 img = r.getImage end %tikrina, ar yra kelio vingis, jei C. kairė> 2800 && C. dešinė <2800 r.turnAngle (2.5) elseif C.left 2800 r.turnAngle (- 2.5) pabaigos %vietos laikiklis kelio vaizdo atpažinimo diske („GETTING IMAGE“) pabaigos pabaiga

Turėkite omenyje, kad mano pasirinkti kintamųjų pavadinimai yra neprivalomi, tačiau vėlgi manau, kad tai palengvina galimybę naudoti vienos raidės kintamuosius, kai įmanoma

Norėdami paaiškinti vidurinę kodo dalį, kai du priekiniai jutikliai nusileidžia nuo kelio krašto (kai kalbama apie sankryžą arba kai jis pasiekia kelio pabaigą), atrodo, ar priešais jį yra kažkas. Kad tai veiktų, turėsite pastatyti objektą ant žemės kelio gale arba bet kurioje sankryžoje.

Kai nuotrauka padaryta, ji naudoja vaizdo atpažinimą, kad išsiaiškintų, ką daryti. Šioje kodo skiltyje taip pat yra vietos turėtojas:

%vietos turėtojas kelio vaizdui atpažinti

Šiuo metu tai naudojau, nes norėjau konkrečiai pakalbėti apie teksto ir spalvų apdorojimą, kuris yra kitame žingsnyje.

7 žingsnis: vaizdo apdorojimas

Yra dvi vaizdo apdorojimo dalys. Pirmasis yra spalvų atpažinimas, kuris apskaičiuoja spalvos intensyvumą paveikslėlyje, kad nuspręstų, ar tęsti teksto atpažinimą. Spalvų skaičiavimai grindžiami tuo, kas buvo pasirinkta tame pačiame pirmame dialogo lange pradžioje (naudojau raudoną, mėlyną, žalią, bet galite pasirinkti bet kokias norimas spalvas, jei vidutinės spalvos intensyvumo vertės gali būti atpažįstamos pagal „Raspberry Pi“fotoaparatas).

img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) raudona = vidurkis (vidutinis (imgb (:,:, 1))); g = vidurkis (vidurkis (imgb (:,:, 2))); b = vidurkis (vidurkis (imgb (:,:, 3)));

Tai yra intensyvumo patikrinimas. Tai bus naudojama kitame segmente, norint nuspręsti, ką jis nori daryti.

jei raudona> g && raudona> b, jei kelio spalva == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img), jei R. Žodžiai {1} == VAIZDAS || R. Žodžiai {2} == VAIZDAS || R. Žodžiai {3} == VAIZDAS t = laikrodis; bazinis pavadinimas = 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 (aplankas, bazinis pavadinimas); imwrite (img, fullFileName) pause (2) elseif R. Žodžiai {1} == RIGHT || R. Žodžiai {2} == TEISINGAS || R. Words {3} == TEISINGAS r.turnAngle (-75) elseif R. Words {1} == LEFT || R. Žodžiai {2} == KAIRĖ || R. Words {3} == LEFT r.turnAngle (75) elseif R. Words {1} == ATGAL || R. Žodžiai {2} == ATGAL || R. Words {3} == BACK r.turnAngle (110) end else r.turnAngle (110) end end

Šis segmentas nusprendžia, ar pirmoje dialogo lange pasirinkta spalva atitinka fotoaparato matomą spalvą. Jei taip, jis paleidžia teksto atpažinimą. Atrodo, kuris žodis (IMAGE, BACK, RIGHT arba LEFT) pasirodo, o po to arba pasisuka (dešinėn ir kairėn), sukasi aplink (nugarai) arba nufotografuoja ir išsaugo tą patį, kaip ir anksčiau.

Pateikiau tik vieną skirtingų spalvų kodo skyrių

Jei norite, kad kodas atpažintų mėlyną ir žalią spalvas, tiesiog nukopijuokite kodą ir pakeiskite logikos patikrinimą segmento viršuje ir nustatykite „pathcolor == (skaičius)“, kad jis atitiktų spalvų pasirinkimus viršutiniame dialogo lange (kodą, kaip jis rodomas, mėlyna spalva būtų 2, o žalia - 3).

8 žingsnis: Galutinis produktas

Gatavas produktas
Gatavas produktas

Dabar robotas-technikas turėtų priartinti Marso misijos modulius ir pranešti astronautams, kai kas nors yra ne vietoje.

Atminkite, kad visas uolos jutiklio ir „LightBumper“vertes reikia pakeisti į tas, kurios stebimos. Be to, iš patirties supratau, kad geriau išbandyti šį projektą ant tamsios spalvos grindų ir dar geriau, jei tos grindys neatspindi. Dėl to padidėja kontrastas tarp kelio ir grindų, todėl yra didesnė tikimybė, kad „Robo-Technician“teisingai juo seks.

Tikimės, kad jums patiko įsteigti mažą pagalbininką misijai „Marsas“ir smagiai kuriate.

Rekomenduojamas: