Mobot#

Artykuł autorstwa Cosku Acay, Edwin Cho, Kenneth Li i Nishant Pol. PDF.

Opis projektu#

W zawodach Mobot w Carnegie Mellon roboty muszą przejść przez serię 14 bramek rozmieszczonych na 255-stopowej zakrzywionej białej linii na zewnętrznym chodniku. Trasa obejmuje dwie strome rampy oraz obszar punktu decyzyjnego, w którym robot musi wybrać właściwą trasę, aby przejść przez 14 bramek w kolejności szeregowej. Ponieważ linia znajduje się na zewnątrz i podlega pogodzie Pittsburgha, robot musi działać w różnych warunkach. W tym roku w dniu zawodów było deszczowo i wietrznie. Więcej informacji można znaleźć na http://www.cs.cmu.edu/mobot/mobot.html

Mobot Mobot

Mobot (full size)Mobot (full size)

Rozwiązanie z CMUcam4#

Zdecydowaliśmy się podejść do zadania podążania za linią za pomocą CMUcam4, ponieważ wymagało to minimalnego sprzętu i miało interfejs dobrze dostosowany do śledzenia linii.

Mobot hardware Mobot hardware (full size)

CMUcam4 przechwytuje obraz linii z prędkością 30 klatek na sekundę i przekazuje obraz śledzenia koloru do Arduino Mega przez jedną z trzech linii szeregowych. Arduino Mega następnie przetwarza ten obraz (patrz Opis oprogramowania poniżej) i dostarcza polecenia prędkości silnika oraz skrętu do kontrolera PID przez inną linię szeregową. Kontroler PID z kolei dostarcza Arduino Mega liczbę zliczeń enkodera dla prawego i lewego koła, co pozwala nam śledzić naszą pozycję i kierunek względem bramki 0.

Kontroler PID (MD-25) jest produkowany przez Robot-Electronics w Wielkiej Brytanii. Napędza dwa przekładniowe szczotkowe silniki DC z magnetycznymi enkoderami na wale silnika. Ekran LCD służy do celów debugowania. Mieliśmy dwie szyny zasilania, 12V dla silników i 5V dla logiki, dzielące tę samą masę i obie zasilane z pojedynczej ładowalnej baterii 12V.

Początkowo planowaliśmy wykonać prototyp z drewnianej podstawy, aby szybko przejść do fazy programowania, a następnie popracować nad szybszą, bardziej niezawodną podstawą, taką jak samochód RC. Okazało się jednak, że prototyp był bardzo niezawodny i łatwy w obsłudze, więc zachowaliśmy go do finalnego projektu. Uszczelnienie korpusu składało się z warstwy folii celofanowej pod warstwą taśmy pakowej. Deszcz jednak przeciekał przez taśmę pakową, ale na szczęście nie przez folię celofanową. Kamera była przykryta kwadratem plastiku z torebki Ziploc, ponieważ odkryliśmy, że ten „filtr” poprawiał zdolność kamery do ignorowania małych fragmentów linii, które dla kamery wyglądały jak betonowe tło.

Opis algorytmu#

Wprowadzenie#

Używamy CMUcam4 w trybie śledzenia koloru z włączonym trybem YUV, co daje nam binarną reprezentację obrazu linii. Oprogramowanie kamery odfiltrowuje wszystko, co nie jest białe (tj. tło) i umieszcza piksel „włączony” tam, gdzie jest linia (gdzie jest biało). Używamy trybu YUV, aby śledzenie koloru było niewrażliwe na intensywność światła, dzięki czemu nasz robot może działać w wielu różnych warunkach, w tym w pomieszczeniach i na zewnątrz.

Podążanie za linią#

CMUcam4 dostarcza naszemu układowi Arduino obraz binarny 80 na 60. Próbkujemy 10 równomiernie rozmieszczonych wierszy pikseli z obrazu i obliczamy środek ciężkości pikseli „włączonych” (zobacz tutaj: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Następnie zakładamy, że linia leży na środku ciężkości. Robiąc to na 10 różnych wierszach obrazu, uzyskujemy dobre przybliżenie linii poprzez połączenie punktów. Możemy następnie wykorzystać te dane, znajdując, jak daleko każdy punkt na linii znajduje się od linii pionowej leżącej w środku obrazu, aby uzyskać wartość reprezentującą, jak bardzo linia jest zakrzywiona. Można to postrzegać jako coś w rodzaju znajdowania pola między styczną a krzywą i wykorzystania tego pola do określenia, jak bardzo musimy skręcić. Znak określa, czy skręt jest w lewo, czy w prawo, natomiast wartość bezwzględna określa, jak bardzo musimy skręcić, aby podążać za linią. Jak można się spodziewać, jeśli zmierzyliśmy zerowe pole, to linia znajduje się bezpośrednio przed robotem i jest linią prostą. Jeśli wartość bezwzględna pola jest duża, robot musi skręcić, aby próbować minimalizować wartość tego pola.

Punkty decyzyjne#

Aby określić, czy robot znajduje się w punkcie decyzyjnym, bierzemy dane zebrane przez kamerę podczas podążania za linią i sprawdzamy, ile średnich punktów środkowych pojawia się w czarnej przestrzeni. Działa to w oparciu o założenie, że średni punkt między dwiema liniami nie powinien znajdować się na żadnej z linii, chyba że linie są tą samą linią. Jeśli robot wykryje wiele średnich punktów w czarnej przestrzeni, może wywnioskować, że muszą tu być dwie linie. Następnie wybiera odpowiedni skręt i preferuje skręcanie w tym kierunku, dopóki nie zobaczy tylko jednej linii.

Przejdź do https://github.com/cacay/Mobot, aby zobaczyć uproszczoną wersję naszego kodu, lub tutaj po lokalną kopię.