% Neste capítulo segue uma breve introdução ao projecto atlas e alguns dos objectivos pretendidos.

% -------------------------------------------------------------
% Secção sobre o projecto atlas
% -------------------------------------------------------------
Para facilitar a interação entre os diversos sensores e controladores de baixo nível,
utiliza-se atualmente a plataforma ROS (\textit{Robot Operating System}), de arquitetura modular.
Esta plataforma permite a criação e gestão de diversos módulos de software e garante 
a comunicação entre eles de uma forma estruturada e robusta.

O ROS é constituído por uma plataforma de programação \textit{open source} para robôs, criada em 2007
para o desenvolvimento do STAIR (\textit{STanford Artificial Intelligence Robot}) \cite{STAIR}.
A partir dessa data o grupo de desenvolvimento de hardware e software \textit{open source}
para aplicações de robótica, \textit{Villow Garage} tem assegurado a continuidade do projeto \cite{ROS_PAPER}.

O sistema operativo ROS foi desenvolvido com a intenção de cumprir os seguintes
objetivos \cite{ROS_PAPER}:

\begin{itemize}
 \item Constituir uma plataforma gratuita e \textit{open source}
 \item Fornecer ferramentas para implementação de código como servidor de parâmetros de configuração, 
visualizador de mensagens, auto geração de documentação, entre outros.
 \item Suportar várias linguagens de programação (C++, Python, Octave e LISP)
 \item Constituir um sistema operativo leve e robusto.
 \item Permitir a utilização de múltiplos computadores em simultâneo (\textit{peer-to-peer}).
\end{itemize}

A plataforma ROS está implementada de acordo com a nomenclatura de nodos,
mensagens, tópicos e serviços \cite{ROS_PAPER}.
Os nodos são os processos que fazem a computação do 
sistema, que constituem os diversos módulos do software.
Com a arquitetura modular é necessário que os nodos comuniquem entre
si, o que é feito através de mensagens. Uma mensagem constitui uma
estrutura de dados específica com os tipos de dados primitivos das 
linguagens de programação (\textit{integer}, \textit{floating point}, \textit{boolean}, entre outros).
Uma mensagem pode ser composta por outras mensagens ou por vetores de mensagens
e podem constituir estruturas de dados bastante complexas.
Para que um determinado nodo possa subscrever ou publicar uma 
determinada mensagem no sistema, é necessário que ela tenha um nome.
Desta forma, o nome de uma mensagem constitui um tópico. 
É possível que possam existir diferentes nodos a publicar e subscrever 
no mesmo tópico, bem como o mesmo nodo publicar e subscrever diversos tópicos.
Embora a forma de comunicação publicar/subscrever seja bastante flexível,
não é adequada para situações em que seja necessário o uso de 
RPC(\textit{Remote Procedure Call}).
Por isso na constituição do sistema ROS existem os serviços para 
comunicações do tipo pedido/resposta. Desta forma um serviço
constitui um par de mensagens uma para o pedido e outra para a resposta.

O software baseado em ROS é organizado em \textit{packages}.
A definição de \textit{package} é um pouco complexa, depende da aplicação a
que se destina e o seu grau de complexidade. Contudo um \textit{package}
consiste obrigatoriamente num diretório que contém um ficheiro XML com uma descrição geral
e com a informação sobre dependências de software \cite{ROS_PAPER}. 
Normalmalmente no diretório de uma \textit{package} existem diversos
subdiretórios para organizar a informação e separar por exemplo ficheiros de 
código fonte de ficheiros executáveis para que o software possa ser desenvolvido
de uma forma organizada. Por exemplo existem \textit{packages} destinadas
à comunicação com sensores, bem como \textit{packages} destinadas 
ao processamento de imagens ou nuvens de pontos.


Atualmente o ROS é constituído por um sistema operativo que fornece
desde drivers de baixo nível para comunicação com o hardware até ao
software de alto nível para perceção, navegação e simulação. 




O software modular tem a vantagem de possibilitar a gravação de mensagens de nodos em disco, 
um fato interessante na sua utilização pois permite a posterior 
análise e desenvolvimento de software em laboratório a partir de dados reais.
Por exemplo, é possível gravar as imagens de uma câmara em disco e posteriormente 
reproduzi-las como se fossem novamente publicadas pela câmara. 













 