% !TEX root = main.tex
\subsection{Robotdriver}

Dynamixel har lagt ut et eksempelbibliotek til Windows og Linux som gjør det
	mulig å kople seg opp til roboten og sende pakker.
Qt har et bibliotek som kan gjøre dette kryssplattform, kalt
	\class{QtSerialPort}.
Utgangspunktet var da at biblioteket levert av leverandøren skulle skrives om
	til Qt ved hjelp av dette.
Dette viste seg å være utfordrende, og det ble i stedet bestemt at
	eksempelbiblioteket skulle brukes.
CMake gjør det mulig å ha \emph{if}-betingelser for plattform, og gjorde det
	dermed lett å velge mellom plattformversjonene ved kompilering.


\subsubsection{Arkitektur}

	Robotdriveren er lagdelt i fire moduler (se figur \ref{fig:lagdeling-uml}).
	Lagdelingen er gjort slik at hver modul kun kommuniserer med laget som
		ligger rett nedenfor.
	Dette sikrer en klar fordeling av ansvar, og gjør koden mer ryddig.

	\begin{figure}[H]
		\centering
		\includegraphics[width=0.3\textwidth]{uml/lagdeling.pdf}
		\caption{Lagdeling for serverprogramvaren}
		\label{fig:lagdeling-uml}
	\end{figure}

	Det nederste laget er kalt for \file{DxlHal}.
	Dette er det laget som tar seg av det plattformspesifikke med å sende
		kommando-pakker over en serieport.

	Modulen over dette kalles for \file{Dynamixel}.
	Denne er ikke plattformspesifikk, og er på et høyere abstraksjonsnivå enn
		\file{DxlHal}.
	Mens \file{DxlHal} sender én og én pakke, kan \file{Dynamixel} sende mer
		sammensatte pakker.
	Til sammen utgjør \file{DxlHal} og \file{Dynamixel} den koden lagt ut av
		Dynamixel.

	Det nest øverste laget er kalt \file{DynaChain}, der all robot-logikk ligger.
	Et klassediagram for robotdriveren kan sees i figur \ref{fig:dynachain-uml}. Det er ikke blitt brukt arv, og alle piler i figuren representerer bruk.

	Det øverste laget er nettverkslaget som tar seg av sending og mottaking over
		internett.

	\begin{figure}[H]
		\centering
		\includegraphics[width=1.0\textwidth]{uml/dynachain.pdf}
		\caption{Klassediagram over \file{DynaChain}}
		\label{fig:dynachain-uml}
	\end{figure}

\subsubsection{DynaChain}

	\file{DynaChain} er den modulen som inneholder all robotlogikk.
	Denne modulen har i hovedsak to oppgaver: å hente ut og endre
		motorposisjonene.

	Den enkleste klassen i hierarkiet er \class{Motor}-klassen.
	Denne klassen innkapsler \emph{en} enkelt motor.
	Det som er felles for hver motor er at de har en motor-ID, en maks-vinkel,
		en minimum-vinkel og et vinkel-avvik.
	Motor ID-en er den ID-en motoren har som sikrer at meldinger kommer frem til
		rett motor.
	Som nevnt tidligere, er posisjonen til motoren gitt ved et heltall mellom 0
		og 1023.
	For å gjøre det lettere å tolke disse tallene, ble det bestemt at det skulle
		brukes grader der 0 grader på alle motorer skulle representere
		posisjonen vist i figur \ref{fig:null-posisjon}.
	For å implementere dette trengs derfor et vinkelavvik som gir forskjellen i
		vinkel mellom posisjon 0 og vinkel 0.
	Dette kan betraktes som en slags kalibrering og er avhengig av robotarmen
		som jobbes med.
	De to resterende vinkel-variablene, maks-vinkel og min-vinkel, angir hvilke
		vinkler som er gyldige.

	\begin{figure}[H]
		\centering
		\includegraphics[width=0.6\textwidth]{fig/robot-null-posisjon.jpg}
		\caption{Posisjon til manipulatorarmen når alle vinkler er satt til 0}
		\label{fig:null-posisjon}
	\end{figure}

	For å håndtere en serie med slike motorer, brukes klassen \class{DynaChain}.
	\class{DynaChain} inneholder en liste med \class{Motor}-objekter, samt
		metoder for å hente ut og styre alle motorer samtidig.
	Den viktigste metoden her er \method{setAngle}{motorid, vinkel}, som tar inn
		motorid og vinkel, og setter motoren til denne posisjonen.

	For å hente ut tilstanden til roboten brukes to klasser:
		\class{DynaChainState} og \class{MotorState}.
	Disse klassene er \emph{immutable}, som vil si at et objekt av disse
		klassene ikke kan endres etter at objektet er initialisert.
	Dette forsikrer mottageren av et slikt objekt om at objektet aldri har blitt
		endret.

	For å hente ut disse tilstandene brukes metoden \method{getState}{}, som er
		implementert for både \class{Motor} og \class{DynaChain}, og som
		henholdsvis returnerer et \class{MotorState}- og
		\class{DynaChainState}-objekt.
	Begge klassene har metoden \method{toJson}{} for å representere tilstanden
		som en JSON-streng, slik at den lett kan dekodes av klienten.
