Este repositório contém o ambiente de desenvolvimento containerizado (Docker) para o projeto de simulação de braço robótico com detecção de objeto utilizando ROS2 e Webots.
O ambiente é baseado em ROS2 Humble e inclui o simulador Webots (R2025a), OpenCV, e NumPy, todos pré-configurados para funcionar em conjunto[cite: 10, 11].
Antes de começar, certifique-se de que sua máquina (host) possui os seguintes softwares:
- Git: Para clonar o repositório.
- Docker Engine: Para construir e executar o contêiner.
- (Opcional, mas Recomendado) NVIDIA GPU:
- Drivers da NVIDIA instalados.
- NVIDIA Container Toolkit (para permitir que o Docker use a GPU, essencial para performance em simulação 3D).
Nota para Usuários Windows/macOS:
- Windows: Este setup é otimizado para WSL2 (Windows Subsystem for Linux). Você precisará do Docker Desktop com integração WSL2 e um X-Server como VcXsrv para a interface gráfica.
- macOS: Você precisará de um X-Server como XQuartz.
Siga estes passos exatamente para configurar o ambiente pela primeira vez.
git clone <url-do-seu-repositorio-github>
cd <nome-do-repositorio>Nosso Dockerfile foi feito para copiar o instalador do Webots localmente, evitando falhas de download durante o build.
Execute o comando a seguir no seu terminal (na pasta raiz do projeto) para baixar a versão exata necessária.
wget https://github.com/cyberbotics/webots/releases/download/R2025a/webots-R2025a-x86-64.tar.bz2Isso garante que o arquivo webots-R2025a-x86-64.tar.bz2 seja salvo na mesma pasta que o Dockerfile, pronto para a construção da imagem.
O ROS2 precisa de uma estrutura de pastas mínima para a primeira compilação.
# Cria as pastas necessárias para o 'trainee_ws'
mkdir -p workspace/trainee_ws/srcIsso pode levar de 15 a 30 minutos na primeira vez, pois irá instalar o ROS2, Webots e todas as dependências2.
# O nome 'edrom_image' é o mesmo usado no script start_container.sh
docker build -t edrom_image .Nota: Caso não tenha o Docker instalado, siga o passo a passo presente em requirements_steps.md
Agora vamos iniciar o contêiner e compilar o workspace vazio.
- Inicie o contêiner:
./start_container.shNota: Na primeira vez, você verá um erro
bash: /trainee/workspace/trainee_ws/install/setup.bash: No such file or directory. Isso é normal.
-
Dentro do contêiner, compile o workspace:
Você estará no prompt ros@nitro:/trainee$.
cd /trainee/workspace/trainee_ws
colcon buildApós a compilação, saia (exit) e entre novamente.
- Saia do contêiner:
exit- Inicie novamente:
./start_container.shDesta vez, **nenhum erro deve aparecer**. O prompt `ros@nitro:/trainee$` deve carregar limpo3.
O ambiente está pronto!
-
Iniciar o Ambiente:
Abra um terminal na pasta do projeto e execute:
./start_container.sh-
Desenvolver:
-
Seu prompt é
ros@nitro:/trainee$. -
Seu workspace ROS2 está em
/trainee/workspace/trainee_ws. -
IMPORTANTE: Todo o código (pacotes ROS2, etc.) deve ser colocado dentro da pasta
/trainee/workspace/trainee_ws/src. -
Como a pasta do projeto está montada (
-v), você pode usar sua IDE favorita (VS Code, PyCharm, etc.) no seu computador (host) para editar os arquivos.
-
-
Compilar (Dentro do Contêiner):
Após adicionar ou modificar pacotes, compile:
cd /trainee/workspace/trainee_ws
colcon build-
Parar o Ambiente:
Simplesmente digite exit no terminal do contêiner.
Execute estes comandos dentro do contêiner para garantir que tudo está funcionando:
- Testar Interface Gráfica (GUI):
rqt_(Uma janela deve abrir. Se falhar, veja o Troubleshooting.)_
- Testar Versão do Webots:
webots --version_(Deve retornar `Webots R2025a`)_
- Teste de Integração (Webots + ROS2):
ros2 launch webots_ros2_universal_robot robot_world_launch.py_(Isso deve abrir o simulador Webots com um robô UR5e.)_
.
├── Dockerfile # Define nossa imagem Docker personalizada
├── README.md # Este arquivo
├── bashrc # Configurações do shell (prompt, aliases) dentro do contêiner
├── entrypoint.sh # Script de entrada do Docker
├── start_container.sh # Script para INICIAR o contêiner
├── webots-R2025a-x86-64.tar.bz2 # Instalador do Webots (Requerido pelo Dockerfile)
└── workspace/
└── trainee_ws/
├── build/ # (Gerado pelo colcon)
├── install/ # (Gerado pelo colcon)
├── log/ # (Gerado pelo colcon)
└── src/ # <-- CÓDIGO FONTE DOS PACOTES
├── arm_simulation/ # Pacote base de simulação e controle híbrido inicial
├── keyboard_check/ # Nódulo para captura e publicação de teclas (Teleoperação)
├── robot_extra/ # Desafios extras: Cinemática Inversa (IK) e Estimação de Profundidade
├── robot_vision/ # Visão Computacional, IBVS e Máquina de Estados
└── webots_packed/ # Integração Webots-ROS2 e controladores principais
Este projeto implementa três estratégias distintas de controle para o braço robótico UR5e, demonstrando uma evolução desde a operação manual até a autonomia baseada em geometria espacial.
A primeira camada de interação é feita através de um sistema de teleoperação manual desacoplado.
-
Arquitetura: Utilizamos o padrão Publisher/Subscriber. Um nó dedicado (
keyboard_publisher) captura as teclas do terminal usando bibliotecas de baixo nível (termios/tty) para garantir uma leitura não bloqueante e sem necessidade de pressionar "Enter". -
Abstração: As teclas são mapeadas para códigos inteiros padronizados (ex:
W=0,S=1,UP=4). Isso permite que o robô seja controlado por qualquer interface (teclado, joystick, web) desde que ela publique as mensagens corretas, sem alterar o código do controlador do robô.
Adotamos uma arquitetura de Visual Servoing Baseado em Imagem (IBVS - Image-Based Visual Servoing) com uma abordagem heurística direta.
-
Conceito: Em vez de calcular onde o objeto está no mundo 3D, o robô reage ao erro na imagem 2D. Se o objeto está à esquerda na tela, a base gira para a esquerda.
-
Controle Proporcional (P-Controller):
A lei de controle é simples: Velocidade = Ganho (Kp) * Erro.
-
Erro (e): Diferença entre o centroide do objeto e o centro da imagem.
-
Simplificação MIMO -> SISO: O problema é tratado como dois sistemas independentes: o erro horizontal controla a Base (Yaw) e o erro vertical controla o Ombro (Pitch).
-
-
Vantagem: Computacionalmente leve e robusto a erros de calibração, pois é um sistema de malha fechada que corrige o erro continuamente a cada frame (30Hz).
Para tarefas de Pick-and-Place que exigem precisão 3D, implementamos uma solução analítica completa no pacote robot_extra.
-
Estimativa de Profundidade (Sem Sensor 3D):
Utilizamos apenas uma câmera monocular (RGB). A profundidade (
$Z$ ) é calculada usando o modelo de câmera Pinhole e semelhança de triângulos, dado que conhecemos o tamanho real do objeto (bola de 7cm):$$Z = \frac{f \cdot R_{real}}{R_{pixel}}$$ -
Transformações (TF2):
O sistema converte as coordenadas do referencial da câmera (camera_link_optical) para o referencial da base do robô (base_link) usando a árvore de transformadas (TF Tree) do ROS2.
-
Cinemática Inversa (IK):
Diferente do IBVS, aqui o robô calcula explicitamente os ângulos das juntas. Utilizamos a biblioteca IKPy com o URDF do UR5e para calcular a solução matemática que leva o efetuador até a coordenada
$(x, y, z)$ calculada, permitindo planejamento de trajetória preciso.
Erro: bash: /trainee/workspace/trainee_ws/install/setup.bash: No such file or directory
-
Causa: O workspace ainda não foi compilado.
-
Solução: Entre no contêiner e execute
cd /trainee/workspace/trainee_ws && colcon build.
Erro: cannot open display (ou falha ao abrir rqt / webots)
-
Causa: O contêiner não consegue se conectar ao seu "display" (servidor gráfico).
-
Solução (Linux): Feche o contêiner, execute
xhost +local:dockerno seu terminal host e tente rodar./start_container.shnovamente.
