Cuprins:

Robo-tehnician: 8 pași
Robo-tehnician: 8 pași

Video: Robo-tehnician: 8 pași

Video: Robo-tehnician: 8 pași
Video: Sistem de control al viscozitatii 2024, Iulie
Anonim
Robo-tehnician
Robo-tehnician

Imaginați-vă pentru o secundă că sunteți unul dintre astronauții care aterizează pe Marte. Aveți un milion de lucruri de făcut, eșantioane de luat, experimente de rulat, date de colectat, dar o dată sau de două ori pe zi trebuie să rulați în jurul modulelor de locuire și / sau de cercetare în care locuiți și lucrați pentru a le inspecta. Este necesar, cineva trebuie să se asigure că lucrurile sunt în formă bună, că toate miile de piese și piese funcționează și sunt la locul lor. Dar dacă ar exista un ajutor automat care să vă scutească de unele dintre aceste sarcini. Ce se întâmplă dacă ar exista un mic robot care să se poată deplasa în interiorul modulelor pentru a se asigura că totul este la locul său, funcționează și este sigur.

Robo-tehnician la salvare.

În esență, acest cod controlează Robo-Tehnicianul pe măsură ce urmează o cale de culoare deschisă la sol. Acesta va urma această cale până când va găsi o intersecție în cale sau o cotitură, ceea ce va determina să fie făcută o fotografie pentru procesarea imaginii, pentru a permite Robo-Tehnicianului să ia o decizie cu privire la unde să meargă mai departe. Senzorii de umflare ușoară și de umflare funcționează pentru a proteja Robo-Technicianul de daune, iar senzorii de umflare controlează momentul în care va fi făcută o fotografie de diagnostic. Împreună, Robo-Tehnicianul este conceput pentru a mări modulele Mar, eliberând timpul astronauților în timp ce îndeplinește sarcina de bază a inspecției, solicitând doar aportul uman atunci când găsește ceva greșit.

Din nou, ca avertisment, aceasta este o lucrare în desfășurare. Codul, așa cum există, funcționează, dar îl are sughiț, mai ales că sunt implicate mai multe programe suprapuse. De asemenea, pentru ca acest proiect să funcționeze într-o misiune reală pe Marte, ar trebui construit un robot pentru acest scop specific, așa că din nou cred că aceasta este o construcție „dovadă de concept”.

Există câteva lucruri de care veți avea nevoie pentru a pune acest lucru în funcțiune. Veți avea nevoie de un program scump, de pachete de asistență pentru acel program și de o mică experiență în codificare. Întrucât sunt student, iar unele dintre codurile de la parter au fost furnizate (pentru raspberry pi), nu voi vorbi în mod specific despre instalare. Mai jos puteți găsi toate linkurile pentru codul de bază respectiv. Să trecem la lista materialelor.

Hardware

  • Raspberry Pi (am folosit versiunea 3)
  • iRobot ®
  • un fel de dispozitiv de reținere pentru a menține Raspberry Pi atașat la Robo-Tehnician
  • Camera Raspberry Pi (nu contează ce fel, atâta timp cât are o focalizare automată bună și o rezoluție a imaginii)
  • un fel de suport sau toc care să țină camera orientată în față pe Robo-Technician
  • un material de utilizat ca bandă, albă (sau foarte deschisă la culoare), care este ținută pe podea în siguranță. Trebuie să fie doar puțin mai larg decât spațiul dintre cei doi senzori din stâncă din față.
  • 4 semne cu text foarte mare (cu cuvintele IMAGINE, DREAPTA, ÎNAPOI și STÂNGA tipărite pe ele)
  • Foi de hârtie colorată (cel puțin trei și de preferință roșu, verde și albastru)

Software

  • Matlab (2018a și 2017b au fost folosite ambele și par să facă puțin diferență)
  • Pachet de asistență Raspberry Pi pentru Matlab
  • Cod Raspberry Pi pentru conectarea la Matlab (link către codul sursă furnizat mai jos)
  • Casetă de instrumente de procesare a imaginilor pentru Matlab (aproape nu puteți face acest proiect fără caseta de instrumente)
  • OPȚIONAL: Matlab Mobile este instalat pe telefonul dvs., pe care îl voi explica mai târziu

Pasul 1: Configurarea hardware-ului

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

Acesta este linkul pentru codul de bază pentru a vă asigura că iRobot® poate comunica cu Matlab, împreună cu un tutorial de bază. Așa cum am spus mai înainte, nu voi acoperi această porțiune specifică, deoarece tutorialul este deja foarte bine pus la punct. Voi menționa că odată ce ați urmat pașii de pe link, puteți utiliza comanda „doc” a Matlab pentru a căuta peste informațiile incluse. Specific:

doc roomba

Și încă un punct foarte important.

Când descărcați fișierele de pe linkul de mai sus, PUNEȚI-LE ÎN FOLDERUL DESCRIS DE MAI SUS, deoarece Matlab cere ca fișierele generate de utilizator să fie în folderul de lucru curent.

Cu asta în afara drumului, să trecem la cod.

Pasul 2: Găsirea tuturor acelor senzori

Găsirea tuturor senzorilor
Găsirea tuturor senzorilor
Găsirea tuturor senzorilor
Găsirea tuturor senzorilor

Faceți o secundă și inspectați iRobot®. Este bine să știți unde sunt acestea, astfel încât să aveți o idee despre intrările pe care Robo-Tehnicianul le primește și veți putea afla de ce lucrul se învârte în cercuri în loc să urmeze calea pe care o veți configura (acest lucru ar putea sau s-ar putea să nu se fi întâmplat). În mod evident, veți vedea marele senzor fizic de umflare din față. Senzorii de stâncă sunt puțin mai dificil de văzut, va trebui să-l răsturnați și să căutați cele patru ferestre din plastic transparent de lângă marginea frontală. Senzorii de lumină sunt chiar mai ascunși, dar deocamdată va fi suficient să spunem că live-ul din banda neagră strălucitoare se desfășoară în jurul părții frontale a iRobot®, care se află în partea din față a barei senzorului fizic.

Există senzori de cădere a roților, dar aceștia sunt neutilizați în acest proiect, așa că vom trece la testarea senzorilor.

Pasul 3: Testarea pentru a seta parametrii

Testarea la setarea parametrilor
Testarea la setarea parametrilor

Înainte de a-l putea trimite pe Robo-Technician să-și îndeplinească treaba, trebuie să ne dăm seama de ciudățenii și gamele de senzori specifice. Deoarece fiecare iRobot® este puțin diferit și se schimbă de-a lungul duratei de viață a robotului, trebuie să ne dăm seama cum citesc senzorii peste zonele în care va funcționa. Cel mai simplu mod de a face acest lucru este să vă configurați o cale de culoare deschisă (Am folosit fâșii de hârtie albă pentru imprimantă, dar orice lucru de culoare deschisă va face) pe suprafața pe care Robo-Tehnicianul o va opera.

Porniți Matlab și deschideți un nou script. Salvați scriptul în același folder pe care l-am descris mai devreme și denumiți-l oricum doriți (totuși, încercați să îl păstrați scurt, deoarece numele acestui fișier va fi numele funcției). Porniți robotul și utilizați setarea variabilei roomba din tutorial, tastând comenzile în fereastra de comandă.

Asigurați-vă că Raspberry Pi este conectat la iRobot® și că computerul dvs. este conectat la aceeași conexiune la internet. Veți petrece mai puțin timp scoțându-vă părul încercând să vă dați seama de ce Matlab nu se va conecta

r = roomba (numărul pe care l-ați configurat)

Variabila „r” în această situație nu este necesară, o puteți numi oricum doriți, dar face viața mai ușoară utilizarea unei variabile cu o singură literă.

Odată ce calea este configurată și roomba a fost conectată cu succes, așezați viitorul Robo-Tehnician unde unul sau doi dintre senzorii de stâncă sunt deasupra căii. Evident, asta înseamnă că celelalte două sau trei sunt deasupra suprafeței pe care ați ales-o.

Acum porniți senzorii de testare cu comanda:

r.testSensors

Rețineți că „r.” Este variabila pe care ați definit-o mai devreme, deci dacă nu este „r”, schimbați „r”. la orice ai decis. Aceasta va afișa ecranul senzorului de testare cu o mulțime de informații.

Pentru acest proiect, concentrați-vă pe secțiunile lightBumpers, bare de protecție și faleze. Mutați Robo-Tehnicianul asigurându-vă că urmăriți modul în care senzorii se schimbă pe diferite suprafețe sau cât de aproape trebuie să fie un obiect pentru ca valorile ligthBumper să se schimbe etc. Păstrați aceste numere în minte (sau scrieți-le) pentru că veți nevoie de ei pentru a seta parametrii dvs. într-o secundă.

Pasul 4: Pornirea codului

În primul rând, veți construi o funcție. Am numit-o „cale”, dar din nou, numele nu este necesar, dar mă voi referi la ea ca „cale” de acum înainte.

Partea superioară a codului configurează unele opțiuni de introducere a utilizatorului. Construiește câteva liste care vor fi utilizate în listdlg și apoi va afișa o casetă de dialog listă. Aceasta permite utilizatorului să selecteze culoarea căii pe care dorește să o urmeze, care va intra în joc mai târziu.

list = {'Roșu', 'Albastru', 'Verde'}

problist = {'Casualty, Save Image', 'Component Out of Place, Save Image', 'Expected, Continue'} pathcolor = listdlg ('PromptString', 'Select a Path Color', … 'SelectionMode', 'single', 'ListString', list) prob = 0; driv = ;

Variabilele „prob” și „driv” trebuie declarate aici deoarece vor fi folosite în interiorul buclei main while a funcției, dar din nou, dacă doriți să redenumiți oricare dintre aceste variabile sau să schimbați selecțiile din listă, este bine atât timp cât ești consecvent în restul codului.

Pasul 5: Partea de sus a buclei While: senzori fizici de lovire

Partea superioară a buclei while conține logica senzorului fizic. Practic, atunci când Robo-Tehnicianul se confruntă cu ceva care se oprește (sau pentru senzorul frontal de umflare face o rezervă de 0,1 metri), atunci se poziționează pentru a face o fotografie. Să acoperim mai întâi porțiunea de control al vitezei și poziției.

Dacă ați testat toți senzorii pe Robo-Tehnician în pașii anteriori, veți ști că senzorii de lovire au o valoare logică (0 sau 1) cu zero reprezentând poziția normală, ne-apăsată a senzorului. Rețineți acest lucru pentru cod.

while true% main while loop% prime bumper info S = r.getBumpers if S.left ~ = 0 r.stop elseif S.right ~ = 0 r.stop elseif S.front ~ = 0 r.stop end

Aceasta este partea de bază „dacă lovește ceva, oprește-te”. Dacă senzorii detectează o coliziune, atunci se deplasează pe următoarea porțiune a codului, care reajustează poziția robotului tehnician pentru a obține o fotografie.

dacă S. stânga ~ = 0% dacă bucla ia informații despre bara de protecție și aliniază camera pentru fotografie r.turnAngle (5) pauză (0,5) img = r.getImage% face fotografie și afișează imaginea (img)% casetă de dialog prob = listdlg (' PromptString ',' Am găsit un obstacol neașteptat, vă rugăm să identificați '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) pauză (0,5) img = r. getImage image (img) prob = listdlg ('PromptString', 'Am găsit un obstacol neașteptat, vă rugăm să identificați' …, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) pauză (0.5) img = r.getImage image (img) prob = listdlg ('PromptString', 'A găsit un obstacol neașteptat, vă rugăm să identificați' …, 'SelectionMode', 'single', 'ListString', problist) end

Practic, odată realizată imaginea, va apărea o altă casetă de dialog cu trei opțiuni. Primele două opțiuni salvează fotografia într-un folder specificat, pe care îl voi acoperi mai târziu, în timp ce a treia opțiune pur și simplu închide caseta de dialog și continuă prin buclă. Dacă nu vă amintiți opțiunile, aruncați o privire la pasul anterior.

Acum am inserat o secțiune de cod între porțiunea senzorului de umflare și porțiunea de salvare a fotografiilor. Acest lucru ia valorile LightBumper și setează viteza de acționare la 0,025 metri / secundă (foarte lent), ceea ce nu este de fapt necesar, dar îl reduce pe Robo-Tehnicianul care lovește lucrurile și, în cele din urmă, uzează senzorii fizici de lovire.

L = r.getLightBumpers dacă L.stânga> 100 || L.leftFront> 100 || L.rightFront> 100 || L. dreapta> 100 driv = 0,025 r.setDriveVelocity (0,025) alt driv = 0,1 capăt

Aceasta ar fi partea în care valorile pe care le-ați observat (și, sperăm, le-ați notat) mai devreme intră în joc

„L. (latura și direcția senzorului)> 100” s-a bazat pe valorile pe care le-am observat, deci dacă observațiile dvs. sunt diferite, modificați aceste numere. Ideea este că, dacă Robo-Tehnicianul simte ceva la câțiva centimetri în față, acesta va încetini, cu atât mai mult decât atât este inutil.

Următoarea porțiune este locul în care sunt salvate fotografiile pentru mai târziu.

% dacă prima sau a doua opțiune a fost selectată în dialogul prob, salvează imaginea dacă prob == 1% dacă bucla creează informații despre fișier pentru fotografie, scrie cu marcaj de timp t = ceas; nume de bază = 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 (folder, nume de bază); imwrite (img, fullFileName) închide Figura 1 pauză (2) elseif prob == 2 t = ceas; nume de bază = 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 (folder, nume de bază); imwrite (img, fullFileName) închide Figura 1 pauză (2) sfârșit

Toate numele fișierelor și locațiile în care sunt salvate fotografiile sunt opționale. Am ales un folder care este cuibărit în folderul roomba pe care l-am creat în pasul de introducere, dar poate fi oriunde ați ales. De asemenea, fotografiile sunt salvate cu marcajul de timp, dar acest lucru nu este deosebit de necesar (deși ar fi ipotetic util pentru o misiune pe Marte).

Cu senzorii de umflare fizici acoperiți, ne putem deplasa pe senzorii de stâncă și pe traseul următor.

Pasul 6: Urmărind calea

Codul pentru senzorii de stâncă este configurat pentru a compara valorile celor două valori ale senzorului frontal și al celor două laterale. Va trebui să modificați aceste valori (probabil) pe baza valorilor observate. De asemenea, probabil că va trebui să editați aceste valori după câteva teste și să le modificați în funcție de lumina ambientală, ora din zi (în funcție de cât de bine este iluminată zona de testare) sau când geamurile senzorului sunt murdare.

Cu toate acestea, înainte de a ajunge la codul senzorului de stâncă, există un segment scurt de cod introdus pentru a spăla unele dintre datele inutile de la Matlab. Această parte nu este necesară, dar am folosit-o pentru a reduce spațiul de stocare necesar pentru a rula programul.

clear img clear t clear nume de bază clear fullFileName clear folder

Următorul segment de cod este carnea proiectului. Permite Robo-Tehnicianului să urmeze calea de culoare deschisă care a fost așezată pe podea. Pe scurt, încearcă să se orienteze, astfel încât cei doi senzori din stâncă din față să fie peste prag, pe baza valorilor observate, și permite programului să înceapă pașii de procesare a imaginii puțin mai târziu.

C = r.getCliffSensors% dacă bucla urmează o bandă de culoare (alb) dacă C.leftFront> 2000 && C.rightFront> 2000% ghidare cale dreaptă r.setDriveVelocity (driv) elseif C.leftFront 2000% virează la dreapta dacă robotul merge prea departe left r.turnAngle (-2,5) elseif C.leftFront> 2000 && C.rightFront <2000% virează la stânga dacă robotul merge prea departe la dreapta r.turnAngle (2,5) elseif C.leftFront <2000 && C.rightFront 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 img = r.getImage end% verifică dacă există o îndoire în cale dacă C. stânga> 2800 && dreapta <2800 r.turnAngle (2.5) altfel dacă C. stânga 2800 r.turnAngle (- 2.5) sfârșit% deținător de locație pentru recunoașterea imaginii căii disp („GETTING IMAGE”) sfârșit sfârșit

Rețineți că numele variabilelor pe care le-am ales sunt opționale, dar din nou cred că face viața mai ușoară utilizarea variabilelor cu o singură literă atunci când este posibil

Pentru a explica secțiunea din mijloc a codului, atunci când cei doi senzori din față fug de marginea căii (când vine vorba de o intersecție sau când ajunge la capătul căii) se pare să vadă dacă există ceva în fața sa. Va trebui să plasați un obiect pe sol la capătul căii sau la orice intersecție pentru ca acest lucru să funcționeze.

Odată ce fotografia este făcută, aceasta folosește recunoașterea imaginii pentru a afla ce să facă. Există și un deținător de locuri în această secțiune de cod:

% deținător de locație pentru recunoașterea imaginii căii ("OBȚINEREA IMAGINILOR")

Am folosit acest lucru pentru moment, deoarece am vrut să vorbesc în mod special despre procesarea textului și a culorii care are loc, care este la pasul următor.

Pasul 7: Prelucrarea imaginilor

Procesarea imaginii are două părți. Mai întâi este recunoașterea culorilor, care calculează intensitatea culorii din imagine pentru a decide dacă să continuați sau nu cu recunoașterea textului. Calculele culorilor se bazează pe alegerea care a fost făcută în acea primă casetă de dialog la început (am folosit roșu, albastru, verde, dar puteți alege orice culori doriți, atâta timp cât valorile medii pentru intensitatea culorii pot fi recunoscute de Cameră 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]) roșu = medie (medie (imgb (:,:, 1))); g = medie (medie (imgb (:,:, 2))); b = medie (medie (imgb (:,:, 3)));

Aceasta este verificarea intensității. Aceasta va fi utilizată în următorul segment pentru a decide ce vrea să facă.

if red> g && red> b if pathcolor == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img) if R. Words {1} == IMAGE || R. Cuvinte {2} == IMAGINE || R. Cuvinte {3} == IMAGINE t = ceas; nume de bază = 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 (folder, nume de bază); imwrite (img, fullFileName) pauză (2) elseif R. Words {1} == DREAPTA || R. Cuvinte {2} == DREPT || R. Words {3} == DREAPTA r.turnAngle (-75) elseif R. Words {1} == STÂNGA || R. Cuvinte {2} == STÂNGA || R. Words {3} == STÂNGA r.turnAngle (75) elseif R. Words {1} == ÎNAPOI || R. Cuvinte {2} == ÎNAPOI || R. Words {3} == ÎNAPOI r.turnAngle (110) end else r.turnAngle (110) end end

Acest segment decide dacă culoarea care a fost selectată în prima casetă de dialog se potrivește cu culoarea pe care o vede camera. Dacă o face, rulează recunoașterea textului. Se pare să vadă ce cuvânt (IMAGINE, ÎNAPOI, DREAPTA sau STÂNGA) apare și apoi fie se rotește (pentru dreapta și stânga), se rotește (pentru spate) sau face o fotografie și o salvează în același mod ca mai devreme.

Am furnizat doar o singură secțiune a codului pentru diferite culori

Pentru a permite codului să recunoască albastru și verde, pur și simplu copiați codul și modificați verificarea logică din partea de sus a segmentului și setați „pathcolor == (număr)” pentru a corespunde selecțiilor de culoare din caseta de dialog de sus (pentru cod așa cum este afișat, albastru ar fi 2 și verde ar fi 3).

Pasul 8: Produsul finit

Produsul finit
Produsul finit

Acum, Robo-Tehnicianul ar trebui să meargă în jurul modulelor misiunii Marte și să raporteze astronauților atunci când ceva nu este deplasat.

Amintiți-vă, toate valorile senzorului de stâncă și lightBumper trebuie să fie schimbate la valorile observate. De asemenea, din experiență, am găsit că este mai bine să testez acest proiect pe o podea de culoare închisă și este chiar mai bine dacă acea podea este nereflectantă. Acest lucru face ca contrastul să crească între cale și podea, ceea ce face mai probabil ca Robo-Tehnicianul să îl urmeze corect.

Sper că v-a plăcut să înființați un mic ajutor pentru misiunea Marte și să vă distrați construind.

Recomandat: