Sommario:
- Passaggio 1: raccogli i tuoi materiali
- Passaggio 2: scarica i Roomba Toolbox per MATLAB
- Passaggio 3: collegarsi a Roomba
- Passaggio 4: scegli come vuoi controllare il tuo Roomba
- Passaggio 5: guida il tuo Roomba
Video: Trasformare il Roomba in un Mars Rover: 5 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 09:59
Passaggio 1: raccogli i tuoi materiali
Per completare questo progetto, dovrai raccogliere i seguenti materiali:
1 Robot Roomba
1 Kit Raspberry Pi
1 videocamera
Accesso a MATLAB
Passaggio 2: scarica i Roomba Toolbox per MATLAB
Eseguire il codice seguente per installare le caselle degli strumenti necessarie per completare questo progetto.
funzione roombaInstalla
clc;
% elenco di file da installare
files = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% posizione da cui installare
options = weboptions('CertificateFilename', ''); % digli di ignorare i requisiti del certificato
server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Installazione/Aggiornamento Roomba';
% mostra lo scopo e ottieni conferma
prompt = {
'Questo programma scaricherà questi file Roomba EF 230:'
''
strjoin(file, ' ')
''
'in questa cartella:'
''
cd
''
'Vuoi continuare? '
};
bip;
yn = questdlg(prompt, …
dlgTitolo, …
'Sì', 'No', 'Sì');
if ~strcmp(yn, 'Sì'), return; fine
% ottiene l'elenco dei file esistenti
esistenti_file = files(cellfun(@exist, files) > 0);
if ~isempty(file_esistenti)
% assicurati che sia davvero ok sostituirli
prompt = {'Stai sostituendo questi file: '
''
strjoin(file_esistenti, ' ')
''
"Va bene sostituire?"
};
bip;
yn = questdlg(prompt, …
dlgTitolo, …
'Sì', 'No', 'Sì');
if ~strcmp(yn, 'Sì'), return; fine
fine
% scarica i file
cnt = 0;
per i=1:lunghezza(file)
f=file{i};
disp(['Scaricamento 'f]);
Tentativo
url = [server f];
websave(f, url, opzioni); % di opzioni aggiunte per evitare errori di sicurezza
cnt = cnt + 1;
catturare
disp(['Errore durante il download 'f]);
fittizio = [f '.html'];
se esiste(fittizio, 'file')==2
cancella (fittizio)
fine
fine
fine
se cnt == lunghezza(file)
msg = 'Installazione riuscita';
waitfor(msgbox(msg, dlgTitle));
altro
msg = 'Errore di installazione - vedere la finestra di comando per i dettagli';
waitfor(errordlg(msg, dlgTitle));
fine
end %roombaInstall
Passaggio 3: collegarsi a Roomba
Ora è il momento di connettersi a Roomba tramite WiFi. Usando 2 dita, premi contemporaneamente i pulsanti Dock e Spot per accendere o ripristinare Roomba. Quindi, esegui il codice r=roomba (# del tuo Roomba) nella finestra di comando di MATLAB per connetterti al tuo robot. Una volta eseguito questo comando, Roomba dovrebbe essere pronto per l'uso.
Passaggio 4: scegli come vuoi controllare il tuo Roomba
Esistono due modi per controllare Roomba: autonomamente o utilizzando uno smartphone come controller.
Se scegli di guidare Roomba in modo autonomo, dovrai utilizzare i tre sensori integrati: sensori di dislivello, sensori di urto e sensori di luce.
Per utilizzare uno smartphone, devi prima connettere lo smartphone al computer seguendo i passaggi seguenti.
NOTA: Il tuo computer e smartphone devono essere sulla stessa rete WiFi per potersi connettere correttamente!
1. Scarica l'app MATLAB dall'app store sul tuo dispositivo.
2. Digita "connector on" nella finestra di comando e imposta una password che dovrà essere inserita in entrambi i dispositivi.
3. Dopo averlo fatto, MATLAB ti darà l'indirizzo IP del tuo computer. Devi andare nella pagina delle impostazioni nell'app MATLAB sul tuo smartphone e aggiungere un computer utilizzando l'indirizzo IP fornito e la password che hai inserito in precedenza.
4. Nella finestra di comando sul tuo computer, digita il codice m=mobiledev e questo dovrebbe inizializzare il tuo smartphone come controller per il tuo Roomba.
5. Il tuo computer e smartphone dovrebbero essere pronti per partire ora.
Passaggio 5: guida il tuo Roomba
Ora che hai tutti gli strumenti necessari per creare il tuo Mars Rover, sei pronto per creare il tuo codice. Di seguito abbiamo allegato un codice di esempio sia per la guida autonoma che per la guida controllata da smartphone.
Guida autonoma
funzione Esplora_modificato(r)
% argomenti di input: 1 oggetto roomba, r
% argomenti di output: nessuno
%descrizione:
La funzione % utilizza un ciclo while infinito per consentire l'autonomia
% esplorazione dei dintorni del bot.
%
%funciton fornisce anche istruzioni al roomba su cosa fare in
%le seguenti situazioni: la ruota o le ruote perdono il contatto con il suolo, e
%l'oggetto viene rilevato davanti o ai lati del bot e a
% di caduta improvvisa rilevata davanti o su entrambi i lati del bot.
%
%le istruzioni tipiche includono comandi di movimento destinati a massimizzare
%esplorazione o evitare un pericolo rilevato e comandi per comunicare
%informazioni relative alle scoperte dei bot (immagini), posizione (grafico), %and state (avviso incagliato) con l'utente tramite matlab e/o e-mail. Parecchi
I comandi %sound sono aggiunti per divertimento.
%impostare le funzionalità di posta elettronica
mail = '[email protected]';
password = 'EF230Roomba';
setpref('Internet', 'Server_SMTP', 'smtp.gmail.com');
setpref('Internet', 'E_mail', posta);
setpref('Internet', 'Nome utente_SMTP', mail);
setpref('Internet', 'Password_SMTP', password);
props = java.lang. System.getProperties;
props.setProperty('mail.smtp.starttls.enable', 'true');
props.setProperty('mail.smtp.auth', 'true');
props.setProperty('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory');
props.setProperty('mail.smtp.socketFactory.port', '465');
% r=roomba(19)
r.beep('G2^^, G2^^, G2^^, G2^^, A2^^, A2^^, G1^^, E1^^, C2^^, C2^^, C1^^, C1 ^^, RE1^^, DO1^^, RE2^^, MI4^^, SOL2^^, SOL2^^, SOL2^^, SOL2^^, LA2^^, LA2^^, SOL1^^, MI1^^, C2^^, C2^^, C2^^, E1^^, E1^^, E1^^, D1^^, C4^^');
v =.1;
riflettere_datum=2700; %imposta il valore di riferimento dei sensori di dislivello
lightBumper_datum = 200; %impostare il valore di riferimento dei sensori paraurti luce
pos=[0, 0]; %variabile per memorizzazione posizione con dato inizializzato
angolo=0; %imposta angolo di riferimento
nettangle=0; % spostamento angolare netto
io=2; % iteratore per l'aggiunta di righe alla variabile di memorizzazione della posizione
dist = 0;
r.setDriveVelocity(v, v); %iniziare roomba ad andare avanti
mentre vero
Scogliera = r.getCliffSensors;
Bump = r.getBumpers;
Luce = r.getLightBumpers;
RandAngle = randi([20, 60], 1); % genera 1 angolo casuale tra 20 e 60 gradi. Utilizzato per impedire al bot di rimanere bloccato in un ciclo
%Cosa fare se una o più ruote perdono il contatto con il suolo:
%fermare il movimento, inviare un'e-mail di avviso con l'immagine dell'ambiente circostante, %e chiedi all'utente se procedere o attendere aiuto
if Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r.stop
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % ottieni la coordinata x
pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); % ottieni la coordinata y
io=i+1;
r.beep('FA#1^^, DO1^^, FA#1^^, DO1^^, FA#1^^, DO1^^, FA#1^^, DO1^^, FA#1^^, DO1^^, FA#1^^, DO1^^, FA#1^^, DO1^^, FA#1^^, DO1^^')
img = r.getImage;
imwrite(img, 'bloccato.png');
%--------------------------
imfile='bloccato.png';
posizione=savepos(pos);
%---------------------------
sendmail(mail, 'AIUTO!', 'Sono bloccato su una scogliera!', {imfile, position})
lista = {'Continua', 'Stop'};
idx = menu('Cosa devo fare?', lista);
se idx == 2
rottura
fine
%Cosa fare se viene rilevato un oggetto davanti al bot:
%fermati, torna indietro, scatta una foto, avvisa l'utente della scoperta
%via e-mail, gira di 90 gradi e continua a esplorare
elseif Light.leftCenter > lightBumper_datum || Light.rightCenter > lightBumper_datum || Bump.front == 1
r.stop;
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % ottieni la coordinata x
pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); % ottieni la coordinata y
io=i+1;
r.moveDistance(-.125);
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % ottieni la coordinata x
pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); % ottieni la coordinata
io=i+1;
r.beep('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')
img = r.getImage;
imwrite(img, 'FrontBump.png')
%--------------------------
imfile='FrontBump.png';
posizione=savepos(pos);
%---------------------------
sendmail(mail, 'Alert!', 'Ho trovato qualcosa!', {imfile, position})
angolo = 90;
netangle=netangle+angolo;
r.turnAngle(angolo);
r.setDriveVelocity(v, v);
%Cosa fare se viene rilevato un oggetto a sinistra del bot:
%stop, gira verso l'oggetto, torna indietro, scatta foto, avvisa
%utente della scoperta via e-mail, ruota di 90 gradi e continua a esplorare
elseif Light.leftFront > lightBumper_datum || Light.left > lightBumper_datum || Bump.sinistra == 1
r.stop;
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % ottieni la coordinata x
pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); % ottieni la coordinata y
io=i+1;
angolo=30;
netangle=netangle+angolo;
r.turnAngle(angolo);
r.moveDistance(-.125);
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % ottieni la coordinata x
pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); % ottieni la coordinata y
io=i+1;
r.beep('A4^, A4^, G1^, E1^, C3.5^, C2^^, C1^, C1^, C2^, D2^, D2^, E8^')
img = r.getImage;
imwrite(img, 'LeftBump.png')
%--------------------------
imfile='LeftBump.png';
posizione=savepos(pos);
%---------------------------
sendmail(mail, 'Alert!', 'Ho trovato qualcosa!', {imfile, position})
angolo=-90;
netangle=netangle+angolo;
r.turnAngle(angolo);
r.setDriveVelocity(v, v);
%Cosa fare se viene rilevato un oggetto a destra del bot:
%stop, gira verso l'oggetto, torna indietro, scatta foto, avvisa
%utente della scoperta via e-mail, ruota di 90 gradi e continua a esplorare
elseif Light.rightFront > lightBumper_datum || Light.right > lightBumper_datum || Bump.right == 1
r.stop;
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % ottieni la coordinata x
pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); % ottieni la coordinata
io=i+1;
angolo=-30;
netangle=netangle+angolo;
r.turnAngle(angolo);
r.moveDistance(-.125);
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % ottieni la coordinata x
pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); % ottieni la coordinata
io=i+1;
pausa(1.5);
r.beep('C1^, C1^, C2^, D2^, D2^, C8^')
img = r.getImage;
imwrite(img, 'RightBump.png')
%--------------------------
imfile='RightBump.png';
posizione=savepos(pos);
%---------------------------
sendmail(mail, 'Alert!', 'Ho trovato qualcosa!', {imfile, position});
angolo=90;
netangle=netangle+angolo;
r.turnAngle(angolo);
r.setDriveVelocity(v, v);
%Cosa fare se viene rilevata una scogliera a sinistra del bot:
%fermati, torna indietro, gira a destra, continua ad esplorare
elseif Cliff.left <Reflect_datum || Cliff.leftFront <Reflect_datum
r.stop;
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % ottieni la coordinata x
pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); % ottieni la coordinata y
io=i+1;
r.moveDistance(-.125);
dist = r.getDistance;
pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); % ottieni la coordinata x
pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); % ottieni la coordinata y
io=i+1;
angolo=-RandAngle;
netangle=netangle+angolo;
r.turnAngle(angolo);
r.setDriveVelocity(v, v);
%Cosa fare se viene rilevata una scogliera a destra del bot:
%fermati, torna indietro, gira a sinistra, continua ad esplorare
elseif Cliff.right < reflex_datum || Cliff.rightFront <Reflect_datum
r.stop;
dist = r.getDistance;
pos(i, 1)= dist * sind(angolo); % ottieni la coordinata x
pos(i, 2)= dist * cosd(angolo); % ottieni la coordinata
io=i+1;
r.moveDistance(-.125);
angolo=Angolo Rand;
netangle=netangle+angolo;
r.turnAngle(angolo);
r.setDriveVelocity(v, v);
fine
fine
Controller per smartphone
Opzioni = {'Autonomo', 'Controllo manuale'}
Prompt = menu('Come vuoi controllare il rover?', Opzioni)
m = mobiledev
r = roomba(19)
se Prompt == 1
Esploratore)
altro
mentre vero
pausa(.5)
PhoneData=m. Orientamento;
Azi=DatiTelefono(1);
Pitch=DatiTelefono(2);
Side=DatiTelefono(3);
se Lato>130 || Lato<-130 %se il telefono è capovolto a faccia in giù, ferma il roomba ed esci dal loop
r.stop
r.beep('C, C, C, C')
rottura
elseif Side>25 && Side<40 %se il telefono è girato di lato tra 25 e 40 gradi girare a sinistra di 5 gradi
r.turnAngle(-5);
elseif Side>40 %se il telefono è girato di lato oltre i 40 gradi gira a sinistra di 45 gradi
r.angolo di virata (-45)
elseif Side-40 %se il telefono è girato di lato tra -25 e -40 gradi girare a destra di 5 gradi
r.angolo di rotazione(5);
elseif Side<-40 %se il telefono è girato di lato meno di -40 gradi gira a sinistra di 45 gradi
r.angolo di virata(45)
fine
%Se il telefono è tenuto vicino alla verticale, scatta un'immagine e tracciala
se Passo<-60 && immagine<=9
r.beep
img=r.getImage;
sottotrama (3, 3, immagine)
imshow(img)
fine
% andare avanti e indietro in base all'orientamento anteriore e posteriore
se Pitch>15 && Pitch<35 %se Pitch tra 15 e 35 gradi avanza a breve distanza
%ottieni i dati del paraurti leggero prima di spostarti
litBump=r.getLightBumpers;
se litBump.leftFront>500 || litBump.leftCenter>500 || litBump.rightCenter>500 || litBump.rightFront>500 %se qualcosa si trova davanti al roomba e colpirà se si sposta in avanti fare rumore e visualizzare un messaggio
r.beep('C^^, F#^, C^^, F#^')
altrimenti %sposta
r.moveDistance(.03);
%Ottieni i dati del paraurti dopo lo spostamento
Bump=r.getBumpers;
se Bump.right==1 || Bump.sinistra==1 || Bump.front==1
r.beep('LA, C, E')
r.moveDistance(-.01)
fine
% ottenere i dati del sensore di dislivello
Cliff=r.getCliffSensors;
se Cliff.left>1500 || Cliff.leftFront>1500 || Cliff.rightFront>1500 || Cliff.right>1500 %se qualcosa fa scattare il sensore di dislivello, trattalo come lava ed esegui il backup
r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')
r.moveDistanza(-.031)
fine
fine
elseif Pitch>35 %se pitch maggiore di 35 gradi avanza a una distanza maggiore
%ottieni i dati del paraurti leggero prima di spostarti
litBump=r.getLightBumpers;
if litBump.leftFront>15 || litBump.leftCenter>15 || litBump.rightCenter>15 || litBump.rightFront>15 %se qualcosa è davanti al roomba e colpirà se si muove in avanti fare rumore e visualizzare un messaggio
r.beep('C^^, F#^, C^^, F#^')
altrimenti %sposta
r.moveDistanza(.3)
%Ottieni i dati del paraurti dopo lo spostamento
Bump=r.getBumpers;
se Bump.right==1 || Bump.sinistra==1 || Bump.front==1 %se colpisci qualcosa fai un rumore, mostra un messaggio ed esegui il backup
r.beep('LA, C, E')
r.moveDistance(-.01)
fine
%ottenere i dati del sensore di dislivello dopo lo spostamento
Cliff=r.getCliffSensors;
se Cliff.left>1500 || Cliff.leftFront>1500 || Cliff.rightFront>1500 || Cliff.right>1500 %se qualcosa fa scattare il sensore di dislivello, trattalo come lava ed esegui il backup
r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')
r.moveDistanza(-.31)
fine
fine
elseif Pitch-35%se pitch tra -15 e -35 deg torna indietro a breve distanza
r.moveDistance(-.03);
%ottenere i dati del sensore di dislivello dopo lo spostamento
Cliff=r.getCliffSensors;
se Cliff.left>1500 || Cliff.leftFront>1500 || Cliff.rightFront>1500 || Cliff.right>1500 %se qualcosa fa scattare il sensore di dislivello, trattalo come lava ed esegui il backup
r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')
r.moveDistanza(.04)
fine
elseif Pitch-60 %se pitch tra -35 e -60 deg torna indietro di una distanza maggiore
r.moveDistanza(-.3)
%ottenere i dati del sensore di dislivello dopo lo spostamento
Cliff=r.getCliffSensors;
se Cliff.left>1500 || Cliff.leftFront>1500 || Cliff.rightFront>1500 || Cliff.right>1500 %se qualcosa fa scattare il sensore di dislivello, trattalo come lava ed esegui il backup
r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')
r.moveDistanza(.31)
fine
fine
fine
fine
Consigliato:
Trasformare una calcolatrice grafica HP49G in un intervallo per Canon Eos: 4 passaggi
Turn-a-HP49G-Graphing-Calculator-into-an-Intervalomet for Canon Eos: Disparador automático e manuale per Canon Eos con HP49GPor Abraham [email protected]://www.flickr.com /photos/cacholongo/Componentes necesarios:2n3904,Resistencia 2,2k;Diodo 1n4001,Cable de conexiÃÆ’Â&su
Come Trasformare un PC o Laptop Vecchio/Danneggiato in un Media Box: 9 Passaggi
Come trasformare un PC o laptop vecchio/danneggiato in una scatola multimediale: in un mondo in cui la tecnologia avanza più velocemente di noi, la nostra amata elettronica diventa troppo presto obsoleta. Forse i tuoi gatti sempre affettuosi hanno fatto cadere il tuo laptop sul tavolo e lo schermo si è rotto. O forse vuoi un media box per una smart TV
Come trasformare il tuo Raspberry Pi in un gateway di accesso remoto: 6 passaggi
Come trasformare il tuo Raspberry Pi in un gateway di accesso remoto: Ehi ragazzi! Alla luce dei recenti avvenimenti, il nostro team di remote.it ha lavorato duramente per raccogliere idee per rendere il lavoro a distanza indolore e accessibile. Abbiamo creato l'immagine della scheda SD remote.itPi, che è una scheda SD che puoi inserire in un nuovo
Mars Roomba Project UTK: 4 passaggi
Mars Roomba Project UTK: DISCLAIMER: FUNZIONA SOLO SE IL ROOMBA È CONFIGURATO IN UN MODO SPECIFICO, QUESTO ISTRUZIONI È STATO CREATO E DESTINATO AD ESSERE UTILIZZATO DA STUDENTI E FACOLTÀ DELL'UNIVERSITÀ DEL TENNESSEE Questo codice viene utilizzato per configurare un Roomba per l'esecuzione locale scritto e s
Mars Roomba: 6 passaggi
Mars Roomba: questo Instructable ti guiderà nelle direzioni di funzionamento di un robot aspirapolvere Roomba controllato da Raspberry Pi. Il sistema operativo che utilizzeremo è tramite MATLAB