Spisu treści:

Robo-technik: 8 kroków
Robo-technik: 8 kroków

Wideo: Robo-technik: 8 kroków

Wideo: Robo-technik: 8 kroków
Wideo: Jak odwołuje się zajęcia na AGH 2024, Listopad
Anonim
Robo-Technik
Robo-Technik

Wyobraź sobie przez chwilę, że jesteś jednym z astronautów, którzy lądują na Marsie. Masz milion rzeczy do zrobienia, próbki do pobrania, eksperymenty do przeprowadzenia, dane do zebrania, ale raz lub dwa razy dziennie musisz biegać po mieszkaniu i/lub modułach badawczych, w których mieszkasz i pracujesz, aby je sprawdzić. To konieczne, ktoś musi upewnić się, że rzecz jest w dobrym stanie, że wszystkie tysiące elementów i części działają i znajdują się na swoim miejscu. Ale co by było, gdyby istniał automatyczny pomocnik, który uwolniłby cię od niektórych z tych obowiązków. Co by było, gdyby istniał mały robot, który mógłby poruszać się po modułach, aby upewnić się, że wszystko jest na swoim miejscu, działa i jest bezpieczne.

Robo-Technik na ratunek.

Zasadniczo ten kod kontroluje Robo-Technika, ponieważ podąża on jasną ścieżką na ziemi. Będzie podążał tą ścieżką, dopóki nie znajdzie skrzyżowania na ścieżce lub zakrętu, co poprosi o zrobienie zdjęcia w celu przetworzenia obrazu, aby umożliwić Robo-Technikowi podjęcie decyzji, gdzie iść dalej. Czujniki świetlnego uderzenia i uderzenia działają, aby chronić Robo-Technika przed uszkodzeniem, a czujniki uderzenia kontrolują, kiedy zostanie wykonane zdjęcie diagnostyczne. Podsumowując, Robo-Technik został zaprojektowany do poruszania się po modułach Marsa, uwalniając czas astronautów podczas wykonywania podstawowego zadania inspekcji, wzywając ludzi tylko wtedy, gdy znajdzie coś nie tak.

Ponownie, jako ostrzeżenie, jest to praca w toku. Kod, jaki istnieje, działa, ale ma pewne problemy, zwłaszcza że w grę wchodzi wiele nakładających się programów. Ponadto, aby ten projekt działał w rzeczywistej misji na Marsa, robot musiałby zostać zbudowany w tym konkretnym celu, więc znowu sądzę, że jest to konstrukcja „sprawdzająca koncepcję”.

Jest kilka rzeczy, których potrzebujesz, aby to uruchomić. Będziesz potrzebował drogiego programu, pakietów wsparcia dla tego programu i trochę wiedzy na temat kodowania. Ponieważ jestem studentem, a część kodu z parteru została dostarczona (dla raspberry pi), nie będę mówił konkretnie o konfiguracji. Poniżej znajdziesz wszystkie linki do tego kodu podstawowego. Przejdźmy do listy materiałów.

Sprzęt komputerowy

  • Raspberry Pi (użyliśmy wersji 3)
  • iRobot®
  • pewnego rodzaju urządzenie trzymające, aby utrzymać Raspberry Pi podłączone do Robo-Technician
  • Kamera Raspberry Pi (nie ma znaczenia, jaka, o ile ma dobry autofokus i rozdzielczość obrazu)
  • jakiś stojak lub kabura, aby utrzymać kamerę skierowaną do przodu na Robo-Technician
  • materiał do zastosowania jako pasek, biały (lub w bardzo jasnym kolorze), który jest bezpiecznie przymocowany do podłogi. Musi być nieco szerszy niż przestrzeń między dwoma przednimi czujnikami klifu.
  • 4 znaki z bardzo dużym tekstem (z nadrukowanymi słowami IMAGE, RIGHT, BACK i LEFT)
  • Arkusze kolorowego papieru (co najmniej trzy, najlepiej czerwony, zielony i niebieski)

Oprogramowanie

  • Matlab (używano obu wersji 2018a i 2017b i wydaje się, że nie ma to większego znaczenia)
  • Pakiet wsparcia Raspberry Pi dla Matlab
  • Kod Raspberry Pi do połączenia z Matlabem (link do kodu źródłowego zamieszczonego poniżej)
  • Image Processing Toolbox for Matlab (prawie nie możesz zrobić tego projektu bez zestawu narzędzi)
  • OPCJONALNIE: Matlab Mobile zainstalowany na Twoim telefonie, co wyjaśnię później

Krok 1: Konfiguracja sprzętu

ef.engr.utk.edu/ef230-2018-08/projects/roo…

To jest łącze do kodu podstawowego, aby zapewnić, że iRobot® może komunikować się z Matlabem, wraz z podstawowym samouczkiem. Jak powiedziałem wcześniej, nie będę omawiał tej konkretnej części, ponieważ samouczek jest już bardzo dobrze rozplanowany. Wspomnę, że po wykonaniu kroków podanych w linku możesz użyć polecenia „doc” Matlaba, aby przejrzeć zawarte informacje. Konkretnie:

doktor roomba

I jeszcze jeden bardzo ważny punkt.

Kiedy pobierzesz pliki z powyższego linku, UMIEŚĆ JE W FOLDERZE, KTÓRYM OPISAŁEM POWYŻEJ, ponieważ Matlab wymaga, aby pliki wygenerowane przez użytkownika znajdowały się w bieżącym folderze roboczym.

Pomijając to, przejdźmy do kodu.

Krok 2: Znalezienie wszystkich tych czujników

Znajdowanie wszystkich tych czujników
Znajdowanie wszystkich tych czujników
Znajdowanie wszystkich tych czujników
Znajdowanie wszystkich tych czujników

Poświęć chwilę i poddaj iRobot® przegląd. Dobrze jest wiedzieć, gdzie one są, aby mieć pojęcie o danych wejściowych, które otrzymuje Robo-Technik, i będziesz w stanie dowiedzieć się, dlaczego rzecz kręci się w kółko zamiast podążać ścieżką, którą ustawisz (może to mogło się nie wydarzyć). Oczywiście z przodu zobaczysz duży fizyczny czujnik wstrząsów. Czujniki klifu są nieco trudniejsze do zauważenia, musisz je odwrócić i poszukać czterech przezroczystych plastikowych okienek w pobliżu przedniej krawędzi. Czujniki wstrząsów świetlnych są jeszcze bardziej ukryte, ale na razie wystarczy powiedzieć, że na żywo w błyszczącym czarnym pasku biegnie wokół przodu iRobota®, który znajduje się z przodu paska fizycznego czujnika wstrząsów.

Istnieją czujniki upadku kół, ale nie są one używane w tym projekcie, więc przejdziemy do testowania czujników.

Krok 3: Testowanie w celu ustawienia parametrów

Testowanie w celu ustawienia parametrów
Testowanie w celu ustawienia parametrów

Zanim wyślemy Robo-Technika, żeby wykonał jego pracę, musimy poznać jego specyficzne dziwactwa i zasięgi czujników. Ponieważ każdy iRobot® jest nieco inny i zmienia się w trakcie życia robota, musimy dowiedzieć się, jak czujniki odczytują obszary, w których będzie pracował. Najprostszym sposobem na to jest ustawienie jasnej ścieżki (Użyłem pasków białego papieru do drukarki, ale wszystko, co jasne, wystarczy) na powierzchni, na której będzie działał Robo-Technik.

Uruchom Matlab i otwórz nowy skrypt. Zapisz skrypt W TYM SAMYM FOLDERZE, CO WCZEŚNIEJ OPISAŁEM i nazwij go, jak chcesz (choć postaraj się, aby był krótki, ponieważ nazwa tego pliku będzie nazwą funkcji). Włącz robota i użyj ustawień zmiennej roomba z samouczka, wpisując polecenia w oknie poleceń.

Upewnij się, że Raspberry Pi jest podłączone do iRobota®, a Twój komputer jest podłączony do tego samego połączenia internetowego. Spędzisz mniej czasu na wyrywaniu włosów, próbując dowiedzieć się, dlaczego Matlab nie chce się połączyć

r = roomba (numer, który ustawiłeś)

Zmienna "r" w tym przypadku nie jest konieczna, możesz ją nazwać jak chcesz, ale ułatwia życie przy użyciu zmiennej jednoliterowej.

Po ustawieniu ścieżki i pomyślnym podłączeniu Roomba umieść przyszłego Robo-Technika w miejscu, w którym jeden lub dwa czujniki klifu znajdują się nad ścieżką. Oczywiście oznacza to, że pozostałe dwie lub trzy znajdują się nad wybraną powierzchnią.

Teraz uruchom czujniki testowe poleceniem:

r.testSensors

Należy pamiętać, że " r. " jest zmienną zdefiniowaną wcześniej, więc jeśli nie jest to ' r ' zmień ' r '. do tego, na co się zdecydujesz. Spowoduje to wyświetlenie ekranu czujnika testowego z mnóstwem informacji.

W tym projekcie skoncentruj się na lekkich zderzakach, zderzakach i sekcjach klifowych. Poruszaj Robo-Technikiem dookoła, upewniając się, jak czujniki zmieniają się na różnych powierzchniach lub jak blisko musi znajdować się obiekt, aby zmieniły się wartości ligthBumpera itp. Pamiętaj o tych liczbach (lub zapisz je), ponieważ będziesz potrzebujesz ich, aby ustawić parametry w ciągu sekundy.

Krok 4: Uruchamianie kodu

Najpierw będziesz konstruować funkcję. Nazwałem to „ścieżką”, ale znowu nazwa nie jest konieczna, ale od teraz będę się do niej odwoływać jako „ścieżka”.

W górnej części kodu ustawiane są opcje wprowadzania danych przez użytkownika. Tworzy kilka list, które będą używane w in listdlg, a następnie wyświetla okno dialogowe listy. Pozwala to użytkownikowi wybrać kolor ścieżki, którą chce podążać, co wchodzi w grę później.

lista = {'Czerwony', 'Niebieski', 'Zielony'}

problist = {'Okazyjny, Zapisz obraz', 'Komponent nie na miejscu, Zapisz obraz', 'Oczekiwany, kontynuuj'} pathcolor = listdlg('PromptString', 'Wybierz kolor ścieżki', … 'SelectionMode', 'single', 'ListString', lista) prob = 0; napęd = ;

Zmienne "prob" i "driv" muszą być zadeklarowane w tym miejscu, ponieważ będą używane w głównej pętli while funkcji, ale znowu, jeśli chcesz zmienić nazwę którejkolwiek z tych zmiennych lub zmienić wybór listy, jest to w porządku, o ile jesteś konsekwentny w pozostałej części kodu.

Krok 5: Początek pętli: fizyczne czujniki uderzeń

Górna część pętli while zawiera logikę fizycznego czujnika uderzeń. Zasadniczo, gdy Robo-Technik wpada na coś, co zatrzymuje się (lub w przypadku przedniego czujnika wypukłości cofa się o 0,1 metra), a następnie ustawia się, aby zrobić zdjęcie. Przyjrzyjmy się najpierw części kontroli prędkości i pozycji.

Jeśli przetestowałeś wszystkie czujniki na Robo-Technician w poprzednich krokach, będziesz wiedział, że czujniki uderzeniowe mają wartość logiczną (0 lub 1) z zerem reprezentującym normalną, niewciśniętą pozycję czujnika. Pamiętaj o tym w kodzie.

while true %main while pętla %receive bumper info S = r.getBumpers if S.left ~= 0 r.stop elseif S.right ~= 0 r.stop elseif S.front ~= 0 r.stop end

To jest podstawowa część „jeśli w coś uderzy, przestań”. Jeśli czujniki wykryją kolizję, przesuwają się do następnej części kodu, która ponownie dostosowuje pozycję Robo-Technika, aby uzyskać zdjęcie.

if S.left ~= 0 %if pętla pobiera informacje o przerywniku i dopasowuje kamerę do zdjęcia r.turnAngle(5) pause(0.5) img = r.getImage %robi zdjęcie i wyświetla obraz(img) %okno dialogowe prob = listdlg(' PromptString', 'Znaleziono nieoczekiwaną przeszkodę, proszę zidentyfikować'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.right ~=0 r.turnAngle(-5) pause(0.5) img = r. getImage image(img) prob = listdlg('PromptString', 'Znaleziono nieoczekiwaną przeszkodę, proszę zidentyfikować'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~= 0 r.moveDistance(- 0.1) pause(0.5) img = r.getImage image(img) prob = listdlg('PromptString', 'Znaleziono nieoczekiwaną przeszkodę, proszę zidentyfikować'…, 'SelectionMode', 'single', 'ListString', problist) end

Zasadniczo po zrobieniu zdjęcia pojawi się kolejne okno dialogowe z trzema opcjami. Dwie pierwsze opcje zapisują zdjęcie w określonym folderze, który omówię później, podczas gdy trzecia opcja po prostu zamyka okno dialogowe i kontynuuje pętlę. Jeśli nie pamiętasz opcji, spójrz na poprzedni krok.

Teraz wstawiłem sekcję kodu między część czujnika uderzeń a część do zapisywania zdjęć. To pobiera wartości lightBumpera i ustawia prędkość napędu na 0,025 metra/sekundę (bardzo wolno), co w rzeczywistości nie jest konieczne, ale zmniejsza to, że Robo-Technik wpada w różne rzeczy i ostatecznie zużywa fizyczne czujniki wstrząsów.

L = r.getLightBumpers, jeśli L.left > 100 || L.lewyPrzód >100 || L. PrawyPrzód >100 || L.right >100 driv = 0,025 r.setDriveVelocity(0,025) w przeciwnym razie driv = 0,1 end

To byłaby ta część, w której w grę wchodzą wartości, które wcześniej zaobserwowałeś (i miejmy nadzieję, że zapisałeś)

Wartość „L.(strona i kierunek czujnika) > 100” została oparta na obserwowanych przeze mnie wartościach, więc jeśli Twoje obserwacje są różne, zmień te liczby. Chodzi o to, że jeśli Robo-Technik wyczuje coś kilka centymetrów przed sobą, zwolni, o ile nie jest to niepotrzebne.

Następna część to miejsce, w którym zdjęcia są zapisywane na później.

%jeśli pierwsza lub druga opcja została wybrana w oknie dialogowym prob, zapisuje obraz jeśli prob == 1 %if pętla buduje informacje o pliku dla zdjęcia, zapisuje ze znacznikiem czasu t = zegar; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); folder = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(folder, nazwa bazowa); imwrite(img, fullFileName) zamknij Rysunek 1 pauza(2) elseif prob == 2 t = zegar; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); folder = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(folder, nazwa bazowa); imwrite(img, fullFileName) zamknij Rysunek 1 pauza(2) koniec

Wszystkie nazwy plików i lokalizacje, w których zapisywane są zdjęcia, są opcjonalne. Wybrałem folder, który jest zagnieżdżony w folderze Roomba, który utworzyłem w kroku wstępnym, ale może być w dowolnym miejscu. Ponadto zdjęcia są zapisywane ze znacznikiem czasu, ale nie jest to szczególnie konieczne (choć hipotetycznie byłoby to przydatne w przypadku misji na Marsa).

Mając zakryte fizyczne czujniki wypukłości, możemy przejść do czujników klifu i podążania ścieżką.

Krok 6: Podążanie ścieżką

Kod dla czujników klifu jest skonfigurowany do porównania wartości dwóch wartości czujników przednich i dwóch bocznych. Będziesz musiał zmienić te wartości (prawdopodobnie) na podstawie obserwowanych wartości. Prawdopodobnie będziesz także musiał edytować te wartości po kilku testach i zmieniać je w zależności od oświetlenia otoczenia, pory dnia (w zależności od tego, jak dobrze oświetlony jest obszar testowy) lub kiedy okna czujników są brudne.

Zanim jednak przejdziemy do kodu czujnika klifu, wstawiłem krótki segment kodu, aby usunąć niektóre niepotrzebne dane z Matlaba. Ta część nie jest potrzebna, ale użyłem jej, aby zmniejszyć ilość miejsca potrzebnego do uruchomienia programu.

wyczyść img wyczyść t wyczyść nazwę bazową wyczyść fullFileName wyczyść folder

Kolejny segment kodu jest mięsem projektu. Pozwala Robo-Technikowi podążać ścieżką w jasnym kolorze, która została umieszczona na podłodze. Krótko mówiąc, próbuje sterować, aby dwa przednie czujniki klifu znajdowały się powyżej progu, w oparciu o obserwowane wartości, i pozwala programowi rozpocząć kroki przetwarzania obrazu nieco później.

C = r.getCliffSensors %if pętla podąża za kolorowym pasmem (białym) if C.leftFront > 2000 && C.rightFront >2000 %proste prowadzenie po ścieżce r.setDriveVelocity(driv) elseif C.leftFront 2000 %obraca się w prawo, jeśli robot zajdzie za daleko left r.turnAngle(-2.5) elseif C.leftFront >2000 && C.rightFront<2000%obraca się w lewo, jeśli robot zajdzie za daleko w prawo r.turnAngle(2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.lewyPrzód >100 || L. PrawyPrzód >100 || L.right >100 img = r.getImage end %sprawdza, czy na ścieżce jest zagięcie, jeśli C.left >2800 && C.right <2800 r.turnAngle(2.5) elseif C.left 2800 r.turnAngle(- 2.5) end %miejsce do rozpoznawania ścieżki disp('POBIERANIE OBRAZU') end end end

Należy pamiętać, że wybrane przeze mnie nazwy zmiennych są opcjonalne, ale myślę, że w miarę możliwości ułatwia to życie

Aby wyjaśnić środkową część kodu, gdy dwa przednie czujniki wybiegają poza krawędź ścieżki (kiedy dochodzi do skrzyżowania lub gdy dochodzi do końca ścieżki), wygląda, czy coś jest przed nimi. Aby to zadziałało, musisz umieścić obiekt na ziemi na końcu ścieżki lub na wszystkich skrzyżowaniach.

Po zrobieniu zdjęcia używa rozpoznawania obrazu, aby dowiedzieć się, co zrobić. W tej sekcji kodu znajduje się również symbol zastępczy:

%place holder dla ścieżki rozpoznawania obrazudisp('POBIERANIE OBRAZU')

Użyłem tego na razie, ponieważ chciałem opowiedzieć konkretnie o przetwarzaniu tekstu i kolorów, które ma miejsce, co jest w następnym kroku.

Krok 7: Przetwarzanie obrazu

Przetwarzanie obrazu składa się z dwóch części. Pierwszym z nich jest rozpoznawanie kolorów, które oblicza intensywność kolorów na obrazie, aby zdecydować, czy kontynuować rozpoznawanie tekstu. Obliczenia kolorów opierają się na tym, jaki wybór został dokonany w pierwszym oknie dialogowym na początku (użyłem czerwonego, niebieskiego, zielonego, ale możesz wybrać dowolne kolory, o ile średnie wartości intensywności kolorów mogą być rozpoznane przez Kamera Raspberry Pi).

img = r.getImage img = imcrop(img, [0 30 512 354]) imgb =imcrop(img, [0 30 512 354]) img = imcrop(img, [0 30 512 354]) czerwony = średnia(średnia(imgb(:,:, 1))); g = średnia(średnia(imgb(:,:, 2))); b = średnia(średnia(imgb(:,:, 3)));

To jest kontrola intensywności. Zostanie to wykorzystane w następnym segmencie, aby zdecydować, co chce zrobić.

if red > g && red >b if pathcolor == 1 imgc = imcrop(img, [0 30 512 354]) R = ocr(img) if R. Words{1} == OBRAZ || R. Words{2} == OBRAZ || R. Words{3} ==OBRAZ t = zegar; basename = sprintf('\img_%d_%d_%d_%d_%d.png', t(1), t(2), t(3), t(4), t(5)); folder = 'E:\UTK\Classes\fall 18\ef230\irobot\images'; fullFileName = fullfile(folder, nazwa bazowa); imwrite(img, fullFileName) pause(2) elseif R. Words{1} == PRAWO || R. Words{2} == PRAWO || R. Words{3} ==PRAWO r.turnAngle(-75) elseif R. Words{1} == LEWO || R. Słowa{2} == LEWO || R. Words{3} == W LEWO r.turnAngle(75) elseif R. Words{1} == WSTECZ || R. Words{2} == WSTECZ || R. Words{3} ==BACK r.turnAngle(110) end else r.turnAngle(110) end end

Ten segment decyduje, czy kolor wybrany w pierwszym oknie dialogowym pasuje do koloru widzianego przez kamerę. Jeśli tak, uruchamia rozpoznawanie tekstu. Wygląda na to, które słowo (IMAGE, BACK, RIGHT lub LEFT) pojawia się, a następnie obraca się (dla prawej i lewej strony), obraca się (dla tyłu) lub robi zdjęcie i zapisuje je w ten sam sposób, jak wcześniej.

Dostarczyłem tylko jedną sekcję kodu dla różnych kolorów

Aby umożliwić rozpoznawanie przez kod koloru niebieskiego i zielonego, po prostu skopiuj kod i zmień kontrolę logiczną u góry segmentu i ustaw kolor ścieżki == (liczba), aby odpowiadał kolorom wybranym z górnego okna dialogowego (dla tak jak jest wyświetlany, niebieski byłby 2, a zielony 3).

Krok 8: Gotowy produkt

Skończony produkt
Skończony produkt

Teraz Robo-Technik powinien poruszać się po modułach misji na Marsa i informować astronautów, gdy coś jest nie na miejscu.

Pamiętaj, że wszystkie wartości czujnika klifu i lightBumper muszą zostać zmienione na obserwowane wartości. Z doświadczenia wiem, że lepiej przetestować ten projekt na ciemnej podłodze, a jeszcze lepiej, jeśli ta podłoga nie odbija światła. Powoduje to zwiększenie kontrastu między ścieżką a podłogą, co zwiększa prawdopodobieństwo, że Robo-Technik będzie podążał za nią poprawnie.

Mam nadzieję, że spodobało Ci się konfigurowanie małego pomocnika do misji na Marsa i budowanie dobrej zabawy.

Zalecana: