Spisu treści:
- Krok 1: Zbierz swoje materiały
- Krok 2: Pobierz zestawy narzędzi Roomba dla MATLAB
- Krok 3: Połącz się z robotem Roomba
- Krok 4: Wybierz sposób sterowania robotem Roomba
- Krok 5: Jedź swoim Roomba
Wideo: Przekształcenie Roomby w łazik marsjański: 5 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:27
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
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
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:
Raspberry Pi - autonomiczny łazik marsjański ze śledzeniem obiektów OpenCV: 7 kroków (ze zdjęciami)
Raspberry Pi - autonomiczny łazik marsjański z śledzeniem obiektów OpenCV: Zasilany przez Raspberry Pi 3, rozpoznawanie obiektów Open CV, czujniki ultradźwiękowe i motoreduktory prądu stałego. Ten łazik może śledzić każdy obiekt, do którego jest wyszkolony, i poruszać się po dowolnym terenie
Przekształcenie dowolnego samochodu zdalnego sterowania w samochód zdalnie sterowany za pomocą aplikacji Bluetooth: 9 kroków
Przekształcenie dowolnego samochodu zdalnego sterowania w samochód zdalnie sterowany za pomocą aplikacji Bluetooth: Ten projekt pokazuje kroki, jak zmienić zwykły samochód zdalnie sterowany na samochód sterujący Bluetooth (BLE) z płytą robotyki Wombatics SAM01, aplikacją Blynk i aplikacją MIT Inventor. jest wiele tanich samochodów RC z wieloma funkcjami, takimi jak reflektory LED i
Weebo - marsjański robot rozpoznawczy: 7 kroków (ze zdjęciami)
Weebo - marsjański robot rozpoznawczy: „Weebo” to nazwa interfejsu sterowania robotem Dustena Vermette (po lewej) i Austina Kelly (po prawej) podczas prezentacji na targach EF 230 Robot
Przekształcenie sprężarki lodówki w pompę próżniową: 5 kroków
Przerabianie sprężarki lodówki na pompę próżniową: Od jakiegoś czasu chciałem mieć pompę próżniową, ale odmawiam zapłaty ceny za nową, która wygląda na wystarczająco mocną i wytrzymałą, której, jak sobie wyobrażam, potrzebuję. Czytałem na różnych forach o wykonaniu pompy próżniowej z kompresora lodówki, ale
Przekształcenie systemu Windows XP lub Vista w komputer Mac i Linux: 10 kroków
Przekształcenie systemu Windows XP lub Vista w komputer Mac i Linux: Ta instrukcja pokaże, jak zmienić komputer z systemem Windows w komputer Mac i PC, a także w system Linux. - Polecam mieć co najmniej 2 GB pamięci RAM - i ponad 10 GB miejsca na dysku twardym (jeśli chcesz linux) Vista lub XP jest zalecane - robię to na