Spisu treści:

Przekształcenie Roomby w łazik marsjański: 5 kroków
Przekształcenie Roomby w łazik marsjański: 5 kroków

Wideo: Przekształcenie Roomby w łazik marsjański: 5 kroków

Wideo: Przekształcenie Roomby w łazik marsjański: 5 kroków
Wideo: Równania różniczkowe i przekształcenia całkowe, ćwiczenia - transformata Laplace'a cz. 4 2024, Listopad
Anonim
Przekształcenie Roomby w łazik marsjański
Przekształcenie Roomby w łazik marsjański

Krok 1: Zbierz swoje materiały

Aby ukończyć ten projekt, będziesz musiał zebrać następujące materiały:

1 robot Roomba

1 zestaw Raspberry Pi

1 kamera wideo

Dostęp do MATLAB

Krok 2: Pobierz zestawy narzędzi Roomba dla MATLAB

Pobierz zestawy narzędzi Roomba dla MATLAB
Pobierz zestawy narzędzi Roomba dla MATLAB
Pobierz zestawy narzędzi Roomba dla MATLAB
Pobierz zestawy narzędzi Roomba dla MATLAB

Uruchom następujący kod, aby zainstalować niezbędne przyborniki, aby ukończyć ten projekt.

funkcja roombaInstall

kl;

% lista plików do zainstalowania

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

% lokalizacji do zainstalowania

options = weboptions('CertificateFilename', ''); % powiedz mu, aby zignorował wymagania certyfikatu

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

dlgTitle = 'Instalacja/aktualizacja Roomba';

% celu wyświetlania i uzyskania potwierdzenia

monit = {

„Ten program pobierze te pliki EF 230 Roomba:”

''

strjoin(pliki, ' ')

''

'do tego folderu:'

''

Płyta CD

''

'Czy chcesz kontynuować? '

};

brzęczyk;

yn = questdlg(monit, …

dlgTitle, …

„Tak”, „Nie”, „Tak”);

if ~strcmp(yn, 'Tak'), zwróć; kończyć się

% pobierz listę istniejących plików

istniejące_pliki = pliki(cellfun(@istnieje, pliki) > 0);

jeśli ~isempty(istniejące_pliki)

% upewnia się, że naprawdę można je wymienić

prompt = {'Zamieniasz te pliki: '

''

strjoin(istniejące_pliki, ' ')

''

– Dobrze, żeby wymienić?

};

brzęczyk;

yn = questdlg(monit, …

dlgTitle, …

„Tak”, „Nie”, „Tak”);

if ~strcmp(yn, 'Tak'), zwróć; kończyć się

kończyć się

% pobierz pliki

liczba = 0;

dla i=1:długość(pliki)

f=pliki{i};

disp(['Pobieranie' f]);

próbować

url = [serwer f];

websave(f, url, opcje); % dodanych opcji, aby uniknąć błędów bezpieczeństwa

cnt = cnt + 1;

łapać

disp(['Błąd pobierania' f]);

manekin = [f '.html'];

jeśli istnieje(atrapa, 'plik')==2

usuń (atrapa)

kończyć się

kończyć się

kończyć się

if cnt == długość(pliki)

msg = 'Instalacja powiodła się';

waitfor(msgbox(msg, dlgTitle));

w przeciwnym razie

msg = 'Błąd instalacji - szczegóły w oknie poleceń';

waitfor(errordlg(msg, dlgTitle));

kończyć się

zakończ %roombaInstall

Krok 3: Połącz się z robotem Roomba

Teraz nadszedł czas, aby połączyć się z robotem Roomba za pomocą Wi-Fi. Używając 2 palców, naciśnij jednocześnie przyciski Dock i Spot, aby włączyć lub zresetować robota Roomba. Następnie uruchom kod r=roomba(# twojego Roomba) w oknie poleceń MATLAB, aby połączyć się z robotem. Po wykonaniu tego polecenia robot Roomba powinien być gotowy do pracy.

Krok 4: Wybierz sposób sterowania robotem Roomba

Wybierz sposób sterowania robotem Roomba
Wybierz sposób sterowania robotem Roomba
Wybierz sposób sterowania robotem Roomba
Wybierz sposób sterowania robotem Roomba

Istnieją dwa sposoby sterowania robotem Roomba: autonomicznie lub za pomocą smartfona jako kontrolera.

Jeśli zdecydujesz się na autonomiczną jazdę Roombą, będziesz musiał użyć trzech wbudowanych czujników: czujników urwiska, czujników nierówności i czujników światła.

Aby korzystać ze smartfona, musisz najpierw podłączyć smartfon do komputera, wykonując poniższe czynności.

UWAGA: Twój komputer i smartfon muszą być w tej samej sieci Wi-Fi, aby prawidłowo się połączyć!

1. Pobierz aplikację MATLAB ze sklepu z aplikacjami na swoje urządzenie.

2. Wpisz „connector on” w oknie poleceń i ustaw hasło, które trzeba będzie wprowadzić do obu urządzeń.

3. Po wykonaniu tej czynności MATLAB poda adres IP Twojego komputera. Musisz wejść na stronę ustawień w aplikacji MATLAB na swoim smartfonie i dodać komputer przy użyciu podanego adresu IP i hasła, które wcześniej wpisałeś.

4. W oknie poleceń na komputerze wpisz kod m=mobiledev, co powinno zainicjować smartfon jako kontroler dla Roomby.

5. Twój komputer i smartfon powinny być teraz gotowe do pracy.

Krok 5: Jedź swoim Roomba

Teraz, gdy masz już wszystkie niezbędne narzędzia do stworzenia swojego łazika marsjańskiego, jesteś gotowy do stworzenia własnego kodu. Poniżej załączamy przykładowy kod zarówno dla jazdy autonomicznej, jak i jazdy sterowanej smartfonem.

Autonomiczna jazda

funkcja Explore_modified(r)

% argumentów wejściowych: 1 obiekt roomba, r

% argumentów wyjściowych: brak

%opis:

Funkcja % wykorzystuje nieskończoną pętlę while, aby umożliwić autonomię

% eksploracja otoczenia bota.

%

%funciton dostarcza też Roombie instrukcje, co robić w

% następujące sytuacje: Koła tracą kontakt z podłożem, i

%object został wykryty przed lub po obu stronach bota, a

%nagłe upuszczenie zostało wykryte przed lub po obu stronach bota.

%

%typowe instrukcje zawierają polecenia ruchu mające na celu maksymalizację

% eksploracji lub unikania wykrytego zagrożenia i poleceń do komunikacji

%informacje dotyczące odkryć botów (zdjęcia), pozycji (wykres), % i stan (ostrzeżenie o osieroconym) z użytkownikiem za pośrednictwem programu Matlab i/lub poczty e-mail. Kilka

Polecenia dźwiękowe % są dodawane dla przyjemności.

%konfiguracja możliwości poczty e-mail

poczta = '[email protected]';

hasło = 'EF230Pokój';

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

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

setpref('Internet', 'SMTP_Nazwa_użytkownika', poczta);

setpref('Internet', 'SMTP_Hasło', hasło);

rekwizyty = java.lang. System.getProperties;

props.setProperty('mail.smtp.starttls.enable', 'prawda');

props.setProperty('mail.smtp.auth', 'prawda');

props.setProperty('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory');

props.setProperty('mail.smtp.socketFactory.port', '465');

% r=pokój(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 = 0,1;

odbicie_datu=2700; %ustaw wartość odniesienia czujników klifu

światłoBumper_datum = 200; %ustaw wartość odniesienia czujników światła zderzaka

poz=[0, 0]; %zmienna do przechowywania pozycji z zainicjowanym punktem odniesienia

kąt=0; %ustaw kąt odniesienia

siatka = 0; % przemieszczenie kąta netto

i=2; % iterator do dodawania wierszy do zmiennej przechowywania pozycji

odległość = 0;

r.setDriveVelocity(v, v); %rozpocznij poruszanie się Roomby do przodu

podczas gdy prawda

Klif = r.getCliffSensors;

Uderzenie = r.getBumpers;

Światło = r.getLightBumpers;

RandAngle = randi([20, 60], 1); % generuje 1 losowy kąt między 20 a 60 stopni. Służy do zapobiegania zablokowaniu bota w pętli

%Co zrobić, jeśli jedno lub więcej kół straci kontakt z podłożem:

%zatrzymaj ruch, wyślij e-mail ostrzegawczy ze zdjęciem otoczenia, % i zapytaj użytkownika, czy kontynuować, czy czekać na pomoc

jeśli Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

poz(i, 1)= poz(i-1, 1) + odległość * sind(netangle); % pobierz współrzędną x

poz(i, 2)= poz(i-1, 2) + odległość * cosd(netangle); % zdobądź y współrzędną

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

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

imfile='zablokowany.png';

pozycja=zapisz poz(poz);

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

sendmail(mail, 'HELP!', 'Utknąłem na klifie!', {imfile, position})

lista = {'Kontynuuj', 'Zatrzymaj'};

idx = menu('Co mam zrobić?', lista);

jeśli idx == 2

przerwa

kończyć się

%Co zrobić, jeśli obiekt zostanie wykryty przed botem:

%zatrzymaj się, cofnij się, zrób zdjęcie, powiadom użytkownika o odkryciu

%przez e-mail, obróć się o 90 stopni i kontynuuj eksplorację

elseif Light.leftCenter > lightBumper_datum || Light.rightCenter > lightBumper_datum || Bump.przód == 1

r.stop;

dist = r.getDistance;

poz(i, 1)= poz(i-1, 1) + odległość * sind(netangle); % pobierz współrzędną x

poz(i, 2)= poz(i-1, 2) + odległość * cosd(netangle); % zdobądź y współrzędną

i=i+1;

r.moveDistance(-.125);

dist = r.getDistance;

poz(i, 1)= poz(i-1, 1) + odległość * sind(netangle); % pobierz współrzędną x

poz(i, 2)= poz(i-1, 2) + odległość * cosd(netangle); % zdobądź y współrzędną

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

pozycja=zapisz poz(poz);

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

sendmail(mail, 'Alert!', 'Coś znalazłem!', {imfile, position})

kąt = 90;

sieć=siatka+kąt;

r.turnAngle(kąt);

r.setDriveVelocity(v, v);

%Co zrobić, jeśli obiekt zostanie wykryty na lewo od bota:

%zatrzymaj się, odwróć się w kierunku obiektu, cofnij się, zrób zdjęcie, zaalarmuj

%użytkownik odkrywania przez e-mail, obróć się o 90 stopni i kontynuuj eksplorację

elseif Light.leftFront > lightBumper_datum || Światło.lewe > światłoBumper_datum || Uderz.w lewo == 1

r.stop;

dist = r.getDistance;

poz(i, 1)= poz(i-1, 1) + odległość * sind(netangle); % pobierz współrzędną x

poz(i, 2)= poz(i-1, 2) + odległość * cosd(netangle); % zdobądź y współrzędną

i=i+1;

kąt=30;

siatka = siatka + kąt;

r.turnAngle(kąt);

r.moveDistance(-.125);

dist = r.getDistance;

poz(i, 1)= poz(i-1, 1) + odległość * sind(netangle); % pobierz współrzędną x

poz(i, 2)= poz(i-1, 2) + odległość * cosd(netangle); % zdobądź y współrzędną

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='LewyBump.png';

pozycja=zapisz poz(poz);

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

sendmail(mail, 'Alert!', 'Coś znalazłem!', {imfile, position})

kąt=-90;

siatka = siatka + kąt;

r.turnAngle(kąt);

r.setDriveVelocity(v, v);

%Co zrobić, jeśli obiekt zostanie wykryty na prawo od bota:

%zatrzymaj się, odwróć się w kierunku obiektu, cofnij się, zrób zdjęcie, zaalarmuj

%użytkownik odkrywania przez e-mail, obróć się o 90 stopni i kontynuuj eksplorację

elseif Światło.prawyPrzód > punkt odniesienia_światła || Light.right > lightBumper_datum || Bump.right == 1

r.stop;

dist = r.getDistance;

poz(i, 1)= poz(i-1, 1) + odległość * sind(netangle); % pobierz współrzędną x

poz(i, 2)= poz(i-1, 2) + odległość * cosd(netangle); % zdobądź y współrzędną

i=i+1;

kąt=-30;

sieć=siatka+kąt;

r.turnAngle(kąt);

r.moveDistance(-.125);

dist = r.getDistance;

poz(i, 1)= poz(i-1, 1) + odległość * sind(netangle); % pobierz współrzędną x

poz(i, 2)= poz(i-1, 2) + odległość * cosd(netangle); % zdobądź y współrzędną

i=i+1;

pauza(1.5);

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

img = r.getImage;

imwrite(img, 'RightBump.png')

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

imfile='RightBump.png';

pozycja=zapisz poz(poz);

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

sendmail(mail, 'Alert!', 'Coś znalazłem!', {imfile, position});

kąt=90;

sieć=siatka+kąt;

r.turnAngle(kąt);

r.setDriveVelocity(v, v);

%Co zrobić, jeśli na lewo od bota zostanie wykryty klif:

%zatrzymaj się, cofnij się, skręć w prawo, kontynuuj zwiedzanie

elseif Cliff.left < odbicie_danych || Cliff.leftFront < odbicie_odniesienia

r.stop;

dist = r.getDistance;

poz(i, 1)= poz(i-1, 1) + odległość * sind(netangle); % pobierz współrzędną x

poz(i, 2)= poz(i-1, 2) + odległość * cosd(netangle); % zdobądź y współrzędną

i=i+1;

r.moveDistance(-.125);

dist = r.getDistance;

poz(i, 1)= poz(i-1, 1) + odległość * sind(netangle); % pobierz współrzędną x

poz(i, 2)= poz(i-1, 2) + odległość * cosd(netangle); % zdobądź y współrzędną

i=i+1;

kąt=-RandAngle;

sieć=siatka+kąt;

r.turnAngle(kąt);

r.setDriveVelocity(v, v);

%Co zrobić, jeśli na prawo od bota zostanie wykryty klif:

%stop, cofnij się, skręć w lewo, kontynuuj eksplorację

elseif Cliff.right < odbicie_danych || Cliff.rightFront < odbicie_odniesienia

r.stop;

dist = r.getDistance;

pos(i, 1)= odległość * sind(kąt); % pobierz współrzędną x

pos(i, 2)= odległość * cosd(kąt); % zdobądź y współrzędną

i=i+1;

r.moveDistance(-.125);

kąt=RandKąt;

sieć=siatka+kąt;

r.turnAngle(kąt);

r.setDriveVelocity(v, v);

kończyć się

kończyć się

Kontroler smartfona

Opcje = {'Autonomiczny', 'Sterowanie ręczne'}

Prompt = menu('Jak chcesz sterować łazikiem?', Opcje)

m = mobiledev

r = pokój(19)

jeśli Monit == 1

Poszukiwacz)

w przeciwnym razie

podczas gdy prawda

pauza (.5)

PhoneData=m. Orientacja;

Azi=DaneTelefonu(1);

Skok=DaneTelefonu(2);

Strona=DaneTelefonu(3);

jeśli strona>130 || Bok <-130%, jeśli telefon jest odwrócony ekranem w dół, zatrzymaj Roombę i wyjdź z pętli

r.stop

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

przerwa

elseif Side>25 && Side<40 %jeśli telefon jest obrócony na boki między 25 a 40 stopni skręć w lewo 5 stopni

r.turnAngle(-5);

elseif Side> 40%, jeśli telefon jest obrócony na boki o ponad 40 stopni skręć w lewo o 45 stopni

r.turnAngle(-45)

elseif Side-40 % jeśli telefon jest obrócony bokiem między -25 a -40 stopni skręć w prawo 5 stopni

r.turnAngle(5);

elseif Side<-40%, jeśli telefon jest obrócony na boki mniej niż -40 stopni skręć w lewo 45 stopni

kąt obrotu(45)

kończyć się

% Jeśli telefon jest trzymany blisko pionu, zrób zdjęcie i narysuj je

jeśli skok <-60 && obraz <= 9

r.bip

img=r.pobierzobraz;

działka podrzędna(3, 3, obraz)

pokaż(obraz)

kończyć się

%przesuń się do przodu i do tyłu w oparciu o orientację przednią i tylną

if Pitch>15 && Pitch<35 %jeśli Pitch między 15 a 35 stopni przesuń się do przodu na krótką odległość

%uzyskaj dane o lekkim przerywniku przed przeniesieniem

litBump=r.getLightBumpers;

jeśli litBump.leftFront>500 || litBump.leftCenter>500 || litBump.rightCenter>500 || litBump.rightFront>500 %, jeśli coś znajduje się przed Roomba i uderzy, jeśli porusza się do przodu, hałasować i wyświetlać komunikat

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

jeszcze % ruchu

r.moveDistance(.03);

%Pobierz dane przerywnika po przeniesieniu

Bump=r.getBumpery;

jeśli Bump.right==1 || Bump.left==1 || Bump.przód==1

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

r.moveDistance(-.01)

kończyć się

% pobierz dane czujnika klifu

Cliff=r.getCliffSensors;

jeśli Klif.lewo>1500 || Klif.lewyPrzód>1500 || Klif. PrawyPrzód>1500 || Cliff.right> 1500 % jeśli coś uruchomi czujnik klifu, potraktuj to jako lawę i wykonaj kopię zapasową

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

r.moveDistance(-.031)

kończyć się

kończyć się

elseif Pitch>35 %jeśli Pitch większy 35 stopni przesuń się do przodu na większą odległość

%uzyskaj dane o lekkim przerywniku przed przeniesieniem

litBump=r.getLightBumpers;

jeśli litBump.leftFront>15 || litBump.leftCenter>15 || litBump.rightCenter>15 || litBump.rightFront>15%, jeśli coś znajduje się przed Roomba i uderzy, jeśli porusza się do przodu, hałasować i wyświetlać komunikat

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

jeszcze % ruchu

r.moveDistance(.3)

%Pobierz dane przerywnika po przeniesieniu

Bump=r.getBumpery;

jeśli Bump.right==1 || Bump.left==1 || Bump.front==1 %jeśli coś uderzysz, zrób hałas, wyświetl komunikat i wykonaj kopię zapasową

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

r.moveDistance(-.01)

kończyć się

% uzyskaj dane z czujnika klifu po przeprowadzce

Cliff=r.getCliffSensors;

jeśli Klif.lewo>1500 || Klif.lewyPrzód>1500 || Klif. PrawyPrzód>1500 || Cliff.right> 1500 % jeśli coś uruchomi czujnik klifu, potraktuj to jako lawę i wykonaj kopię zapasową

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

r.moveDistance(-.31)

kończyć się

kończyć się

elseif Skok-35% jeśli skok między -15 a -35 stopni cofnij się na krótką odległość

r.moveDistance(-.03);

% uzyskaj dane z czujnika klifu po przeprowadzce

Cliff=r.getCliffSensors;

jeśli Klif.lewo>1500 || Klif.lewyPrzód>1500 || Klif. PrawyPrzód>1500 || Cliff.right> 1500 % jeśli coś uruchomi czujnik klifu, potraktuj to jako lawę i wykonaj kopię zapasową

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

r.moveDistance(.04)

kończyć się

elseif Pitch-60 %if pitch pomiędzy -35 a -60 stopni cofnij się na większą odległość

r.moveDistance(-.3)

% uzyskaj dane z czujnika klifu po przeprowadzce

Cliff=r.getCliffSensors;

jeśli Klif.lewo>1500 || Klif.lewyPrzód>1500 || Klif. PrawyPrzód>1500 || Cliff.right> 1500 % jeśli coś uruchomi czujnik klifu, potraktuj to jako lawę i wykonaj kopię zapasową

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

r.moveDistance(.31)

kończyć się

kończyć się

kończyć się

kończyć się

Zalecana: