Sommario:
- Passaggio 1: materiali di consumo
- Passaggio 2: sviluppare la codifica per soddisfare il risultato desiderato
- Passaggio 3: test
- Passaggio 4: osservare gli output visivi
Video: IRobot Create-Mars Expedition Rover Mark I: 4 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:04
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
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
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
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
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:
Elmo Iron Man Mark II: 4 passaggi
Elmo Iron Man Mark II: Casco replica mark II de 2 partis, casco e impulso unidos per cadena che conduce il cavo, alimentato da 4 batterie AA ubicadas en la parte posteriore fino al microcontrollore e l'interruttore de encendido.Casco: Servomotores para el cierre sei aperto
Mark Twain House Haunting: 5 passaggi
Mark Twain House Haunting: si dice che la casa di Mark Twain sia infestata dal famoso autore. In questo Instructable, ho "scoperto" una vecchia fotografia che dimostra senza ombra di dubbio che il fantasma di Twain infesta davvero questa vecchia casa storica
The Ultimate Beer Pong Machine - PongMate CyberCannon Mark III: 6 passaggi (con immagini)
The Ultimate Beer Pong Machine - PongMate CyberCannon Mark III: Introduzione Il PongMate CyberCannon Mark III è il più nuovo e avanzato pezzo di tecnologia del beer pong mai venduto al pubblico. Con il nuovo CyberCannon, chiunque può diventare il giocatore più temuto al tavolo del beer pong. Com'è questo p
Utilizzo del modulo di comando di IRobot Create con Linux: 4 passaggi
Utilizzo del modulo di comando di IRobot Create con Linux: poiché iRobot non ha fornito agli utenti Linux un modo per utilizzare il modulo di comando, ho dovuto capirlo da solo. Non lasciarti intimidire, non è affatto difficile, davvero. Tutto quello che devi fare è eseguire un paio di script. Cominciamo, vero?
Modificare un IRobot Create per Paint: 6 passaggi (con immagini)
Modifica di un IRobot Create to Paint: questo è un progetto di robotica che potrebbe probabilmente essere completato da qualcuno che non ha alcuna esperienza con i robot. Dico questo perché, prima di iniziare, non avevo esperienza con i robot. O scrivere programmi. In effetti, sapevo dipingere e questo era