Robótica Computacional 2025.1 - AI
Instruções para a avaliação:
- A prova tem duração de 4 horas.
- Inicie a prova no Blackboard para a ferramenta do Smowl ser iniciada.
- O Smowl é obrigatório durante toda a prova.
- Só finalize o Blackboard quando enviar a prova via Github Classroom incluindo o hash do último commit na resposta do Blackboard.
- Durante a prova vamos registrar, a camera, a tela, as páginas visitadas, os acessos online e os registro do teclado.
- Coloque seu
nomeeemailnoREADME.mddo seu repositório. - A prova deverá ser realizada de forma individual.
- É permitido consultar a internet ou qualquer material utilizado no curso, mas não será permitida a comunicação com terceiros durante a prova
em qualquer plataforma. Não é permitido o uso de ferramentas de **IA** como chatGPT, Copilot, Gemini ou similares durante a prova.Não é permitido o uso de ferramentas colaborativas como Google Docs, Google Slides, ou similares durante a prova.Não é permitido o uso de ferramentas de comunicação como Discord, WhatsApp, Telegram ou similares durante a prova.Não é permitido o uso de editores de codigo com IA como Cursor ou Windsurf durante a prova, sendo permitido apenas o uso do **VSCode**.Não é permitido o uso de redes sociais, fóruns ou plataformas de comunicação durante a prova, com exceção apenas doStack OverfloweROS Answers, desde que o aluno não faça perguntas nas plataformas.- Faça commits e pushes regularmente de sua avaliação.
- Eventuais avisos importantes serão realizados em sala durante a prova.
- Escreva a frase "yey" como a resposta da soma no arquivo
README.mdcomo teste de sua atenção. - A responsabilidade por
infraestrutura,configuraçõesesetupem funcionamento pleno, é de cada estudante. -
SÓ SERÃO ACEITOS REPOSITÓRIOS DE ALUNOS QUE ASSINARAM A LISTA DE PRESENÇA.
-
BOA PROVA!
Atualização do Pacote (ROS 2)
Execute os comandos abaixo para atualizar os pacotes da ros2 obrigatórios para a prova:
cd ~/colcon_ws/src/my_simulation
git stash
git pull
cb
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
avaliacao_ai.- Dica: Para utilizar os módulos desenvolvidos no capitulo 3, inclua o pacote
robcomp_utile o pacoterobcomp_interfacescomo dependência do seu pacote, e então, importe como nos exemplos do capitulo 3.
- Dica: Para utilizar os módulos desenvolvidos no capitulo 3, inclua o pacote
Exercício 0 - Organização & Qualidade (1)
Este exercício avalia a organização e a qualidade dos vídeos dos exercícios e do arquivo README.md.
Critérios de Avaliação:
- O pacote foi corretamente configurado.
- As dependências do pacote estão corretas.
- Os diretórios e arquivos estão organizados de forma adequada.
- Todos os scripts estão na pasta
avaliacao_aidentro do pacoteavaliacao_ai. - A configuração dos nós foi realizada corretamente.
- Os nós da ROS 2 foram executados utilizando o comando
ros2 run. - Vídeo: A ação do robô é claramente compreensível pelo vídeo.
- README.md: O link do vídeo foi adicionado corretamente no campo indicado.
- README.md: O arquivo
README.mdcontém o nome completo e o e-mail do estudante.
Exercício 1 - Batatinha-Frita-1-2-3 (6)

Baseando-se no código base_control.py do capitulo 3, crie um arquivo chamado q1.py contendo uma classe denominada Jogador. Esta classe deve implementar um nó chamado jogador_node, responsável por fazer com que o robô simulado jogue o jogo da batatinha-frita-1-2-3 com Young-Hee.
No jogo batatinha-1-2-3, Young-Hee vai publicar as palavras sequenciais "ba", "ta", "ti", "nha", "fri", "ta", "1", "2", "3" e então, Young-Hee vai aguardar entre 2 a 5 segundos antes de voltar a publicar a mesma sequência. O robô só pode se mover enquanto Young-Hee estiver publicando as palavras "ba", "ta" e "ti". Se o robô se mover enquanto Young-Hee não estiver publicando, o robô perde o jogo e deve recomeçar. O robô vence o jogo se chegar no final da pista.
Ao chegar no final da pista, Young-Hee vai publicar o tempo que o robô levou para chegar no final e o robô deve parar e comemorar de alguma forma.
Utilize o comando abaixo para iniciar o simulador no mapa da prova:
ros2 launch my_gazebo run_turtle.launch.py
O nó criado deve:
- Criar um publisher para o tópico
/young_heeque publica mensagens do tiporobcomp_interfaces.msg.GameStatus. - Ao iniciar, o nó deve publicar uma mensagem com o status READY, com o horário atual e o nome do aluno nos campos apropriados.
- Com isso, Young-Hee vai começar o jogo, mudando o status para IN_PROGRESS e publicando as palavras em sequenciais em loop.
- Young-Hee demora de 0.5 a 2 segundos para publicar cada palavra.
- Após publicar a palavra "3", Young-Hee vai aguardar entre 2 a 5 segundos antes de voltar a publicar a mesma sequência.
- O robô deve se mover para frente enquanto Young-Hee estiver publicando as palavras "ba", "ta" e "ti"...
- O robô deve estar parado a partir de quando Young-Hee publicar a palavra "3".
- Se Young-Hee mudar o status do jogo para LOST, o robô deve parar e nunca mais se mover, sendo nescessário reiniciar o nó.
- O robo deve seguir a pista so se movendo na hora certa.
- Quando o robô chegar no final da pista, à partir de
X = -5, Young-Hee vai mudar o status para WIN e o robô deve parar e imprimir no terminal uma comemoração - seja criativo! - Depois de chegar no final da pista o robô deve parar enquanto ainda na região preta e não se mover mais.
Dica
Durante a execução do nó, você terá que interroper algum estado do robô, enquanto Young-Hee não estiver publicando. Portanto, armazene o estado do robô em uma variável, enquanto o robô não estiver se movendo e então, retorne o estado do robô para o valor original quando Young-Hee voltar a publicar.

Requisitos
- Deve existir o arquivo chamado
q1.py. - O programa deve ser executado sem erros.
- A classe deve ser chamada
Jogador. - A implementação deve seguir a estrutura da classe
Jogador, conforme exemplo nobase_control.py. - A função
controldeve ser a única à publicar no tópico/cmd_vel. - A função
controldeve ser idêntica à do arquivobase_control.py, com excesão aocheck_dangerque pode ser removido. Todas as decisões de controle devem ocorrer dentro dos nós, sem alterações na funçãocontrol. - Não utilizar loops infinitos ou
sleepdurante o controle do robô. - Deve se inscrever e publicar no tópico
/young_heecom mensagens do tiporobcomp_interfaces.msg.GameStatus. - Deve seguir as regras do jogo da batatinha-frita-1-2-3.
- Deve começar sempre da posição padrão inicial do robô.
- Você pode remover a parede, mas dessa forma sua nota será limitada a 3,0.
Rúbrica
- O programa deve respeitar as restrições definidas.
- Nota: +1,0 - [1] & o robô mantém a conversa com o Young-Hee sem spamar.
- Nota: +1,0 - [2] & o robô consegue andar e parar quando Young-Hee não está falando.
- Nota: +1,0 - [3] & o robô consegue chegar até o final da circuito e vencer o jogo, comemorando e parando na região preta.
- Nota: +3,0 - [4] & não foi feito nenhum ajuste no mapa, tento o robô de contornar a parede enquanto segue as regras do jogo.
Vídeo
Grave um vídeos, mostrando a conversa com o Young-Hee (echo no tópico), o terminal da simulação, o terminal do robô (3 terminais no total) e o robô executando as intruções. Publique os vídeos no YouTube e inclua apenas o link no arquivo README.md do seu repositório.
Entregas parciais são aceitas, sem garantia de nota, o aluno deve explicar no README.md e na descrição do vídeo até onde foi feito.
Desafio (+1)
Os 3 melhores tempos, de acordo com Young-Hee no video postado do aluno, serão premiados com 1 ponto extra na nota da ai. So poderá participar do desafio quem tiver completado todos as etapas do exercício e no video postado estiver claro que o robô completou o desafio corretamente, com Young-Hee confirmando o tempo.
Para competir, escreva seu tempo no arquivo README.md.
Exercício 2 - OpenCV (3)
Crie um arquivo chamado q2.py com uma classe chamada BalloonCounter, que possui um método run. Este método deve receber uma imagem e retornar um dicionário com a contagem de balões de cada cor. O arquivo só pode ser executado se for rodado diretamente, chamanado a função main. A função main deve passar pelas 5 imagens fornecidas e armazenar o resultado em um dicionário onde a chave é o nome do arquivo e o valor é o dicionário retornado pelo método run. Ao final, a função main deve imprimir o dicionário com o total de balões de cada cor em cada imagem.
Exemplo de um frame do vídeo:

Importante
A legenda dos balões é para auxiliar alunos com daltonismo, seu método não deve depender dela.
Saída esperada:
resultado = {
'img1.png' : {
'amarelo': 3,
'laranja': 2
'roxo': 2
},
}
Restrições
Os balões podem ser de 3 cores: amarelo, laranja e roxo. Os balões podem estar em qualquer posição da imagem. O tamanho e orientação dos balões nunca mudam. A legenda dos balões é para auxiliar alunos com daltonismo, é proibido usar a legenda para identificar os balões.
Requisitos
- Deve existir um arquivo chamado
q2.py - O programa deve ser executado sem erros.
- A classe deve se chamar
BalloonCounter - A classe deve possuir um método
runque conta as laranjas que entram em cada cesto. - O programa deve conter uma função
mainque passa um loop pelas 5 imagens fornecidas e armazena o resultado em um dicionárioresultados. - Seu método não utiliza a legenda de qualquer forma para identificar os balões.
- O método
rundeve retornar um dicionário com a contagem de balões de cada cor na imagem recebida. - Seu método é dinâmico e funciona para qualquer imagem com as mesmas características, além das fornecidas.
Rúbrica
- O programa respeita as restrições definidas.
- Nota: +0,5 - [1] & é capaz de passar a imagem para a classe receber um dicionário (pode ser vazio) e então imprimir o dicionário e mostrar a imagem original.
- Nota: +0,5 - [2] & é capaz de segmentar cada uma das 3 cores de balões.
- Nota: +1,0 - [2] & é capaz de contar uma das cores de balões em todas as imagens.
- Nota: +1,0 - [3] & é capaz de contar todas as cores de balões em todas as imagens e armazenar o resultado em um dicionário e imprimir o resultado no final.
Vídeo
Grave um vídeo mostrando o funcionamento do programa para todas as imagens fornecidas. Em cada imagem, deve mostrar a imagem original, a imagem segmentada e o resultado da contagem de balões. Publique o vídeo no YouTube e inclua apenas o link no arquivo README.md do seu repositório.