Pipeline completa per calibrazione hand-eye e grasp planning su robot Unitree G1/H1 con camera depth Nuwa-HP60C. Esposta come FastAPI + GUI vanilla JS, con assistente AI (OpenRouter + tool calling curato) per pilotare il sistema in linguaggio naturale. Architettura: - FastAPI orchestrator (porta da .env, default 8890) che coordina 4 microservizi upstream: Nuwa-HP60C, marker-finder, YOLO, robot bridge. - Dual-robot: services.g1 e services.h1 in config.yaml; switchabili a runtime via PUT /api/home/robot. - Calibrazione hand-eye eye-to-hand split per-side (right/left). - Marker pose: marker-finder riceve gli intrinseci RGB della Nuwa al boot, PnP server-side con quei dati. Nessun re-PnP locale richiesto. - Depth-to-RGB: registrazione iterativa IR↔RGB per back-projection 3D corretta (Nuwa /api/measure usa coords IR; il nostro /api/perception/ measure_rgb prende pixel RGB e ritorna 3D nel frame RGB OpenCV). - Correzione affine sul depth bias (calibrabile via marker come ground-truth) — riduce errore Z da ~6% a ~1.5% nei test. - AI assistant: 16 tool curati (move_wrist_*, hand_action, get_marker[_3d], detect_object, calibration_*, set_active_robot…), system prompt dinamico che riflette robot attivo + marker config + addendum customizzabile da GUI. Temperature di default 0.1 per evitare invenzioni. GUI (7 tab): - Home: stato comunicazione device + selettore robot attivo G1/H1 - Assistente AI: chat con OpenRouter, history persistita lato browser, task riutilizzabili (prompt salvati), trace tool calls - Impostazioni AI: modello da combo curata, temperature, max iterations, prompt addendum, anteprima system prompt - Calibrazione, Auto-Calibrazione, TrovaUtensile, Servo Visuale, Vista 3D, Movimento EE — invariate dalle versioni precedenti Setup: - Variabili in presa-mano/.env (template in .env.example) - OPENROUTER_API_KEY richiesta solo per il tab Assistente AI - PRESA_MANO_PORT configurabile Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
42 lines
1.5 KiB
Markdown
42 lines
1.5 KiB
Markdown
# presa-mano
|
|
|
|
Microservizio Python (FastAPI) che orchestra:
|
|
|
|
1. **Calibrazione hand-eye** (eye-to-hand) tra la **Nuwa depth camera** (montata in alto,
|
|
a sinistra del robot) e la **base del G1**, usando un **ArUco sul polso destro**.
|
|
2. **Riconoscimento oggetto** via YOLO server + point cloud Nuwa.
|
|
3. **Pianificazione presa**: asse dell'oggetto (PCA) + posa polso per il G1.
|
|
|
|
## Microservizi usati
|
|
|
|
| Servizio | URL (default) | Scopo |
|
|
|---------------|---------------------------|-------------------------------------|
|
|
| Nuwa-HP60C | http://localhost:8877 | RGB, depth, point cloud, intrinsics |
|
|
| Marker-finder | http://localhost:8082 | Detection 2D ArUco (corners) |
|
|
| YOLO Server | http://localhost:8879 | Bbox oggetto da prendere |
|
|
| G1 API Server | http://localhost:8765 | Controllo polso/mano (dry-run se down) |
|
|
|
|
Il servizio **presa-mano** espone GUI + API su **http://localhost:8890**.
|
|
|
|
## Quick start
|
|
|
|
```bash
|
|
docker compose up -d presa-mano
|
|
# Apri http://localhost:8890
|
|
```
|
|
|
|
## GUI
|
|
|
|
Tre tab:
|
|
|
|
- **Calibrazione**: muovi il polso in varie pose, premi *Acquisisci sample* per ognuna,
|
|
poi *Risolvi*. Salva `data/calibration.yaml`.
|
|
- **Grasp**: rileva oggetto, visualizza bbox + asse, esegui (con toggle dry-run).
|
|
- **Movimento EE**: lettura pose correnti, invio pose assolute/relative, apri/chiudi mano,
|
|
emergency stop.
|
|
|
|
## Configurazione
|
|
|
|
`config.yaml` contiene i default; l'API espone `GET/PUT /api/config` per override runtime
|
|
(es. cambiare ID/size ArUco dalla GUI).
|