Spisu treści:
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
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ą.