Sommario:

Trasformare il Roomba in un Mars Rover: 5 passaggi
Trasformare il Roomba in un Mars Rover: 5 passaggi

Video: Trasformare il Roomba in un Mars Rover: 5 passaggi

Video: Trasformare il Roomba in un Mars Rover: 5 passaggi
Video: Se Vedi Questo In Mare, Esci Subito! 😱 2024, Novembre
Anonim
Trasforma il tuo Roomba in un Mars Rover
Trasforma il tuo Roomba in un Mars Rover

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

Scarica i Roomba Toolbox per MATLAB
Scarica i Roomba Toolbox per MATLAB
Scarica i Roomba Toolbox per MATLAB
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

Scegli come vuoi controllare il tuo Roomba
Scegli come vuoi controllare il tuo Roomba
Scegli come vuoi controllare il tuo Roomba
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: