\chapter{Preliminaria} Ta praca została zrealizowana w ramach przedmiotu "Projekt: autonomiczna jazda łazikiem". Z jego powodu(trzeba zmienic to wyrazenie), powstało wiele rozwiązań dla zadań z "konkursów łazikowych". Żaden spośród łazików biorących udział w University Rover Challenge nie używa sieci neuronowych bezpośrednio do nawigacji , ale prawie wszystkie używają ROS (Robot Operating System) jako podstawy całego oprogramowania. Z tego powodu w tym rozdziale poruszone będą: \begin{itemize} \item Łazik Aleph 1 \item Podstawy sieci neuronowych. \item Architektura ROS \end{itemize} \section {Łazik} Łazik Aleph 1 powstał z inicjatywy koła naukowego Continuum\footnote{ Strona koła naukowego Continuum: \href{http://continuum.uni.wroc.pl/}{http://continuum.uni.wroc.pl/}} w roku 2014. Od tego czasu został zaprezentowany na konkursach takich jak European Rover Challenge (ERC) oraz University Rover Challenge (URC). Przez ostatnie dwa lata łazik był doceniany na konkursie URC (w roku 2016 zajął 3 miejsce, a w roku 2017 -- 2 miejsce). Podczas konkursu URC pojazdy były ocenianie w czterech kategoriach\footnote{ Regulamin konkursu URC: \href{http://urc.marssociety.org/home/requirements-guidelines} {http://urc.marssociety.org/home/requirements-guidelines}}: \begin{itemize} \item Science Cache Task -- pobieranie i badanie próbek w terenie \item Extreme Retrieval and Delivery Task -- transport pakunku w różnych warunkach terenowych \item Equipment Servicing Task -- zdolności manualne (umiejętność podnoszenia, przenoszenia obiektów, obsługa przycisków, przełączników i innych narzędzi) \item Autonomous Traversal Task -- umiejętność poruszania się pomiędzy wyznaczonymi punktami \end{itemize} \section{Podstawy sieci neuronowych} Głebokie sieci neuronowe (deep neural networks) to popularny model w uczeniu maszynowym. Celem sieci jest przybliżenie funkcji $f^*$, przyporządkowującej argumentom $x$ wartości $y$, funkcją $f(x,\theta)=y$ oraz znalezienie parametru $\theta$, który da najlepsze przybliżenie. \subsection{Jak działają} Sieci neuronowe są zazwyczaj złożone z wielu różnych funkcji, nazywanych warstwami. Przykładowo $f(x)=f^{(3)}(f^{(2)}(f^{(1)}(x)))$, wtedy $f^{(3)}$ jest wartwą wyjściową, której wyniki powinny odpowiadać funkcji $f^*$. Wyniki dla pozostałych warstw nie są znane, z tego powodu nazywa się je ukrytymi warstwami. \subsection{Jak trenować} W wyniku trenowania chcemy znaleźć takie $\theta$, żeby $f^*(x)\approx f(x,\theta)$. W tym celu należy zdefiniować funkcję kosztu $L(\theta)$ tzn. odległości modelu od celu, zależną od $\theta $, przykładowo dla regresji średni błąd kwadratowy dla danych uczących. Dla takiej funkcji chcielibyśmy teraz znaleźć minimum. Minimum globalne może być trudne do znalezienia, ale minima lokalne zazwyczaj są wystarczająco dobre. Gdyby $L$ byłoby funkcją jednej zmiennej, wystarczyłoby zacząć w losowym miejscu i wielokrotnie wykonać następujący krok $x=x-\epsilon L'(x)$, aby dotrzeć do minimum lokalnego. Dla funkcji wielu zmiennych podobny algorytm działa, ale pochodną należy zastąpić gradientem $x=x-\epsilon \nabla _x L(x)$. \subsection{Popularne warstwy} Warstwa liniowa (linear lub dense) jest najbardziej podstawową warstwą. Każdy element wyjściowy ($m$ wartości) jest kombinacją wszystkich wejść ($n$ wartości) danej warstwy (powiększoną o stałą). Zatem taka warstwa jest parametryzowana macierzą rozmiaru $n \cdot m$ oraz wektorem rozmiaru $m$. Dwie takie sąsiednie warstwy liniowe można by zredukować do jednej, ponieważ $W_2 \cdot (W_1 \cdot x + b_1) +b_2 = W \cdot x + b$, gdy $W=W_2 \cdot W_1$ oraz $b = W_2 \cdot b_1 +b_2$. Zatem dowolnie głęboką sieć złożoną z takich warstw możnaby zredukować do 1 takiej warstwy, ale po każdej funkcji liniowej aplikuje się funkcję nieliniową np. tanh lub relu ($\max(0,x)$). Dzięki temu sieci neuronowe są w stanie pokryć znacznie większą przestrzeń funkcji niż tylko liniowe. Inną warstwą, już specjalizowaną w przetwarzaniu danych położonych na pewnej kracie, jest warstwa konwolucyjna. Przykładowym wejściem dla takiej warstwy może być dwuwymiarowa siatka pikseli. Natomiast wyjściem jest obraz o zbliżonej (lub tej samej) rozdzielczości, którego wartość jest kombinancją liniową spójnego bloku piksli z wejścia. Ważną cechą takiej warstwy jest fakt, że wszystkie wyjścia korzystają z tych samych parametrów, co powoduje że znajdują te same wzorce położone w innych miejscach. Kolejnym typem warstw specjalizowanym w przetwarzaniu obrazów jest pooling. Dzieli ona wejście na spójne rozłączne bloki, na każdym z nich osobno aplikuje funkcję np. $max$ lub $avg$. Taka operacja powoduje niewrażliwość na małe przemieszczenia wejść. Dodatkowo zmniejsza to rozmiar wejścia w kolejnych warstwach co zmniejsza liczbę parametrów. \subsection{Uwagi} Konwolucyjne sieci neuronowe bardzo dobrze radzą soie z widzeniem maszynowym, są w stanie klasyfikować bezproblemowo obrazki\footnote{\href {https://www.cs.toronto.edu/\~kriz/imagenet\_classification\_with\_deep\_convolutional.pdf} {https://www.cs.toronto.edu/\~kriz/imagenet\_classification\_with\_deep\_convolutional.pdf}}. Ale w przypadku patrzenia na tylko jedną kratkę nie są wstanie wyciągnąć wniosków. Co w przypadku nawigacji oznacza, że proces sterowania jest tylko ciągiem spontanicznych decyzji bez planowania trasy. Dodatkową konsekwencją takiej architektury jest ukryte założenie, że dla każdego obrazu z kamery jest tylko jedna poprawna odpowiedź. \section{ROS} ROS to rozbudowany framework przeznaczony do programowania robotów. Składa się na niego wiele bibliotek oraz narzędzi mających na celu zbudowanie klastra komputerów tworzących spójny system. Dostarcza on abstrakcję nad sprzętem, środki komunikacji między procesami oraz oraz inne funkcjonalności dostarczane przez typowy system operacyjny. Ze względu na modułową budowę oraz architekturę peer-to-peer procesy mogą bezproblemowo działać na różnych komputerach. \subsection{Node} Podstawową jednostką w ROSie jest wierzchołek(node), jego głównym zdaniem jest wykonywanie obliczeń. Wierzchołki razem tworzą graf, a komunikują się za pomocą tematów(topic). Taka architektura (inspirowana budową mikrojądra) zapewnia lepsza ochronę na błędy w porównaniu do architektury monolitycznej. Dodatkowo pojedyńczy element można bezproblemowo przepisać, i to w innym języku. \subsection{Topic} Tematy(topic) pozwalają bezproblemowo zapewnić komunikację międzyprocesową w ROSie. Każdy node może zadelkarować chęć nadawania bądź nasłuchiwania na danym temacie. Przykładowo moduł jazdy autonomicznej może zasubskrybować obraz z kamery Kinect, a publikować na temacie reprezentującym kierunek ruchu. Tematy są otypowane, co gwarantuje że wszystkie wiadomości wysłane na tym samym temacie mają taką samą strukturę. \subsection{Gotowe moduły} ROS dostarcza wiele gotowych modułów pozwalających szybko rozpocząć projekt. Jednym z nich jest Odom, który zbiera informacje o położeniu i prędkości z wielu źródeł danych i łączy je w jedno (o większej pewności). Przykładowo dane może zbierać z czujnika gps, prędkości obrotowej kół oraz akcelerometru. Inny moduł potrafi tworzyć mapy na podstawie obrazu z kamery oraz mapy głębokości. Wynik tej rekonstrukcji można obejrzeć z pomocą innych usług służących do wizualizacji różnych typów danych takich jak obraz, wartości zmieniające się w czasie, chmury punktów lub mapa terenu. %chyba nie aż tak ważne %tf,kamery,konwersje obrazków/strumieni % \section{Autonomia Aleph 1} %Co zostało zrobione na przedmiocie: %\begin{itemize} % \item Sprzęt (mnóstwo) % \item Mapa 3d (RTAB\_MAP) % \item Rozpoznawanie klawiatur/piłek tenisowych % \item Symulator % \item kilka sieci obraz->kierownica % \item wrappery/konwertery różnych protokołów/formatów %\end{itemize}