SO-101 が手首カメラだけでボールを見て、ピンポン球をラケットの上でバランスさせる
- 製作者: zecice
SO-101 がグリッパーで卓球のラケットを握り、その上でピンポン球のバランスを保ちます。ボールを捉えるセンサーは手首カメラだけで、それ以外はすべてアーム自身の関節の読み取り値です。コントローラーは MuJoCo で学習され、そのまま実機のアームで動きます。作者は X に投稿した短い動画 でそれを示しています。手がボールをラケットの縁へ押しやると、アームがボールを中央へ戻します。
仕組み
リポジトリ のパイプラインは 4 段階です。手首カメラの画像(640x480 を 128x96 に縮小)は色のしきい値で判定する検出器に送られ、オレンジのボールを見つけます。シミュレーションで学習した小さな MLP 推定器が、直近 3 回の検出結果からラケット上のボールの位置を求めます。速度はその位置をフィルタ付きの有限差分で求めたものです。最後に、強化学習(PPO)で学習したコントローラーが 30 Hz で 5 つの関節位置の変化量を出力します。ラケットはカメラに対して縁を向けて固定されているので、カメラはラケットを横から見ることになり、ボールは画像のある一列の近くに映ります。
シミュレーションから実機への移行を成功させたもの
作者の Sim2Real の教訓は、最初から実システムの欠点ごとコントローラーを学習させることです。これはドメインランダム化の一つの形です。
- 制御遅延を 0 から 4 フレーム(0 から 133 ms)の範囲でランダムにし、直近 3 回の行動を観測に含める。 - 安価なサーボはたわみ、遅れるため、サーボのゲインを柔らかく、ランダムにする。 - コントローラーが見るボールの状態に推定器の出力と同じようなノイズを加え、その速度はロボットが使うのと同じ有限差分フィルタで計算する。正確な速度で学習したコントローラーは、カメラから求めた速度ではまったく機能しませんでした。
うまくいかなかったことも書かれています。手首画像を入力とするエンドツーエンドの CNN 方策を、PPO コントローラーから行動クローニングと DAgger で学習させたものは、シミュレーションでは問題なかったものの、実際のボールはほとんど見えていませんでした。単純な色検出器と小さな推定器がそれに取って代わりました。
実機のアームで
ハードウェアは SO-101 フォロワーアーム、手首カメラ、グリッパーに挟んだ普通のラケット、そしてオレンジのボールです。アームは LeRobot の SO-101 follower と Feetech のドライバーで動きます。README には実機で効いた点が挙げられています。
- サーボの P ゲインは LeRobot の既定値 16 ではなく 32 にする。16 ではアームがたわみ、4 から 7 度の指令を無視する。実行スクリプトがこれを設定する。 - ホーム姿勢を水平にする。数度傾くだけでボールは転がり落ちる。方策に積分動作がないためだ。各アームは同梱のガイドスクリプトで自分のホーム姿勢を記録する。 - ラケットは負荷(約 10%)で締め付け、グリッパーを完全に閉じる指令は決して出さない。ストールすると Feetech の過負荷保護が働き、電源を入れ直すまでモーターがバスから外れる。 - 同梱のスクリプトで自分の環境の遅延を測る。コントローラーは 0 から 4 ステップ(1 ステップ 33 ms)の追加遅延を想定して学習している。
README は、アームが自律的に動き、スクリプト終了後も通電したままであることも注意しています。
結果と公開されているもの
作者の報告では、ランダム化したシミュレーションでエピソードの 97.5% が 10 秒間バランスを保ち、カメラのパイプライン全体を通したシミュレーションでは 120 回中 113 回、そして実機でもバランスを保てています。学習済みのコントローラーと推定器の重みはリポジトリにあるため、アームがなくてもシミュレーターでパイプライン全体を試せます。コントローラーの学習は約 2900 万(29M)ステップ、ノート PC で約 2 時間かかりました(シミュレーションに CPU 6 コア、ネットワークに RTX A1000 GPU)。開発は Linux で行われ、macOS と Windows は未検証です。
コードと重みは MIT ライセンスです。SO-101 のモデルファイルは TheRobotStudio の SO-ARM100 リポジトリ に由来し Apache-2.0、ラケットのメッシュは卓球制御のプロジェクトに由来し MIT です。
詳細
- 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
写真と動画
- 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.
リンク
- 製作者: https://github.com/zecice