Stale rosnąca popularność tanich platform sprzętowych spowodowała ogromną liczbę pomysłów na ich wykorzystanie. Jedną z najbardziej popularnych oraz dających duże możliwości rozwijania własnych projektów jest Raspberry Pi. Wraz z rosnącą popularnością projektów realizowanych z wykorzystaniem tej platformy rozwijana była warstwa sprzętowa jak i dodawane były kolejne możliwości programowania układu. Wśród najpopularniejszych metod programowania należy wymienić języki C czy Python.
Bardzo istotna jest także możliwość programowania i interakcji z urządzeniem za pomocą środowiska MATLAB® i Simulink®. W artykule przybliżona została metodologia wykorzystania wymienionych programów do stworzenia urządzenia podążającego kamerą (zamocowaną na serwie) za obiektem o określonym kolorze.
MATLAB zapewnia wiele potężnych narzędzi idealnych do projektowania robotów mobilnych. Czy można użyć MATLABAa do wygenerowania kodu i... Czytaj dalej »
Sprzęt potrzebny do wykonania projektu
Podstawą tworzonego systemu będzie Raspberry Pi. W tym konkretnym projekcie wykorzystano drugą wersję układu, która jest wyposażona w procesor ARM 900 MHz oraz 1 GB RAM. Wykorzystywano system operacyjny Raspbian.
Projekt dopełniają: kamera Logitech C270, serwomechanizm Hitec HS-485HB oraz konieczne okablowanie i elementy montażowe. Na poniższym zdjęciu widoczna jest platforma testowa oraz zielony, drewniany klocek, który był obiektem śledzonym przez kamerę.
Przykładowa platforma testowa.
Oczywiście warstwy sprzętowej, która została wykorzystana w tym projekcie, nie musimy traktować jako docelowe środowisko działania rozwiązania. Oprogramowanie przygotowane z użyciem Raspberry Pi może także przenieść później na inną platformę sprzętową.
Oprogramowanie
Do zaprojektowania i implementacji oprogramowania sprawującego kontrolę nad układem użyte zostało środowisko MATLAB i Simulink. Dzięki temu całość prac projektowych prowadzona była w ramach modelu Simulinka oraz włączanego do niego kodu w języku MATLAB.
Wykonany system może być przykładem wykorzystania metodologii Model-Based Design (projektowania z wykorzystaniem modeli) do realizacji pełnego projektu.
System opracowany został z wykorzystaniem dwóch bazowych narzędzi MATLABa i Simulinka. Metoda identyfikacji obiektu na obrazie nie jest bardzo zaawansowana, gdyż celem było przedstawienie pełnego workflow - od założeń projektowych do działającego systemu, a nie poszukiwanie najlepszej metody z dziedziny przetwarzania obrazów.
Oczywiście zastosowane algorytmy mogą być rozwijane w dalszych pracach lub mogą być zastąpione bardziej zaawansowanymi metodami. W dziedzinie przetwarzania obrazów, sieci neuronowych czy deep learning pomocne mogą być narzędzia:
Image Processing ToolboxTM
Computer Vision System ToolboxTM
Statistics and Machine Learning ToolboxTM
Neural Network ToolboxTM
Rozwój układów i algorytmów sterownia może być wspomagany przez:
Na etapie implementacji sprzętowej projektu również wykorzystywane było środowisko MATLAB i Simulink. Było to możliwe dzięki współpracy tego oprogramowania z zestawem różnego rodzaju platform sprzętowych. Współpraca taka jest realizowana poprzez pakiety wsparcia sprzętowego dostarczane przez MathWorks. Jedną ze wspieranych platform jest oczywiście Raspberry Pi, więcej informacji na ten temat można znaleźć na stronie producenta.
Współpraca pomiędzy Raspberry Pi oraz Simulinkiem wymaga pobrania, zainstalowania oraz konfiguracji pakietu wsparcia sprzętowego. Wszystkie te operacje możemy wykonać za pomocą wbudowanych w MATLABa narzędzi. Jedno z nich, Add-Ons Explorer (pozwalający zarządzać instalacjami pakietów), widoczne jest na poniższym zrzucie ekranu.
Współpracę oprogramowania MATLAB i Simulink ze sprzętem zapewniają dedykowane pakiety wsparcia (Hardware Support Packages).
Pakiet wsparcia sprzętowego zapewnia:
zestaw bloków do obsługi interfejsów urządzenia (widoczny poniżej),
automatyczną generację kodu C z modelu Simulinka,
komunikację z systemem operacyjnym, co pozwala na automatyczne przeniesienie programu na docelową platformę,
możliwość pracy w trybie external, co pozwala na szybkie prototypowanie rozwiązania na sprzęcie (poprzez podgląd sygnałów i ustawianie parametrów w trakcie działania programu).
Biblioteka "Simulink Support Package for Raspberry Pi Hardware".
Zastosowane oprogramowanie pozwoliło na szybką implementację rozwiązania, bez konieczności ręcznego pisania kodu C. Realizacja w graficznym środowiska Simulinka pozwala też na czytelną reprezentację projektu.
Może być to szczególnie korzystne, gdy pracujemy w zespole lub chcemy komuś przekazać efekt naszej pracy.
Tworzenie programu
Całość oprogramowania widoczna jest na poniższym zrzucie ekranu. Dzięki graficznej reprezentacji programu bardzo łatwo możemy odczytać strukturę i przenalizować działanie tworzonego rozwiązania.
Jest to jedna z istotnych zalet podejścia Model-Based Design w stosunku do ręcznego pisania kodu źródłowego.
Model główny, prezentujący oprogramowanie stacji monitoringu.
Punktem początkowym pracy modelu jest obraz z kamery USB podłączonej do Raspberry Pi. Do jej obsługi wykorzystywany jest blok V42L Video Capture z pakietu wsparcia sprzętowego. Kluczowe ustawienia to wskazanie źródła czyli urządzenia, ustawienie rozdzielczości i czasu próbkowania.
Konfiguracja sterownika kamery.
Informacje uzyskane z kamery przekazywane są do analizy oraz wizualizacji. Ścieżka wizualizacyjna nie jest rozbudowana. Sygnały wygenerowane z bloku sterownika kamery przekazywane są do bloku Mark image. Bloki tego typu pozwalają na integrację kodu w języku MATLAB w modelach Simulinka. Funkcja wykonywana przez Mark image to oznaczenie na obrazie zidentyfikowanego punktu środka śledzonego obiektu.
Kod umieszczony wewnątrz wykonywanej funkcji:
MATLAB
1
2
3
4
5
6
7
8
function[r1,g1,b1]=MarkImage(r,g,b,pos,detect)
%#codegen
r1=r;g1=g;b1=b;
ifdetect
r1(pos(1)-3:pos(1)+3,pos(2)-3:pos(2)+3)=255;
g1(pos(1)-3:pos(1)+3,pos(2)-3:pos(2)+3)=0;
b1(pos(1)-3:pos(1)+3,pos(2)-3:pos(2)+3)=0;
end
Wyjścia bloku MATLAB Function przekazują sygnały bezpośrednio do SDL Video Display, który jest odpowiedzialny za wyświetlanie obrazu w Simulinku.
Ścieżka analizy obrazu jest trochę bardziej rozbudowana. W podsystemie ObjectDetection zawiera binaryzację obrazu z wyodrębnieniem elementów zielonych. W dalszej kolejności znajduje się MATLAB Function, która realizuje wyznaczenie środka znalezionego obiektu.
Kod napisany w języku MATLAB zamieszczony jest poniżej:
MATLAB
1
2
3
4
5
6
7
8
9
10
function[pos,detect]=FindCentroid(bw)
%#codegen
[r,c]=find(bw);
ifisempty(r)
pos=[-1-1];
detect=false;
else
pos=[mean(r),mean(c)];
detect=true;
end
Zwrócone przez funkcję wartości są przekazywane do wizualizacji w celu oznaczenia środka obiektu. Jednocześnie dane te przekazane są do sterowania serwomechanizmem. Na ich podstawie następuje odpowiednie pozycjonowanie kamery. W celu wyznaczenia pozycji, w której powinna się znaleźć kamera, do podsystemu servo przekazywane są informacje o rozmiarze pobranego obrazu, pozycji środka obiektu oraz potwierdzenie, czy w ogóle obiekt został znaleziony.
Zadaniem podsystemu sterownia jest wyznaczenie pozycji i ustawienie sygnałów sterujących na wyjściach układu. Wyliczenie pozycji polega na ustaleniu, w jakiej odległości od środka obrazu znajduje się zidentyfikowany obiekt. Wyznaczenie kierunku ruchu serwomechanizmu, tak aby utrzymywać obiekt w centrum, realizowane jest poprzez kod funkcji servoDirection:
MATLAB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
functiondirection=servoDirection(size,x,margin)
%#codegen
center=size/2;
ifx==-1
direction=0;
elseifx>=center+margin
direction=1;
elseifx<=center-margin
direction=-1;
else
direction=0;
end
Wyznaczony kierunek ruchu serwomechanizmu przekazywany jest do bloku Discrete-Time Integrator, który ustala narastającą (lub malejącą) wartość sterowania. Dodatkowo, w przypadku zniknięcia śledzonego obiektu z pola widzenia kamery, pozycja serwomechanizmu jest resetowana. Realizowane jest to dzięki wejściu External reset w integratorze, które jest podłączone do sygnału niosącego informację o zidentyfikowaniu obiektu. Połączenia bloków widoczne jest poniżej:
Podsystem sterownia serwomechanizmem.
Wartość wyznaczoną przez integrator wykorzystujemy jako pozycję serwomechanizmu i używamy w bloku drivera. Standard Servo Write to blok dostarczony z pakietem wsparcia sprzętowego, pozwalający na kontrolę serwomechanizmu. Sterownik oczywiście musi być odpowiednio skonfigurowany poprzez wskazanie pinu czy ustawienia związane z generacją sygnału PWM.
Konfiguracja sterownika serwomechanizmu.
Implementacja na sprzęcie
Po przeprowadzeniu wszystkich prac związanych z przygotowaniem algorytmu oraz budową i konfiguracją modelu, można przejść do fazy implementacji. Dzięki współpracy oprogramowania MATLAB i Simulink z platformą Raspberry Pi wdrożenie rozwiązania odbywa się bez konieczności pisania kodu w C lub innym języku. Kod jest generowany automatycznie, kompilowany i uruchamiany na platformie. Dzięki temu możemy włączyć symulację w trybie external i na bieżąco, z poziomu modelu Simulinka, obserwować efekt pracy systemu czy też modyfikować jego parametry.
Dzięki temu w Simulinku możemy zobaczyć obraz, który jest rejestrowany przez kamerę wraz z naniesionym punktem środka zidentyfikowanego obiektu.
Przykład działania programu w praktyce oraz więcej informacji na temat tego rozwiązania znaleźć można w poniższym materiale wideo:
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY na bazie Arduino i Raspberry Pi.
To nie koniec, sprawdź również
Przeczytaj powiązane artykuły oraz aktualnie popularne wpisy lub losuj inny artykuł »
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY z Arduino i RPi.
Trwa ładowanie komentarzy...