\chapter{Sistema de monitorização}\label{chapter:monitor}
\thispagestyle{myheadings}




% -------------------------------------------------------------
% intro
% -------------------------------------------------------------
Neste capitulo apresenta-se todo procedimento efetuado para implementação do módulo de monitorização remota para o Atlascar.

% -------------------------------------------------------------
% simmechanics
% -------------------------------------------------------------
\section{O problema}\label{sec:problema_monitor}
O tema monitorização aparece relacionado com o segurança, daí a necessidade de monitorizar o estado da maquina remotamente. 
Interpreta-se como estado da maquina, o estado de algumas variáveis de medidas efetuadas a bordo do veículo como as rotações do motor, a velocidade, se este se encontra em modo de 
condução manual/automático entre muitos outros. Nesse âmbito surge o trabalho apresentado neste capitulo.


\section{Estudo de soluções}\label{sec:monitor_estudo_sol}
A solução para implementação do sistema teria de passar pelos seguintes requisitos:
\begin{itemize}
\item teria de ser possível interpretar as mensagens trocadas entre sistemas no veículo.
\item a informação teria de ser transmitida durante a operação do veículo e em qualquer local.
\item a informação transmitida teria de estar disponível em qualquer ponto.
\item teria de ser possível rever historiais de informação.
\end{itemize}

Depois dos requisitos serem impostos iniciou-se uma pesquisa de qual seria a melhor forma para implementação do tem proposto. Encontrado para isso uma solução	
\ref{sec:ros_rms_descricao}, que poderia ser adaptada para o problema em questão. Mas essa abordagem foi abandonada, pois tratava-se de um sistema desenvolvido em exclusividade para 
um grupo restrito de equipamentos, muito complexo e a sua adaptação para o problema em causa seria uma tarefa árdua.
Assim optou-se por outro tipo de abordagem, inspirado no sistema descrito anteriormente, mas adaptado aos objetivos propostos.
\newline
Tendo o sistema implementado o seguinte funcionamento
\begin{itemize}
 \item Um módulo \textbf{ROS} que subscreve as mensagens no carro, escrevendo os dados numa base de dados remota.
 \item Uma pagina web acede a essa base de dados, apresentando os valores da variáveis do sistema.
\end{itemize}
\pagebreak

O esquema do sistema descrito pode ser consultado na figura\ref{fig:esq_monitor}.

\begin{figure}[h!]
        \centering
                \includegraphics[width=10cm]{Imagens/flow_monitor}
                \caption{Esquema de implementação da monitorização do ATLASCAR}
                \label{fig:esq_monitor}
\end{figure}


\section{Módulo ROS}\label{sec:modulo_ros}
O módulo de \textbf{ROS} criado dá pelo nome de \textit{remote\_monitor}, dependendo da biblioteca \textit{database\_interface}, que se encontra em desenvolvimento. Essa biblioteca é responsável pela comunicação do módulo com a base de dados \textit{Postgresql}.
\newline
O módulo criado consiste na subscrição de mensagens que são publicadas no sistema do Atlascar. as mensagens subscritas são as seguintes:
\begin{description}
\item [atlascar\_base/ManagerSatus.h]
Nesta mensagem são retirados grande parte das variáveis relativas ao estado da maquina.

\item[gps\_common/GPSFix.h]
Esta mensagem contem variáveis relativas ao posicionamento do veículo, sendo essas obtidas a partir de um sensor \textit{GPS} instalado na parte superior do veículo
\end{description}
As mensagens anteriormente descritas contêm variáveis que serão usadas para monitorização do veiculo, sendo essas descritas de seguida: 





\begin{table}[!h]

\centering


\begin{tabular}{|c|c|l|}
\hline
\multicolumn{3}{|c|}{Variavés subscritas} \\

\hline
\textbf{Mensagem} & \textbf{Variáveis }& \multicolumn{1}{|c|}{\textbf{Descrição}}\\
\hline

\multirow{29}{*}{\begin{sideways} \textit{ManagerStatus}\end{sideways}} 

& \textbf{speed} & Velocidade instantânea \\
 & \textbf{rpm} & Rotações por minuto do motor \\
 & \textbf{db\_time} &  data de inserção YYYY-MM-DD\\
 & \textbf{atlas\_time} & hora de inserção hh:mm:ss \\
 & \textbf{throttle\_press} & pressão exercida no pedal do acelerador \\ 
& \textbf{brake\_press} & pressão exercida no pedal do travão \\
& \textbf{clutch\_press} & Pressão exercida no pedal da embraigem \\
& \textbf{throttle} & atuação do acelerador \\
& \textbf{brake} & atuação do travão \\
& \textbf{clutch} & atuação da embraiagem \\
& \textbf{steering\_wheel} & posição do volante \\
& \textbf{auto\_throttle} & modo de atuação do acelerador \\
& \textbf{auto\_brake} & modo de atuação do travão \\
& \textbf{auto\_clutch} & modo de atuação da embraiagem \\
& \textbf{auto\_steering} & modo de atuação da direção \\
& \textbf{auto\_iginition} & modo de atuação da ignição \\  
& \textbf{hanbrake} & atuação do travão de mão \\
& \textbf{emergency} & estado da emergência \\ 
& \textbf{lights\_minimum} & estado das luzes de presença \\
& \textbf{lights\_medium} & estado das luzes de cruzamento \\ 
& \textbf{lights\_high} & estado das luzes de estrada \\
& \textbf{lights\_left} & estado das luzes de sinalização de mudança de direção à esquerda \\ 
& \textbf{çights\_right} & estado das luzes de sinalização de mudança de direção à direita\\
& \textbf{lights\_brake} & estado das luzes de sinalização de travagem \\ 
& \textbf{lights\_reverse} & estado das luzes de sinalização de marcha atrás \\
& \textbf{lights\_warning} & estado da luz rotativa amarela de sinalização  \\ 
 & \textbf{horn} & estado da buzina \\
\hline
 \multirow{6}{*}{\begin{sideways} \textit{GPS\_Fix}\end{sideways}} 

%&  &  \\
& & \\
&\textbf{lat\_gps} & latitude da posição \\
&\textbf{long\_gps} & longitude da posição \\
&\textbf{atl\_gps} & altitude  \\
&\textbf{track\_gps}& direção do veículo tendo como referencia o Norte \\
& & \\
%& & \\
\hline 
\multirow{6}{*}{\begin{sideways} \textit{Vazios}\end{sideways}} 

%&  &  \\
& & \\
& &   \\
&\textbf{empty\_field3} & variável em aberto para futuras variáveis \\
&\textbf{empty\_field4} & variável em aberto para futuras variáveis \\
& &   \\
%& & \\
& & \\
%& & \\
\hline 

 
%%\multirow{3}{*}{Midfielders} & MC & David Batty \\
%% & MC & Eirik Bakke \\
%% & MC & Jody Morris \\ \hline
%%Forward & FW & Jamie McMaster \\ \hline
%%\multirow{2}{*}{Strikers} & ST & Alan Smith \\
%% & ST & Mark Viduka \\
%\hline
  \end{tabular}\caption{Lista de variáveis subscritas e respetivas mensagens}\label{tbl:mensagens_ros}
\end{table}


\pagebreak
\begin{itemize}
 

\item \textbf{empty\_field3} - variável sem valor definido, está presente para futura expansão do sistema de monitorização.
\item \textbf{empty\_field4} - variável sem valor definido, está presente para futura expansão do sistema de monitorização.
\end{itemize}

Depois de todas as variáveis tratadas é iniciada a comunicação com a base de dados que se encontra alojada num servidor, neste caso em concreto, no se encontra no laboratório. 
\newline
Neste caso em particular todo o sistema assenta sobre um servidor de base de dados incorporado no \textit{Linux}, que dá pelo nome de \textit{Postgresql}. Sendo para este sistema que a biblioteca usada está preparada para comunicar. A biblioteca usada encontra-se nos elementos de software desta dissertação, pois foi necessário fazer uma cópia local, pois ainda não existia nenhum repositório com a mesma\citep{database_interface_ros}.
%\textbf{Não se se define aqui a instalação do sistema ou se remeto para anexo...} 

\subsection{Funcionamento do Módulo}\label{subsec:funcionamento}

A estrutura de funcionamento do módulo criado é a seguinte:
\begin{itemize}
\item São criados ponteiros com os mesmos elementos da base de dados;
\item A conexão à base de dados é iniciada;
\item Depois da verificação de conexão, é dado inicio à escrita das variáveis na base de dados;
\item Quando o programa é interrompido é criada uma copia da base de dados para um ficheiro \textit{.csv}, o ficheiro será guardo na pasta \textit{/tmp/}, contendo a data e hora de criação no nome com o seguinte formato \textit{atlascar\_YY\_MM\_DD\_hh\_mm\_ss.csv}; 
\item Depois da cópia da base de dados todos os campos são apagados;
\item O programa é terminado;
\end{itemize}
\pagebreak
O esquema de funcionamento encontra-se representado na figura seguinte\ref{fig:esq_mod_ros}.

\begin{figure}[h!]
        \centering
        
                \includegraphics[width=10cm]{Imagens/graf_modulo_ROS}
                \caption{Esquema de simplificado do módulo ROS}
                \label{fig:esq_mod_ros}
      
\end{figure}

\section{Funcionamento da base de dados}\label{sec:base_dados}
O sistema de armazenamento de dados está implementado numa tabela de uma base de dados em \textit{Postgresql}. A tabela criada para este sistema tem o nome \textit{data\_table\_atlas}, pode ser alterado, mas tem de se ter em atenção que o módulo ROS \ref{sec:modulo_ros} e a página \textit{web}, estão criados para comunicar com uma tabela com aquele nome. O modo de instalação e configuração do sistema \textit{Postgresql} pode ser consultado no anexo \ref{anexo:tutorial_monitor}. Todos os dados usados para configuração de todo o sistema descrito nesta dissertação encontram-se no software fornecido com a mesma.
\newline

A tabela \textit{data\_table\_atlas}, contém os seguintes elementos:
\begin{itemize}
\item \textbf{id} [int] - elemento que contém o numero da linha, também definido como \textit{PRIMARY KEY} da base de dados.
\item \textbf{rpm} [int] - é o elemento que contém o valor das rotações do motor do veículo.
\item \textbf{speed} [double precison] - elemento que contém o valor da velocidade instantânea medida no veículo.
\item \textbf{db\_time} [date] - elemento da base de dados que contém a data em que cada elemento foi adicionado à tabela, com o formato YY-MM-DD.
\item \textbf{atlas\_time} [time without time zone] - elemento que contém a hora em que cada elemento foi adicionado à tabela, com o formato hh:mm:ss.
\item \textbf{throttle} [int] - elemento que contém a variável responsável pelo o estado do acelerador no veículo.
\item \textbf{brake} [int] - elemento que contém a variável responsável pelo o estado do travão no veículo. 
\item \textbf{clutch} [int] - elemento que contém a variável responsável pelo o estado do clutch no veículo.
\item \textbf{gear} [int] - elemento que contém a variável que indica a mudança que se encontra engrenada na caixa de velocidades do veículo.
\item \textbf{steering} [double precison] - elemento que contém a variável com valor do potenciómetro que indica a posição do volante do veículo.
\item \textbf{throttle\_press} [double precison] - elemento que contém a variável com valor da pressão aplicada no pedal do acelerador por parte do utilizador do veículo.
\item \textbf{brake\_press} [double precison] - elemento que contém a variável com valor da pressão aplicada no pedal do travão por parte do utilizador do veículo.
\item \textbf{clutch\_press} [double precison] - elemento que contém a variável com valor da pressão aplicada no pedal da embraiagem por parte do utilizador do veículo.
\item \textbf{auto\_throttle} [int] - elemento que contém a variável que indica o modo de atuação do acelerador, se este se encontra no modo manual ou automático.
\item \textbf{auto\_brake} [int] - elemento que contém a variável que indica o modo de atuação do travão, se este se encontra no modo manual ou automático.
\item \textbf{auto\_clutch} [int] - elemento que contém a variável que indica o modo de atuação da embraiagem, se este se encontra no modo manual ou automático.
\item \textbf{auto\_steering} [int] - elemento que contém a variável que indica o modo de atuação da direção, se este se encontra no modo manual ou automático.
\item \textbf{auto\_ignition} [int] - elemento que contém a variável que indica o modo de atuação da ignição do veículo, se este se encontra no modo manual ou automático.
\item \textbf{handbrake} [int] - elemento que contém a variável que indica o estado de atuação do travão de mão do veículo.
\item \textbf{emergency} [int] - elemento que contém a variável que indica o estado da  emergencia no veículo.
\item \textbf{lights\_minimum} [int] - elemento que contém a variável que indica o estado das luzes de presença no veículo.
\item \textbf{lights\_medium} [int] - elemento que contém a variável que indica o estado das luzes de cruzamento no veículo.
\item \textbf{lights\_high} [int] - elemento que contém a variável que indica o estado das luzes de estrada no veículo.
\item \textbf{lights\_left} [int] - elemento que contém a variável que indica o estado das luzes de mudança de direção à esquerda no veículo.
\item \textbf{lights\_right} [int] - elemento que contém a variável que indica o estado das luzes de mudança de direção à direita no veículo.
\item \textbf{lights\_brake} [int] - elemento que contém a variável que indica o estado das luzes de sinalização de travagem no veículo.
\item \textbf{lights\_reverse} [int] - elemento que contém a variável que indica o estado das luzes de sinalização de marcha atrás no veículo
\item \textbf{lights\_warning} [int] - elemento que contém a variável que indica o estado das luz de sinalização de modo automático no veículo.
\item \textbf{horn} [int] - elemento que contém a variável que indica o estado de atuação da buzina no veículo.
\item \textbf{lat\_gps} [double precison] - elemento que contém a variável com o valor da latitude do posicionamento do veículo.
\item \textbf{long\_gps} [double precison] - elemento que contém a variável com o valor da logitude do posicionamento do veículo.
\item \textbf{alt\_gps} [double precison] - elemento que contém a variável com o valor da altitude do posicionamento do veículo.
\item \textbf{track\_gps} [double precison] - elemento que contém a variável com o valor da direção do veículo.
\item \textbf{empty\_field3} [int] - campo que se encontra em aberto para futura expansão.
\item \textbf{empty\_field4} [int] - campo que se encontra em aberto para futura expansão.

\end{itemize}



\url{http://ros.org/wiki/sql_database/Tutorials/Installing\%20a\%20PostgreSQL\%20Server}

\section{Página web}\label{sec:webpage}

A página \textit{web} desenvolvida no âmbito do projeto apresentado tem comunicar com a base de dados em \textit{Postgresql}.
\newline
Esse procedimento só é possível com a adição ao código \textit{html} de um script em \textit{php} e de \textit{JavaScript}.
O código \textit{php} é responsável por toda a parte de comunicação com a base de dados e obtenção dos campos da tabela. Enquanto os \textit{scripts} em \textit{JavaScript}, são responsáveis pela parte dinâmica da página, ou seja, a apresentação das variáveis ser feita em intervalos de tempo regulares, e alguns elementos visuais presentes na página.

\subsection{Código PHP}\label{subsec:phpcode}
O código \textit{PHP} implementado para esta página web, consiste num pequeno \textit{script}, que tem o seguinte método de funcionamento:

\begin{figure}[h!]
        \centering
                \includegraphics[width=8cm]{Imagens/grafphp}
                \caption{Esquema de simplificado do módulo PHP}
                \label{fig:esq_mod_php}
      
\end{figure}

Sendo de seguida apresentado o código usado na elaboração do comando php, para obtenção dos dados da base de dados:
\newline
%codigo para por o ficheiro que contem o codigo em php
%\begin{lstlisting}
\lstinputlisting[caption=Codigo PHP implementado, style=PHP1]{codigo/serverside.php}
%\end{lstlisting}


\pagebreak


Para o código implementado, pelo menos na plataforma \textit{LINUX}, teve de ser instalado uma biblioteca para os comandos usados serem reconhecidos. Essa biblioteca pode ser instalada através do comando \textit{sudo apt-get install php5-pgsql}.

\subsection{Código \textit{Javascript}}\label{subsec:java_script}
Depois da página PHP \ref{subsec:phpcode} ser criada, a sua atualização não era possivél sem que alguma ação por parte do utilizador fosse tomada, daí a introduçao do \textit{Javascript} neste projeto. Além de a adição de alguns \textit{widgets}, já implementados como o \textit{Google maps} \citep{google_maps_java}, o script criado em \textit{Javascript} é responsável pelo "chamar"(não encontrei nenhum sinónimo melhor pode ficar assim??) da função em php, isto para os dados serem os mais recentes que se encontram na base de dados, pois o código php é chamado a uma frequencia de 5Hz, que é a taxa de atualização da página html.
\newline
Por outro lado o \textit{Javascript} também evita que a atualização da pagina seja total, podendo  apenas campos específicos da página web serem atualizados, os \textit{div's}.

\lstinputlisting[caption=Codigo JavaScript implementado no sistema, style=Java]{codigo/script_ze.js}





























\subsection{Código \textit{html}}\label{subsec:html}
A página html usada foi um template já existente, para manter a uniformidade de apresentação, ficando a pagina de monitorização com o mesmo aspeto que a pagina de apresentação do laboratório. \newline
Dentro dessa pagina apenas foram criados os campos necessários para apresentação dos campos a monitorizar.
\section{Sistema de monitorização implementado}\label{sec:sist_monitor_impl}
Depois de todos os procedimentos descritos anteriormente o sistema foi implementado com sucesso podendo a página em questão ser visualizada no endereço \url{lars.mec.ua.pt/atlascar_live}, ou recorrendo ao QR code \ref{fig:qrcode_atlaslive}.
\begin{figure}[h!]
        \centering
        
                \includegraphics[width=8cm]{Imagens/qrcode_atlaslive}
                \caption{QR code para acesso ao site de monitorização do ATLASCAR}
                \label{fig:qrcode_atlaslive}
      
\end{figure}


Cenas 
\newline
\lstinputlisting[style=XML, firstline=6, lastline=13]{codigo/atlascarlive.html}
%\lstinputlisting[caption=Includes para o Javascript, style=customc, firstline=6, lastline=11]{codigo/atlascarlive.html}

%
%\thispagestyle{empty}