Obsah:

Proměna Roomby v Mars Rover: 5 kroků
Proměna Roomby v Mars Rover: 5 kroků

Video: Proměna Roomby v Mars Rover: 5 kroků

Video: Proměna Roomby v Mars Rover: 5 kroků
Video: How to Replace a Roomba Battery 2024, Listopad
Anonim
Proměňte Roombu v Mars Rover
Proměňte Roombu v Mars Rover

Krok 1: Shromážděte své materiály

K dokončení tohoto projektu budete potřebovat shromáždit následující materiály:

1 robot Roomba

1 sada Raspberry Pi

1 videokamera

Přístup k MATLABu

Krok 2: Stáhněte si Roomba Toolboxes pro MATLAB

Stáhněte si Roomba Toolboxes pro MATLAB
Stáhněte si Roomba Toolboxes pro MATLAB
Stáhněte si sady nástrojů Roomba pro MATLAB
Stáhněte si sady nástrojů Roomba pro MATLAB

Spuštěním následujícího kódu nainstalujete potřebné sady nástrojů k dokončení tohoto projektu.

funkce roombaInstall

clc;

% seznam souborů k instalaci

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

% umístění pro instalaci

options = weboptions ('CertificateFilename', ''); % řekněte, aby ignoroval požadavky na certifikát

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

dlgTitle = 'Instalace/aktualizace Roomba';

% účel zobrazení a získání potvrzení

výzva = {

"Tento program stáhne tyto soubory EF 230 Roomba:"

''

strjoin (soubory, '')

''

'do této složky:'

''

CD

''

'Chceš pokračovat? '

};

pípnutí;

yn = questdlg (výzva,…

dlgTitle,…

„Ano“, „Ne“, „Ano“);

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

% získat seznam existujících souborů

existing_files = soubory (cellfun (@exist, files)> 0);

if ~ isempty (existing_files)

% ujistěte se, že je opravdu v pořádku je vyměnit

prompt = {'Nahrazujete tyto soubory:'

''

strjoin (existing_files, '')

''

„OK vyměnit?“

};

pípnutí;

yn = questdlg (výzva,…

dlgTitle,…

„Ano“, „Ne“, „Ano“);

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

konec

% stáhněte soubory

cnt = 0;

pro i = 1: délka (soubory)

f = soubory {i};

disp (['Stahování' f]);

Snaž se

url = [server f];

websave (f, URL, možnosti); % přidané možnosti, aby se zabránilo chybám zabezpečení

cnt = cnt + 1;

úlovek

disp (['Chyba při stahování' f]);

atrapa = [f '.html'];

pokud existují (figurína, 'soubor') == 2

odstranit (figurína)

konec

konec

konec

if cnt == délka (soubory)

msg = 'Instalace proběhla úspěšně';

waitfor (msgbox (msg, dlgTitle));

jiný

msg = 'Chyba instalace - podrobnosti najdete v příkazovém okně';

waitfor (errordlg (msg, dlgTitle));

konec

konec %roombaInstall

Krok 3: Připojte se k zařízení Roomba

Nyní je čas připojit se k vašemu Roomba pomocí WiFi. Pomocí 2 prstů současným stisknutím tlačítek Dock a Spot zapněte nebo resetujte robot Roomba. Poté spusťte kód r = roomba (# vašeho Roomba) v příkazovém okně MATLABu a připojte se k robotovi. Jakmile tento příkaz provedete, robot Roomba by měl být připraven jít.

Krok 4: Vyberte si, jak chcete robot Roomba ovládat

Vyberte si, jak chcete robot Roomba ovládat
Vyberte si, jak chcete robot Roomba ovládat
Vyberte si, jak chcete robot Roomba ovládat
Vyberte si, jak chcete robot Roomba ovládat

Roombu můžete ovládat dvěma způsoby: autonomně nebo pomocí smartphonu jako ovladače.

Pokud se rozhodnete řídit Roombu autonomně, budete muset použít tři vestavěné senzory: senzory útesu, senzory nárazu a světelné senzory.

Abyste mohli používat smartphone, musíte jej nejprve připojit k počítači podle níže uvedených kroků.

POZNÁMKA: Aby se počítač správně připojil, musí být váš počítač a smartphone ve stejné síti WiFi!

1. Stáhněte si aplikaci MATLAB z obchodu s aplikacemi ve vašem zařízení.

2. Do příkazového okna zadejte „connector on“a nastavte heslo, které bude nutné zadat do obou zařízení.

3. Poté vám MATLAB přidělí IP adresu vašeho počítače. V chytrém telefonu musíte přejít na stránku nastavení v aplikaci MATLAB a přidat počítač pomocí dané IP adresy a hesla, které jste zadali dříve.

4. Do příkazového okna v počítači zadejte kód m = mobiledev a měl by se váš smartphone inicializovat jako ovladač pro váš robot Roomba.

5. Váš počítač a smartphone by měly být připraveny.

Krok 5: Drive Your Roomba

Nyní, když máte všechny potřebné nástroje k vytvoření svého Mars Rover, jste připraveni vytvořit si vlastní kód. Níže jsme připojili příklad kódu jak pro autonomní řízení, tak pro řízení pomocí smartphonu.

Autonomní řízení

funkce Explore_modified (r)

%vstupních argumentů: 1 objekt roomba, r

Argumenty %výstupu: žádné

%popis:

Funkce %využívá nekonečnou smyčku, která umožňuje autonomii

%průzkum okolí robota.

%

%funciton také poskytuje roomba instrukce, co dělat

%následující situace: Kolo (kola) ztratí (y) kontakt se zemí, an

%objektu je detekován před nebo po obou stranách robota a

%náhlého pádu je detekováno před nebo na obou stranách robota.

%

%typické pokyny obsahují pohybové příkazy určené k maximalizaci

%průzkumu nebo zamezení detekovaného nebezpečí a příkazů ke komunikaci

%informací týkajících se objevů robotů (obrázky), pozice (graf), %a stav (upozornění na lanko) s uživatelem prostřednictvím matlabu a/nebo e -mailu. Několik

Pro radost je přidáno %zvukových příkazů.

%nastavení možností e -mailu

mail = '[email protected]';

heslo = 'EF230Roomba';

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

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

setpref ('Internet', 'SMTP_Uživatelské jméno', pošta);

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;

reflect_datum = 2700; %nastavené referenční hodnoty snímačů útesu

lightBumper_datum = 200; %nastavené světlo Referenční hodnota čidel nárazníku

pos = [0, 0]; Proměnná %pro uložení polohy s inicializovaným vztažným bodem

úhel = 0; %nastavený referenční úhel

netangle = 0; %čistého úhlového posunutí

i = 2; %iterátor pro přidávání řádků do proměnné úložiště pozic

dist = 0;

r.setDriveVelocity (v, v); %spusťte roomba vpřed

zatímco pravda

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Light = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %generuje 1 náhodný úhel mezi 20 a 60 stupni. Používá se k zabránění uvíznutí robota ve smyčce

%Co dělat, když jedno nebo více kol ztratí kontakt se zemí:

%zastavte pohyb, pošlete varovný e -mail s obrázkem okolí, %a zeptejte se uživatele, zda má pokračovat, nebo počkat na pomoc

pokud Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získat x souřadnici

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %získejte souřadnici y

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';

pozice = savepos (pos);

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

sendmail (mail, „POMOC!“, „Uvízl jsem na útesu!“, {imfile, position})

list = {'Pokračovat', 'Zastavit'};

idx = menu ('Co mám dělat?', seznam);

pokud idx == 2

přestávka

konec

%Co dělat, když je objekt detekován před robotem:

%stop, přesuňte se zpět, vyfoťte, upozorněte uživatele na objev

%e -mailem, otočte o 90 stupňů a pokračujte v průzkumu

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ískat x souřadnici

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %získejte souřadnici y

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získat x souřadnici

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %získejte souřadnici y

i = 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';

pozice = savepos (pos);

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

sendmail (mail, 'Upozornění!', 'Něco jsem našel!', {imfile, pozice})

úhel = 90;

netangle = netangle+úhel;

r.turnAngle (úhel);

r.setDriveVelocity (v, v);

%Co dělat, když je vlevo od robota detekován objekt:

%zastavení, otočení směrem k objektu, zálohování, pořízení snímku, upozornění

%uživatelů objevů prostřednictvím e -mailu, otočte se o 90 stupňů a pokračujte v průzkumu

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ískat x souřadnici

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %získejte souřadnici y

i = i+1;

úhel = 30;

netangle = netangle+úhel;

r.turnAngle (úhel);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získat x souřadnici

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %získejte souřadnici y

i = i+1;

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

img = r.getImage;

imwrite (img, 'LeftBump.png')

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

imfile = 'LeftBump.png';

pozice = savepos (pos);

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

sendmail (mail, 'Upozornění!', 'Něco jsem našel!', {imfile, pozice})

úhel = -90;

netangle = netangle+úhel;

r.turnAngle (úhel);

r.setDriveVelocity (v, v);

%Co dělat, když je objekt detekován vpravo od robota:

%zastavení, otočení směrem k objektu, zálohování, pořízení snímku, upozornění

%uživatelů objevů prostřednictvím e -mailu, otočte se o 90 stupňů a pokračujte v průzkumu

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ískat x souřadnici

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %získejte souřadnici y

i = i+1;

úhel = -30;

netangle = netangle+úhel;

r.turnAngle (úhel);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získat x souřadnici

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %získejte souřadnici y

i = i+1;

pauza (1,5);

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

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

pozice = savepos (pos);

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

sendmail (mail, 'Upozornění!', 'Něco jsem našel!', {imfile, pozice});

úhel = 90;

netangle = netangle+úhel;

r.turnAngle (úhel);

r.setDriveVelocity (v, v);

%Co dělat, když je nalevo od robota detekován útes:

%zastavení, pohyb dozadu, zahněte doprava, pokračujte v průzkumu

elseif Cliff.left <odrážející_datum || Cliff.leftFront <odrážející_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získat x souřadnici

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %získejte souřadnici y

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %získat x souřadnici

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %získejte souřadnici y

i = i+1;

úhel = -RandAngle;

netangle = netangle+úhel;

r.turnAngle (úhel);

r.setDriveVelocity (v, v);

%Co dělat, když je vpravo od robota detekován útes:

%zastavení, pohyb dozadu, zahněte doleva, pokračujte v průzkumu

elseif Cliff.right <odrážející_datum || Cliff.rightFront <odrážející_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = dist * sind (úhel); %získat x souřadnici

pos (i, 2) = dist * cosd (úhel); %získejte souřadnici y

i = i+1;

r.moveDistance (-. 125);

úhel = RandAngle;

netangle = netangle+úhel;

r.turnAngle (úhel);

r.setDriveVelocity (v, v);

konec

konec

Ovladač smartphonu

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

Prompt = menu ('Jak byste chtěli ovládat vozítko?', Možnosti)

m = mobiledev

r = roomba (19)

pokud Výzva == 1

Badatel)

jiný

zatímco pravda

pauza (.5)

PhoneData = m. Orientace;

Azi = PhoneData (1);

Rozteč = Data telefonu (2);

Strana = Data telefonu (3);

pokud Strana> 130 || Strana <-130 %, pokud je telefon převrácen lícem dolů, zastavte roombu a ukončete smyčku

r.stop

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

přestávka

elseif Strana> 25 && Strana <40 %, pokud je telefon otočen na stranu mezi 25 a 40 stupni, otočte doleva o 5 stupňů

r.turnAngle (-5);

elseif Strana> 40 %, pokud je telefon otočen na stranu o více než 40 stupňů, otočte doleva o 45 stupňů

r.turnAngle (-45)

elseif Strana -40 %, pokud je telefon otočen na stranu mezi -25 a -40 stupňů, otočte doprava o 5 stupňů

r.turnAngle (5);

elseif Strana <-40 %, pokud je telefon otočen na stranu méně než -40 stupňů, otočte doleva o 45 stupňů

r.turnAngle (45)

konec

%Pokud je telefon držen v blízkosti svislice, pořiďte obrázek a vykreslete jej

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

r. píp

img = r.getImage;

subplot (3, 3, obrázek)

imshow (obr.)

konec

%pohyb vpřed a vzad na základě přední a zadní orientace

pokud je rozteč> 15 && rozteč <35 %, pokud je rozteč mezi 15 a 35 stupni, pohybujte se vpřed na krátkou vzdálenost

%před přesunem získejte údaje o lehkém nárazníku

litBump = r.getLightBumpers;

pokud litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, pokud je něco před roomba a zasáhne, pokud se pohne vpřed, vydá hluk a zobrazí zprávu

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

jinak %tah

r.moveDistance (.03);

%Získejte údaje o nárazníku po přesunu

Bump = r.getBumpers;

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

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

r.moveDistance (-. 01)

konec

%získat data senzoru útesu

Cliff = r.getCliffSensors;

pokud Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, pokud něco spustí snímač útesu, zacházejte s tím jako s lávou a zálohujte

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

r.moveDistance (-. 031)

konec

konec

elseif Rozteč> 35 %, pokud je rozteč větší 35 stupňů, posuňte se vpřed na delší vzdálenost

%před přesunem získejte údaje o lehkém nárazníku

litBump = r.getLightBumpers;

pokud litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, pokud je něco před roomba a zasáhne, pokud se pohne vpřed, vydá hluk a zobrazí zprávu

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

jinak %tah

r.moveDistance (.3)

%Získejte údaje o nárazníku po přesunu

Bump = r.getBumpers;

pokud Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %, pokud na něco narazíte, vydáte hluk, zobrazíte zprávu a zálohujete

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

r.moveDistance (-. 01)

konec

%získat data senzoru útesu po přesunu

Cliff = r.getCliffSensors;

pokud Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, pokud něco spustí snímač útesu, zacházejte s tím jako s lávou a zálohujte

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

r.moveDistance (-. 31)

konec

konec

elseif Rozteč -35 %, pokud se rozteč mezi -15 a -35 deg pohybuje zpět na krátkou vzdálenost

r.moveDistance (-. 03);

%získat data senzoru útesu po přesunu

Cliff = r.getCliffSensors;

pokud Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, pokud něco spustí snímač útesu, zacházejte s tím jako s lávou a zálohujte

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

r.moveDistance (.04)

konec

elseif Rozteč -60 %, pokud je rozteč mezi -35 a -60 stupňů, se přesune zpět na delší vzdálenost

r.moveDistance (-. 3)

%získat data senzoru útesu po přesunu

Cliff = r.getCliffSensors;

pokud Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, pokud něco spustí snímač útesu, zacházejte s tím jako s lávou a zálohujte

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

r.moveDistance (.31)

konec

konec

konec

konec

Doporučuje: