Sommario:

Robot-tecnico: 8 passaggi
Robot-tecnico: 8 passaggi

Video: Robot-tecnico: 8 passaggi

Video: Robot-tecnico: 8 passaggi
Video: Il ROBOT più ECONOMICO su AMAZON. Come va? 2024, Luglio
Anonim
Robot-Tecnico
Robot-Tecnico

Immagina per un secondo di essere uno degli astronauti che atterra su Marte. Hai un milione di cose da fare, campioni da prelevare, esperimenti da eseguire, dati da raccogliere, ma una o due volte al giorno devi correre intorno all'abitazione e/o ai moduli di ricerca in cui vivi e lavori per ispezionarli. È necessario, qualcuno deve assicurarsi che la cosa sia in buone condizioni, che tutte le migliaia di pezzi e parti funzionino e siano a posto. Ma cosa accadrebbe se ci fosse un assistente automatizzato per sollevarti da alcuni di questi compiti. E se ci fosse un piccolo robot in grado di muoversi all'interno dei moduli per assicurarsi che tutto fosse a posto, funzionante e al sicuro.

Robo-Tecnico in soccorso.

In sostanza, questo codice controlla il Robo-Tecnico mentre segue un percorso di colore chiaro sul terreno. Seguirà questo percorso fino a quando non troverà un incrocio nel percorso o una svolta, che richiederà di scattare una foto per l'elaborazione dell'immagine per consentire al robotecnico di prendere una decisione su dove andare dopo. I sensori di urto e di urto della luce funzionano per proteggere il Robo-Technician dai danni e i sensori di urto controllano quando verrà scattata una foto diagnostica. Nel complesso, il Robo-Technician è progettato per ingrandire i moduli di Mar, liberando il tempo degli astronauti mentre svolgono il compito di base dell'ispezione, richiedendo l'intervento umano solo quando trova qualcosa che non va.

Ancora una volta come avvertimento, questo è un lavoro in corso. Il codice, così com'è, funziona ma ha dei singhiozzi, soprattutto perché sono coinvolti più programmi sovrapposti. Inoltre, affinché questo progetto funzioni in una vera missione su Marte, dovrebbe essere costruito un robot per quello scopo specifico, quindi di nuovo immagino che questa sia una build "prova di concetto".

Ci sono alcune cose di cui avrai bisogno per farlo funzionare. Avrai bisogno di un programma costoso, pacchetti di supporto per quel programma e un po' di esperienza nella programmazione. Dato che sono uno studente e parte del codice del piano terra è stato fornito (per il raspberry pi), non parlerò specificamente della configurazione. Di seguito puoi trovare tutti i collegamenti per quel codice di base. Passiamo alla lista dei materiali.

Hardware

  • Raspberry Pi (abbiamo usato una versione 3)
  • iRobot®
  • una sorta di dispositivo di supporto per mantenere il Raspberry Pi attaccato al Robo-Technician
  • Fotocamera Raspberry Pi (non importa di che tipo, purché abbia una buona messa a fuoco automatica e una buona risoluzione dell'immagine)
  • una sorta di supporto o fondina per mantenere la fotocamera rivolta in avanti sul Robo-Technician
  • un materiale da usare come striscia, bianco (o di colore molto chiaro), che si tiene saldamente al pavimento. Deve essere solo leggermente più largo dello spazio tra i due sensori di dislivello anteriori.
  • 4 cartelli con testo molto grande (con le parole IMAGE, RIGHT, BACK e LEFT stampate su di essi)
  • Fogli di carta colorata (almeno tre e preferibilmente rosso, verde e blu)

Software

  • Matlab (2018a e 2017b sono stati entrambi utilizzati e sembrano fare poca differenza)
  • Pacchetto di supporto Raspberry Pi per Matlab
  • Codice Raspberry Pi per la connessione a Matlab (link al codice sorgente fornito di seguito)
  • Image Processing Toolbox per Matlab (praticamente non puoi fare questo progetto senza la cassetta degli attrezzi)
  • FACOLTATIVO: Matlab Mobile installato sul tuo telefono, che ti spiegherò più avanti

Passaggio 1: configurazione dell'hardware

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

Questo è il collegamento per il codice di base per garantire che iRobot® possa comunicare con Matlab, insieme a un tutorial di base. Come ho detto prima, non tratterò questa parte specifica poiché il tutorial è già molto ben strutturato. Menzionerò che una volta seguiti i passaggi sul collegamento, è possibile utilizzare il comando "doc" di Matlab per esaminare le informazioni incluse. Nello specifico:

doc roomba

E un altro punto molto importante.

Quando scarichi i file dal link sopra, METTILI NELLA CARTELLA CHE HO DESCRITTO SOPRA, poiché Matlab richiede che i file generati dall'utente si trovino nella cartella di lavoro corrente.

Detto questo, passiamo al codice.

Passaggio 2: trovare tutti quei sensori

Trovare tutti quei sensori
Trovare tutti quei sensori
Trovare tutti quei sensori
Trovare tutti quei sensori

Prenditi un secondo e dai un'occhiata all'iRobot®. È utile sapere dove sono, così hai un'idea degli input che il robotecnico sta ricevendo e sarai in grado di capire perché la cosa gira in tondo invece di seguire il percorso che imposterai (questo potrebbe o potrebbe non essere accaduto). Vedrai ovviamente il grande sensore di urto fisico sulla parte anteriore. I sensori della scogliera sono un po' più difficili da vedere, dovrai capovolgerlo e cercare le quattro finestre di plastica trasparente vicino al bordo anteriore. I sensori di collisione della luce sono ancora più nascosti, ma per ora basterà dire dal vivo nella fascia nera lucida che corre intorno alla parte anteriore dell'iRobot®, che si trova sulla parte anteriore della barra fisica del sensore di collisione.

Ci sono sensori di caduta delle ruote, ma questi non sono utilizzati in questo progetto, quindi passeremo a testare i sensori.

Passaggio 3: test per impostare i parametri

Test per impostare i parametri
Test per impostare i parametri

Prima di poter inviare il Robo-Technician a fare il suo lavoro, dobbiamo capire le sue stranezze specifiche e le gamme dei sensori. Poiché ogni iRobot® è leggermente diverso e cambia nel corso della vita del robot, dobbiamo capire come i sensori leggono le aree in cui opererà. Il modo più semplice per farlo è impostare il tuo percorso colorato (Ho usato strisce di carta bianca per stampante, ma qualsiasi cosa di colore chiaro andrà bene) sulla superficie che opererà il Robo-Technician.

Avvia Matlab e apri un nuovo script. Salva lo script NELLA STESSA CARTELLA CHE HO DESCRITTO PRIMA e chiamalo come vuoi (cerca di mantenerlo breve, poiché il nome di questo file sarà il nome della funzione). Accendi il robot e usa la configurazione della variabile roomba dal tutorial, digitando i comandi nella finestra dei comandi.

Assicurati che il Raspberry Pi sia collegato a iRobot® e che il tuo computer sia connesso alla stessa connessione Internet. Passerai meno tempo a strapparti i capelli cercando di capire perché Matlab non si connette

r = roomba (numero che hai impostato)

La variabile "r" in questa circostanza non è necessaria, puoi chiamarla come vuoi, ma rende la vita più facile usare una variabile a lettera singola.

Una volta che il percorso è stato impostato e il roomba è stato collegato con successo, posiziona il futuro Robo-Technician dove uno o due dei sensori di dislivello sono sopra il percorso. Ovviamente ciò significa che gli altri due o tre sono sopra la superficie che hai scelto.

Ora avvia i sensori di prova con il comando:

r.testSensors

Tieni presente che la "r." è la variabile che hai definito in precedenza, quindi se non è "r" cambia la "r." a qualunque cosa tu abbia deciso. Questo farà apparire la schermata del sensore di prova con un sacco di informazioni.

Per questo progetto concentrati sui lightBumpers, sui paraurti e sulle sezioni della scogliera. Muovi il Robo-Tecnico assicurandoti di osservare come cambiano i sensori su diverse superfici, o quanto deve essere vicino un oggetto affinché i valori di ligthBumper cambino, ecc. Tieni a mente questi numeri (o scrivili) perché ne ho bisogno per impostare i tuoi parametri in un secondo.

Passaggio 4: avvio del codice

Prima di tutto costruirai una funzione. L'ho chiamato "percorso" ma, ancora una volta, il nome non è necessario, ma d'ora in poi mi riferirò ad esso come "percorso".

La parte superiore del codice imposta alcune opzioni di input dell'utente. Crea alcuni elenchi che verranno utilizzati in in listdlg e quindi visualizza una finestra di dialogo elenco. Ciò consente all'utente di selezionare il colore del percorso che desidera seguire, che entra in gioco in seguito.

lista = {'Rosso', 'Blu', 'Verde'}

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

Le variabili "prob" e "driv" devono essere dichiarate qui poiché verranno utilizzate all'interno del ciclo while principale della funzione, ma ancora una volta, se si desidera rinominare una di queste variabili o modificare le selezioni dell'elenco, va bene finché sei coerente nel resto del codice.

Passaggio 5: parte superiore del ciclo While: sensori di bump fisici

La parte superiore del ciclo while contiene la logica del sensore di collisione fisico. Fondamentalmente, quando il Robo-Technician si imbatte in qualcosa si ferma (o per il sensore di urto anteriore esegue il backup di 0,1 metri), quindi si posiziona per scattare una foto. Copriamo prima la parte di controllo della velocità e della posizione.

Se hai testato tutti i sensori sul Robo-Technician nei passaggi precedenti, saprai che i sensori a urto hanno un valore logico (0 o 1) con zero che rappresenta la posizione normale, non premuta del sensore. Tienilo a mente per il codice.

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

Questa è la parte di base "se colpisce qualcosa, fermati". Se i sensori rilevano una collisione, si spostano sulla parte successiva del codice, che regola la posizione del Robo-Tecnico per ottenere una foto.

if S.left ~= 0 %if loop prende le informazioni sul paraurti e allinea la fotocamera per la foto r.turnAngle(5) pause(0.5) img = r.getImage %scatta foto e visualizza image(img) %dialog box prob = listdlg(' PromptString', 'Trovato un ostacolo imprevisto, identificare'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.right ~=0 r.turnAngle(-5) pause(0.5) img = r. getImage image(img) prob = listdlg('PromptString', 'Trovato un ostacolo imprevisto, identificare prego'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~= 0 r.moveDistance(- 0.1) pause(0.5) img = r.getImage image(img) prob = listdlg('PromptString', 'Trovato un ostacolo imprevisto, identificare prego'…, 'SelectionMode', 'single', 'ListString', problist) end

Fondamentalmente, una volta scattata l'immagine, apparirà un'altra finestra di dialogo con tre opzioni. Le prime due opzioni salvano la foto in una cartella specificata, che tratterò in seguito, mentre la terza opzione chiude semplicemente la finestra di dialogo e continua il ciclo. Se non ricordi le opzioni, dai un'occhiata al passaggio precedente.

Ora ho inserito una sezione di codice tra la porzione del sensore di collisione e la porzione di salvataggio delle foto. Questo prende i valori di LightBumper e imposta la velocità di guida a 0,025 metri/secondo (molto lenta), che in realtà non è necessaria, ma riduce il fatto che il Robo-Technician sbatte contro le cose e alla fine consuma i sensori di urto fisici.

L = r.getLightBumpers se L.left > 100 || L.sinistraFront >100 || L.destra Anteriore >100 || L.right >100 driv = 0.025 r.setDriveVelocity(0.025) altrimenti driv = 0.1 end

Questa sarebbe la parte in cui entrano in gioco i valori che hai osservato (e, si spera, annotato)

La "L. (lato e direzione del sensore) > 100" era basata sui valori che ho osservato, quindi se le tue osservazioni sono diverse, cambia questi numeri. L'idea è che se il Robo-Tecnico rileva qualcosa a pochi centimetri davanti a sé, rallenterà, più di quanto non sia necessario.

La parte successiva è dove le foto vengono salvate per dopo.

%se la prima o la seconda opzione è stata selezionata nella finestra di dialogo prob, salva l'immagine if prob == 1 %if il ciclo costruisce informazioni sul file per la foto, scrive con timestamp t = orologio; basename = 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(cartella, nomebase); imwrite(img, fullFileName) close Figura 1 pause(2) elseif prob == 2 t = clock; basename = 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(cartella, nomebase); imwrite(img, fullFileName) close Figura 1 pause(2) end

Tutti i nomi di file e le posizioni in cui vengono salvate le foto sono facoltativi. Ho scelto una cartella che è nidificata all'interno della cartella roomba che ho creato nel passaggio di introduzione, ma può essere ovunque tu scelga. Inoltre, le foto vengono salvate con il timestamp, ma ciò non è particolarmente necessario (sebbene sarebbe ipoteticamente utile per una missione su Marte).

Con i sensori fisici coperti, possiamo spostarci sui sensori della scogliera e seguire il percorso.

Passaggio 6: seguire il percorso

Il codice per i sensori di dislivello è impostato per confrontare i valori dei due valori dei sensori anteriori e dei due laterali. Dovrai modificare questi valori (probabilmente) in base ai valori osservati. Probabilmente dovrai anche modificare questi valori dopo alcune esecuzioni di test e cambiarli in base alla luce ambientale, all'ora del giorno (a seconda di quanto è ben illuminata l'area di test) o quando le finestre del sensore sono sporche.

Prima di arrivare al codice del sensore di dislivello, tuttavia, c'è un breve segmento di codice che ho inserito per eliminare alcuni dati non necessari da Matlab. Questa parte non è necessaria, ma l'ho usata per ridurre lo spazio di archiviazione necessario per eseguire il programma.

clear img clear t clear basename clear fullFileName cancella cartella

Il prossimo segmento di codice è la carne del progetto. Permette al Robo-Tecnico di seguire il percorso di colore chiaro che è stato posizionato sul pavimento. In poche parole, cerca di guidare se stesso in modo che i due sensori di dislivello anteriori siano al di sopra della soglia, in base ai valori osservati, e consenta al programma di iniziare le fasi di elaborazione dell'immagine un po' più tardi.

C = r.getCliffSensors %if il ciclo segue una banda di colore (bianco) se C.leftFront > 2000 && C.rightFront >2000 %guida del percorso rettilineo r.setDriveVelocity(driv) elseif C.leftFront 2000 %gira a destra se il robot va troppo lontano left r.turnAngle(-2.5) elseif C.leftFront >2000 && C.rightFront<2000%gira a sinistra se il robot va troppo lontano a destra r.turnAngle(2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.sinistraFront >100 || L.destra Anteriore >100 || L.right >100 img = r.getImage end %verifica se c'è una curva nel percorso se C.left >2800 && C.right <2800 r.turnAngle(2.5) elseif C.left 2800 r.turnAngle(- 2.5) end %segnaposto per il riconoscimento dell'immagine del percorso disp('GETTING IMAGE') end end end

Tieni presente che i nomi delle variabili che ho scelto sono facoltativi, ma ancora una volta penso che semplifichi la vita utilizzare variabili a lettera singola quando possibile

Per spiegare la sezione centrale del codice, quando i due sensori anteriori escono dal bordo del percorso (quando arriva a un incrocio o quando raggiunge la fine del percorso) cerca se c'è qualcosa davanti. Dovrai posizionare un oggetto a terra alla fine del percorso o in qualsiasi intersezione affinché funzioni.

Una volta scattata la foto, utilizza il riconoscimento dell'immagine per capire cosa fare. C'è un segnaposto anche in questa sezione di codice:

%segnaposto per il riconoscimento dell'immagine del percorsodisp('OTTENERE IMMAGINE')

L'ho usato per il momento perché volevo parlare in modo specifico dell'elaborazione del testo e del colore che si verifica, che è nel passaggio successivo.

Passaggio 7: elaborazione delle immagini

Ci sono due parti per l'elaborazione delle immagini. Il primo è il riconoscimento del colore, che calcola l'intensità del colore nell'immagine per decidere se continuare o meno con il riconoscimento del testo. I calcoli del colore si basano su quale scelta è stata fatta in quella primissima finestra di dialogo all'inizio (ho usato rosso, blu, verde ma puoi scegliere tutti i colori che vuoi, purché i valori medi per l'intensità del colore possano essere riconosciuti dal Fotocamera 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]) red = mean(mean(img(:,:, 1))); g = media(media(imgb(:,:, 2))); b = media(media(imgb(:,:, 3)));

Questo è il controllo dell'intensità. Questo verrà utilizzato nel segmento successivo per decidere cosa vuole fare.

if red > g && red >b if pathcolor == 1 imgc = imcrop(img, [0 30 512 354]) R = ocr(img) if R. Words{1} == IMAGE || R. Parole{2} == IMMAGINE || R. Parole{3} ==IMMAGINE t = orologio; basename = 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(cartella, nomebase); imwrite(img, fullFileName) pause(2) elseif R. Words{1} == RIGHT || R. Parole{2} == DESTRA || R. Words{3} ==RIGHT r.turnAngle(-75) elseif R. Words{1} == LEFT || R. Parole{2} == SINISTRA || R. Words{3} == LEFT r.turnAngle(75) elseif R. Words{1} == INDIETRO || R. Parole{2} == INDIETRO || R. Words{3} ==BACK r.turnAngle(110) end else r.turnAngle(110) end end

Questo segmento decide se il colore selezionato nella prima finestra di dialogo corrisponde al colore visualizzato dalla telecamera. Se lo fa, esegue il riconoscimento del testo. Cerca di vedere quale parola (IMMAGINE, INDIETRO, DESTRA o SINISTRA) appare e poi gira (per destra e sinistra), gira intorno (per indietro) o scatta una foto e la salva nello stesso modo di prima.

Ho fornito solo una singola sezione del codice per i diversi colori

Per consentire al codice di riconoscere il blu e il verde, è sufficiente copiare il codice e modificare il controllo logico nella parte superiore del segmento e impostare il " pathcolor == (numero) " in modo che corrisponda alle selezioni di colore dalla finestra di dialogo in alto (per il codice come viene visualizzato, il blu sarebbe 2 e il verde sarebbe 3).

Passaggio 8: il prodotto finito

Il prodotto finito
Il prodotto finito

Ora il robotecnico dovrebbe zoomare intorno ai moduli della missione su Marte e riferire agli astronauti quando qualcosa è fuori posto.

Ricorda, tutti i valori del sensore di dislivello e di LightBumper devono essere modificati in base ai valori osservati. Inoltre, per esperienza ho trovato meglio testare questo progetto su un pavimento di colore scuro ed è ancora meglio se quel pavimento non è riflettente. Questo fa aumentare il contrasto tra il percorso e il pavimento, il che rende più probabile che il Robo-Tecnico lo segua correttamente.

Spero ti sia piaciuto creare un piccolo aiutante per la missione su Marte e divertirti a costruire.

Consigliato: