Tartalomjegyzék:

A Roomba átalakítása Mars Roverré: 5 lépés
A Roomba átalakítása Mars Roverré: 5 lépés

Videó: A Roomba átalakítása Mars Roverré: 5 lépés

Videó: A Roomba átalakítása Mars Roverré: 5 lépés
Videó: Best Robot Vacuums 2024 - The Only 5 You Should Consider Today 2024, November
Anonim
A Roomba átalakítása Mars Roverré
A Roomba átalakítása Mars Roverré

Lépés: Gyűjtse össze anyagait

A projekt befejezéséhez a következő anyagokat kell összegyűjtenie:

1 Roomba robot

1 Raspberry Pi készlet

1 Videokamera

Hozzáférés a MATLAB -hoz

2. lépés: Töltse le a Roomba eszköztárait a MATLAB számára

Töltse le a Roomba eszköztárait a MATLAB számára
Töltse le a Roomba eszköztárait a MATLAB számára
Töltse le a Roomba eszköztárait a MATLAB számára
Töltse le a Roomba eszköztárait a MATLAB számára

Futtassa a következő kódot a projekt befejezéséhez szükséges eszköztárak telepítéséhez.

funkció roombaTelepítés

clc;

% telepítendő fájlok listája

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

% telepítési hely

options = weboptions ('CertificateFilename', ''); % azt mondja, hogy figyelmen kívül hagyja a tanúsítvány követelményeit

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

dlgTitle = 'Roomba telepítése/frissítése';

% megjelenítési cél, és kap megerősítést

prompt = {

'Ez a program letölti ezeket az EF 230 Roomba fájlokat:'

''

strjoin (fájlok, "")

''

'ebbe a mappába:'

''

CD

''

'Akarod folytatni? '

};

hangjelzés;

yn = questdlg (gyors,…

dlgCím,…

„Igen”, „Nem”, „Igen”);

ha ~ strcmp (yn, 'Igen'), vissza; vége

% get a létező fájlok listája

létező_fájlok = fájlok (cellfun (@exist, files)> 0);

ha ~ üres (létező_fájlok)

% győződjön meg arról, hogy valóban rendben van -e kicserélni őket

prompt = {'Ezeket a fájlokat cseréli le:'

''

strjoin (létező_fájlok, "")

''

- Rendben van cserélni?

};

hangjelzés;

yn = questdlg (gyors,…

dlgCím,…

„Igen”, „Nem”, „Igen”);

ha ~ strcmp (yn, 'Igen'), vissza; vége

vége

% töltse le a fájlokat

cnt = 0;

i = 1 esetén: hossz (fájlok)

f = fájlok {i};

disp (['Letöltés' f]);

próbáld ki

url = [f szerver];

webes mentés (f, url, opciók); % hozzáadott lehetőség a biztonsági hibák elkerülésére

cnt = cnt + 1;

fogás

disp (['Hiba a letöltéskor' f]);

dummy = [f '.html'];

ha létezik (dummy, 'file') == 2

törlés (dummy)

vége

vége

vége

ha cnt == hossz (fájlok)

msg = 'A telepítés sikeres';

waitfor (msgbox (msg, dlgTitle));

más

msg = 'Telepítési hiba - részletekért lásd a parancsablakot';

waitfor (errordlg (msg, dlgTitle));

vége

end %roombaInstall

3. lépés: Csatlakozás a Roomba -hoz

Most itt az ideje, hogy WiFi segítségével csatlakozzon a Roomba készülékéhez. A Roomba bekapcsolásához vagy alaphelyzetbe állításához két ujjal nyomja meg egyszerre a Dock és a Spot gombot. Ezután futtassa az r = roomba kódot (Roomba# -ja) a MATLAB parancsablakában, hogy csatlakozzon a robotjához. Miután végrehajtotta ezt a parancsot, a Roomba készen áll az indulásra.

4. lépés: Válassza ki, hogyan szeretné irányítani a Roomba -t

Válassza ki, hogyan szeretné irányítani a Roomba -t
Válassza ki, hogyan szeretné irányítani a Roomba -t
Válassza ki, hogyan szeretné irányítani a Roomba -t
Válassza ki, hogyan szeretné irányítani a Roomba -t

A Roomba kétféle módon vezérelhető: önállóan vagy okostelefon használatával vezérlőként.

Ha a Roomba autonóm vezetését választja, akkor a három beépített érzékelőt kell használnia: sziklaérzékelőket, ütésérzékelőket és fényérzékelőket.

Az okostelefon használatához először csatlakoztatnia kell okostelefonját a számítógéphez az alábbi lépések végrehajtásával.

MEGJEGYZÉS: A számítógép és az okostelefon ugyanazon a WiFi hálózaton kell, hogy legyen, hogy megfelelően csatlakozzon!

1. Töltse le a MATLAB alkalmazást a készülék alkalmazásboltjából.

2. A parancsablakba írja be a "connector on" parancsot, és állítson be jelszót, amelyet mindkét eszközbe be kell írni.

3. Ezt követően a MATLAB megadja a számítógép IP -címét. Be kell lépnie az okostelefon MATLAB alkalmazásának beállítási oldalára, és hozzá kell adnia egy számítógépet a megadott IP -cím és a korábban megadott jelszó használatával.

4. A számítógép parancsablakában írja be az m = mobiledev kódot, és ezzel inicializálja az okostelefont a Roomba vezérlőjeként.

5. A számítógépnek és az okostelefonnak most készen kell állnia a használatra.

5. lépés: Vezesse a Roomba -t

Most, hogy minden szükséges eszköze megvan a Mars Rover létrehozásához, készen áll a saját kód létrehozására. Az alábbiakban példakódot csatoltunk mind az autonóm vezetéshez, mind az okostelefonnal vezérelt vezetéshez.

Autonóm vezetés

függvény Explore_modified (r)

%bemeneti argumentum: 1 roomba objektum, r

%kimeneti argumentum: nincs

%leírás:

A %függvény végtelen, míg ciklusokat használ az autonóm használathoz

%feltárása a bot környezetének.

%

A %funciton utasításokat is ad a roomba -nak, hogy mit tegyen

%a következő helyzeteket: A kerekek elvesztik a kapcsolatot a talajjal, an

%objektumot észlel a bot előtt vagy mindkét oldalán, és a

%hirtelen esést észlel a bot előtt vagy mindkét oldalán.

%

A tipikus utasítások %tartalmaznak mozgásparancsokat, amelyek célja a maximalizálás

%felfedezés vagy az észlelt veszély elkerülése, és kommunikációs parancsok

%információ a botok felfedezéseiről (képek), pozíció (grafikon), %és állapot (szálkás figyelmeztetés) a felhasználóval matlab és/vagy e -mail útján. Számos

%hangparancsokat adunk hozzá az élvezethez.

%beállítási e -mail képességek

mail = '[email protected]';

jelszó = 'EF230Roomba';

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

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

setpref ('Internet', 'SMTP_felhasználónév', mail);

setpref ('Internet', 'SMTP_Password', jelszó);

kellékek = 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 = szoba (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;

tükrözi_adat = 2700; %sziklaérzékelő referenciaérték beállítása

lightBumper_datum = 200; %beállított fény Lökhárító érzékelők referencia értéke

poz = [0, 0]; %változó a pozíció tárolásához, nullapont inicializálva

szög = 0; %beállított referenciaszög

netangle = 0; %nettó szög -elmozdulás

i = 2; %iterátor sorok hozzáadásához a pozíciótároló változóhoz

dist = 0;

r.setDriveVelocity (v, v); %start roomba halad előre

míg igaz

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Fény = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %1 véletlenszerű szöget hoz létre 20 és 60 fok között. Arra használják, hogy a bot ne ragadjon bele a hurokba

%Mi a teendő, ha egy vagy több kerék elveszíti a kapcsolatot a talajjal:

%mozgás leállítása, figyelmeztető e -mail küldése a környezet képével, %és kérdezze meg a felhasználót, hogy folytassa -e vagy várja a segítséget

ha Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.megáll

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kap x koordinátát

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kap y koordinátát

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, 'ragadt.png');

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

imfile = 'ragadt.png';

pozíció = savepos (pos);

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

sendmail (mail, 'SEGÍTSÉG!', 'Egy sziklán rekedtem!', {imfile, position})

list = {'Folytatás', 'Leállítás'};

idx = menu ('Mit tegyek?', lista);

ha idx == 2

szünet

vége

%Mi a teendő, ha objektumot észlel a bot előtt:

%megállás, visszalépés, kép készítése, figyelmeztetés a felfedezésre

%e -mailben, forduljon 90 fokkal, és folytassa a felfedezést

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); %kap x koordinátát

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kap y koordinátát

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kap x koordinátát

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kap y koordinátát

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

pozíció = savepos (pos);

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

sendmail (mail, 'Alert!', 'Találtam valamit!', {imfile, position})

szög = 90;

netangle = netangle+szög;

r.turnAngle (szög);

r.setDriveVelocity (v, v);

%Mi a teendő, ha objektumot észlel a bot bal oldalán:

%megállás, tárgy felé fordulás, biztonsági mentés, kép készítése, riasztás

%felhasználó a felfedezés e -mailben, forduljon 90 fokkal, és folytassa a felfedezést

elseif Light.leftFront> lightBumper_datum || Fény.bal> lightBumper_datum || Bump.left == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kap x koordinátát

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kap y koordinátát

i = i+1;

szög = 30;

netangle = netangle+szög;

r.turnAngle (szög);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kap x koordinátát

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kap y koordinátát

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

pozíció = savepos (pos);

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

sendmail (mail, 'Alert!', 'Találtam valamit!', {imfile, position})

szög = -90;

netangle = netangle+szög;

r.turnAngle (szög);

r.setDriveVelocity (v, v);

%Mi a teendő, ha objektumot észlel a bot jobb oldalán:

%megállás, tárgy felé fordulás, biztonsági mentés, kép készítése, riasztás

%felhasználó a felfedezés e -mailben, forduljon 90 fokkal, és folytassa a felfedezést

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); %kap x koordinátát

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kap y koordinátát

i = i+1;

szög = -30;

netangle = netangle+szög;

r.turnAngle (szög);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kap x koordinátát

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kap y koordinátát

i = i+1;

szünet (1.5);

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

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

pozíció = savepos (pos);

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

sendmail (mail, 'Alert!', 'Találtam valamit!', {imfile, position});

szög = 90;

netangle = netangle+szög;

r.turnAngle (szög);

r.setDriveVelocity (v, v);

%Mi a teendő, ha sziklát észlel a bot bal oldalán:

%stop, mozogjon hátra, forduljon jobbra, folytassa a felfedezést

elseif Cliff.left <tükrözi_adat || Cliff.leftFront <tükrözi_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kap x koordinátát

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kap y koordinátát

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kap x koordinátát

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kap y koordinátát

i = i+1;

szög = -RandAngle;

netangle = netangle+szög;

r.turnAngle (szög);

r.setDriveVelocity (v, v);

%Mi a teendő, ha sziklát észlel a bot jobb oldalán:

%stop, mozogjon hátra, forduljon balra, folytassa a felfedezést

elseif Cliff.right <tükrözi_datum || Cliff.rightFront <tükrözi_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = dist * sind (szög); %kap x koordinátát

pos (i, 2) = dist * cosd (szög); %kap y koordinátát

i = i+1;

r.moveDistance (-. 125);

szög = RandAngle;

netangle = netangle+szög;

r.turnAngle (szög);

r.setDriveVelocity (v, v);

vége

vége

Okostelefon vezérlő

Beállítások = {'Autonóm', 'Kézi vezérlés'}

Prompt = menu ('Hogyan szeretné irányítani a rovert?', Beállítások)

m = mobiledev

r = roomba (19)

ha gyors == 1

Felfedező)

más

míg igaz

szünet (.5)

PhoneData = m. Orientation;

Azi = Telefonadatok (1);

Hangmagasság = Telefonadatok (2);

Oldal = Telefonadatok (3);

ha az oldal> 130 || Oldala <-130 %, ha a telefont lefelé fordítja, állítsa le a Roomba-t és lépjen ki

r.megáll

r. hangjelzés ('C, C, C, C')

szünet

elseif Oldala> 25 && Oldala <40 %, ha a telefont 25 és 40 ° között oldalra fordítja, forduljon balra 5 ° -kal

r.fordulószög (-5);

elseif Oldala> 40 %, ha a telefont oldalra fordítva 40 ° -kal balra 45 ° -kal fordul

r.turnAngle (-45)

elseif Oldalsó -40 %, ha a telefont oldalra fordítja -25 és -40 fok között, forduljon jobbra 5 fokkal

r.fordulószög (5);

elseif Oldala <-40 %, ha a telefont oldalra fordítva kevesebb, mint -40 ° fordul balra 45 °

r.turnAngle (45)

vége

%Ha a telefont függőleges közelében tartja, készítsen egy képet, és rajzolja meg

ha Pitch <-60 && image <= 9

r. sípolás

img = r.getImage;

alterület (3, 3, kép)

imshow (img)

vége

%előre és hátra mozog az elülső és hátsó tájolás alapján

ha Pitch> 15 && Pitch <35 %, ha 15 és 35 ° közötti dőlésszög halad előre rövid távolságra

%kap könnyű lökhárító adatokat mozgás előtt

litBump = r.getLightBumpers;

ha világítBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, ha valami a roomba előtt van, és előreütéskor üt, zajt ad és üzenetet jelenít meg

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

más %mozog

r.moveDistance (.03);

%Lökhárító adatok beszerzése költözés után

Bump = r.getBumpers;

ha Bump.jobb == 1 || Bump.left == 1 || Bump.front == 1

r. hangjelzés ('A, C, E')

r.moveDistance (-. 01)

vége

%kap sziklaérzékelő adatokat

Cliff = r.getCliffSensors;

ha Cliff.bal> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ha valami kiváltja a sziklaérzékelőt, lávaként kezelje, és készítsen biztonsági másolatot

r. hangjelzés ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 031)

vége

vége

elseif Pitch> 35 %, ha a dőlésszög nagyobb, mint 35 °, lépjen előre hosszabb távolságra

%kap könnyű lökhárító adatokat mozgás előtt

litBump = r.getLightBumpers;

ha világítBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, ha valami a roomba előtt van, és ütés esetén előrehaladáskor zajt ad és üzenetet jelenít meg

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

más %mozog

r.moveDistance (.3)

%Lökhárító adatok beszerzése költözés után

Bump = r.getBumpers;

ha Bump.jobb == 1 || Bump.left == 1 || Bump.front == 1 %, ha valamit eltalál, hangot ad, üzenetet jelenít meg, és biztonsági másolatot készít

r. hangjelzés ('A, C, E')

r.moveDistance (-. 01)

vége

%kap sziklaérzékelő adatokat költözés után

Cliff = r.getCliffSensors;

ha Cliff.bal> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ha valami kiváltja a sziklaérzékelőt, lávaként kezelje, és készítsen biztonsági másolatot

r. hangjelzés ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 31)

vége

vége

elseif Pitch -35 %, ha a dőlésszög -15 és -35 fok között mozog vissza

r.moveDistance (-. 03);

%kap sziklaérzékelő adatokat költözés után

Cliff = r.getCliffSensors;

ha Cliff.bal> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ha valami kiváltja a sziklaérzékelőt, lávaként kezelje, és készítsen biztonsági másolatot

r. hangjelzés ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.04)

vége

elseif Pitch -60 %, ha a -35 és -60 ° közötti dőlésszög hosszabb távolságra lép vissza

r.moveDistance (-. 3)

%kap sziklaérzékelő adatokat költözés után

Cliff = r.getCliffSensors;

ha Cliff.bal> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ha valami kiváltja a sziklaérzékelőt, lávaként kezelje, és készítsen biztonsági másolatot

r. hangjelzés ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.31)

vége

vége

vége

vége

Ajánlott: