Spisu treści:
Wideo: Projekt Mars Roomba UTK: 4 kroki
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:30
OŚWIADCZENIE: TO DZIAŁA TYLKO, JEŚLI ROOMBA JEST USTAWIONA W A
BARDZO SZCZEGÓLNY SPOSÓB, TA INSTRUKCJA ZOSTAŁA STWORZONA I PRZEZNACZONA DO WYKORZYSTANIA PRZEZ STUDENTÓW I WYDZIAŁÓW UNIWERSYTETU TENESSEE
Ten kod jest używany do skonfigurowania robota Roomba do uruchamiania lokalnie napisanego i zapisanego kodu w MATLAB. To nie zadziała, jeśli nie możesz uzyskać niezbędnych bibliotek ze strony internetowej Uniwersytetu Tennessee. Jeśli posiadasz biblioteki, możesz je wykorzystać do zaprogramowania własnego Roomby za pomocą funkcji w bibliotece. Ta instrukcja uczy, jak zainstalować biblioteki, utworzyć folder dla całego kodu oraz jak kodować i korzystać z programu, który udostępniliśmy poniżej.
Potrzebne materiały:
· Roomba
· MATLAB
· Raspberry Pi i kamera Pi
Krok 1: Zdobywanie bibliotek
Na stronie inżynierskiej znajduje się zestaw narzędzi/biblioteka, który należy pobrać i umieścić w nowym folderze. Ten folder musi zawierać wszystkie pliki robocze projektu, ponieważ każda funkcja używana w programie, który tworzysz, będzie musiała odwoływać się do biblioteki. Po wykonaniu tej czynności możesz rozpocząć pracę nad swoimi programami
Krok 2: Pisanie programów
Istnieje wiele funkcji, które można wykorzystać w programie, dostęp do tych funkcji można uzyskać za pomocą polecenia „doc roomba”. Korzystając z tych funkcji, możesz sterować robotem Roomba na wiele różnych sposobów. Poniższy kod wykorzystuje czujniki wypukłości, czujniki paska świetlnego, kamerę i czujniki klifu na różne sposoby, aby stworzyć łazik marsjański. Wykorzystaliśmy czujniki uderzeń, aby wykryć, kiedy robot Roomba uderza w obiekt, kiedy to się dzieje, robot cofa się, odwraca i kontynuuje ruch. Zanim Roomba uderzy w obiekt, pasek świetlny wykryje obiekt i spowolni Roombę tak, że gdy uderzy w obiekt, aby aktywować czujnik uderzenia, Roomba będzie mniej uszkodzony/pod wpływem uderzenia. Kamera wyszukuje wodę lub lawę na powierzchni, jeśli nie zostanie znaleziona ciecz, robot będzie kontynuował wyszukiwanie, jeśli zostanie znaleziona woda, robot wyśle wiadomość do operatorów. Czujniki urwiska są zaprojektowane tak, aby zatrzymać robota, jeśli zbliży się do urwiska. Jeśli robot wyczuje urwisko, cofnie się i zawróci, aby uniknąć upadku.
Krok 3: Kod
Skopiuj i wklej to do pliku MATLAB, który znajduje się w tym samym folderze co biblioteki
functionMainRoombaFile(r)
r.setDriveVelocity(0.1, 0.1)
while true % Infinte while pętla utrzymująca działanie kodu
dontFall = cliffCheck(r) % Przypisuje zmienną „dontFall” do funkcji „cliffCheck”
if dontFall % if, aby kontynuować w kodzie po zakończeniu 'cliffCheck'
r.setDriveVelocity(0.1, 0.1) % Utrzymuje robota Roomba w ruchu po zakończeniu 'cliffCheck'
end % kończy 'dontFall' if statement
bumper=bumpcheck(r) % Przypisuje zmienną 'bumper' do funkcji 'bumpcheck'
if bumper % if instrukcja kontynuowania w kodzie po zakończeniu „bumpcheck”
r.setDriveVelocity(0.1, 0.1) % Utrzymuje robota Roomba w ruchu po zakończeniu „testu uderzeniowego”
end % kończy 'zderzak' if instrukcji
liquids = LiquidCheck(r) % Przypisuje zmienną 'liquids' do funkcji 'LiquidCheck'
if płyny % if deklaracja kontynuacji w kodzie po zakończeniu 'LiquidCheck'
r.setDriveVelocity(0.1, 0.1) % Utrzymuje robota Roomba w ruchu po zakończeniu „LiquidCheck”
end % kończy 'liquids' if statement
lightbumper=lightcheck(r) % Przypisuje zmienną „lightbumper” do funkcji „lightcheck”
pauza (0,1) % Krótka pauza, aby uniknąć ciągłej iteracji pętli
end % kończy się w nieskończoność while pętla
end % kończy funkcję
function bumper=bumpcheck(r) % Tworzy funkcję 'bumpcheck'
bumpdata= r.getBumpers % Przypisuje wszystkie dane z przerywnika do zmiennej „bumpdata”
zderzak = bumpdata.right || bumpdata.left || bumpdata.front % Tworzy przechowywaną zmienną „zderzak” dla różnych przerywników
if bumpdata.right>0 % Jeśli stwierdzenie powodujące różne funkcje Roomby w przypadku uderzenia w zderzak
r.stop % Zatrzymuje Roomba
r.moveDistance (-0,3, 0,2) % cofa Roomba 0,3m
r.turnAngle(90, 0.5) % Obraca Roombę o 90 stopni tak szybko, jak to możliwe
kończyć się
jeśli bumpdata.front>0
r.stop
r.moveDistance (-0,3, 0,2)
r.turnAngle(randi(270), 0.5) % Obraca robota Roomba w losowych odstępach od 0 do 270 stopni tak szybko, jak to możliwe
kończyć się
jeśli bumpdata.left>0
r.stop
r.moveDistance (-0,3, 0,2)
r.turnAngle(-90, 0.5) % Obraca Roombę o -90 stopni tak szybko, jak to możliwe
kończyć się
kończyć się
function lightbump=lightcheck(r) % Tworzy funkcję 'lightcheck'
lightdata= r.getLightBumpers % Przypisuje wszystkie dane z czujnika uderzeń świetlnych do zmiennej „lightdata”
lightbump = lightdata.left || lightdata.right || lightdata.rightCenter || lightdata.leftCenter % Tworzy przechowywaną zmienną „lightbumper” dla różnych zderzaków świetlnych
if lightbumper % instrukcja If, aby wywołać dane lightbumpera z góry
if lightdata.left>10 % Instrukcja If powodująca wystąpienie różnych funkcji Roomby, jeśli zderzak światła wykryje więcej niż 10 wartości
r.setDriveVelocity(0,05, 0,05) % Spowalnia roombę, aby przygotować się na uderzenie
end % kończy początkowe wyrażenie if
jeśli lightdata.rightCenter>10
r.setDriveVelocity(0,05, 0,05)
kończyć się
jeśli lightdata.right>10
r.setDriveVelocity(0,05, 0,05)
kończyć się
jeśli lightdata.leftCenter>10
r.setDriveVelocity(0,05, 0,05)
kończyć się
end % kończy 'lightbumper' if statement
end % kończy funkcję lightcheck
function dontFall = cliffCheck(r) % Tworzy funkcję 'cliffCheck'
dane = r.getCliffSensors; % Przypisuje wszystkie dane z czujnika klifu do zmiennej „dane”
dontFall = dane.po lewej<1020 || data.leftFront<1020 || data.rightFront<1020 || data.right<1020 % Tworzy przechowywaną zmienną „dontFall” dla różnych czujników klifu
if dontFall % If, aby wywołać dane z czujnika klifu z góry
if data.left < 1010 % If instrukcja powodująca wystąpienie różnych funkcji Roomba, jeśli czujnik wysokości wykryje mniej niż 1010 wartości
r.stop
r.moveDistance (-0,2; 0,2) % w tył Roomba 0,2m
r.turnAngle(-90, 0.5) % Obraca Roombę o -90 stopni tak szybko, jak to możliwe
elseif data.leftFront < 1010
r.stop
r.moveDistance (-0,3, 0,2)
r.turnAngle(90, 0.5) % Obraca Roombę o 90 stopni tak szybko, jak to możliwe
elseif data.rightFront < 1010
r.stop
r.moveDistance (-0,3, 0,2)
r.turnAngle(90, 0.5) % Obraca Roombę o 90 stopni tak szybko, jak to możliwe
elseif data.right < 1010
r.stop
r.moveDistance (-0,3, 0,2)
r.turnAngle(90, 0.5) % Obraca Roombę o 90 stopni tak szybko, jak to możliwe
kończyć się
kończyć się
kończyć się
płyny funkcyjne = LiquidCheck(r) % Tworzy funkcję „LiquidCheck”
podczas gdy prawda % rozpocznij nieskończoną pętlę do kalibracji
img = r.getImage; % odczytuje kamerę z robota
image(img) % pokazuje obraz w oknie figury
red_mean = mean(mean(img(200, 150, 1)))% odczytuje średnią ilość czerwonych pikseli
blue_mean = mean(mean(img(200, 150, 3)))% odczytuje średnią ilość niebieskich pikseli
ciecze = czerwona_średnia || blue_mean % Tworzy przechowywaną zmienną „ciecze” dla różnych zmiennych koloru
if liquids % if wywołanie danych obrazu z góry
if red_mean>170 % If instrukcja powodująca różne funkcje Roomby, jeśli kamera widzi średni czerwony kolor większy niż 170
r.stop % zatrzymuje Roomba
r.setLEDCenterColor(255) % ustawia koło na kolor czerwony
r.setLEDDigits(); % wyczyść wyświetlacz
f = waitbar(0, '*KOMUNIKAT PRZYCHODZĄCY*'); % tworzy pasek oczekiwania na ładowanie wiadomości
r.setLEDDigits('GORĄCE'); % ustawia wyświetlacz LED na wyjście „GORĄCE”
pauza(0.5) %Krótka pauza, aby przeczytać wyświetlone informacje
r.setLEDDigits('LAVA'); % ustawia wyświetlacz LED na wyjście „LAVA”
pauza(0.5)
waitbar(.33, f, '*KOMUNIKAT PRZYCHODZĄCY*'); % tworzy wzrost paska oczekiwania
r.setLEDDigits('GORĄCE');
pauza(0.5)
r.setLEDDigits('LAVA');
pauza(0.5)
waitbar(.67, f, '*KOMUNIKAT PRZYCHODZĄCY*'); % tworzy wzrost paska oczekiwania
r.setLEDDigits('GORĄCE');
pauza(0.5)
r.setLEDDigits('LAVA');
waitbar(1, f, '*KOMUNIKAT PRZYCHODZĄCY*'); %uzupełnia pasek oczekiwania
pauza(1)
close(f) % zamyka pasek oczekiwania
r.setLEDDigits(); % czyści wyświetlacz LED
zamknij wszystkie % Zamyka wszystkie poprzednie okna
osie('Color', 'none', 'XColor', 'none', 'YColor', 'none') % Czyści okno wykresu osi i wykresu
y=0,5; % ustawia pozycję y tekstu w oknie kreślenia
x=0,06; % ustawia pozycję x tekstu w oknie kreślenia
title('FROM MARS ROOMBA', 'fontsize', 32) % Dodaje tytuł do okna kreślenia
quadeqtxt = 'NIEBEZPIECZEŃSTWO LAWA'; % Ustawia zmienną 'quadeqtxt' na 0
text(x, y, quadeqtxt, 'interpreter', 'lateks', 'rozmiar czcionki', 36); % wyświetla tekst quadeq w oknie kreślenia
r.moveDistance(-0,2, 0,2) %odwraca Roomba 0,2m
r.turnAngle(180, 0.5) %obraca roombę o 180 stopni najszybciej jak to możliwe
r.setLEDCenterColor(128, 128); % ustawia środkową diodę LED Roomby na pomarańczową
zamknij wszystkie %zamyka pozostałe otwarte okna
elseif blue_mean>175 % If stwierdzenie powodujące różne funkcje Roomby jeśli kamera widzi średni niebieski kolor większy niż 175
r.stop % zatrzymuje Roomba
r.setLEDCenterColor(255) % ustawia koło na kolor czerwony
r.setLEDDigits(); % wyczyść wyświetlacz
f = waitbar(0, '*KOMUNIKAT PRZYCHODZĄCY*'); % tworzy pasek oczekiwania na ładowanie wiadomości
r.setLEDDigits('WYGLĄDAJ'); % ustawia wyświetlacz LED na wyjście „LOOK”
pauza(0.5) %Krótka pauza, aby przeczytać wyświetlone informacje
r.setLEDDigits('WATR'); % ustawia wyświetlacz LED na wyjście „WATR”
pauza(0.5)
waitbar(.33, f, '*KOMUNIKAT PRZYCHODZĄCY*'); % tworzy wzrost paska oczekiwania
r.setLEDDigits('WYGLĄDAJ');
pauza(0.5)
r.setLEDDigits('WATR');
pauza(0.5)
waitbar(.67, f, '*KOMUNIKAT PRZYCHODZĄCY*'); % tworzy wzrost paska oczekiwania
r.setLEDDigits('WYGLĄDAJ');
pauza(0.5)
r.setLEDDigits('WATR');
waitbar(1, f, '*KOMUNIKAT PRZYCHODZĄCY*'); %uzupełnia pasek oczekiwania
pauza(1)
close(f) % zamyka pasek oczekiwania
r.setLEDDigits(); % czyści wyświetlacz LED
zamknij wszystkie % Zamyka wszystkie poprzednie okna
osie('Color', 'none', 'XColor', 'none', 'YColor', 'none') % Czyści okno wykresu osi i wykresu
y=0,5; % ustawia pozycję y tekstu w oknie kreślenia
x=0,06; % ustawia pozycję x tekstu w oknie kreślenia
title('FROM MARS ROOMBA', 'fontsize', 32) % Dodaje tytuł do okna kreślenia
quadeqtxt = 'ZNALEZIONA WODA'; % Ustawia zmienną 'quadeqtxt' na 0
text(x, y, quadeqtxt, 'interpreter', 'lateks', 'rozmiar czcionki', 36); % wyświetla tekst quadeq w oknie kreślenia
r.moveDistance(-0,2, 0,2) %odwraca Roomba 0,2m
r.turnAngle(180, 0.5) %obraca roombę o 180 stopni najszybciej jak to możliwe
r.setLEDCenterColor(128, 128); % ustawia środkową diodę LED Roomby na pomarańczową
zamknij wszystkie %zamyka pozostałe otwarte okna
end %ends 'red_mean' if statement
end %ends 'liquids' if statement
end % zamyka nieskończoność while pętla
end % kończy funkcję „LiquidCheck”
Krok 4: Uruchamianie kodu
Po skopiowaniu i wklejeniu kodu do MATLAB musisz połączyć się z Roombą. Po podłączeniu robota Roomba musisz nazwać zmienną r. Funkcje używają zmiennej r w odniesieniu do Roomby, więc Roomba musi być zdefiniowana jako zmienna r. Po uruchomieniu kodu Roomba powinna działać zgodnie z instrukcją.
Zalecana:
Projekt robota UTK 2017: 3 kroki
Projekt robota UTK 2017: Misja: Nasz zespół inżynierów został zatrudniony przez Froogle, fundację non-profit zajmującą się rozwojem technologii open-source, w celu opracowania innowacyjnego Human Assisting Mars Rover. to Roomba, którą zakodowaliśmy, aby wykonać serię o
Mars Roomba: 6 kroków
Mars Roomba: Ten instruktaż poprowadzi Cię w kierunku obsługi bota próżniowego Roomba kontrolowanego przez Raspberry Pi. System operacyjny, którego będziemy używać, to MATLAB
Projekt UTK EF 230 MarsRoomba Jesień 2018: 5 kroków
Projekt UTK EF 230 MarsRoomba Jesień 2018: Obecnie łaziki marsjańskie są używane do zbierania danych na powierzchni Marsa różnymi metodami, aby ostatecznie dowiedzieć się więcej o potencjale planety dla życia mikrobiologicznego. Łaziki wykorzystują głównie narzędzia fotograficzne i analizy gleby do danych c
IRobot Create-Mars Expedition Rover Mark I: 4 kroki
IRobot Create-Mars Expedition Rover Mark I: Ta instrukcja nauczy Cię, jak skonfigurować iRobot Create za pomocą kodowania MatLab. Twój robot będzie mógł wyszukiwać minerały poprzez rozróżnianie kształtów, manewrować nierównym terenem za pomocą czujników klifowych i ma zdolność
Palnik zasilany przez USB! Ten projekt może przepalić plastik/drewno/papier (zabawny projekt musi być również bardzo drobny): 3 kroki
Palnik zasilany przez USB! Ten projekt może palić się przez plastik/drewno/papier (zabawny projekt musi być również bardzo cienki): NIE WOLNO TEGO UŻYWAĆ Z USB!!!! Dowiedziałem się, że może uszkodzić twój komputer ze wszystkich komentarzy. mój komputer jest w porządku. Użyj ładowarki do telefonu 600mA 5V. użyłem tego i działa dobrze i nic nie może zostać uszkodzone, jeśli użyjesz wtyczki bezpieczeństwa, aby zatrzymać zasilanie