Scenariusz pracy robota
Sprawdzanie uwarunkowań środowiskowych za pomocą czujników pozwala określić, czy robot poprawnie wykonuje bieżące zadanie lub czy może przejść do kolejnego zadania. Implementacja tego mechanizmu jest w przypadku robotów pracujących autonomicznie istotna. Jeżeli jakieś warunki nie są spełnione lub nie można czegoś sprawdzić, robot powinien zwrócić odpowiedni komunikat błędu i przestać wykonywać zadanie. Jeżeli zaś w wyniku sprawdzania uwarunkowań środowiskowych okaże się, że wszystko przebiega zgodnie z planem, robot może przystąpić do wykonania kolejnej czynności.
Rozszerzony scenariusz pracy robota
W rozdziale 8. przedstawiliśmy scenariusz pracy robota Unit1, zgodnie z którym robot ten pracuje w małym pomieszczeniu, gdzie poza nim znajduje się tylko jeden przedmiot. Robot ma odegrać rolę badacza — musi znaleźć przedmiot, określić jego kolor, a następnie zwrócić dane opisujące kolor. W rozszerzonym scenariuszu Unit1 ma za zadanie dodatkowo przenieść ten obiekt w miejsce swojego początkowego położenia. Wizualne planowanie scenariusza pracy polega na graficznym przedstawieniu sytuacji, w której znajduje się robot, i zadań, które przed nim stoją.
Wizualny scenariusz składa się z następujących komponentów:
- schemat rzeczywistej przestrzeni pracy robota;
- diagramu blokowy wykonywania programu;
- tabela stanów ilustrująca zmiany, do których dochodzi w miejscu pracy robota.
Na rysunku 9.1 przedstawiliśmy plan scenariusza pracy robota Unit1. Zaznaczyliśmy na nim rozmiar obszaru, położenie robota oraz położenie przedmiotu, do którego ma podjechać robot. Schemat rzeczywistej przestrzeni pracy robota powinien określać kształty, rozmiary, odległości i materiały wszystkich przedmiotów, z którymi robot ma nawiązywać interakcje w danym scenariuszu, a także przedmiotów, które mają wpływ na rolę odgrywaną przez robota w danym scenariuszu.
Unit1 pracuje na powierzchni o wymiarach 200×300 cm. Przedmiot, do którego ma podejść, jest ważącą 75 g kulą o obwodzie ok. 18 cm. Współrzędne (0, 0) znajdują się w lewym dolnym rogu obszaru — to właśnie w tym miejscu robot ma znaleźć się na początku i na końcu pracy.
Rysunek 9.1. Plan przestrzeni pracy robota Unit1
Korzystamy z prostego dwuwymiarowego układu współrzędnych, który umożliwia opisanie położenia robota względem położenia przedmiotu. Robot znajduje się w punkcie o współrzędnych (0, 0), a przedmiot jest w punkcie o współrzędnych (100, 150) — w przybliżeniu na środku przestrzeni pracy. Po co nam te szczegółowe dane? Dlaczego musimy określać położenia, masy, rozmiary, odległości itd.? Gdyby robot był zdalnie sterowany, to operator pełniłby funkcję jego oczu i uszu i nie trzeba by było podawać niektórych z tych informacji. Operatorzy sterujący zdalnie robotem mogą korzystać z rozsądku i doświadczenia. Niestety robot nie posiada rozsądku ani doświadczenia (a przynajmniej na razie takie roboty jeszcze nie powstały). Aby autonomiczny robot pracował efektywnie, musi dysponować pewnymi danymi. W tabeli 9.1 wymieniliśmy cztery podstawowe sposoby uzyskiwania informacji o scenariuszu pracy przez autonomicznego robota.
Tabela 9.1. Cztery podstawowe sposoby uzyskiwania informacji o scenariuszu pracy przez autonomicznego robota
Numer | Metoda |
1. | Informacje są jawnie zapisywane w pamięci robota w wyniku procesu programowania. |
2. | Robot uzyskuje dane na temat scenariusza i środowiska za pomocą czujników. |
3. | Robot uzyskuje dane na temat scenariusza i środowiska, wykonując określone procedury. |
4. | Różne kombinacje metod 1. – 3. |
Aby dostarczyć robotowi informacji niezbędnych do wykonania pracy, korzystamy z kombinacji metod oznaczonych w tabeli 9.1 numerami 1. i 2. Obie umożliwiają dostarczenie robotowi informacji o jego otoczeniu. Część tych informacji jest dostarczana za pomocą kodu programu, a część robot uzyskuje za pomocą czujników. W bieżącym scenariuszu robot jest wyposażony tylko w ultradźwiękowy czujnik odległości i czujnik koloru. Ponadto porusza się na gąsienicach i ma mechaniczne ramię (zobacz rysunek 9.2).
Rysunek 9.2. Robot Unit1
Elementy, od których zależy efektywność robota
Gdy określisz środowisko pracy robota, a także rolę, jaką będzie w nim odgrywał, musisz sprawdzić, czy w rzeczywistości będzie mógł wykonać zaplanowane przez Ciebie zadania. Można to zrobić za pomocą listy kontrolnej przedstawionej w tabeli 9.2.
Tabela 9.2. Zestawienie elementów, od których zależy efektywność pracy robota pracującego w rozszerzonym scenariuszu
Efektywność pracy robota | Tak lub nie |
Czy czujniki nadają się do wykonania zaplanowanych zadań? | Tak |
Czy efektory końcowe nadają się do wykonania zaplanowanych zadań? | Tak |
Czy silniki nadają się do wykonania zaplanowanych zadań? | Tak |
Czy mikrokontroler nadaje się do wykonania zaplanowanych zadań? | Tak |
W rozszerzonym scenariuszu pracy robot musi zidentyfikować kolor przedmiotu. Ponieważ robot jest wyposażony w czujnik koloru, zakładamy, że jest do tego zdolny. Musi przenieść plastikową kulę ważącą ok. 75 g. Czy może wykonać tę czynność? W tabeli 9.3 przedstawiliśmy możliwości robota Unit1.
Tabela 9.3. Prosta tabela możliwości robota Unit1
Nazwa robota | Mikrokontrolery | Czujniki | Efektory końcowe | Mobilność | Komunikacja |
Unit1 | ARM9 (Java):
|
Zespół czujników:
|
Przednie prawe ramię (PhantomX Pincher) o 6 stopniach swobody z chwytakiem liniowym Tylne lewe ramię o 2 stopniach swobody z chwytakiem kątowym | Gąsienice | Port USB Bluetooth |
Według tabeli możliwości robota Unit1 jego ramię może podnieść ciężar 500 g, a więc przedmiot o wadze 75 g nie powinien stanowić dla niego problemu. Unit1 jest wyposażony w gąsienice i może poruszać się po zaplanowanym obszarze pracy, a więc silniki robota spełniają wymagania stawiane przez scenariusz jego pracy. Robot ten jest wyposażony w dwa mikrokontrolery — Mindstorms EV3 i Arduino Uno (mikrokontroler sterujący mechanicznym ramieniem robota) — które mogą wykonać zaplanowane zadania. Przypominamy, że całkowita potencjalna wydajność robota zależy w 25% od każdego z następujących komponentów:
- czujników,
- efektorów końcowych,
- silników,
- układów sterujących.
Ponieważ uzyskaliśmy twierdzącą odpowiedź na wszystkie znajdujące się w tabeli kontrolnej pytania, możemy stwierdzić, że robot ma pełny potencjał, by wykonać zaplanowane zadania. W praktyce może jednak się okazać, że możliwość wykonania zadania i faktyczne wykonanie zadania to dwie różne rzeczy. Warto jeszcze raz ocenić potencjał robota po podjęciu przez niego próby wykonania zadania. Może wtedy się okazać, że trzeba wymienić niektóre czujniki albo zmodyfikować kod sterujący ich pracą. Być może ramię robota charakteryzuje się zbyt małą swobodą ruchu. Może być tak, że ramię jest w stanie podnieść 75 g, ale nie jest w stanie jej utrzymać wystarczająco długo.
Wspomnianą listę można wykorzystać do oceny potencjału robota, zanim podejmie on próbę wykonania zaplanowanej czynności, a także do oceny poprawności jego pracy po podjęciu tej próby. Jeżeli robot nie spełnia wszystkich wymagań jeszcze przed rozpoczęciem wykonywania czynności, to znaczy, że należy go zmodyfikować lub poprawić aż do uzyskania twierdzących odpowiedzi na wszystkie znajdujące się na liście pytania. Tylko wtedy robot będzie mógł potencjalnie wykonać swoją pracę w sposób poprawny. Jeżeli natomiast robot spełnia wszystkie wymagania, można przystąpić do sporządzenia schematu blokowego prezentującego kolejne czynności wykonywane przez niego podczas odgrywania zaplanowanej roli. Jest to ważne z kilku powodów:
- Schemat pomaga przed napisaniem kodu określić czynności wykonywane przez robota.
- Schemat ułatwia dostrzeżenie szczegółów scenariusza pracy, o których nie pomyślałeś wcześniej.
- Schemat możesz wykorzystać jak element dokumentacji pracy, który pozwoli Ci później przypomnieć sobie założenia projektu.
- Schematu możesz użyć do zaprezentowania komuś zadań wykonywanych przez robota.
- Schemat jest pomocny w znajdowaniu błędów i pomyłek w logice pracy robota.
Na rysunku 9.3 pokazaliśmy uproszczoną wersję schematu blokowego prezentującego czynności wykonywane przez robota Unit1 w rozszerzonym scenariuszu pracy. Numerami 1. – 8. oznaczyliśmy osiem akcji wykonywanych przez robota. Procesy te są tak naprawdę uogólnieniami — na przykład w kroku oznaczonym numerem 1 dochodzi do inicjalizacji robota, co w rzeczywistości jest złożonym procesem inicjalizacji czujników (określania ich trybów pracy, określenia rodzaju dostarczanego sygnału), inicjalizacji silników i definiowania ich początkowej prędkości obrotowej, a także przestawiania mechanicznych ramion w położenia początkowe.
Zauważ, że pola kroku 1. i 3. są wyróżnione podwójnymi liniami. W rozdziale 3. pisaliśmy o tym, że podwójne linie oznaczają czynności składające się z wielu kroków lub podprocedur (można je podzielić na kilka prostszych operacji).
Inicjalizacja robota polega między innymi na upewnieniu się, czy poziom naładowania akumulatorów pozwala na ukończenie czynności, i sprawdzeniu początkowego położenia. Na szczęście na początku pracy robot znajduje się we właściwym miejscu. Każdą z tych czynności można by zaprezentować na diagramie za pomocą oddzielnego pola, ale teraz staramy się, aby schemat był jak najprostszy, a proces inicjalizacji (krok 1.) i przemieszczanie się robota (krok 3.) przedstawiliśmy za pomocą pojedynczych pól procesów.
Rysunek 9.3. Uproszczona wersja schematu blokowego rozszerzonego scenariusza pracy robota Unit1
Inicjalizacja (krok 1.) jest zwykle wykonywana za pomocą procedury typu setup() lub startup(), a we wszystkich przykładach zaprezentowanych w tej książce procedury te są elementem konstruktora Javy lub C++ (Arduino). W krokach 2., 4. i 7. (zobacz rysunek 9.4) sprawdzamy za pomocą czujników uwarunkowania środowiskowe: warunki wstępne, warunki końcowe, a także warunki pracy robota. Warunek wstępny jest warunkiem, który musi być spełniony na początku czynności lub jeszcze przed jej wykonaniem. Warunek końcowy jest warunkiem, który powinien być spełniony bezpośrednio po wykonaniu operacji przez robota.
Rysunek 9.4. Podstawowe struktury sprawdzające warunki wstępne i końcowe
Co dzieje się w przypadku niespełnienia warunków wstępnych lub końcowych?
Co powinniśmy zrobić, jeżeli warunki wstępne jakiejś akcji nie są spełnione? Co oznacza niespełnienie warunków końcowych jakiejś akcji? Czy robot powinien podejmować próbę wykonania czynności, jeżeli jej warunki wstępne nie są spełnione? W kroku 2. na rysunku 9.3 znajduje się instrukcja sprawdzania warunku końcowego procesu inicjalizacji robota. Warunek ten określa, czy czujniki zostały przełączone we właściwy tryb pracy i czy silniki zostały przygotowane do pracy z właściwymi prędkościami. Określa również, czy ramię robota zostało ustawione we właściwej pozycji wyjściowej itd.
Czy w przypadku niespełnienia tych warunków powinniśmy w ogóle wysyłać robota na misję? Czy to dla niego bezpieczne? Czy jest to w ogóle sensowne? Zauważ, że według schematu blokowego w przypadku niespełnienia warunków końcowych robot powinien się zatrzymać. Jeżeli warunki te nie są spełnione, oznacza to jakiś poważny problem z pracą mechanizmów robota i nie chcemy, aby robot nawet podejmował próbę wykonania zaplanowanych czynności. Niespełnienie warunków wstępnych i końcowych określamy mianem naruszenia uwarunkowań środowiskowych pracy robota.
Jakie akcje mogę wybrać w przypadku niespełnienia warunków wstępnych lub końcowych?
Jakie akcje może wykonać robot w przypadku niespełnienia niektórych warunków wstępnych lub końcowych? Przyjrzyjmy się trzem podstawowym czynnościom, które robot może wykonać. Co prawda możesz spotkać inne rozwiązania, ale zasadniczo będą to różne warianty tych trzech opcji:
1. Robot może zignorować niespełnienie warunków wstępnych i podjąć próbę wykonania czynności, które wciąż jest w stanie wykonać.
2. Robot może podjąć próbę naprawienia sytuacji poprzez na przykład wyregulowanie jakichś parametrów albo zmianę położenia wybranych elementów konstrukcyjnych, siłowników lub efektorów. Sprowadza się to do podjęcia przez robota próby spełnienia warunków tak, aby mógł dalej wykonywać zaplanowane zadania.
3. Robot może złożyć raport zawierający przyczynę naruszenia warunków wstępnych lub końcowych, a następnie przejść w tryb „bezpieczny” i zatrzymać się lub wyłączyć.
Dużym wyzwaniem dla programistów robotów jest decyzja, co zrobić, jeżeli coś pójdzie niezgodnie z planem lub inaczej, niż zakładano. Powstały techniki radzenia sobie z problemami nieznanych środowisk, niespodziankami występującymi w środowisku pracy, zmianami sytuacji i nieprawidłowościami pracy robota. Rozpoczynając programowanie autonomicznych robotów, przygotowujemy je do pracy w sytuacjach, które są w pełni kontrolowane, w środowiskach, które są w pełni zdefiniowane i przewidywalne. W ten sposób możemy łatwo sprawdzić warunki wstępne i końcowe, a reakcja na ewentualne nieprawidłowości będzie prosta.
