Sommario:

Garden Helper Roomba Bot: 8 passaggi
Garden Helper Roomba Bot: 8 passaggi

Video: Garden Helper Roomba Bot: 8 passaggi

Video: Garden Helper Roomba Bot: 8 passaggi
Video: You’re welcome 😚 #Roomba #maintenance 2024, Dicembre
Anonim
Garden Helper Roomba Bot
Garden Helper Roomba Bot

Kiara Myers, Ahmad Alghadeer e Madison Tippet

Scopo:

Questo tutorial ti insegnerà come programmare un Roomba Bot, usando MATLAB, per navigare in un giardino, rilevando frutta/verdura di forma circolare che sono abbastanza maturi da essere raccolti in base alle loro dimensioni. Questo robot ti invia anche un'email, avvisandoti di quanti frutti sono pronti per essere raccolti e del percorso che ha percorso.

Caratteristiche:

  • Utilizza sensori di luce per rilevare i muri e gira leggermente per evitare di colpirli
  • Utilizza sensori di urto per interrompere il programma quando colpisce la roccia alla fine del giardino
  • Utilizza l'elaborazione delle immagini per rilevare un cerchio nel giardino e quindi determinarne il raggio
  • Utilizza sensori di scogliera per rilevare un nastro colorato che indica la presenza di un frutto

Passaggio 1: materiali e forniture:

  • Un computer portatile
  • MATLAB 2017
  • Roomba Aspirapolvere
  • Lampone Pi
  • Blocchi di legno
  • Carta bianca
  • Carta nera
  • Nastro colorato/sottile striscia di carta colorata
  • Roccia grande

Passo 2:

Passaggio 3: assemblare il tuo "giardino"

Assemblare il tuo
Assemblare il tuo
  1. Prendi la tua carta nera e taglia cerchi di varie dimensioni
  2. Fissa questi cerchi neri su un grande foglio bianco

    Questo contrasto sarà necessario quando si rileva un frutto

  3. Usa i tuoi blocchi di legno per costruire un percorso da giardino simile a un labirinto per far navigare il tuo robot

    Abbiamo scelto un percorso a forma di U come nella foto sopra

  4. Alla fine del tuo giardino aggiungi una roccia o una porta o un altro oggetto per far sapere al tuo robot che è fatto
  5. Attacca il tuo foglio bianco con il cerchio sui muri del giardino

    Abbiamo usato dei secchi per fissarlo perché le nostre pareti erano troppo corte per la telecamera

  6. Metti del nastro colorato/sottile striscia di carta colorata sul terreno davanti al frutto

Passaggio 4: scrittura del codice

Navigando nel giardino

Utilizzo dei sensori di impatto: per eseguire il programma, inseriamo la codifica in un'istruzione while che esegue il ciclo di varie istruzioni if fino a quando il codice non viene interrotto. Se uno dei respingenti viene colpito, il loro valore sarà uguale a vero (che in booleano è un valore di 1). Un'istruzione if viene utilizzata per violare il codice quando uno dei loro valori è uguale a 1.

Utilizzo dei sensori di dislivello: all'interno dell'istruzione while, utilizziamo un'istruzione if per comunicare a Roomba quando è arrivato nella posizione di un impianto. Roomba rileva il nastro colorato sul pavimento esaminando la soglia di rosso rilevata dai sensori di dislivello. Se il sensore di dislivello sinistro o destro rileva un colore con una soglia maggiore di quella del terreno, arresterà il robot per 2 secondi (utilizzando il comando di pausa). Durante questi 2 secondi, Roomba acquisirà e visualizzerà un'immagine del frutto. Usando il comando imfindcircles integrato, imposta un intervallo per i raggi dei tuoi cerchi e Roomba troverà il tuo cosiddetto frutto.

Utilizzo dell'elaborazione delle immagini: all'interno dell'istruzione if, incorporiamo un'altra istruzione if che dice: se il raggio rilevato, raggi3, è maggiore o uguale al nostro requisito minimo di un frutto maturo, r1 (lo decidi tu), quindi contare e visualizzare su il Roomba quanti frutti sono pronti e girare per continuare attraverso il giardino. In caso contrario, il turno di continuare attraverso il giardino. Nota: potrebbe essere necessario regolare l'angolo di rotazione perché ogni Roomba è diverso

Utilizzo dei paraurti luminosi: in un'altra istruzione if, i paraurti luminosi vengono analizzati per essere sicuri che nessuno di essi diventi più grande della nostra soglia determinata. Se il paraurti sinistro, destro, sinistro centrale, destro centrale, anteriore sinistro o anteriore destro supera la soglia, Roomba girerà leggermente con l'angolazione appropriata per evitare di sbattere contro un muro. Quindi, navigare nel labirinto.

Il resto del codice viene utilizzato per tracciare il percorso intrapreso da Roomba e quindi inviare i risultati alla tua email

Passaggio 5: copia il codice

% Scopo: In base alle loro dimensioni, il roomba attraverserà un giardino e distinguerà le verdure/frutta che sono pronte per essere raccolte. % Ingressi: sensori di luce, sensori di dislivello, sensori di impatto, immagine dalla telecamera % uscite: ogni volta che i sensori di luce sono superiori alla soglia, il roomba si girerà e scatterà un'immagine, emette un segnale acustico se il raggio di % verdura/frutta è compreso tra un intervallo specifico. Il codice si interrompe quando roomba si imbatte in % un oggetto, invia all'astronauta un'e-mail su quanti frutti sono pronti per essere % raccolti e una mappatura del movimento di roomba. % Utilizzo: istruzioni If e while, comandi di stampa, codice e-mail da MATLAB

k=0

tic

timerVal=tic

mentre vero

v=.2; % velocità r.setDriveVelocity(v, v);%roomba vai avanti L=r.getLightBumpers; LC=L.sinistraCentro; Rr=L.destra; Lf=L.sinistra; RC=L.rightCenter; LF=L.anteriore sinistro; RF=L.rightFront; Q= 75; % soglia. RTH=30; %Soglia rossa alta RTL=10; %Soglia rossa bassa B=r.getBumpers S=r.getCliffSensors; r1=24; r3=10; PL1=1800; se S.leftFront > PL1 || S.rightFront > PL1 %rileva se il colore a terra è al di sopra della soglia r.stop pause(2) elapsedTime=toc(timerVal-2) tic timerVal=tic % pausa per 2 secondi img = r.getImage; %take image imshow(img)%display image [centers3, radii3] = imfindcircles(img, [30 50], 'ObjectPolarity', 'dark', 'Sensitivity', 0.9); h = viscerchi(centri3, raggi3); %cerca cerchi di raggi w/in un intervallo specificato nell'immagine se raggi3>=r1 T=1 k=k+1 dist1=0.2.*elapsedTime %Se il raggio rilevato è maggiore o uguale al minimo %requisito di un frutto maturo, quindi Roomba conta questo frutto altrimenti se raggi3<=r3 T=0 altrimenti T=0 dist2=0.2.*Tempo trascorso %In caso contrario, non conta la fine del frutto

if T==1 r.setLEDDigits(num2str(k)) r.beep r.beep r.beep r.turnAngle(78) %Se è stato rilevato un frutto, visualizza il numero su Roomba, %fai un rumore e gira elseif T==2 r.turnAngle(78) %Se vengono rilevati 2 frutti, girare per continuare attraverso %garden else r.turnAngle(78) %Se non vengono rilevati frutti, girare per continuare attraverso %garden end if LC >Q r.stop r.turnAngle(-7) elseif RC >Q r.stop r.turnAngle(7) elseif LF >Q r.stop r.turnAngle(-7) elseif RF >Q r.stop r. turnAngle(7) elseif Lf > Q r.stop r.turnAngle(-7) elseif Rr >Q r.stop r.turnAngle(7) end %Se uno dei valori dei light bumper supera la soglia, %il Roomba girerà leggermente nella direzione appropriata per evitare % di sbattere contro un muro

se B.destra ==1 || B.sinistra==1 || B.front==1 dist3=0.2.*elapsedTime r.stop r.beep('F#*2, F#*2, c, F#*2, F#*2') r.turnAngle(360) %Se uno dei vengono colpiti i bumbers, quindi il roomba riproduce il suono, gira su se stesso, %e rompe il codice

fine pausa

end scatter(0.533, 0, '^') mantieni scatter(0.533, dist1, '<') mantieni scatter(-dist2, dist1, 'v') mantieni scatter(-dist2, 0, 'd') saveas (gcf, 'Movimento.png')

kmsg=num2str(k) mail= '[email protected]' password='Srsora123#' host='smtp.gmail.com' port='465'

setpref('Internet', 'E_mail', posta); setpref('Internet', 'SMTP_Server', host) props = java.lang. System.getProperties; props.setProperty('mail.smtp.user', mail); props.setProperty('mail.smtp.host', host); props.setProperty('mail.smtp.port', port); props.setProperty('mail.smtp.starttls.enable', 'true'); props.setProperty('mail.smtp.debug', 'true'); props.setProperty('mail.smtp.auth', 'true'); props.setProperty('mail.smtp.socketFactory.port', port); props.setProperty('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory'); props.setProperty('mail.smtp.socketFactory.fallback', 'false'); sendmail(mail, 'Ciao astronauta! Ci sono così tanti frutti nel giardino', kmsg, {'movement.png'})

Consigliato: