Cześć 😉
Chciałbym podzielić się moim projektem, który już jakiś czas temu ukończyłem. Głównym założeniem było stworzenie robota, którego będzie można sterować ręcznie (myszką) lub sam będzie znajdował przedmiot do podniesienia za pomocą kamerki. Do obróbki obrazu wykorzystałem Matlaba oraz komunikację szeregową.
Poniżej zamieszczam filmik prezentujący ogólną zasadę działania robota oraz demonstrujący jego możliwości, dostępne są napisy po polsku i angielsku:
Zanim przejdziemy dalej - jeżeli uważasz, że ten robot to ciekawy projekt, proszę zostaw łapkę w górę pod filmikiem, biorę udział w konkursie orgznizowanym przez Matlaba, w którym 40% puli punktów pochodzi z wyświetleń i łapek w górę pod filmikiem konkursowym.
Tryb ręczny
Do obsłużenia myszki komputerowej wykorzystałem tę bibliotekę oraz ten schemat podłączenia. Całość jest całkiem prosta, jedynym kłopotem jest dostanie się do przewodów w kablu myszki, są strasznie cienkie i łatwo je uszkodzić.
Tryb automatyczny
Niestety - ten manipulator potrafi znaleźć przedmiot tylko jeżeli ten leży w jednym z trzech wcześniej zdefiniowanych miejsc. Może kiedyś przyjdzie czas na rozszerzoną wersję 😉 Jak już wspomniałem - do zadania obróbki obrazu z kamerki wykorzystałem Matlaba. Pierwszym komentarzem jest zazwyczaj zwrócenie uwagi na prostsze alternatywy, np. OpenCV, ale z Matlabem mam już jako takie doświadczenie, dobrze mi się w nim pracuje i chciałem nauczyć się czegoś nowego. Aby połączyć kamerkę internetową z Matlabem, musimy ściągnać specjalne rozszerzenie, w górnym pasku ikon klikamy Add-Ons, wybieramy Get Hardware Support Packages, wybieramy Install from Internet i szukamy USB Webcams. Na filmiku krok po kroku omówiłem co dzieje się w algorytmie obróbki obrazu, teraz chciałbym wspomnieć o kilku najważniejszych funkcjach, które wykorzystałem:
snapshot - robi zdjęcie aktualnego kadru z kamerki
rgb2gray - konwertuje obraz na odcienie szarości
bwareaopen - usuwa zakłócenia z obrazu binarnego
regionprops - mierzy naszą ostateczną białą plamę (taśmę), umożliwia wyznaczenie jej środka, który bezpośrednio przekłada się na położenie taśmy przed robotem.
Pozostało przyporządkować wyznaczone położenie do jednego z trzech wcześniej zdefiniowanych i wysłać numer lokacji do Arduino za pomocą funkcji fprintf.
MATLAB Support Package for Arduino Hardware
Matlab posiada również specjalną paczkę umożliwiającą programowanie Arduino z poziomu Matlaba lub Simulinka. To całkiem ciekawa możliwość, mamy wtedy dostęp do podstawowych funkcji Arduino takich, jak digitalWrite czy analogRead oraz całego arsenału funkcji Matlaba. Niestety to rozwiązanie uniemożliwia w prosty sposób korzystanie z zewnętrznych bibliotek Arduino - dlatego zdecydowałem się na zwykłą komunikację szeregową. Niemniej jednak, ta nakładka jest bardzo ciekawa i chciałbym wspomnieć o jej przykładowym wykorzystaniu. Jakiś czas temu pracowałem nad regulatorem PID na wzmacniaczach operacyjnych. W domowych warunkach nie miałem pomysłu na obserwowanie odpowiedzi skokowej mojego układu. Z pomocą przyszło Arduino i Matlab wraz z omawianą paczką. Wystarczyło podłączyć interesujący mnie sygnał do wejścia analogowego Arduino oraz napisać kilka linijek kodu:
a=arduino;
i = 1;
tic
while (toc<10)
b(i) = a.readVoltage(0);
plot(b);
drawnow;
i=i+1;
end
Odpowiedź skokowa regulatora PID:
Odpowiedź skokowa układu z wyraźnym przeregulowaniem:
Zoptymalizowana odpowiedź skokowa układu:
Oś poziomą można oczywiście zamienić na czas, a nie próbki, ale to nie było konieczne do stworzenia prostego narzędzia debugującego mój układ 🙂
Jeżeli masz jakiekolwiek pytania lub chciałbyś, abym coś lepiej wyjaśnił - zapytaj. Chętnie podzielę się zdobytym doświadczeniem. I pamiętaj o łapce w górę pod filmikiem! 😉