Projekt przedstawiony w poniższym artykule przedstawia wielomodułową platformę mobilną OmnIVOice, która powstała w ramach projektu „Budowa robota społecznego” realizowanego w Kole Naukowym Robotyki SKaNeR na Politechnice Łódzkiej. Na fotografii 1 przedstawiono omawianą platformę mobilną. Zbudowany robot charakteryzują takie cechy jak:

  • generowanie mowy,
  • zdalne sterowanie z wykorzystaniem joysticka, ruchów ludzkiego ciała lub dedykowanego sterownika,
  • reagowanie na ewentualne kolizje z przeszkodami w bliskim otoczeniu.

Fot. 1. Mobilna platforma OmnIVOice

Fot. 1. Mobilna platforma OmnIVOice

Celem budowania robotów społecznych, w odróżnieniu od szeroko znanych i stosowanych robotów przemysłowych, jest wspomaganie ludzi w realizacji podstawowych i codziennych czynności życiowych. Roboty te muszą charakteryzować się dużą interaktywnością oraz zalążkami inteligencji, a ich celem jest zaawansowana interakcja z człowiekiem. Niejednokrotnie są to roboty wzorowane na człowieku lub zwierzęciu, aczkolwiek konstruowane są przeróżne formy i wybór najbardziej przyjaznej ludziom pozostaje sprawą otwartą.

Na podstawie dotychczas przedstawionych informacji należy stwierdzić, że są to konstrukcje: kosztowne, o dużych rozmiarach, trudne w realizacji w ramach „studenckiego” budżetu. Takie aplikacje z reguły nie są w stanie pracować w małych, ograniczonych przestrzeniach (na przykład na biurku podczas zajęć laboratoryjnych). W przypadku takiego środowiska pracy szczególnie ważne jest zapewnienie platformie mobilnej dużej swobody ruchu, co można uzyskać poprzez odpowiedni dobór struktury kinematycznej, która określa sposób przemieszczania się platformy. Mimo powyższych ograniczeń, w ramach studenckiego projektu, powstał robot z zaimplementowanymi podstawowymi funkcjami z zakresu interakcji człowieka z maszyną, który charakteryzuje się kompaktowymi wymiarami i dużymi możliwościami kinematycznymi. Schemat blokowy stworzonego projektu został przedstawiony na rysunku 2.

Rys. 2. Schemat blokowy platformy OmnIVOice

Głównym zadaniem sterownika jest odpowiednie sterowanie układem napędowym robota, aby robot poruszał się zgodnie z zadaną trajektorią ruchu przy jednoczesnym zagwarantowaniu bezpieczeństwa pracy w przestrzeni roboczej. Wybór układu był podyktowany przyjętymi wymaganiami, które miał spełniać moduł niskopoziomowego sterownika ruchu:

  • dysponować interfejsami komunikacyjnymi,
  • posiadać dużą liczbę wejść/wyjść cyfrowych oraz analogowych,
  • charakteryzować się dużą mocą obliczeniową,
  • dysponować kilkoma układami realizującymi sprzętowo funkcje licznikowe,
  • być dostępny w postaci zestawu uruchomieniowego – w celu skrócenia etapu projektowania.

Idealnym rozwiązaniem okazał się mikrokontroler STM32F100RB dostępny jako zestaw uruchomieniowy STM32VLDISCOVERY. Spełniał on w pełni wszystkie założone wymagania. Używane w projekcie peryferia mikrokontrolera STM32F100RB oraz techniki programistyczne zostały przedstawione na poniższym rysunku.

Rys. 3. Schemat blokowy sterownika niskopoziomowego

Rys. 3. Schemat blokowy sterownika niskopoziomowego

Zbudowany robot może być sterowany z wykorzystaniem: myszy komputerowej, joysticka lub czujnika ruchu Kinect. Ponadto dodana została funkcja umożliwiająca sterowanie z wykorzystaniem skonstruowanego bezwładnościowego modułu sterującego, który eliminuje konieczność użycia komputera klasy PC do sterowania robotem. Wymaganiami odnośnie tego elementu było by układ:

  • umożliwiał komunikację w standardzie USART używaną w transmisji danych z modułem komunikacji bezprzewodowej,
  • posiadał akcelerometr do sterowania prędkością liniową robota,
  • posiadał przetwornik analogowo-cyfrowy do odczytu napięcia z potencjometru, który służy do sterowania obrotem platformy mobilnej.

Na rysunku 4 przedstawiony został schemat blokowy przedstawiający używane elementy mikrokontrolera oraz stosowane techniki programistyczne.

Rys. 4. Schemat blokowy bezwładnościowego modułu sterującego

Rys. 4. Schemat blokowy bezwładnościowego modułu sterującego

W tym przypadku zastosowany został zestaw uruchomieniowy STM32F4DISCOVERY z wbudowanym akcelerometrem – układ LIS302DL. Należy zaznaczyć, że wykorzystanie akcelerometru w sterowaniu pozwala w pełni sterować ruchem platformy i to w bardzo ciekawy i praktyczny sposób.

Układ wcześniej wspomnianego sterownika niskopoziomowego zarządzającego robotem został podzielony na trzy moduły o ściśle określonych zadaniach. Na rysunku 5 został przedstawiony schemat przepływu informacji pomiędzy tymi elementami. Moduły na rysunku zostały oznaczone jako:

  1. Moduł STM32 – moduł z mikrokontrolerem STM32,
  2. Moduł Sharp – moduł z czujnikami odległości SHARP,
  3. Moduł Napęd – moduł sterujący napędem robota mobilnego.

Rys. 5. Schemat sterownika ilustrujący przepływ informacji

Rys. 5. Schemat sterownika ilustrujący przepływ informacji

Obwody drukowane dla wymienionych modułów zostały zaprojektowane w programie Altium Designer i stanowią prototypowe układy elektroniczne zastosowane w robocie OmnIVOice. Aplikacja główna została napisana w języku C++. Przy tworzeniu kodu wykorzystywane zostały gotowe biblioteki dostarczane przez producenta oraz wykorzystane zostało bezpośrednie konfigurowanie rejestrów odpowiadających używanym peryferiom.

W projekcie zostały wykorzystane następujące peryferia i możliwości układu STM32F100RB:

  • licznik TIM1 – generowanie sygnałów o zmiennej częstotliwości ze stałym współczynnikiem wypełnienia 50%, które służyły do sterowania silnikami krokowymi,
  • licznik TIM2 – generowanie sygnału zegarowego określającego z jaką częstotliwością zostają wykonane: pętla główna programu, pomiar i obróbka sygnałów z czujników Sharp, sprawdzenie stanu baterii,
  • DMA (Direct Memory Access) – transmisja danych z rejestrów przetwornika ADC do określonego miejsca w pamięci bez użycia procesora,
  • przetwornik ADC – odczytywanie wartości sygnałów pochodzących z czujników odległości Sharp, służących do detekcji przeszkód w przestrzeni roboczej robota,
  • USART – użyty w komunikacji z modułami transmisji bezprzewodowej,
  • Remapping – funkcja umożliwiająca zmianę przeznaczenia odpowiednich pinów mikroprocesora.

Jednym z ważniejszych zadań układu STM32F100RB jest generowanie zadanych profili prędkościowych, które sterują silnikami krokowymi. W tym celu w oprogramowaniu została zaimplementowana funkcja rampy, która umożliwia łagodne rozpoczęcie ruchu robota, hamowanie oraz zmianę prędkości na niższą, wyższą bądź przeciwną.

Stworzony trzykołowy robot należy do klasy Omnidirectional, co zapewnia możliwość dowolnego wyboru wartości wektorów v i ?, w każdej chwili czasu t. Schemat ten został przedstawiony na rysunku 6. Ta właściwość robota jest osiągnięta dzięki rozmieszczeniu geometrycznemu kół co 120° na obwodzie podstawy oraz ich rodzajowi – zastosowano tzw. koła szwedzkie z rolkami na obwodzie koła obróconymi o 90° w stosunku do osi głównej koła. Na rysunku 7 przedstawiono platformę służącą do przemieszczania się robota.

Rys. 6. Kinematyka robota Omnidirectional

Rys. 6. Kinematyka robota Omnidirectional


Rys. 7. Platforma jezdna robota

Rys. 7. Platforma jezdna robota

Takie podejście do konstrukcji mechanicznej zapewniło dużą zwrotność robota, który z założenia dedykowany jest do pracy w ograniczonych przestrzeniach (np. powierzchnia biurka lub stołu), przy zachowaniu prostoty wykonania i łatwości sterowania. W celu właściwego przemieszczania się robota aplikacja nadrzędna rozwiązuje odwrotne zadanie kinematyki dla prędkości w oparciu o następujący układ równań wektorowo-macierzowych:

 wzor1

gdzie:

  •  oznacza prędkość obrotową i-tego koła, dla i=1, 2, 3,
  •  oznaczają odpowiednio prędkości liniowe i prędkość obrotową w nieruchomym układzie kartezjańskim XI i YI,

pozostałe parametry związane są z wymiarami konstrukcji: ?=60°, r = 60 mm, d = 350 mm.

Wyznaczone w ten sposób prędkości obrotowe kół są następnie skalowane i przekazywane do jednostki sterującej napędami. Prędkość kół jest ograniczona odgórnie do 5 obrotów na sekundę. Ograniczenie to wynika z możliwości występowania poślizgów na niektórych rodzajach powierzchni. Pomimo skomplikowanego opisu matematycznego implementacja przedstawionych powyżej równań sprowadza się do paru linijek kodu przedstawionych na listingu 1.

 

List. 1. Wyznaczanie wartości sterujących obrotem kół szwedzkich

W rezultacie działania powyższego kodu uzyskiwana jest prędkość obrotowa dla poszczególnych silników. Należy zaznaczyć, że użyte silniki krokowe są sterowane częstotliwością sygnału zegarowego. W związku z powyższym konieczne jest przeliczenie zadanych prędkości obrotowych na częstotliwość pracy silników krokowych (silnik wykonuje 1 pełen obrót po otrzymaniu 200 impulsów zegarowych).

Drugim ważnym zadaniem realizowanym przez aplikację jest zbieranie informacji z otaczającego robot środowiska przy użyciu czujników odległości Sharp. W tym celu w kodzie programu został umieszczony algorytm DSP, którego zadaniem jest zbieranie oraz filtrowanie wartości pomiarowych z czujników. Każdy z zastosowanych czujników posiada bufor pomiarowy (pamiętane jest 9 ostatnich wartości z pomiarów), które są poddawane obróbce poprzez filtrację medianową. Mediana jest wartością środkową z niemalejącego zbioru wartości. Na pierwszy rzut oka może się wydawać, że konieczne jest sortowanie elementów, co jest operacją o dużej złożoności obliczeniowej. Przykładowo dla sortowania bąbelkowego w najgorszym przypadku konieczne jest wykonanie n2 (gdzie n jest liczbą elementów w zbiorze) operacji porównania oraz zamiany miejsc pomiędzy poszczególnymi elementami. W przypadku metody Quicksort można liczbę wymaganych operacji zredukować do n · log(n), co nadal jest dużym obciążeniem dla mikrokontrolera. Z tego powodu zoptymalizowano algorytm poprzez redukcję jego złożoności i zmieniono cel na odnalezienie wartości środkowej, nie zaś pełnego posortowania zbioru. Kod realizujący tę operację został przedstawiony na listingu 2.

List. 2. Kod poszukujący wartości środkowej w zadanym zbiorze

Dla przykładu załóżmy, że chcemy wyznaczyć medianę następującego zbioru liczb: 3, 8, 5, 9, 2, 7, 4, 1, 6. Uszeregowanie go w porządku rosnącym daje zbiór: 1, 2, 3, 4, 5, 6, 7, 8, 9. Mediana to naturalnie wartość środkowa – 5. Zastosowanie powyżej przedstawionego algorytmu da w rezultacie następujący ciąg liczb: 2, 4, 6, 1, 5, 8, 3, 7, 9. Analogicznie jak poprzednio wynikiem działania będzie wartość środkowa – 5.

Zaletą filtru medianowego, należącego do filtrów nieliniowych, w stosunku do filtrów liniowych (np. filtr uśredniający kolejne wartości) jest bardzo dobra eliminacja zakłóceń impulsowych o wysokich częstotliwościach. Na rysunku 8 przedstawiono efekty działania dwóch wyżej wspomnianych filtrów.

Rys. 8. Porównanie filtru medianowego z filtrem uśredniającym

Rys. 8. Porównanie filtru medianowego z filtrem uśredniającym

Wynikiem pomiaru każdego z czujników jest mediana z 9 ostatnich pomiarów. Tak obrobione dane pomiarowe są sprawdzane pod względem ich wartości. W zależności od wartości może nastąpić jedna z dwóch skrajnych sytuacji:

  • jeżeli wartość jest mniejsza niż dolny ustalony próg oznacza to, że robot dojechał do krańca stołu i wykrył jego krawędź,
  • gdy wartość z czujników jest wyższa niż ustalony próg górny oznacza to, że robot napotkał przeszkodę.

W obu wymienionych sytuacjach ruch robota jest blokowany w kierunku, w którym zostało wykryte zagrożenie, blokowana jest również możliwość obrotu robota. Po wykryciu przeszkody wysyłany jest komunikat do jednostki centralnej o braku możliwości ruchu w danym kierunku.

W ramach prac nad platformą mobilną powstały dwie różne aplikacje sterujące przemieszczaniem się robota uruchamiane na komputerze klasy PC. Niestety w niektórych zastosowaniach te sposoby sterowania robotem okazały się mało wygodne. Aby rozwiązać ten problem wykonano sterownik umożliwiający zadawanie kierunku oraz wartości prędkości dla każdej z osi kartezjańskiego układu współrzędnych związanego z układem robota. Do tego celu wykorzystano zestaw uruchomieniowy STM32F4DISCOVERY bazujący na procesorze STM32F407VGT6. Zestaw ten posiada trójosiowy akcelerometr, który został użyty do zadawania prędkości liniowej. Aby wykorzystać możliwości kinematyczne robota umożliwiono także obrót wokół własnej osi. W tym celu użyty został potencjometr obrotowy. Na fotografii 9 przedstawiono skonstruowany sterownik.

Fot. 9. Wygląd bezwładnościowego kontrolera ruchu platformy mobilnej

Fot. 9. Wygląd bezwładnościowego kontrolera ruchu platformy mobilnej

Kontroler sterujący ruchem wykorzystuje następujące układy peryferyjne mikrokontrolera STM32F407VGT6:

  • licznik TIM4 – generowanie 4 sygnałów PWM,
  • GPIO – sterownie stanem diod LED oraz odczyt stanu przycisku,
  • USART – wysłanie komend ruchu robota do modułu transmisji bezprzewodowej,
  • ADC – odczytu wartości napięcia z potencjometru służącego do obrotu robota wokół osi Z,
  • DMA – wykorzystywany w transmisji danych z przetwornika ADC do pamięci,
  • NVIC – tablica wektorów przerwań,
  • SPI –komunikacja z akcelerometrem – układ LIS302DL,
  • SysTick – wykonywanie okresowych działań programu takich jak: wysyłanie ramki z komendami ruchu, odczyt wartości z poszczególnych osi akcelerometru, ustalanie stanu diod LED.

Komunikacja kontrolera bezwładnościowego z robotem odbywa się drogą bezprzewodową z wykorzystaniem gotowego modułu. Przesyłane dane mają postać przedstawioną na rysunku poniżej.

Rys. 10. Ramka danych przesyłana przez bezwładnościowy kontroler sterujący robotem

Rys. 10. Ramka danych przesyłana przez bezwładnościowy kontroler sterujący robotem

Zasadnicza część ramki rozpoczyna się bajtem startu o wartości 0x01 i kończy się bajtem stopu o wartości 0x04. Dwa ostatnie bajty są wykorzystywane w komunikacji pomiędzy aplikacją pracująca na komputerze a kontrolerem bezwładnościowym. W przypadku komunikacji pomiędzy sterownikiem bezwładnościowy i sterownikiem ruchu robota dwa ostatnie bajty są pomijane. Drugi bajt ramki przechowuje informację ile kolejnych bajtów będzie przesłanych wraz ze znakiem końca transmisji danych. Bajt oznaczony symbolem M_vX zawiera informację o najstarszych 4 bitach zaś L_vX zawiera informacje o 4 najmłodszych bitach zadanej prędkości liniowej względem osi X. Analogicznie M_vY i L_vY – prędkość w osi Y, M_vZ i L_vZ – prędkość w oku osi Z. Bajt oznaczony jako SK przechowuje 8 najmłodszych bitów sumy bajtów o numerach od 3 do 7. Wykorzystywany jest on do sprawdzania poprawności przesłanych danych – jako suma kontrolna.

W aplikacji zadbano także o monitorowanie stanu podłączonych baterii poprzez odczyt przez mikrokontroler stanu wyjścia z komparatora. Jeśli na wyjściu komparatora pojawi się stan zera logicznego układ w celu weryfikacji powtórzy sprawdzenie 3-krotnie, po czym wyśle komunikat w formacie ASCII do komputera przemysłowego PC104 wymuszając wygenerowanie komunikatu głosowego o konieczności zmiany baterii. Jeśli zmiana baterii nie zostanie dokonana w ciągu 3 minut układ powtórzy komunikat. Komunikaty wysyłane są drogą bezprzewodową do komputera klasy PC-104 generującego mowę.

Kolejnym wyróżnionym, oddzielnym elementem jest czujnik odległości firmy Sharp, który jest jednym z układów elektronicznych tworzących konstrukcję „kanapkową” robota. Na pokładzie płytki modułu znajduje się wejście na złącze listwowe modułu STM32. Aby uniknąć dużej ilości kabli połączeniowych do czujników zdecydowano się na umieszczenie gniazd dla czujników Sharp na opisywanej płytce, która znajduje się jak najbliżej podstawy robota gdzie fizycznie zamontowane są czujniki. Rysunek poniżej przedstawia zamontowane na krawędzi pleksi czujniki odległości Sharp.

Rys. 11. Połączenie modułów elektronicznych na robocie wraz z zamontowanymi czujnikami Sharp

Rys. 11. Połączenie modułów elektronicznych na robocie wraz z zamontowanymi czujnikami Sharp

Ostatnim wyróżnionym elementem jest moduł napędowy. Składa się on z trzech sterowników bipolarnych silników krokowych. Sterowniki zostały oparte na układach scalonych L297 i L298 umożliwiających łatwe sterowanie pracą silników. Sterownik może pracować w trybie pół kroku bądź pełnego kroku, umożliwia całkowite odcięcie napięcia z uzwojeń silnika oraz szybką zmianę kierunku obrotów. Synchroniczne połączenie sterowników umożliwia kontrolę wartości prądów fazowych bez obawy zakłócenia wykonywanych pomiarów. Pomiar jest zsynchronizowany z pracą mostka tranzystorowego i jest wykonywany w momencie pełnego przewodzenia tranzystorów w gałęziach. Pozwala to uniknąć błędów pomiarowych spowodowanych szpilami prądowymi wynikającymi z przełączania indukcyjności uzwojeń silnika. Na płytce modułu znajduje się również wejście dla sygnałów pochodzących z modułu STM32.

Ze względu na dużą liczbę rożnych modułów wymagane było aby układ zasilania zapewniał różne wartości napięć poszczególnym elementom. Taki podział układu zasilania, na mniejsze bloki odpowiedzialne za zasilanie pojedynczych modułów, zabezpieczył pozostałe elementy przed mogącymi pojawić się zwarciami. Ze względu na dążenie do małej masy całkowitej robota zastosowano akumulatory litowo-polimerowe. Silniki krokowe sterowane są napięciem niestabilizowanym o wartości około 11,1 V. Do zasilania komputera klasy PC-104 stosowane jest napięcie 14 V, które podawane jest na zasilacz impulsowy komputera. Mimo dużego poboru energii komputer przemysłowy może pracować do 5 godzin.

Generowanie mowy odbywa się z użyciem komputera klasy PC-104, na którym zainstalowany jest system operacyjny Windows XP SP3. Z wykorzystaniem wbudowanych bibliotek API oraz dodatkowych bibliotek SAPI stworzono aplikację, która na podstawie przekazanego tekstu generuje dźwiękową wypowiedź. Do generowania mowy używany jest program stworzony przez firmę IVONA Software. W podstawowej konfiguracji komputer PC-104 nie posiada karty dźwiękowej, w związku z czym zastosowana została zewnętrzna karta dźwiękowa oraz głośniki podłączane do portu USB.

W celu umożliwienia kontroli przy użyciu komputera PC oraz sprawdzenia poprawności działania poszczególnych modułów platformy stworzona została aplikacja z interfejsem graficzny. Aplikacja została napisana w języku C# i jest przeznaczona do pracy na komputerze klasy PC. W komunikacji z robotem stosowana jest transmisja danych przez port RS232 z wykorzystaniem modułów bezprzewodowych. Na rysunku 12 przedstawiony został zrzut ekranu aplikacji.

Rys. 12. Okno aplikacji napisanej w C# do testowania oraz sterowania robota

Rys. 12. Okno aplikacji napisanej w C# do testowania oraz sterowania robota

Okno programu zostało podzielony na dwie części. Pierwsza (dolna część okna) umożliwia nawiązanie transmisji bezprzewodowej z trzema elementami:

  • sterownikiem ruchu zarządzanym przez mikrokontroler STM32F100RB,
  • bezwładnościowym kontrolerem kontrolowanym przez mikrokontroler STM32F407VGT6,
  • modułem generujący mowę zbudowanym na podstawie komputera przemysłowego klasy PC104.

W celu nawiązania połączenie pomiędzy komputerem PC a robotem należy wybrać odpowiedni numer portu COM i nacisnąć przycisk „Open”, w wyniku tego zostanie nawiązane połączenie. Transmisja odbywa się z domyślnie ustawioną prędkością 57600 b/s. Aplikacja posiada możliwość wysyłania łańcuchów tekstowych wprowadzonych w pole „Write”. Dane z tekstem odbierane są przez modułu generujący mowę znajdujący się w robocie. Możliwy jest również odbiór danych wysyłanych przez robota z informacją o zmianie stanu czujników Sharp zamontowanych na obwodzie platformy (stan czujników jest wizualizowany przez odpowiednie kolory kontrolek S1-S7). Natomiast w grupie Velocity wyświetlane są aktualnie zadawane wartości prędkości (dx/dt, dy/dt, dO/dt) przy użyciu bezwładnościowego sterownika ruchu.

Rys. 13. Zakładka umożliwiająca testowanie kontrolera bezwładności

Rys. 13. Zakładka umożliwiająca testowanie kontrolera bezwładności

Drugi element aplikacji (górna część okna) zbudowany jest w postaci 4 zakładek udostępniających następujące funkcje:

  • Control Mouse – sterowanie robotem przy użyciu myszki,
  • Control Joystick – sterowanie robotem przy użyciu joysticka,
  • Control Kinect – sterowanie robotem przy użyciu Kinecta,
  • Test STM34F4 – odczyt i wizualizacja danych sterujących ruchem platformy przy użyciu skonstruowanego kontrolera bezwładnościowego (zrzut ekranu przedstawiono na rysunku 13).

Łukasz Ryszka i Michał Maciejewski