Spisu treści:

Projekt Mars Roomba UTK: 4 kroki
Projekt Mars Roomba UTK: 4 kroki

Wideo: Projekt Mars Roomba UTK: 4 kroki

Wideo: Projekt Mars Roomba UTK: 4 kroki
Wideo: Я работаю в Страшном музее для Богатых и Знаменитых. Страшные истории. Ужасы. 2024, Lipiec
Anonim
Mars Roomba Projekt UTK
Mars Roomba Projekt UTK
Mars Roomba Projekt UTK
Mars Roomba Projekt UTK

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: