Un SO-101 tient une balle de ping-pong en équilibre en la voyant seulement par sa caméra de poignet
- Constructeur: zecice
Un SO-101 tient une raquette de tennis de table dans sa pince et garde une balle de ping-pong en équilibre dessus. La caméra de poignet est son seul capteur pour la balle ; tout le reste vient des mesures articulaires du bras lui-même. Le contrôleur a été entraîné dans MuJoCo et tourne sans modification sur le vrai bras, comme le montre l'auteur dans un court clip sur X : une main pousse la balle vers le bord de la raquette et le bras la ramène au centre.
Comment ça marche
La chaîne de traitement du dépôt compte quatre étapes. Les images de la caméra de poignet (640x480, réduites à 128x96) passent par un détecteur à seuil de couleur qui trouve la balle orange. Un petit estimateur MLP, entraîné en simulation, transforme les 3 dernières détections en position de la balle sur la raquette. La vitesse est une différence finie filtrée de ces positions. Un contrôleur entraîné par apprentissage par renforcement (PPO) produit ensuite 5 variations de position articulaire à 30 Hz. La raquette est serrée de chant face à la caméra, si bien que la caméra la voit de côté et voit la balle près d'une seule colonne de l'image.
Ce qui a fait réussir le passage de la simulation au réel
La leçon sim-to-real de l'auteur : entraîner le contrôleur avec les défauts du système réel dès le départ, une forme de randomisation de domaine :
- Latence de commande tirée au hasard entre 0 et 4 images (0 à 133 ms), avec les 3 dernières actions dans l'observation. - Gains de servo souples et aléatoires, parce que les servos bon marché s'affaissent et traînent. - Un état de balle bruité comme la sortie de l'estimateur, dont la vitesse est calculée par le même filtre de différences finies que celui du robot. Un contrôleur entraîné sur la vitesse exacte a complètement échoué avec la vitesse tirée de la caméra.
Ce qui n'a pas marché est aussi consigné : une politique CNN de bout en bout sur les images du poignet, entraînée par clonage de comportement et DAgger à partir du contrôleur PPO, allait bien en simulation mais voyait à peine la vraie balle. Le simple détecteur de couleur et le petit estimateur l'ont remplacée.
Sur le vrai bras
Le matériel : un bras suiveur SO-101, une caméra de poignet, une raquette standard serrée dans la pince et une balle orange. Le bras passe par les pilotes SO-101 follower et Feetech de LeRobot. Le README liste ce qui a compté sur le vrai bras :
- Gain P des servos à 32 au lieu de la valeur par défaut de LeRobot, 16, avec laquelle le bras s'affaisse et ignore les commandes de 4 à 7 degrés. Le script d'exécution le règle. - Une pose de repos de niveau : quelques degrés d'inclinaison et la balle s'échappe, car la politique n'a pas d'action intégrale. Chaque bras enregistre sa propre pose de repos avec un script guide fourni. - Serrer la raquette selon la charge (environ 10%) et ne jamais commander la fermeture complète de la pince : un blocage déclenche la protection contre les surcharges de Feetech et le moteur disparaît du bus jusqu'à une coupure de l'alimentation. - Mesurer sa propre latence avec le script fourni ; le contrôleur est entraîné pour 0 à 4 pas supplémentaires de 33 ms.
Le README prévient aussi que le bras bouge tout seul et reste alimenté après la fin des scripts.
Résultats et ce qui est publié
L'auteur indique 97.5% d'épisodes tenus en équilibre pendant 10 secondes en simulation randomisée, 113 sur 120 en simulation avec toute la chaîne caméra, et que le bras réel tient la balle. Les poids entraînés du contrôleur et de l'estimateur sont dans le dépôt, si bien que toute la chaîne peut être essayée dans le simulateur sans bras. L'entraînement du contrôleur a demandé environ 29 millions de pas et environ 2 heures sur un portable (6 cœurs CPU pour la simulation, un GPU RTX A1000 pour le réseau). Il a été développé sous Linux ; macOS et Windows ne sont pas testés.
Le code et les poids sont sous MIT. Les fichiers du modèle SO-101 viennent du dépôt SO-ARM100 de TheRobotStudio sous Apache-2.0, et le maillage de la raquette d'un projet de commande pour le tennis de table sous MIT.
Détails
- 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
Photos et vidéos
- 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.
Liens
- Constructeur: https://github.com/zecice