# Apostila de Introdução Geral no LEAD - 2024
# Capítulo 1 - Artigo 1 - Introdução do Capítulo
## 1.0 Introdução
Essa é a introdução de uma apostila de conhecimentos fundamentais do LEAD. Atualmente pensamos em 3 capítulos. O primeiro será ROS, o segundo Transformadas no ROS e o terceiro será sobre Gazebo.
A Apostila é uma coleção de artigos onde eles ou serão um tutorial, ou uma conceituação, ou ambos.
Todo artigo comecará com um tópico chamado de Introdução que descreverá o seu conteúdo.
Os códigos feitos pra ROS podem ser desenvolvidos em Python ou em C++. A apostila será toda em python. A perspectiva é que no futuro escrevamos apendices para os artigos com os detalhes necessários para desenvolver em C++.
Esse artigo é para dar uma noção geral do [ROS](https://www.ros.org/).
## 1.0.1 Sumário Geral do capitulo 1
1. Introdução do Capítulo < Estamos aqui
2. Instalando o ROS (Conteinerização)
3. Nó (Joy + publicador Vazio)
4. Publicador (Keyboard)
5. Subscritor (Gazebo + Joy | Keyboard)
6. Raspberry Pi
7. Nó Rp (Raspberry Pi + Joy | Keyboard)
8. Launch (Geral)
## 1.0.2 Sumário Local
[TOC]
## 1.1 Fundamentos em ROS|ROS2
O ROS é um conjunto de ferramentas que juntas oferecem uma forma de controlar diversos dispositivos físicos de forma abstrata.
Ele possui uma abstração comum onde qualquer pessoa que entenda ROS consegue pegar um projeto e entender o contexto geral.
Isso é útil para projetar de forma colaborativa e de criar ferramentas fácilmente compartilhaveis.
O ROS possui alguns conceitos chaves, como: distros ROS, nó, mensagem, tópico, publicação, subscrição, pacotes, workspace e launch.
Falaremos desses conceitos abaixo.
## 1.2 Distros
A primeira coisa a falar de ROS é que bom, qual ROS? o ROS é fortemente ligado ao Ubuntu, ao Python e ao C++. Assim, qualquer novidade em alguma dessas ferramentas obriga uma atualização no ROS. Assim existem diversas distros ROS.
Essas são exemplos de distros do ROS:

Fonte da imagem: [link](https://ubuntu.com/blog/ros-foxy-ros-melodic-eol)
Existem muitos outras distros ROS, mas essas estão entre as mais faladas atualmente(2024). Podemos ver que eles dividiram em duas categorias, ROS e ROS2. O desenvolvimento do ROS precisou passar por uma reformulação completa e criou-se, assim, o ROS2. Falaremos dessas diferenças mais adiante, depois que os conceitos de ROS estiverem fundamentados.
É importante destacar que qualquer pacote ROS sempre estará atrelado a distro em questão. Se você for usar uma ferramenta, certifica-se de buscar a versão da sua distro.
## 1.3 Nós
Sobre nós podemos dizer que ele é uma instancia de execução do ROS. Basicamente ele é um executor de atividades. Resumindo, o nó serve para:
* responder outros nós
* publicar dados de um sensor
* controlar dispositivos
Normalmente você escreve um código que levanta um nó e ele terá uma função única, ligada a algumas das 3 ações supracitadas.
Um exemplo seria um nó (chamaremos de nó A) que informa a temperatura de forno. Você usaria um termometro para medir e informar eletronicamente a temperatura para um raspberry pi que publica o nó A.
É possível escrever um código que levanta N nós e um nó que faça N funções, mas não é a prática do nosso laboratório. Nós gostamos de associar: código <-> nó.
Olhando o exemplo, e se você quisesse que o fogo do forno desligasse chegando uma determinada temperatura? Para isso você precisa fazer um outro nó (nó B) que lê essa publicação da temperatura(do nó A) e executa a ação de desligar de acordo com o valor.
## 1.4 Comunicação entre nós
O exemplo anterior mostra a necessidade de comunicação entre nós. Existem muitas formas de comunicação. Abordaremos a principal: Tópicos.
Quando o nó A publica a informação da temperatura, ele faz isso publicando em um tópico (tópico Z). Quando o Nó B le a informação da temperatura, ele faz isso se subscrevendo no tópico Z.
3.1 Mensagem
3.2 Tópico
3.2 Publicação
3.2 Subscrição
Todo tópico é sempre estruturado com um tipo de mensagem. A temperatura pode ser apenas um float.
>Seguem duas documentações sobre mensagens, uma em [geral](http://wiki.ros.org/msg) e outra específica na [std_msgs](http://wiki.ros.org/std_msgs);
A mensagem é o que estrutura o tópico. Basicamente você possui um conjunto de tipos e você pode criar mensagens baseadas nesses tipos. Assim você pode desenvolver mensagens customizdas para diferentes tipos de sensores ou aparelhos.
### 1.4.1 Publicador
O forno por exemplo, um valor float é o suficiente, pois a temperatura é um escalar. Se você tem a velocidade de um carro, pode ser interessante saber a direção do movimento, criando a necessidade de estruturar um vetor. Diferentes comunicações, diferentes tipos de mensagens.
Vendo isso vemos que a mensagem estrutura o tópico e o tópico é o espaço de comunicação entre os nós. Mas como eu escrevo em um tópico? com um publicador.
Como eu escrevo um publicador? A primeira coisa é criar um nó:

Depois o nó irá construir um tópico (se o tópico não existir)

Então o nó irá publicar nesse Tópico enviando uma mensagem:

Por fim o nó fica atualizando o valor do tópico enviando mensagens:

Assim teremos um nó que é um publicador.
### 1.4.2 subscritor
OK, temos como um nó publica em um tópico, mas como um nó lê de um tópico? Essa pergunta é importante porque a comunicação entre nós se baseia em escrita e leitura.
Bom, a leitura se baseia numa subscrição. No caso, o nó se subscreve em um tópico e sempre que esse tópico altera o valor, o nó executa uma função que recebe essa mensagem.

Assim, sempre que o valor de temperadura é alterado, o nó subscritor executa a função passando em "data" a mensagem recebita no tópico.
Assim você atrela o tópico a uma função. Um nó pode ter diversas subscrições onde cada função roda sempre que um tópico é atualizado.
### 1.4.3 Tamanho da fila (Queue size)
Esse é um dos parametros que você passa tanto para publicação, quanto para subscrição. No laboratório colocamos 1. No caso da publicação é a quantidade de mensagens que publica e no caso da subscrição, a quantidade que lê. Isso pode gerar certos prtoblemas de dessincronia entre as mensagens. Só em situações onde a necessidade que a vazão da transferência de dados seja muito grande, não faz muito sentido em pensar sobre isso.
## 1.5 Pacotes e Workspaces
Esse tópico não é sobre a execução de nós no ROS e sim sobre a produção e instalação de nós.
O workspace é um conjunto comum de pacotes e o pacote é um conjunto comum de nós.
Sempre que você vai iniciar um nó, você precisa de um pacote. Um nó sempre ta atrelado a um pacote. Sempre que você vai começar um pacote você precisa de um workspace, todo pacote sempre ta ligado a um workspace.
Assim, se você vai começar um projeto totalmente novo, por exemplo: acabou de instalar ros e vai criar o seu primeiro nó (como o que é proposto no [artigo 3](https://hackmd.io/gaLEy34RQhePH6U-eUW5yQ?view)). Então você terá que primeiro criar um workspace, depois um pacote e por fim começar seu primeiro nó.

Nese caso o diretório ros2_ws é um workspace. O diretório src é o que contem os pacotes e os outros possuem programas que os pacotes usaram.

Em cima vemos as mesmas 3 pastas que darão apoio aos pacotes e vemos o diretório "key_pkg". Ele é um exemplo de um pacote. Esse workspace possui apenas esse pacote.

Esse é um pacote que tem apenas um nó, que é o node_pub_key.py
Basicamente a ideia é ter uma árvore de dependencias de workspace e pacotes. Eu posso pegar um pacote na internet e colocar no meu workspace e ele funcionará dentro do meu projeto. A ideia é funcionar de forma modular.
Um computador tem workspaces. Um workspace tem pacotes. Um pacotes tem nós. Nós publicam e subscrevem tópicos com mensagens.
## 1.6 Launch
Se você desejar executar 2 nós, como você faz? O Launch é um arquivo que você passa pro ROS em que indica qual nó você quer executar, com qual ordem e com quais parametros.
Assim um Launch pode ter uma lógica condicional onde você pode executar um projeto.
Normalmente um projeto possui vários arquivos launch onde cada um usa os mesmos nós de formas diferentes.