\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 da monitorização aparece relacionado com o da segurança, daí a necessidade de monitorizar o estado da máquina remotamente. 
Interpreta-se como estado da máquina, 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.


\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 o módulo teria interpretar as mensagens trocadas entre sistemas no veículo.
\item possibilidade de transmissão de informação durante a operação do veículo e em "qualquer" local.
\item a informação transmitida teria de ser acessível de qualquer local.
\item teria de ser possível rever historiais de informação (registos).
\end{itemize}

Depois dos requisitos definidos iniciou-se uma pesquisa para encontrar uma solução capaz de satisfazer todos os requisitos. Foi encontrada uma solução, que pode ser consultada na secção \ref{sec:ros_rms_descricao}, e que poderia ser adaptada para o problema em questão. Mas essa abordagem foi abandonada, pois tratava-se de um sistema muito complexo e a sua adaptação para o problema em causa seria uma tarefa árdua.
Assim, optou-se por um outro tipo de abordagem, inspirado no sistema descrito anteriormente, mas adaptado aos objetivos propostos.
\newline
O sistema implementado tem seguinte funcionamento:
\begin{itemize}
 \item Há um módulo \textbf{ROS} que subscreve as mensagens no carro, escrevendo os dados numa base de dados remota.
 \item Há uma pagina web que acede a essa base de dados, apresentando os valores da variáveis do sistema.
\end{itemize}
%\pagebreak

O esquema do sistema descrito está representado na figura\ref{fig:esq_monitor}.

\begin{figure}[h!]
        \centering
                \includegraphics[width=14cm]{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}. 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, que se encontram na tabela \ref{tbl:mensagens_ros}.

\begin{table}[H]

\centering


\begin{tabular}{|c|c|p{8cm}|}
\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{gear} & mudança do veículo \\
& \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{lights\_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 referência o Norte \\
& & \\
%& & \\
\hline 
\multirow{6}{*}{\begin{sideways} \textit{Vazios}\end{sideways}} 


& & \\
& & \\
&\textbf{empty\_field3} & campo em aberto para futuras variáveis \\
&\textbf{empty\_field4} & campo 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}





Depois de todas as variáveis recebidas é iniciada a comunicação com a base de dados que se encontra alojada num servidor de IP fixo. 
\newline
Neste caso em particular todo o sistema assenta sobre um servidor de base de dados \textit{Postgresql} em \textit{Linux}, com o qual a biblioteca implementada se encontra preparada para comunicar. A biblioteca usada encontra-se nos elementos de software desta dissertação, pois foi necessário fazer uma cópia local da mesma, visto não existir, até ao momento, nenhum repositório com para implementação desta biblioteca \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 ROS}\label{subsec:funcionamento_moduloROS}

A estrutura de funcionamento do módulo criado é a seguinte:
\begin{itemize}
\item Subscrição das mensagens do estado do carro;
\item A ligação à base de dados é estabelecida;
\item É efetuada a verificação de existência de elementos na base de dados remota, em caso afirmativo, é efetuada uma cópia, para um ficheiro no pc remoto, e depois a base de dados é apagada;
\item Depois da verificação da ligação e do estado da base de dados, é dado inicio à escrita das variáveis na base de dados;
\item Quando o programa é interrompido é criada uma cópia da base de dados para um ficheiro \textit{.csv}, no computador remoto, o ficheiro é guardado na pasta \textit{/opt/atlascar/}(no servidor da base de dados), o ficheiro criado tem a seguinte denominação \newline
\textit{atlascar\_YY\_MM\_DD\_hh\_mm\_ss.csv}; 
\item Depois da cópia da base de dados, esta é limpa;
\item O programa é terminado;
\end{itemize}

O esquema de funcionamento encontra-se representado na figura \ref{fig:esq_mod_ros}.

\begin{figure}[H]
        \centering
        
                \includegraphics[width=14cm]{Imagens/graf_modulo_ROS}
                \caption{Esquema de simplificado do módulo ROS}
                \label{fig:esq_mod_ros}
      
\end{figure}
O módulo encontra-se a escrever continuamente na base de dados, com um ciclo \textit{while}, até que seja interrompido o programa, a condição de fecho é a interrupção forçada do módulo.
\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, com  explicado na subsecção \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}. 
\newline

A tabela \textit{data\_table\_atlas}\ref{tbl:tabela_var_db}, contém os seguintes elementos:



\begin{table}[H]
\begin{tabular}{|c|c|p{6cm}|}

\hline
\multicolumn{3}{|c|}{Tabela data\_table\_atlas} \\

\hline
\textbf{Variáveis} & \textbf{Tipo}& \textbf{Descrição} \\ \hline
 \textbf{id} & [int] PK & identificação de cada linha da tabela \\ \hline
 \textbf{rpm} & [int] &  Rotações por minuto do motor \\ \hline
\textbf{speed} & [double precision] & Velocidade instantanea \\ \hline 
 \textbf{db\_time} &  [date] & data de introdução da linha \\ \hline
 \textbf{atlas\_time} & [time without time zone] & hora de introdução da linha\\\hline
 \textbf{throttle} & [int] & atuação do acelerador \\\hline
 \textbf{brake} & [int] &  atuação do travão \\\hline 
 \textbf{clutch} & [int] & atuação da embraiagem \\\hline
 \textbf{gear} & [int] &  mudança do veículo \\\hline
 \textbf{steering} & [double precision]& posição do volante \\\hline
 \textbf{throttle\_press} & [double precision] & pressão exercida sobre o pedal do acelerador \\\hline 
 \textbf{brake\_press} & [double precision] & pressão exercida no pedal do travão \\\hline
 \textbf{clutch\_press} & [double precision]& pressão exercida no pedal da embraiagem \\\hline 
 \textbf{auto\_throttle} & [int] & modo de atuação do acelerador \\\hline
 \textbf{auto\_brake} & [int] &  modo de atuação do travão\\\hline
 \textbf{auto\_clutch} & [int] & modo de atuação da embraiagem\\\hline
 \textbf{auto\_steering} & [int] & modo de atuação da direção\\\hline
 \textbf{auto\_iginition} & [int] & modo de atuação ignição\\\hline
 \textbf{hanbrake} & [int] & atuação do travão de mão \\\hline
 \textbf{emergency} & [int] & estado da emergencia no veículo\\\hline
 \textbf{lights\_minimum} & [int] & estado das luzes de presença\\\hline
 \textbf{lights\_medium} & [int] & estado das luzes de cruzamento\\\hline
 \textbf{lights\_high} & [int] & estado das luzes de estrada \\\hline
 \textbf{lights\_left} & [int] & estado das luzes  de mudança de direção à esquerda\\\hline
 \textbf{çights\_right} & [int] & estado das luzes de mudança de direção à direita\\\hline
 \textbf{lights\_brake} & [int] & estado das luzes de sinalização de travagem\\\hline 
 \textbf{lights\_reverse} & [int] & estado das luzes de sinalização de marcha atrás\\\hline
 \textbf{lights\_warning} & [int] & estado da luz rotativa amarela de sinalização \\\hline
 \textbf{horn} & [int]  & estado da buzina\\\hline
\textbf{lat\_gps} & [double precision] & latitude da posição\\\hline
\textbf{long\_gps} & [double precision] & longitude da posição\\\hline
\textbf{alt\_gps} & [double precision] & altitude a que se encontra o veículo\\\hline
\textbf{track\_gps} & [double precision] & direção do veículo tendo como referência o Norte\\\hline
\textbf{empty\_field3} & [int] & campo vazio para futuras variáveis \\\hline
\textbf{empty\_field4} & [int] & campo vazio para futuras variáveis\\ \hline
%\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. \textit{PK-Primary Key}}\label{tbl:tabela_var_db}
\end{table}
%\pagebreak
Para implementação da tabela \ref{tbl:tabela_var_db} foi seguido o tutorial que se encontra em anexo ou no endereço:\newline  \url{ros.org/wiki/sql_database/Tutorials/Installing\%20a\%20PostgreSQL\%20Server}







%---------------------------------------
%		PAGINA WEB
%-------------------------
\section{Página web}\label{sec:webpage}

A página \textit{web} desenvolvida no âmbito do projeto apresentado tem de 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}, a organização das diferentes linguagens encontra-se exemplificado na figura \ref{fig:esq_pag_web}. 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. Os \textit{scripts} em \textit{JavaScript} são responsáveis pela parte dinâmica da página, ou seja, para fazer a apresentação das variáveis em intervalos de tempo regulares, bem como alguns elementos visuais presentes na página. 
Para uma página \textit{web} estar acessível do exterior, esta tem de estar inserida num servidor http, para este caso em particular foi usado o \textit{Apache2} para \textit{LINUX}.
\newline

\begin{figure}[H]
        \centering
        
                \includegraphics[width=8cm]{Imagens/esquema_pagina}
                \caption{Esquema de simplificado da organização da página web}
                \label{fig:esq_pag_web}
      
\end{figure}

Em seguida serão apresentados os códigos e métodos usados para a criação da página de monitorização do Atlascar.
%------------------------------
%		CÓDIGO PHP IMPLEMENTADO
%--------------------------------
\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}

De seguida apresenta-se o código usado na elaboração do comando PHP para obtenção dos dados da base de dados:
%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}


Para o reconhecimento das funções que se encontram no código \textit{PHP} por parte do sistema operativo, uma biblioteca \textit{PHP} tem de ser instalada, no caso em questão no sistema \textit{UNIX}, usando o comando \textit{sudo apt-get install php5-pgsql}.

\subsection{Código \textit{Javascript}}\label{subsec:java_script}
Depois da página PHP, subsecção \ref{subsec:phpcode}, ser criada, a sua atualização não era possível sem que alguma ação por parte do utilizador fosse tomada, daí a introduçao do \textit{Javascript} neste projeto. Além da 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 por invocar da função em PHP, para que os dados sejam os mais recentes que se encontram na base de dados; o código PHP é chamado a uma frequência de 5Hz, que é a taxa de atualização dos campos da página html.
\newline
Por outro lado, o \textit{Javascript} também evita que a atualização da pagina tenha de ser total, podendo apenas alterar 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 das variáveis a monitorizar. Para os campos poderem ser atualizados  na página \textit{html}, o \textit{script} criado em \textit{Javascript} teve de ser adicionado à página \textit{html}, isso é efetuado pela adição de um \textit{header}, que contém os \textit{scripts} necessários para o correto funcionamento do \textit{Javascript}. Os \textit{headers} inseridos na página \textit{html} são os seguintes:
 
\lstinputlisting[style=XML, firstline=6, lastline=12]{codigo/atlascarlive.html}

A página criada em html tem o seguinte aspeto:


\begin{figure}[H]
\centering
\includegraphics[width=10cm]{Imagens/pag_html}
\caption{Página web criada para monitorização do Atlascar}
\label{fig:pag_atlascar}
\end{figure}




\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 figura:\ref{fig:qrcode_atlaslive}.
\begin{figure}[h!]
        \centering
        
                \includegraphics[width=4cm]{Imagens/qrcode_atlaslive}
                \caption{QR code para acesso ao site de monitorização do ATLASCAR}
                \label{fig:qrcode_atlaslive}
      
\end{figure}

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

%\thispagestyle{empty}
%\clearpage
%\thispagestyle{empty}
