Adaptação dos modelos OpenVLA e OpenVLA-OFT ao braço robótico Universal Robots UR3, equipado com uma garra OnRobot RG2 e duas câmaras Intel RealSense (D435 na cena, D415 no pulso). O projeto cobre todo o ciclo: recolha de um dataset de demonstrações pick-and-place, pré-processamento para o formato RLDS/OXE, fine-tuning com LoRA, fusão dos adaptadores, avaliação e inferência em tempo real no robot.
Projeto desenvolvido no âmbito da unidade curricular de Projeto da Licenciatura em Engenharia Informática da UBI.
Demonstração em vídeo: https://www.youtube.com/watch?v=lI04P4rUPSA
| Caminho | Descrição |
|---|---|
robot_controller/ |
Aplicação de controlo do robot: captura do dataset, teleoperação e inferência remota (ver abaixo) |
preprocess_all.py |
Constrói os dois datasets TFDS (base e OFT) a partir dos episódios brutos |
merge_oft_adapters.py |
Funde em lote os adaptadores LoRA do OpenVLA-OFT no modelo base, produzindo checkpoints implantáveis |
apply_adapters.py |
Funde um único adaptador LoRA do OpenVLA base |
eval_project.py |
Avaliação offline: métricas L1/accuracy por dimensão |
openvla/ |
Repositório OpenVLA (código de fine-tuning e deploy do modelo base) |
openvla-oft/ |
Repositório OpenVLA-OFT (código de fine-tuning e deploy da variante OFT) |
Ponto de entrada: web_app.py — aplicação FastAPI que controla o robot, as câmaras, o orquestrador e os controladores de inferência, e serve a interface web (REST + WebSockets + streams MJPEG).
Módulos principais:
config.py— configuração central: IP do robot, números de série das câmaras, taxas de captura, mapeamentos do comando, URLs dos servidores de inferência.robot_manager_rg2.py— ligação ao UR3 viaur_rtde(servoL/moveL, freedrive) e controlo da garra RG2 por URScript.camera.py— captura contínua das RealSense num thread produtor com buffer partilhado.capture.py— gravação de episódios a 20 Hz para TFRecord (RLDS), com rate guard e deteção de câmara congelada.orchestrator.py— máquina de estados dos episódios pick-and-place e sequência automática (circuito Euleriano sobre os pares de posições).gamepad.py— teleoperação com comando.inference.py/inference_oft.py— ciclos de inferência contra os servidoresdeploy.pyremotos (OpenVLA e OpenVLA-OFT, respetivamente).models.py— persistência das posições e dos metadados de episódios (JSON emstate/).
- Recolha do dataset — na interface web, definir as 16 posições da mesa e lançar a sequência automática; cada episódio é gravado como
episode.tfrecord+metadata.json. - Pré-processamento — construir os dois datasets TFDS (recorte 1080×1080, ação de 7 dimensões com wrap dos deltas de rotação para (−π, π], propriocepção de 7 dimensões no OFT):
Produz
python preprocess_all.py
ur3_rlds_dataset(OpenVLA base) eur3_oft_dataset(OpenVLA-OFT), ambos registados no OXE dos respetivos repositórios. - Fine-tuning — com os scripts
finetune.pydos repositóriosopenvla/eopenvla-oft/(LoRA rank 32; no OFT, com FiLM, propriocepção e câmara de pulso). - Fusão dos adaptadores — produzir checkpoints autónomos prontos para o
deploy.py:# OFT (em lote, um por checkpoint da run) python merge_oft_adapters.py --base_checkpoint <modelo_base> \ --runs_root <pasta_das_runs> --output_root <pasta_de_saida> # OpenVLA base (um adaptador) python apply_adapters.py --base-model <dir> --adapter <dir> --stats <dataset_statistics.json>
- Avaliação offline — métricas L1 e accuracy (tolerância 0,05 no espaço normalizado [−1, 1]), por dimensão e globais, na fração de validação:
python eval_project.py --model_paths '["<checkpoint_fundido>"]' --ur3_data_root_dir <raiz_dos_datasets>
- Inferência no robot — arrancar os servidores
deploy.pyremotos e usar as páginas/inference(base) e/inference_oftda interface web.
- Python 3.10+ (o ambiente de treino dos repositórios OpenVLA usa 3.10)
- Robot:
ur_rtde,pygame(teleoperação) - Câmaras:
pyrealsense2,opencv-python - Dados:
tensorflow,tensorflow-datasets,numpy - Modelos:
torch,transformers,peft,draccus - Interface:
fastapi,uvicorn,requests,json_numpy
O OpenVLA base afinado falhou em todas as tentativas no robot real, enquanto o OpenVLA-OFT atingiu 88,9 % de taxa de sucesso (40/45) em tarefas pick-and-place. Ver a demonstração em vídeo.