Open Source Robotics

Una colección curada de proyectos, herramientas y software de robótica de código abierto de alta calidad.

Un SO-101 equilibra una pelota de ping-pong viéndola solo con la cámara de muñeca

SO-101 Open Robot Arm

  • Constructor: zecice

Un SO-101 sostiene una pala de tenis de mesa en su pinza y mantiene una pelota de ping-pong en equilibrio sobre ella. La cámara de muñeca es su único sensor para la pelota; todo lo demás sale de las lecturas de las propias articulaciones del brazo. El controlador se entrenó en MuJoCo y funciona sin cambios en el brazo real, como muestra el autor en un clip corto en X: una mano empuja la pelota hacia el borde de la pala y el brazo la devuelve al centro.

Cómo funciona

La cadena de procesamiento del repositorio tiene cuatro etapas. Las imágenes de la cámara de muñeca (640x480, reducidas a 128x96) pasan a un detector por umbral de color que encuentra la pelota naranja. Un pequeño estimador MLP, entrenado en simulación, convierte las 3 últimas detecciones en la posición de la pelota sobre la pala. La velocidad es una diferencia finita filtrada de esas posiciones. Después, un controlador entrenado con aprendizaje por refuerzo (PPO) emite 5 cambios de posición articular a 30 Hz. La pala está sujeta de canto respecto a la cámara, de modo que la cámara la ve de lado y ve la pelota cerca de una sola columna de la imagen.

Qué hizo funcionar el salto desde la simulación

La lección sim-to-real del autor es entrenar el controlador con los defectos del sistema real desde el principio, una forma de aleatorización de dominio:

- Latencia de control aleatoria entre 0 y 4 fotogramas (0 a 133 ms), con las 3 últimas acciones en la observación. - Ganancias de servo blandas y aleatorias, porque los servos baratos ceden y se retrasan. - Un estado de la pelota con ruido como la salida del estimador, con su velocidad calculada por el mismo filtro de diferencias finitas que usa el robot. Un controlador entrenado con la velocidad exacta fracasó por completo con la velocidad derivada de la cámara.

También queda escrito lo que no funcionó: una política CNN de extremo a extremo sobre imágenes de la muñeca, entrenada por clonación de comportamiento y DAgger a partir del controlador PPO, iba bien en simulación pero apenas veía la pelota real. El sencillo detector de color y el pequeño estimador la sustituyeron.

En el brazo real

El hardware es un brazo seguidor SO-101, una cámara de muñeca, una pala estándar sujeta en la pinza y una pelota naranja. El brazo funciona con los controladores SO-101 follower y Feetech de LeRobot. El README enumera lo que importó en el brazo real:

- Ganancia P de los servos en 32 en lugar del valor por defecto de LeRobot, 16, con el que el brazo cede e ignora órdenes de 4 a 7 grados. El script de ejecución la fija. - Una pose de reposo nivelada: con unos pocos grados de inclinación la pelota se escapa, porque la política no tiene acción integral. Cada brazo registra su propia pose de reposo con un script guía incluido. - Apretar la pala por carga (alrededor del 10%) y no ordenar nunca el cierre total de la pinza: un bloqueo dispara la protección de sobrecarga de Feetech y el motor se cae del bus hasta que se corta y se restablece la alimentación. - Medir la latencia propia con el script incluido; el controlador está entrenado para 0 a 4 pasos extra de 33 ms.

El README advierte además de que el brazo se mueve solo y sigue alimentado cuando los scripts terminan.

Resultados y qué se publica

El autor informa de un 97.5% de episodios equilibrados durante 10 segundos en simulación aleatorizada, 113 de 120 en simulación con la cadena completa de la cámara, y de que equilibra en el brazo real. Los pesos entrenados del controlador y del estimador están en el repositorio, así que toda la cadena se puede probar en el simulador sin brazo. Entrenar el controlador llevó unos 29 millones de pasos y unas 2 horas en un portátil (6 núcleos de CPU para la simulación, una GPU RTX A1000 para la red). Se desarrolló en Linux; macOS y Windows no están probados.

El código y los pesos son MIT. Los archivos del modelo del SO-101 proceden del repositorio SO-ARM100 de TheRobotStudio bajo Apache-2.0, y la malla de la pala de un proyecto de control de tenis de mesa bajo MIT.

Detalles

  • arm: SO-101 follower
  • task: Balancing a ping-pong ball on a table-tennis paddle held in the gripper
  • posted: 5 November 2026 (video), repository opened 8 November 2026
  • licence: MIT (code and weights); SO-101 model files Apache-2.0; paddle mesh MIT
  • sensing: Wrist camera only for the ball, plus the arm's joint readings
  • weights: Controller and estimator released in the repository
  • training: MuJoCo with randomised latency (0-133 ms), soft servos and noisy ball state
  • framework: LeRobot (SO-101 follower, Feetech drivers), MuJoCo 3.17
  • controller: PPO policy, 5 joint-position changes at 30 Hz
  • difficulty: Advanced
  • perception: Colour-threshold detector and a small MLP estimator trained in simulation

Fotos y vídeos

  • zecice/so101-pingpong-balance: The simulation, PPO training, detector and estimator, real-arm loop and pretrained weights, with a README covering what made sim-to-real work and what mattered on the real arm.
  • The real arm balancing the ball: The builder's clip of the SO-101 keeping the ball on the paddle while a hand pushes it towards the edge.

Enlaces

  • Constructor: https://github.com/zecice

Este sitio web requiere JavaScript. Por favor, habilite JavaScript para explorar nuestros proyectos de robótica.