Open Source Robotics

Una raccolta curata di progetti, strumenti e software di robotica open source di alta qualità per la comunità della robotica.

Un SO-101 tiene in equilibrio una pallina da ping-pong vedendola solo con la telecamera da polso

SO-101 Open Robot Arm

  • Costruttore: zecice

Un SO-101 regge una racchetta da tennistavolo nella pinza e tiene in equilibrio sopra di essa una pallina da ping-pong. La telecamera da polso è il suo unico sensore per la pallina; tutto il resto viene dalle letture dei giunti del braccio stesso. Il controller è stato addestrato in MuJoCo e gira senza modifiche sul braccio reale, come mostra l'autore in una breve clip su X: una mano spinge la pallina verso il bordo della racchetta e il braccio la riporta al centro.

Come funziona

La pipeline del repository ha quattro stadi. I fotogrammi della telecamera da polso (640x480, ridotti a 128x96) vanno a un rilevatore a soglia di colore che trova la pallina arancione. Un piccolo stimatore MLP, addestrato in simulazione, trasforma gli ultimi 3 rilevamenti nella posizione della pallina sulla racchetta. La velocità è una differenza finita filtrata di quelle posizioni. Un controller addestrato con l'apprendimento per rinforzo (PPO) produce poi 5 variazioni di posizione dei giunti a 30 Hz. La racchetta è bloccata di taglio rispetto alla telecamera, così la telecamera la vede di lato e vede la pallina vicino a una sola colonna dell'immagine.

Che cosa ha fatto funzionare il passaggio dalla simulazione

La lezione sim-to-real dell'autore è addestrare il controller con i difetti del sistema reale fin dall'inizio, una forma di domain randomization:

- Latenza di controllo casuale tra 0 e 4 fotogrammi (da 0 a 133 ms), con le ultime 3 azioni nell'osservazione. - Guadagni dei servo morbidi e casuali, perché i servo economici cedono e ritardano. - Uno stato della pallina rumoroso come l'uscita dello stimatore, con la velocità calcolata dallo stesso filtro a differenze finite usato dal robot. Un controller addestrato sulla velocità esatta ha fallito del tutto con la velocità ricavata dalla telecamera.

È annotato anche ciò che non ha funzionato: una policy CNN end-to-end sulle immagini del polso, addestrata con behavior cloning e DAgger a partire dal controller PPO, andava bene in simulazione ma vedeva a malapena la pallina reale. Il semplice rilevatore di colore e il piccolo stimatore l'hanno sostituita.

Sul braccio reale

L'hardware è un braccio follower SO-101, una telecamera da polso, una racchetta normale bloccata nella pinza e una pallina arancione. Il braccio funziona con i driver SO-101 follower e Feetech di LeRobot. Il README elenca ciò che ha contato sul braccio reale:

- Guadagno P dei servo a 32 invece del valore predefinito di LeRobot, 16, con cui il braccio cede e ignora comandi da 4 a 7 gradi. Lo script di esecuzione lo imposta. - Una posa di riposo in piano: pochi gradi di inclinazione e la pallina scivola via, perché la policy non ha azione integrale. Ogni braccio registra la propria posa di riposo con uno script guida incluso. - Stringere la racchetta in base al carico (circa il 10%) e non comandare mai la chiusura completa della pinza: uno stallo fa scattare la protezione da sovraccarico di Feetech e il motore sparisce dal bus finché non si spegne e riaccende l'alimentazione. - Misurare la propria latenza con lo script incluso; il controller è addestrato per un ritardo da 0 a 4 passi extra di 33 ms.

Il README avverte inoltre che il braccio si muove da solo e resta alimentato dopo la fine degli script.

Risultati e che cosa è rilasciato

L'autore riporta il 97.5% degli episodi in equilibrio per 10 secondi in simulazione randomizzata, 113 su 120 in simulazione con l'intera pipeline della telecamera, e che il braccio reale tiene la pallina. I pesi addestrati del controller e dello stimatore sono nel repository, quindi l'intera pipeline si può provare nel simulatore senza il braccio. L'addestramento del controller ha richiesto circa 29 milioni di passi e circa 2 ore su un portatile (6 core di CPU per la simulazione, una GPU RTX A1000 per la rete). È stato sviluppato su Linux; macOS e Windows non sono testati.

Il codice e i pesi sono MIT. I file del modello SO-101 vengono dal repository SO-ARM100 di TheRobotStudio sotto Apache-2.0, e la mesh della racchetta da un progetto di controllo per il tennistavolo sotto MIT.

Dettagli

  • 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

Foto e video

  • 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.

Link

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

Questo sito richiede JavaScript. Attiva JavaScript per esplorare i nostri progetti di robotica open source.