C3PO, parte 1: Claude Code maneja un robot en Isaac Sim
Le estoy dando un cuerpo a Claude.
El proyecto se llama C3PO, y empezó como un proyecto escolar. Los LLMs de frontera razonan y usan herramientas, los robots humanoides ya son hardware capaz, y casi nadie conecta las dos cosas. Yo quería hacerlo. El objetivo final es un Unitree G1 real que perciba, decida y se mueva en el mundo físico con Claude al mando. El G1 cuesta plata de verdad y se puede romper, así que empecé en simulación.
Lo más simple que pueda funcionar
La primera implementación es deliberadamente cruda. Tiene tres piezas:
- Isaac Sim en un host Ubuntu aparte, corriendo un G1
- Un bridge en Python que expone los controles del robot como herramientas MCP y habla DDS (CycloneDDS y el SDK de Unitree) con el simulador
- Claude Code como cerebro
Usar Claude Code como cerebro me ahorró escribir una UI, un backend o código de orquestación. El bridge es un servidor MCP registrado en el .mcp.json del proyecto, así que cualquier sesión de Claude Code abierta en el repo tiene herramientas como walk_to y get_state al lado de sus herramientas normales de archivos. Escribo lo que quiero en la terminal, y Claude llama a las herramientas del robot igual que normalmente llama a grep.
Las herramientas centrales son get_state, walk_to, turn y stop_everything. get_state transmite pose, batería, postura y fallas en vivo desde el simulador a unos 100 Hz. walk_to corre un loop de control de velocidad hacia una coordenada del mundo, con distancia mínima de frenado para que el robot no se estampe contra las cosas. stop_everything cancela todas las tareas en curso y pone la velocidad en cero. El resto de las veinte herramientas cubre las posturas y gestos que trae el G1, como sentarse, agacharse, saludar, dar la mano y abrazar.
Funciona de punta a punta. El robot camina uno o dos metros por comando, gira 90° o 180° a pedido, y reporta su posición todo el tiempo.
También está lleno de las rarezas que hacen divertida a la robótica. La política de caminata del simulador es tan conservadora que la velocidad efectiva es del 10 al 15% de lo que comandás. El multicast de DDS no funciona bien en macOS, así que el bridge escribe a mano una config unicast.
Se lo puede ver razonando sobre la diferencia entre lo que pidió y lo que consiguió: “moved 0.74 m of the 1 m target before reaching stop_distance”, y en el giro, “total 177° — within 3° of the 180° target, finished cleanly.”
Qué aprendí
MCP resulta ser una buena interfaz para robótica. Las habilidades son solo herramientas con esquemas JSON, y el modelo nunca necesita saber que existen los topics de DDS o los modos del firmware. Como un modelo de frontera manejó desde el día uno, pude probar toda la interfaz de habilidades en horas en vez de semanas.
Lo que sigue
Usar Claude Code como conductor fue solo una forma de arrancar. El flujo de control vive adentro de una herramienta de código en mi laptop, y nadie más puede usarlo. El próximo paso es sacar el agente a un backend propio con una interfaz de verdad. Eso es la parte 2.
Todo el proyecto es open source: github.com/mercho40/C3PO.