Obsah:

Premena vašej robota Roomba na vozítko Mars: 5 krokov
Premena vašej robota Roomba na vozítko Mars: 5 krokov

Video: Premena vašej robota Roomba na vozítko Mars: 5 krokov

Video: Premena vašej robota Roomba na vozítko Mars: 5 krokov
Video: МАЛЬДИВЫ, которые в самое сердце. Большой выпуск. 4K 2024, November
Anonim
Vaša Roomba sa zmení na Mars Rover
Vaša Roomba sa zmení na Mars Rover

Krok 1: Zhromaždite svoje materiály

Na dokončenie tohto projektu budete potrebovať nasledujúce materiály:

1 robot Roomba

1 súprava Raspberry Pi

1 videokamera

Prístup k MATLABu

Krok 2: Stiahnite si sady nástrojov Roomba pre MATLAB

Stiahnite si Panely s nástrojmi Roomba pre MATLAB
Stiahnite si Panely s nástrojmi Roomba pre MATLAB
Stiahnite si Panely s nástrojmi Roomba pre MATLAB
Stiahnite si Panely s nástrojmi Roomba pre MATLAB

Spustite nasledujúci kód, aby ste nainštalovali potrebné sady nástrojov na dokončenie tohto projektu.

funkcia roombaInštalovať

clc;

% zoznam súborov na inštaláciu

files = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

% umiestnenia, z ktorého sa má nainštalovať

options = weboptions ('CertificateFilename', ''); % povedzte, aby ignoroval požiadavky na certifikát

server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';

dlgTitle = 'Inštalácia/aktualizácia Roomba';

% účelu zobrazenia a získajte potvrdenie

prompt = {

„Tento program stiahne tieto súbory EF 230 Roomba:“

''

strjoin (súbory, '')

''

'do tohto priečinka:'

''

cd

''

'Chceš pokračovať? '

};

pípnutie;

yn = questdlg (prompt,…

dlgNázov,…

„Áno“, „Nie“, „Áno“);

if ~ strcmp (yn, 'Yes'), return; koniec

% získať zoznam existujúcich súborov

existing_files = súbory (bunková zábava (@exist, súbory)> 0);

ak ~ je prázdny (existujúce_súbory)

% uistite sa, že je skutočne v poriadku ich nahradiť

prompt = {'Nahrádzate tieto súbory:'

''

strjoin (existujúce_súbory, '')

''

„OK nahradiť?“

};

pípnutie;

yn = questdlg (prompt,…

dlgNázov,…

„Áno“, „Nie“, „Áno“);

if ~ strcmp (yn, 'Yes'), return; koniec

koniec

% stiahnuť súbory

cnt = 0;

pre i = 1: dĺžka (súbory)

f = súbory {i};

disp (['sťahovanie' f]);

skúsiť

url = [server f];

websave (f, URL, možnosti); % pridaných možností, aby sa predišlo chybám zabezpečenia

cnt = cnt + 1;

chytiť

disp (['Chyba pri sťahovaní' f]);

atrapa = [f '.html'];

ak existujú (atrapa, 'súbor') == 2

vymazať (atrapa)

koniec

koniec

koniec

ak cnt == dĺžka (súbory)

msg = 'Inštalácia bola úspešná';

čakať (msgbox (msg, dlgTitle));

inak

msg = 'Chyba inštalácie - podrobnosti nájdete v príkazovom okne';

čakať na (errordlg (msg, dlgTitle));

koniec

koniec %roombaInštalácia

Krok 3: Pripojte sa k robotu Roomba

Teraz je čas pripojiť sa k vášmu robotovi Roomba pomocou WiFi. Dvoma prstami súčasným stlačením tlačidiel Dock a Spot zapnite alebo resetujte robot Roomba. Ďalej spustite kód r = roomba (# vašej roboty Roomba) v príkazovom okne programu MATLAB a pripojte sa k svojmu robotovi. Akonáhle vykonáte tento príkaz, vaša Roomba by mala byť pripravená ísť.

Krok 4: Vyberte si, ako chcete Roombu ovládať

Vyberte si, ako chcete ovládať svoj robot Roomba
Vyberte si, ako chcete ovládať svoj robot Roomba
Vyberte si, ako chcete ovládať svoj robot Roomba
Vyberte si, ako chcete ovládať svoj robot Roomba

Roombu môžete ovládať dvoma spôsobmi: autonómne alebo pomocou smartfónu ako ovládača.

Ak sa rozhodnete riadiť Roombu autonómne, budete musieť použiť tri vstavané senzory: snímače útesu, snímače nárazov a svetelné senzory.

Ak chcete používať smartfón, najskôr ho musíte pripojiť k počítaču podľa nižšie uvedených krokov.

POZNÁMKA: Aby sa správne pripojili, váš počítač a smartfón musia byť v rovnakej sieti WiFi!

1. Stiahnite si aplikáciu MATLAB z obchodu s aplikáciami do svojho zariadenia.

2. Do príkazového okna zadajte príkaz „connector on“a zadajte heslo, ktoré bude potrebné zadať do oboch zariadení.

3. Potom vám MATLAB poskytne IP adresu vášho počítača. Musíte ísť na stránku nastavení v aplikácii MATLAB vo svojom smartfóne a pridať počítač pomocou danej IP adresy a hesla, ktoré ste zadali predtým.

4. Do príkazového okna na počítači zadajte kód m = mobiledev a tým by sa mal váš smartphone inicializovať ako ovládač vašej robota Roomba.

5. Váš počítač a smartphone by mali byť pripravené.

Krok 5: Odvezte si robot Roomba

Teraz, keď máte všetky potrebné nástroje na vytvorenie svojho Mars Rover, ste pripravení vytvoriť si vlastný kód. Nižšie sme pripojili príklad kódu pre autonómnu jazdu a jazdu ovládanú smartfónom.

Autonómne riadenie

funkcia Explore_modified (r)

%vstupných argumentov: 1 objekt roomba, r

Argumenty %výstupu: žiadne

%popis:

Funkcia %využíva autonómnu nekonečnú slučku while

%prieskum okolia robota.

%

%funciton tiež poskytuje roombau pokyny, čo robiť

%nasledujúce situácie: Kolesá stratia kontakt s vozovkou, an

%objektu je detegovaný pred alebo po oboch stranách robota a

%náhly pokles je detekovaný pred alebo po oboch stranách robota.

%

%typické pokyny obsahujú pohybové príkazy určené na maximalizáciu

%prieskumu alebo sa vyhnúť zistenému nebezpečenstvu a príkazom na komunikáciu

%informácií týkajúcich sa objavov robotov (obrázky), polohy (graf), %a uveďte (uviaznuté upozornenie) s používateľom prostredníctvom matlabu a/alebo e -mailu. Niekoľko

%zvukových príkazov je pridaných pre potešenie.

%možnosti nastavenia e -mailu

mail = '[email protected]';

heslo = 'EF230Roomba';

setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com');

setpref ('Internet', 'E_mail', pošta);

setpref ('Internet', 'SMTP_Username', mail);

setpref ('Internet', 'SMTP_Password', heslo);

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 ^^, D1 ^^, C1 ^^, D2 ^^, E4 ^^, G2 ^^, G2 ^^, G2 ^^, G2 ^^, A2 ^^, A2 ^^, G1 ^^, E1 ^^, C2 ^^, C2 ^^, C2 ^^, E1 ^^, E1 ^^, E1 ^^, D1 ^^, C4 ^^ ');

v =, 1;

odrážať_datum = 2700; %nastavenej referenčnej hodnoty senzorov útesu

lightBumper_datum = 200; %nastaveného svetla Referenčná hodnota senzorov nárazníka

pos = [0, 0]; Premenná %pre ukladanie polohy s inicializovaným nulovým bodom

uhol = 0; %nastaveného referenčného uhla

netangle = 0; %čistého posunu uhla

i = 2; %iterátor na pridávanie riadkov do premennej ukladania pozícií

dist = 0;

r.setDriveVelocity (v, v); %naštartujte roomba dopredu

kým je to pravda

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Svetlo = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %generuje 1 náhodný uhol medzi 20 a 60 stupňami. Používa sa na zabránenie uviaznutiu robota v slučke

%Čo robiť, ak jedno alebo viac kolies stratí kontakt so zemou:

%zastavte pohyb, pošlite varovný e -mail s obrázkom okolia, %a spýtajte sa používateľa, či má pokračovať, alebo čakať na pomoc

ak Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získať x súradnice

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y coordinate

i = i+1;

r.beep ('F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^ ')

img = r.getImage;

imwrite (img, 'stick.png');

%--------------------------

imfile = 'stick.png';

pozícia = savepos (pos);

%---------------------------

sendmail (mail, 'POMOC!', 'uviazol som na útese!', {imfile, position})

list = {'Pokračovať', 'Zastaviť'};

idx = menu ('Čo mám robiť?', zoznam);

ak idx == 2

prestávka

koniec

%Čo robiť, ak je pred robotom zistený objekt:

%zastavte, vráťte sa, odfoťte, upozornite užívateľa na objav

%e -mailom, otočte o 90 stupňov a pokračujte v skúmaní

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); %získať x súradnice

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y coordinate

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získať x súradnice

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y coordinate

i = i+1;

r.píp ('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')

img = r.getImage;

imwrite (img, 'FrontBump.png')

%--------------------------

imfile = 'FrontBump.png';

pozícia = savepos (pos);

%---------------------------

sendmail (mail, 'Upozornenie!', 'Niečo som našiel!', {imfile, position})

uhol = 90;

netangle = netangle+uhol;

r.turnAngle (uhol);

r.setDriveVelocity (v, v);

%Čo robiť, ak je naľavo od robota zistený objekt:

%zastavenie, otočenie k objektu, zálohovanie, fotografovanie, upozornenie

%používateľov objavovania prostredníctvom e -mailu, otočte sa o 90 stupňov a pokračujte v skúmaní

elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získať x súradnice

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y coordinate

i = i+1;

uhol = 30;

netangle = netangle+uhol;

r.turnAngle (uhol);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získať x súradnice

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y coordinate

i = i+1;

r.píp ('A4^, A4^, G1^, E1^, C3.5^, C2 ^^, C1^, C1^, C2^, D2^, D2^, E8^')

img = r.getImage;

imwrite (obr., 'LeftBump.png')

%--------------------------

imfile = 'LeftBump.png';

pozícia = savepos (pos);

%---------------------------

sendmail (mail, 'Upozornenie!', 'Niečo som našiel!', {imfile, position})

uhol = -90;

netangle = netangle+uhol;

r.turnAngle (uhol);

r.setDriveVelocity (v, v);

%Čo robiť, ak je objekt detekovaný napravo od robota:

%zastavenie, otočenie k objektu, zálohovanie, fotografovanie, upozornenie

%používateľov objavovania prostredníctvom e -mailu, otočte sa o 90 stupňov a pokračujte v skúmaní

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); %získať x súradnice

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y coordinate

i = i+1;

uhol = -30;

netangle = netangle+uhol;

r.turnAngle (uhol);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získať x súradnice

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y coordinate

i = i+1;

pauza (1,5);

r.beep ('C1^, C1^, C2^, D2^, D2^, C8^')

img = r.getImage;

imwrite (img, 'RightBump.png')

%--------------------------

imfile = 'RightBump.png';

pozícia = savepos (pos);

%---------------------------

sendmail (mail, 'Upozornenie!', 'Niečo som našiel!', {imfile, position});

uhol = 90;

netangle = netangle+uhol;

r.turnAngle (uhol);

r.setDriveVelocity (v, v);

%Čo robiť, ak je vľavo od robota zistený útes:

%zastavenie, pohyb dozadu, odbočenie doprava, pokračovanie v skúmaní

elseif Cliff.left <reflect_datum || Cliff.leftFront <odrážať_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získať x súradnice

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y coordinate

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získať x súradnice

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y coordinate

i = i+1;

uhol = -RandAngle;

netangle = netangle+uhol;

r.turnAngle (uhol);

r.setDriveVelocity (v, v);

%Čo robiť, ak je vpravo od robota zistený útes:

%zastavenie, pohyb dozadu, odbočenie doľava, pokračovanie v skúmaní

elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = dist * sind (uhol); %získať x súradnice

pos (i, 2) = dist * cosd (uhol); %get y coordinate

i = i+1;

r.moveDistance (-. 125);

uhol = RandAngle;

netangle = netangle+uhol;

r.turnAngle (uhol);

r.setDriveVelocity (v, v);

koniec

koniec

Ovládač smartfónu

Options = {'Autonomous', 'Manual Control'}

Prompt = menu ('Ako by ste chceli ovládať vozítko?', Možnosti)

m = mobiledev

r = roomba (19)

ak Výzva == 1

Preskúmať (r)

inak

kým je to pravda

pauza (.5)

PhoneData = m. Orientácia;

Azi = PhoneData (1);

Rozteč = údaje o telefóne (2);

Strana = údaje o telefóne (3);

ak Strana> 130 || Strana <-130 %, ak je telefón otočený tvárou nadol, zastaví robota Roomba a výjazdovú slučku

r.stop

r.beep ('C, C, C, C')

prestávka

elseif Strana> 25 && Strana <40 %, ak je telefón otočený nabok medzi 25 a 40 stupňami, otočte doľava o 5 stupňov

r.turnAngle (-5);

elseif Strana> 40 %, ak je telefón otočený nabok o 40 stupňov, otočte doľava o 45 stupňov

r.turnAngle (-45)

elseif Strana -40 %, ak je telefón otočený nabok medzi -25 a -40 °, otočte doprava o 5 °

r.turnAngle (5);

elseif Strana <-40 %, ak je telefón otočený nabok menej ako -40 stupňov, otočte doľava o 45 stupňov

r.turnAngle (45)

koniec

%Ak sa telefón drží v blízkosti vertikály, urobte obrázok a vykreslite ho

ak je rozteč <-60 && image <= 9

r.píp

img = r.getImage;

podkres (3, 3, obrázok)

imshow (img)

koniec

%pohyb dopredu a dozadu na základe prednej a zadnej orientácie

ak je rozstup> 15 && rozstup <35 %, ak je rozstup medzi 15 a 35 stupňami, pohybuje sa dopredu na krátku vzdialenosť

%získajte údaje o ľahkom nárazníku pred pohybom

litBump = r.getLightBumpers;

ak litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, ak je niečo pred roomba a zasiahne, ak sa pohne dopredu, vydá zvuk a zobrazí správu

r.beep ('C ^^, F#^, C ^^, F#^')

inak %hýbať

r.moveDistance (.03);

%Získajte údaje o nárazníku po presune

Bump = r.getBumpers;

ak Bump.right == 1 || Bump.left == 1 || Bump.front == 1

r.beep („A, C, E“)

r.moveDistance (-. 01)

koniec

%získať údaje senzora útesu

Cliff = r.getCliffSensors;

ak Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ak niečo spustí snímač útesu, považujte to za lávu a zálohujte

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 031)

koniec

koniec

elseif Rozteč> 35 %, ak je rozteč väčšia 35 stupňov, posuňte sa dopredu na väčšiu vzdialenosť

%získajte údaje o ľahkom nárazníku pred pohybom

litBump = r.getLightBumpers;

ak litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, ak je niečo pred roomba a zasiahne, ak sa pohne dopredu, vydá zvuk a zobrazí správu

r.beep ('C ^^, F#^, C ^^, F#^')

inak %hýbať

r.moveDistance (.3)

%Získajte údaje o nárazníku po presune

Bump = r.getBumpers;

ak Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %, ak na niečo narazíte, vydáte hluk, zobrazí správu a zálohuje sa

r.beep („A, C, E“)

r.moveDistance (-. 01)

koniec

%získať údaje senzora útesu po presune

Cliff = r.getCliffSensors;

ak Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ak niečo spustí snímač útesu, považujte to za lávu a zálohujte

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 31)

koniec

koniec

elseif Rozteč -35 %, ak je rozstup medzi -15 a -35 °, pohybuje sa späť na krátku vzdialenosť

r.moveDistance (-. 03);

%získať údaje senzora útesu po presune

Cliff = r.getCliffSensors;

ak Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ak niečo spustí snímač útesu, považujte to za lávu a zálohujte

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.04)

koniec

elseif Rozteč -60 %, ak je rozstup medzi -35 a -60 stupňov, posuňte sa späť na väčšiu vzdialenosť

r.moveDistance (-. 3)

%získať údaje senzora útesu po presune

Cliff = r.getCliffSensors;

ak Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ak niečo spustí snímač útesu, považujte to za lávu a zálohujte

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.31)

koniec

koniec

koniec

koniec

Odporúča: