Sommario:

IRobot Create-Mars Expedition Rover Mark I: 4 passaggi
IRobot Create-Mars Expedition Rover Mark I: 4 passaggi

Video: IRobot Create-Mars Expedition Rover Mark I: 4 passaggi

Video: IRobot Create-Mars Expedition Rover Mark I: 4 passaggi
Video: DIY Radar With Ultrasonic Sensor And Chat-GPT Generated Arduino Code | Coders Cafe 2024, Novembre
Anonim
IRobot Create-Mars Expedition Rover Mark I
IRobot Create-Mars Expedition Rover Mark I

Questa istruzione ti insegnerà come configurare iRobot Create utilizzando la codifica MatLab. Il tuo robot avrà la capacità di cercare minerali distinguendo forme, manovrare terreni accidentati attraverso l'uso di sensori di dislivello e ha la capacità di essere controllato manualmente tramite un feed live.

Passaggio 1: materiali di consumo

Forniture
Forniture

Per questo progetto, avrai bisogno di iRobot Create, che è una versione programmabile del robot aspirapolvere Roomba. Il robot è dotato di tutti i sensori necessari per questo progetto, in particolare sensori di urto, sensori di dislivello e sensori "Light Bump". Avrai anche bisogno di un Raspberry Pi e di una videocamera, utilizzati per la comunicazione wireless, la programmazione dal vivo e il feed video dal vivo. Infine, avrai bisogno di un supporto stampato in 3D per Raspberry Pi e fotocamera.

Passaggio 2: sviluppare la codifica per soddisfare il risultato desiderato

Sviluppa la codifica per soddisfare il risultato desiderabile
Sviluppa la codifica per soddisfare il risultato desiderabile

Una volta connesso Roomba, dovrai creare un codice Matlab che ti darà gli output desiderati dopo gli input desiderati.

Il codice è visibile qui:

%Progetto Roomba%Brenten Arnold (barnol15); Julianne Korn (qdp218); Mike Heal(mheal) %4/11/19 %Descrizione del problema: crea un rover per assistere gli umani durante l'%esplorazione/abitazione di Marte. Metodo di soluzione: ricerca di materia organica (verde) attraverso l'uso di paraurti, sensori di dislivello e fotocamera per verificare la presenza di materia organica. Consenti al rover di navigare su terreni accidentati attraverso l'uso di paraurti, sensori di dislivello e sensori di altezza delle ruote. Consenti agli umani di controllare il rover da %una distanza di sicurezza e di cercare manualmente i minerali. scelte = {'VITA', 'TERRENO IMPROPRIO', 'CONTROLLO UTENTE'}; %Tre opzioni nel menu di dialogo Impostazione = menu('', scelte) se Impostazione>0 %Se l'opzione è stata scelta chiedi conferma dell'utente scelte2 = {'Sì', 'No'} %Crea un array di celle per "sì" o "No " scelta Conferma = menu(['Hai scelto "' scelte{Impostazioni} '" modalità.'], scelte2) %Conferma la scelta dell'impostazione utente se Conferma==1 se Impostazione==1 %Controlla se è stata scelta l'impostazione "VITA" i =0 while i==0 r.setLEDDigits(num2str('LIFE')) %Display 'LIFE' on LED for i=1:100 r.setDriveVelocity(0.05) %Sposta roomba in avanti a 0.05 m/sy = r.getCliffSensors %Recupera e memorizza i valori del sensore di dislivello nella struttura della cella "y" l = r.getLightBumpers %Recupera e memorizza i valori del sensore di dislivello nella struttura "f" se l.left>100 %Controlla se il paraurti sinistro è coperto r.moveDistance(-0.05) %Sposta roomba indietro di 0,05 metri r.turnAngle(20) %Ruota roomba di 20 gradi in senso antiorario img=r.getImage %Ottieni l'immagine dalla fotocamera della torta rasberry su roomba rect = [100 0 150 150]; img = imcrop(img, rect) %ritaglia l'immagine da mettere a fuoco al centro red = mean(mean(img(:,:, 1))) %intensità media del rosso verde = mean(mean(img(:,:, 2))) %intensità media del verde blue = mean(mean(img(:,:, 3))) %intensità media del blu se verde>rosso && verde>blu %Controlla se la pianta è nell'immagine d=msgbox(['Vita trovata! ']); Visualizza una finestra di messaggio che dice "Vita trovata!" attendere(d); end elseif l.leftFront>100 %Controlla se il paraurti della luce anteriore/sinistra è coperto r.moveDistance(-0.05) %Sposta roomba indietro di 0,05 metri img=r.getImage %Ottieni l'immagine dalla fotocamera della torta rasberry su roomba e memorizza nella variabile 'img 'rett = [100 0 150 150]; img = imcrop(img, rect) %ritaglia l'immagine da mettere a fuoco al centro red = mean(mean(img(:,:, 1))) %intensità media del rosso verde = mean(mean(img(:,:, 2))) %intensità media del verde blue = mean(mean(img(:,:, 3))) %intensità media del blu se verde>rosso && verde>blu %Controlla se la pianta è nell'immagine d=msgbox(['Vita trovata! ']); Visualizza una finestra di messaggio che dice "Vita trovata!" attendere(d); end elseif l.leftCenter>100 %Controlla se il paraurti sinistro/centrale è coperto r.moveDistance(-0.05) %Sposta roomba indietro di 0,05 metri img=r.getImage %Ottieni l'immagine dalla fotocamera della torta rasberry su roomba e memorizza nella variabile 'img 'rett = [100 0 150 150]; img = imcrop(img, rect) %ritaglia l'immagine da mettere a fuoco al centro red = mean(mean(img(:,:, 1))) %intensità media del rosso verde = mean(mean(img(:,:, 2))) %intensità media del verde blue = mean(mean(img(:,:, 3))) %intensità media del blu se verde>rosso && verde>blu %Controlla se la pianta è nell'immagine d=msgbox(['Vita trovata! ']); Visualizza una finestra di messaggio che dice "Vita trovata!" attendere(d); end elseif l.rightCenter>100 %Controlla se il paraurti destro/centrale è coperto r.moveDistance(-0.05)%Sposta roomba indietro di 0,05 metri img=r.getImage %Ottieni l'immagine dalla fotocamera della torta rasberry su roomba e memorizza nella variabile 'img 'rett = [100 0 150 150]; img = imcrop(img, rect) %ritaglia l'immagine da mettere a fuoco al centro red = mean(mean(img(:,:, 1))) %intensità media del rosso verde = mean(mean(img(:,:, 2))) %intensità media del verde blue = mean(mean(img(:,:, 3))) %intensità media del blu se verde>rosso && verde>blu %Controlla se la pianta è nell'immagine d=msgbox(['Vita trovata! ']); Visualizza una finestra di messaggio che dice "Vita trovata!" attendere(d); end elseif l.rightFront>100 %Controlla se il paraurti destro/anteriore è coperto r.moveDistance(-0.05)%Sposta roomba indietro di 0,05 metri img=r.getImage %Ottieni l'immagine dalla fotocamera della torta rasberry su roomba e memorizza nella variabile 'img 'rett = [100 0 150 150]; img = imcrop(img, rect) %ritaglia l'immagine da mettere a fuoco al centro red = mean(mean(img(:,:, 1))) %intensità media del rosso verde = mean(mean(img(:,:, 2))) %intensità media del verde blue = mean(mean(img(:,:, 3))) %intensità media del blu se verde>rosso && verde>blu %Controlla se la pianta è nell'immagine d=msgbox(['Vita trovata! ']); Visualizza una finestra di messaggio che dice "Vita trovata!" attendere(d); end elseif l.right>100 %Controlla se il paraurti destro è coperto r.moveDistance(-0.05)%Sposta roomba indietro di 0.05 metri r.turnAngle(-20)%Ruota roomba di 20 gradi in senso orario img=r.getImage %Ottieni immagine da fotocamera a torta di lamponi su roomba e memorizza nella variabile 'img' rect = [100 0 150 150]; img = imcrop(img, rect) %ritaglia l'immagine da mettere a fuoco al centro red = mean(mean(img(:,:, 1))) %intensità media del rosso verde = mean(mean(img(:,:, 2))) %intensità media del verde blue = mean(mean(img(:,:, 3))) %intensità media del blu se verde>rosso && verde>blu %Controlla se la pianta è nell'immagine d=msgbox(['Vita trovata! ']); Visualizza una finestra di messaggio che dice "Vita trovata!" attendere(d); end elseif y.leftFront<1500 %Controlla se la parte anteriore/sinistra di roomba è fuori dalla scogliera r.moveDistance(-0.1, 0.05) %Sposta roomba indietro di 0,1 metri a 0,05 m/s r.turnAngle(-5) %Ruota roomba 5 gradi CW altrimenti se y.rightFront<1500 %Controlla se la parte anteriore/destra di roomba è fuori dalla scogliera r.moveDistance(-0.1, 0.05) %Sposta roomba indietro di 0,1 metri a 0,05 m/s r.turnAngle(5) %Ruota roomba 5 gradi CCW elseif y.left<1000 %Controlla se il lato sinistro di roomba è fuori dalla scogliera r.moveDistance(-0.05, 0.05) %Sposta roomba indietro di 0,05 metri a 0,05 m/s r.turnAngle(-10) %Ruota roomba di 10 gradi CW altrimenti i=0 while i==0 r.setLEDDigits(num2str('RGH')) %Display 'Rough' sul display a LED per i=1:1000 r.setDriveVelocity(0.05) %Imposta la velocità drive roomba su 0.05 m/sx = r.getBumpers %Recupera e memorizza i valori del sensore paraurti nella struttura "x" y = r.get CliffSensors %Recupera e memorizza i valori del sensore di dislivello nella struttura "y" se x.right==1 %Controlla se il paraurti destro è premuto r.turnAngle(10) %Ruota roomba di 10 gradi in senso antiorario elseif x.left==1 %Controlla se sinistro il paraurti è premuto r.turnAngle(-10) %Ruota roomba di 10 gradi in senso orario elseif x.front==1 %Controlla se il paraurti anteriore è premuto r.turnAngle(20) %Ruota roomba di 20 gradi in senso antiorario elseif x.rightWheelDrop==1 % Controlla se la ruota destra è scesa r.turnAngle(-20)%Ruota roomba 20 gradi in senso orario elseif x.leftWheelDrop==1 %Controlla se la ruota sinistra è scesa r.turnAngle(20) %Ruota roomba 20 gradi in senso antiorario altrimenti se y.leftFront< 1500 %Controlla se la parte anteriore sinistra di roomba è fuori dalla scogliera r.moveDistance(-0.05, 0.05) %Sposta roomba indietro 0.05 metri a 0.05 m/s r.turnAngle(-5)%Ruota roomba 5 gradi in senso orario altrimenti se y.rightFront< 1500 %Controlla se la parte anteriore destra di roomba è fuori dalla scogliera r.moveDistance(-0.05, 0.05)%Sposta roomba indietro di 0,05 metri a 0,05 m/s r.turnAngle(5) %Ruota roomba di 5 gradi in senso antiorario altrimenti se y.left<1000 %Controllare se la parte lasciata o f roomba è fuori scogliera r.moveDistance(-0.05, 0.05)%Sposta roomba indietro di 0,05 metri a 0,05 m/s r.turnAngle(-10)%Ruota roomba di 10 gradi in senso orario altrimentiif y.right0 if Continue==1 i=0 %Continua terreno accidentato altrimenti i=1 %Termina terreno accidentato fine fine altrimenti %Modalità manuale i=0 r.setLEDDigits(num2str('USER')) %Visualizza 'USER' sul display a LED d=msgbox(['Tasti freccia - Spostare; S - Fermata Rover; ESC - Controllo dell'utente finale; A - Individua risorsa']); attendere(d); mentre i==0 r.showCamera %Apri il feed live della fotocamera a torta rasberry in una finestra separata D=getkey(1) %Recupera il tasto premuto dall'utente, memorizza il valore ASCII come variabile D se D==30 %Controlla se la freccia "su" ha stato premuto r.setDriveVelocity(0.1) %Invia roomba in avanti a 0.2 m/s altrimenti se D==28 %Controlla se la freccia "sinistra" è stata premuta r.setDriveVelocity(0) %Impedisci a roomba di andare avanti o indietro r.turnAngle(15, 0.05)%Ruota roomba di 45 gradi in senso antiorario a 0.05 m/s altrimenti se D==31 %Controlla se è stata premuta la freccia "giù" r.setDriveVelocity(-0.1) %Sposta roomba indietro a 0.2 m/s altrimentise D==29 % Verifica se la freccia "destra" è premuta r.setDriveVelocity(0) %Impedisci a roomba di spostarsi in avanti o indietro r.turnAngle(-15, 0.05) %Ruota roomba di 45 gradi in senso orario a 0,05 m/s altrimenti D==27 %Verifica se è stato premuto il tasto "esc" (escape) i=1 %Cambia il valore della variabile "i" per uscire dal ciclo d=msgbox('Uscita da "Controllo utente"') %Informa l'utente che si sta uscendo dalla modalità manuale altrimenti D== 115 %Controllare se è stato premuto il tasto "s" r.setDriveVelocity(0) %Stop roomba da andare avanti o indietro elseif D==97 %Controllare se è stato premuto "a" image = r.getImage; imwrite(image, 'image.png') W = Classify(image) K = mode(W) if K == 3 d=msgbox('Risorsa trovata') %Visualizza se è stata rilevata una risorsa rettangolare waitfor(d); %Attendi che l'utente chiuda la finestra di messaggio "d" elseif K == 0 d=msgbox('Not Resource:(') %Visualizza se la risorsa rettangolare non viene rilevata waitfor(d); %Attenda che l'utente chiuda la finestra di messaggio "d" end else d=msgbox('Immissione chiave non valida.') %Visualizza se l'utente chiude il menu "scegli impostazioni" waitfor(d); %Attendi che l'utente chiuda la finestra di messaggio "d" end waitfor(d); %Attendi l'utente chiude la finestra di messaggio "d" end end end else d=msgbox('Goodbye') %Saluta se le opzioni sono chiuse end waitfor(d);

Passaggio 3: test

test
test

Una volta che il codice è stato scritto, dovrai testare Roomba. Sebbene il tuo codice possa sembrare corretto, molti dei tuoi valori, in particolare per il colore o la forma, dovranno essere modificati per riconoscere correttamente gli oggetti che desideri che Roomba identifichi.

Passaggio 4: osservare gli output visivi

Osserva gli output visivi
Osserva gli output visivi
Osserva gli output visivi
Osserva gli output visivi

Sarà molto evidente se hai programmato con successo Roomba in base alle sue uscite visive.

Le uscite includono:

  • Rilevamento della forma: la capacità di Roomba di distinguere correttamente le forme per trovare i minerali corretti
  • Manovre su terreni accidentati: evita scogliere o zone buie
  • Modalità manuale: feed live e possibilità di controllare Roomba
  • Immagini: Immagini di minerali
  • Vita ritrovata!: una casella di testo MatLab che indica che la tua pianta ha identificato la vita organica.

Questa è la fine del nostro tutorial, goditi il tuo nuovo Mars Expedition Rover!

Consigliato: