Entregável 6 de Robótica Computacional
Instruções gerais
Aviso 1: Sempre desenvolvam nos arquivos .py
dos respectivos exercícios.
Aviso 2: Lembre-se de dar 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 todas as questões você deve gravar um vídeo do seu robô executando a tarefa. O vídeo deve ser feito gravando a tela do linux, tutorial, e deve ser postado no Youtube.
No arquivo README.md
do seu repositório existe o campo Link do Vídeo
onde você deve colocar o link do 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 este entregável, você deve utilizar o robô real, mas você pode testar o código no simulador.
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 nomeado
entregavel_6
.- 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
IMPORTANTE
Atualize o pacote do robcomp_interfaces
que existe em seu SSD com os comandos abaixo:
cd ~/colcon_ws/src/my_simulation/
git stash
git pull
cb
Exercício 0 - Organização & Qualidade (1 pontos)
Este exercício está avaliando a organização e qualidade dos vídeos dos exercícios 2, 3 e 4, do desafio e do arquivo README.md
.
Critérios de Avaliação:
- O pacote foi configurado corretamente.
- Os nós foram configurados corretamente.
- Vídeo: O vídeo foi gravado na horizontal.
- Vídeo: O vídeo foi gravado em um ambiente bem iluminado.
- Vídeo: O audio está claro e sem ruídos, se desejar, remova o audio e adicione uma música de fundo.
- Vídeo: Na descrição do vídeo no Youtube, está descrito o que o robô está fazendo.
- Vídeo: Pelo vídeo, é possível entender o que o robô está fazendo.
- README.md: O link do vídeo está correto e foi adicionado no campo específico.
- README.md: O arquivo README.md tem o nome completo e o email de todos os integrantes do grupo.
Exercício 1 - Nós de Visão (3 pontos)
Neste exercício, você deve criar dois nós: um para identificar objetos utilizando a MobileNet e outro para detectar marcadores ArUco.
1.1 - Identificação de Objetos com MobileNet
Com base no código image_subscriber.py
do capítulo 5, crie um arquivo chamado mobilenet_detector.py
que contenha um nó denominado mobilenet_node
. Este nó deve:
- Inscrever-se no tópico de imagens.
- Identificar objetos nas imagens utilizando o modelo MobileNet.
- Publicar, no tópico
/mobilenet_detection
, a classe, o centro_x e o centro_y de cada objeto identificado, utilizando o formato de mensagemrobcomp_interfaces/msg/DetectionArray
. - Ouvir o tópico
/vision/mobilenet_flag
e, ao receber uma mensagemFalse
, interromper o processamento de imagens.
1.2 - Identificação de Marcadores ArUco
Com base no código image_subscriber.py
do capítulo 5, crie um arquivo chamado aruco_detector.py
que contenha um nó denominado aruco_node
. Este nó deve:
- Inscrever-se no tópico de imagens.
- Identificar marcadores ArUco nas imagens.
- Publicar, no tópico
/aruco_detection
, a id (como string), o centro_x e o centro_y de cada marcador identificado, utilizando o formato de mensagemrobcomp_interfaces/msg/DetectionArray
. - Ouvir o tópico
/vision/aruco_flag
e, ao receber uma mensagemFalse
, interromper o processamento de imagens.
Critérios de Avaliação:
Para cada nó, mobilenet_node
e aruco_node
:
2. Desenvolveu o nó com os comportamentos corretos.
5. Vídeo: Grave a tela do Linux mostrando em uma tela as deteções.
6. Vídeo: Mova o robô em algum lugar no qual não haja objetos ou marcadores ArUco e mostre que o código não falha e mostra uma imagem sem as deteções.
7. Vídeo: Desligue o nó enviando uma mensagem False
para o tópico pelo terminal e mostre que o código para de detectar objetos ou marcadores ArUco.
Exercício 2 - Segue Linha (3 pontos)
Baseando-se no código base_control.py
do módulo 3, crie um arquivo chamado segue_linha.py
com um nó denominado seguidor_node
, que faça com que robô real siga a linha amarela do chão. O nó deve:
-
O nó deve ter estados,
centraliza
esegue
epara
. -
Adicione um subscriber, que se inscreve no tópico de imagem comprimida e direciona para a função
image_callback
. -
A função
image_callback
deve filtrar a faixa amarela na pista e armazenar o centro da linha mais próximo nas variáveisself.cx
,self.cy
, e a metade da largura da imagem na variávelself.w
. -
A função
image_callback
deve ser executada apenas se a variávelself.running
forTrue
. -
Calcule também a distância do centro da linha ao centro da imagem.
-
Caso o robô não veja nenhum contorno, defina o centro como
(-1,-1)
, ou seja,self.cx = -1
,self.cy = -1
. -
o estado
centraliza
deve centralizar o robô no segmento de linha amarelo mais relevante. -
o estado
segue
deve fazer o robô seguir a linha amarela, se movendo para frente. -
O estado
para
deve ser chamado depois de completar uma volta na pista, e o robô deve parar.
Dica: Ao iniciar a execução do nó, armazene em uma variável a posição inicial do robô e compare com a posição atual para saber se o robô completou uma volta.
Critérios de Avaliação:
- Nó filtra corretamente a imagem da câmera para encontrar a linha amarela.
- Desenvolveu o nó
seguidor_node
com os comportamentos corretos. - Não utiliza nenhuma função de
sleep
ewhile
no código. Com exceção dosleep
para "dar boot" no robô. - Navega corretamente pela pista.
- Vídeo: Mostra o robô executando o comportamento e navegando por uma volta completa na pista e parando.
- Vídeo: O robô não colide com nenhum obstáculo.
- Vídeo: Link do vídeo do robô em ação no Youtube.
Exercício 3 - Aproxima Creeper (3 pontos)
Baseando-se no código base_control.py
do módulo 3, crie dois arquivos, um chamado aproxima.py
com um nó denominado aproxima_node
que, faça com que o robô real se aproxime do creeper e outro arquivo chamado filtro_cor.py
com um nó denominado filtro_cor_node
que filtra a cor do creeper e publica uma mensagem do tipo geometry_msgs/Point com a posição do creeper na imagem (x, y) e a largura da imagem (z).
O nó aproxima_node
deve:
-
Ter três estados,
segue
,centraliza
estop
. -
No estado
centraliza
, o robô deve girar até encontrar o creeper da cor selecionada. -
No estado
segue
, o robô deve se aproximar do creeper. -
No estado
stop
, o robô deve parar quando estiver a menos de0.5m
do creeper. -
Se o creeper for retirado da frente do robô, ele deve voltar para o estado
centraliza
.
O nó filtro_cor_node
deve:
-
Receber a cor do creeper como
string
no parâmetrocor
. -
Os limites HSV devem ser definidos em um dicionário,
self.cores
no método__init__
, com os nomes das cores como chave e um segundo dicionário com as chavesinferior
esuperior
com os valores dos limites inferior e superior da cor no espaço HSV. -
Filtrar a cor do creeper
-
Publicar uma mensagem do tipo geometry_msgs/Point com,
-
x: a posição do creeper na imagem.
-
y: a posição do creeper na imagem.
-
z: a largura da imagem.
-
Dica: leia a documentação oficial: geometry_msgs/msg/Point.
Critérios de Avaliação:
- Desenvolveu o
filtro_cor_node
para filtra e publicar as informações do creeper. - Desenvolveu o nó
aproxima_node
com os comportamentos corretos. - Não utiliza nenhuma função de
sleep
ewhile
no código. Com exceção dosleep
para "dar boot" no robô. - Vídeo: Mostra o robô executando o comportamento e se aproximando de 2 creepers. Assim que ele parar a menos de
0.5m
do primeiro creeper, tire o creeper da frente do robô e coloque outro do outro lado do robô a uma distância de2m
. - Repita o processo para cada cor de creeper, ou seja, devem ser gravados 3 vídeos.