Projeto - Missão na 404
O objetivo do projeto é programar nosso robô para cumprir um conjunto de missões na sala 404. Utilizaremos o cenário apresentado a seguir.
Os grupos, que podem ser compostos por até quatro integrantes
, deverão trabalhar em conjuto no repositório do GitHub Classroom disponibilizado.
Link para repositório do projeto GitHub Classroom
Data de Entrega: Dia da AF às 12h
Instruções gerais
Aviso 1: Sempre desenvolvam nos arquivos .py
dos respectivos exercícios.
Aviso 2: Lembre-se de realizar commit
e push
no seu repositório até o horário limite de entrega.
Aviso 3: Preencha o nome completo dos integrantes do seu grupo no arquivo README.md
do seu repositório.
Aviso 4: Além de seu repositório, para todos os conceitos os grupos devem gravar um vídeo do seu robô executando a tarefa
. O vídeo deve ser postado no Youtube.
No arquivo README.md
do seu repositório existe o campo Link do Vídeo
onde você deve preencher com apenas o link de cada video no youtube. Certifique-se de que o vídeo está público e que o link está correto. NUNCA de commit no vídeo
, somente adicione o link.
Aviso 5: Para o projeto, as entregas são feitas utilizando o robô real. Entregas no simulador serão aceitas, conquistando no máximo o conceito D.
Aviso 6: São aceitos videos com entregas parciais que comprovam que seu robô é capaz de realizar parte das tarefas. Inclua o link dos vídeos no README com um comentário.
- É possível realizar a entrega parcial de conceitos avançados, por exemplo, entregar a parte de um conceito B antes de entregar a parte de um conceito C.
Configuração do Pacote (ROS 2)
- Preparação Inicial: Primeiro, aceite o convite do GitHub Classroom e clone o repositório dentro da pasta
colcon_ws/src/
no seu SSD. - Criação do Pacote ROS 2: Dentro do diretório do seu repositório, crie um novo pacote chamado
projeto_robcomp
.- Dica: Para utilizar os modulos desenvolvidos no módulo 3, inclua o pacote
robcomp_util
como dependência do seu pacote, e então, importe como nos exemplos do módulo 3.
- Dica: Para utilizar os modulos desenvolvidos no módulo 3, inclua o pacote
Atualização dos Repositórios
Em um novo terminal, execute os comandos a seguir linha por linha.
cd ~/colcon_ws/src/my_simulation
git stash
git pull
cb
Mapa Simulado
Para inicializar o mapa do desafio, em um terminal digite:
ros2 launch my_gazebo pista-24B.launch.py
Descrição das Missões
O projeto é composto por 4 missões de complexidade crescente, envolvendo tanto o design de software quanto a utilização dos sensores e comportamentos do robô. É preciso concluir todas as missões anteriores para obter a nota da missão subsequente.
Cada missão deverá ser registrada em um ou mais vídeos, com o link adicionado no arquivo README
e o codigo deve ser versionado utilizando o Releases do GitHub, com a tag do conceito atingido.
As missões envolvem os seguintes elementos:
-
Pista: O robô deve permanecer dentro da pista, retornando a ela o mais rápido possível caso saia.
-
Creepers: Bonecos semelhantes aos do Minecraft, que devem ser transportados até a área de entrega.
- Eles estão posicionados no creeper_place em cor/ID aleatória, com excessão de um que está perdido.
-
"Drop Area": Caixas com imagens detectáveis pela MobileNet, local onde os creepers devem ser depositados. Elas são colocadas em locais fixos da pista.
-
Labirinto: Um dos creepers está dentro de um labirinto, que deve ser percorrido pelo robô para encontrá-lo e resgatá-lo.
-
Placas: Arucos de
ID
100
,150
e250
. O grupo pode coloca-las em qualquer lugar, fora da linha branca, para auxiliar na navegação.
Dica 1
No simulador, você pode alterar a posição das placas no arquivo pista24B.world
, em um terminal digite:
code /home/borg/colcon_ws/src/my_simulation/my_gazebo/worlds/pista24B.world
Para completar uma missão, o grupo deve:
-
Capturar a tela do robô realizando a missão no simulador (até o conceito C).
-
Gravar o robô realizando a missão na pista real.
-
Incluir o link do vídeo no README do seu repositório e criar um Release com a tag referente ao último conceito alcançado.
-
Cada missão deve ser concluída em menos de 15 minutos.
-
Deixar o creeper em uma "Drop Area" inclui:
5.1. Parar próximo à "Drop Area".
5.2. Posicionar-se de frente da "Drop Area".
5.3. Aproximar-se até ficar a 0.5m de distância.
5.4. Abaixar a garra e soltar o creeper em pé.
5.5. Retornar à pista sem derrubar o creeper.
As missões podem ser validadas ao longo do projeto. Solicite a validação da parte de requisitos de software antes de gravar.
Sua classe deve receber como entrada, cor do creeper, ID do creeper e "Drop Area".
Missão C
Atenção
Missão no robô simulado
Essa missão é a mais simples do projeto e envolve aplicar diretamente os conceitos trabalhados na disciplina, para criar um mapa da pista e a localização dos creepers e das "Drop Area". Os seguintes passos devem ser realizados:
-
Inicie o
cartographer
com um mapa vázio e o nó do robô. -
Crie um dicinário com as cores dos creepers e seus respectivas IDs e as o objeto das "Drop Area", como o exemplo abaixo:
- Para os creepers, armazene como
creepers = {
'verde_10': '',
'verde_11': '',
'azul_10': '',
'azul_11': '',
'bicicleta': (0,0),
'cavalo': (0,0),
...
}
-
O robô sai da posição inicial e visita o local onde estão os creepers.
-
Para cada creepers presente no local, salve sua posição como a string
creeper_place
-
O creeper que não está no
creeper_place
está no labirinto, anote sua posição comolabirinto
-
Depois continue andando pela pista até encontrar todas as "Drop Area".
-
Ao encontrar uma "Drop Area", armazene onde ela está no dicionário guardando a posição
(x, y)
do robô quando o viu ou estime sua posição no mapa. -
Ao encontrar todas as "Drop Area", o robô retorna para a posição inicial, para e imprime o dicionário com as posições dos creepers.
-
Salve o mapa da pista
Requisitos de projeto de software:
-
Uso de Classes: O código deve ser estruturado de forma orientada a objetos, utilizando classes para organizar as funcionalidades
-
Máquina de Estados: Implemente uma máquina de estados para gerenciar as diferentes etapas da missão;
-
Controle Proporcional: Utilize técnicas de controle proporcional para manter o robô na trajetória desejada, especialmente ao seguir a linha.
Nota final desta missão: 5,0
Missão B
Atenção
Realizar a Missão no robô real
Essa missão se resume a executar a missão D no robô real.
Requisitos de projeto de software:
- Mesmo desafio da missão C
- Utilizar o robô real
Nota final desta missão: 7,0
Missão A
Atenção
Realizar a Missão no robô real
Essa missão utiliza o mapa e a localização dos artefatos da missão anterior e adiciona a capacidade de derubar os creepers. Os seguintes passos devem ser realizados:
-
Iniciar o
navigator
e o nó do robô. -
A classe recebe a cor e o ID do creeper desejado com excessão do creeper perdido no labirinto e a "Drop Area" desejada;
-
O robô navega diretamente até o
creeper_place
e pega o creeper desejado; -
Depois navega até a "Drop Area".
-
O robô deixa o creeper desejado na "Drop Area" desejada;
-
Volta para a pista e retorna a posição inicial e para.
Requisitos de projeto de software:
-
Mesmo do C
-
Subscriber para Aruco: Crie um nó específico que identifica o creeper pela cor e ID desejados - tanto pode publicar todos os creepers encontrados quanto apenas o creeper desejado - é uma boa prática este nó se inscrever em um tópico flag que indica se o nó deve ou não processar.
-
Subscriber para MobileNet: Crie um nó para a leitura da MobileNet. Ele deve publicar um tópico com a posição (na imagem) e classe da caixa detectada - é uma boa prática este nó se inscrever em um tópico flag que indica se o nó deve ou não processar.
Nota final desta missão: 10,0
Entrega Parcial
- O robô derruba um creeper em uma posição específica;
- O robô derruba um creeper em uma posição específica e retorna a posição inicial.
- O robô derruba um creeper e se move para a "Drop Area".
- O robô consegue pegar um creeper em um ambiente controlado;
Missão A++
Atenção
Realizar a Missão no robô real
Essa missão utiliza os conceitos das missões anteriores adicionando resgatar o creeper
do labirinto e levar ele para a "Drop Area". Os seguintes passos devem ser realizados:
-
Iniciar o
navigator
, ocartografer
e o nó do robô. -
A classe recebe a cor e o ID do creeper desejado (no caso o que está perdido no labirinto) e a "Drop Area" desejada;
-
O robô vai até o labirinto, navegando pelo labirinto até encontrar o o creeper desejado;
-
O robô pega o creeper desejado;
-
O robô sai do labirinto e segue para a "Drop Area";
-
O robô deixa o creeper desejado na "Drop Area" desejada;
-
O robô retorna para a posição inicial e para.
Requisitos de projeto de software:
- Mesmo do B
Nota final desta missão: 12,0
Entrega Parcial
- O robô consegue entrar e sair do labirinto sem ter o mapa do labirinto.
Bonus
Boas práticas de Python e ROS que podem render pontos bônus no projeto:
- Utilização de Launch Files para execução do projeto
- Implementação de múltiplos "Action Servers" para todas as ações relevantes do robô.
- Configuração eficiente de parâmetros ROS
- POO, Modularização e reusabilidade de código.