Robot omijający przeszkody

Cel ćwiczenia

Zapoznanie się z działaniem czujników odległości. Zaplanowanie i zaprogramowanie sterownika realizującego nawigację z omijaniem przeszkód.

Wstęp teoretyczny

W zadaniu nawigacji robotów mobilnych duże znaczenie ma rozpoznawanie cech geometrycznych otoczenia (rozpoznawanie i omijanie przeszkód). Zadanie to realizowane jest przez tworzenie bitowych lub wektorowych map otoczenia. Pozyskiwanie informacji o otoczeniu może być realizowane online (tworzenie dynamicznej mapy otoczenia) lub offline (stworzenie statycznej mapy otoczenia która zostanie użyta do zaprojektowania optymalnej ścieżki). W drugim przypadku mapa może być uaktualniana na bieżąco, aby uwzględnić zmiany środowiska.

Układy współrzędnych

Obserwację otoczenia realizują czujniki odległości. Czujniki rozmieszczone są zwykle na obwodzie robota i skierowane w różnych kierunkach (dla robota jadącego wyłącznie do przodu nie ma sensu stosować czujników wycelowanych do tyłu). Każdy z czujników mierzy odległość od przeszkody w kierunku na wprost od siebie (a więc w układzie współrzędnych związanym z danym czujnikiem). Jednak to, co nas interesuje, to położenie przeszkód w obiektywnym układzie współrzędnych (układzie świata). Dlatego współrzędne zmierzone przez czujnik należy przekształcić najpierw do układu współrzędnych związanych z robotem (uwzględniając położenie i orientację czujników) a następnie do uładu zewnętrznego (uwzględniając położenie i orientację robota). Współrzędne przeszkody leżącej w odległości \(d_i\) od i-tego czujnika w jego układzie współrzędnych wynoszą \(\begin{bmatrix}d_i\\0\\1\end{bmatrix}\) (są to tak zwane współrzędne jednorodne znormalizowane). Macierz przekształcenia dla rotacji o kąt \(\theta'\) i translacji o wektor \(\begin{bmatrix}x'\\y'\end{bmatrix}\) ma postać:

\[\begin{split}R(x', y', \theta')=\begin{bmatrix} \cos(\theta') & -\sin(\theta') & x'\\ \sin(\theta') & cos(\theta') & y'\\ 0 & 0 & 1 \end{bmatrix}\end{split}\]

Tak więc współrzędne przeszkody w układzie świata będą wynosić:

\[\begin{split}\begin{bmatrix} x_{d_i} \\ y_{d_i} \\ 1 \end{bmatrix} = R(x, y, \theta) R(x_{s_i}, y_{s_i}, \theta_{s_i}) \begin{bmatrix} d_i \\ 0 \\ 1 \end{bmatrix}\end{split}\]

gdzie \((x, y, \theta)\) są położeniem i orientacją robota a \((x_{s_i}, y_{s_i}, \theta_{s_i})\) położeniem i orientacją i-tego czujnika względem robota (położenie czujnika wyznaczamy względem środka odcinka między kołami).

Sumowanie wektorów i zachowanie Avoid-Obstacles

Pomiar każdego czujnika da nam wektor do zmierzonej przeszkody. Czujniki, które nie napotkały przeszkody, zmierzą wartość “nieskończoną” (nieskończoność dla czujnika ultradźwiękowego to wartość \(2550\) wyrażona w milimetrach natomiast dla czujnika podczerwonego to \(100\) co odpowiada odległości \(70\) cm). W związku z tym zachowanie Avoid-Obstacles (unikaj przeszkód) możemy zaprogramować wykorzystując zachowanie Go-to-Goal z poprzedniego ćwiczenia. Jako wektor do celu wykorzystamy wektor, będący sumą wektorów czujników. W przypadku braku przeszkód czujniki skierowane na boki wzajemnie się znoszą, natomiast czujniki skierowane do przodu lub pod kątem do przodu dadzą wkład wyłącznie w kierunku do przodu (składowe poprzeczne wzajemnie się znoszą). W przypadku, gdy czujniki po jednej stronie zauważą przeszkodę, ich wkład będzie mniejszy i sumaryczny wektor będzie odchylał się w kierunku przeciwnym. W efekcie robot nie widzący przeszkód będzie jechał na wprost a robot w pobliżu przeszkody będzie skręcał w kierunku od przeszkody. Ilustruje to poniższy rysunek.

../_images/Obstacle1.png

Wykonanie ćwiczenia

W ćwiczeniu wykorzystany jest robot educator z trzema czujnikami odległości.

  1. Zainstaluj czujnik ultradźwiękowy zgodnie z instrukcją (zamocowany centralnie i skierowany do przodu) oraz czujniki podczerwone po obu stronach skierowane pod kątem \(60^\circ\). Mocowanie zaprojektuj samodzielnie lub wykorzystaj ten opis. Zmierz odległości (współrzędne \(x\) i \(y\)) od środka robota do czujników.

  2. Zaprogramuj robota realizującego funkcję avoid-obstacles.

    • Ponieważ w robocie wykorzystywane są czujniki różnych typów, prawdopodobnie konieczne będzie przeskalowanie ich wskazań do wspólnej bazy (np. do wartości w centymetrach).

    • Prawdopodobnie przydatne będzie wprowadzenie wagi (np. czujnik centralny będzie miał inny wkład niż boczne).

    • Mnożenie macierzy wykonaj ręcznie lub wykorzystaj możliwości pakietu numpy (możliwe, że trzeba go będzie doinstalować poleceniem apt-get install python3-numpy lub pobrać i zainstalować ręcznie, jeśli roboty nie mają dostępu do internetu).

    • w zadaniu można wykorzystać klasę Pose z symulatora pySimiam. Warto również zapoznać się z realizacją kontrolera avoidobstacles.py w tym symulatorze.

  3. Przetestuj działanie robota. Prawidłowo zaprogramowany robot powinien jeździć po sali nie wpadając na przeszkody.

Opis sprawozdania

Sprawozdanie z ćwiczenia powinno zawierać:

  1. Opis modyfikacji mocowania czujników odległości (jeśli różne od zaproponowanych w instrukcji).

  2. Listingi programów (pliki .py i/lub .ev3) z optymalnymi wartościami parametrów.

  3. Wnioski – dyskusja wyników.

Next Section - Arbitraż