状態:ドラフト(2026-10-18)、実測。画面および文章中の数値はすべてシミュレータ内の値であり、カメラの周期・遅延・ノイズは仮定値です。本記事のロボットは学習を行っていない古典的プランナーで動作します。 評価は第7回と同じ評価用ボール500個(seed 0)を使用し、同じ3つの条件(真の状態、120 Hz・遅延30 ms、120 Hz・遅延100 ms)で実施しました。括弧内は95%信頼区間の半幅です。 ロボットモデルはMuJoCo Menagerieの
unitree_g1(Unitree公式g1_29dof_rev_1_0、BSD-3-Clause)であり、オリジナルファイルは変更していません。関節速度の制限値はモデルに含まれていないため、Unitree公式のURDF値を使用しました。 動画は2026-10-18にホームラボのKubernetesのミニPCノード1台上で一時Podとしてレンダリングしました(CPUのみ、最大メモリ1.55 GiB)。環境はMuJoCo 3.16.0、Python 3.12.15、numpy 2.5.4、Mesa 25.0.7(OSMesa)であり、エンコーディングはffmpeg 9.0.2(libx264)です。
目次
- 1. なぜ人型なのか
- 2. 動画で確認する
- 3. ロボットとプランナー
- 4. 結果:評価用ボール500個
- 5. 左右の軸はどの程度の速さが必要か
- 6. ラケットはどのくらいの速さで振ることができるか
- 7. GPUでの高速実行
- 8. 次のステップ:学習、そしてロボット同士の対戦
- 未計測と制限
1. なぜ人型なのか
第5回から第9回までのロボットは、テーブルの端に取り付けられたガントリー2軸と手首2軸でした。ボールを受け返す上では最もシンプルな形です。しかし、本実験室の次の目標は ロボット同士を対戦させてより強いロボットを育成することであり、その対戦が人間の卓球に似たものになるためには、ロボットも人間のような外見を持つ必要があります。
そのため、広く使われている人型ロボットUnitree G1の上半身を選びました。脚部の代わりに左右にスライドする1つの軸を取り付けています。これは卓球選手がサイドステップでボールに追いつく動きの代わりとなる軸です。
さらに条件を1つ追加しました。 ロボットは人間よりも速く動いてはならない ということです。ロボットの関節は人間よりも何倍も速く動くことができますが、その速度で勝利したロボットは「人間のようにプレイするロボット」とは言えません。関節の角速度、左右の移動速度と加速度、ラケットの速度に文献に示された人間の上限値を適用し、ロボットの限界値と人間の限界値のうち小さい方を使用しました。
2. 動画で確認する
2.1 ボール1つを斜め後方から
相手コートのベースラインから飛んできたボールに対し、ロボットが左右の軸で0.37 m移動し、0.789 sで打ち返しました。打球瞬間のラケット速度は1.27 m/sです。オレンジ色の点はボールが通過した軌跡です。胴体がボールを追うように回転し、肘と手首によってラケット面が作られている様子が確認できます。
2.2 同じボールを上方から
上方から見ると、ロボットがボールの飛来予測位置にあらかじめ移動している様子がよくわかります。この「事前移動」が本記事において最も大きな違いを生み出した動作です(セクション4)。
2.3 異なる4つのボール
左右の軸が右側(+)に大きく移動したボール、左側(-)に0.82 m移動したボール、中央のボール、ショートバウンドしたボールを順番につなぎました。4つのボールすべてレシーブに成功しました。ボールは最初の80個のうち成功したボールの中から左右軸の移動が大きい順に選択されており、選択ルールと結果はレンダリングスクリプトによってファイルに出力されます。
3. ロボットとプランナー
| 項目 | 値 |
|---|---|
| 腕 | 7軸(肩3、肘1、手首3) |
| 腰 | 3軸(yaw、roll、pitch) |
| 左右軸 | 移動範囲±0.9 m、速度1.5 m/s、加速度10 m/s² |
| 骨盤の位置 | ベースライン後方48 cm(28~68 cmの範囲を走査して選定、差分は標本誤差の範囲内) |
| 質量 | モデル33.3 kg(公式仕様約35 kg) |
| プランナー | 第7回「ハイブリッド公称」と同等の構造:ボール予測 → 打球時刻・位置・面・速度の決定 → 逆運動学 → 関節軌道、学習なし |
プランナーはガントリーと同様のボール予測と打球決定を使用し、最後のステップのみG1の11個の関節(左右軸を含む)に対する逆運動学に変更しました。再計画時は前回の姿勢から開始するように設定したところ、学習用ボールにおける真の状態の成功率が88.5%から94.0%に向上しました。
3.1 人間の限界
| 関節 | ロボットの限界(URDF, rad/s) | 人間の上限(rad/s) |
|---|---|---|
| 腰 yaw | 32 | 10.1 |
| 腰 roll・pitch | 37 | 10.1(胴体回転値を代用、推定) |
| 肩 pitch / roll / yaw | 37 | 13.8 / 4.8 / 16.7 |
| 肘 | 37 | 5.7 |
| 手首 roll / pitch / yaw | 37 / 22 / 22 | 18.3 / 9.3 / 3.9 |
- 左右移動の上限は2.2 m/s、加速度の上限は10 m/s²です。 健常な卓球選手のサイドステップの測定データは見つからなかったため、速度はパラ卓球代表選手の重心の左右速度範囲(双方向4.35 m/s)の半分と推定し、加速度はテニスの測定データを流用しました。
- ラケット速度の上限は19.6 m/sです。 評価を通じて一度も制限にかかりませんでした。関節の上限値だけでもラケットは人間の最高速度を下回ります。
- 上限値と出典は1つの設定ファイルに集約しました。制限によってカットされた割合は学習ログに別途集計されます。
4. 結果:評価用ボール500個
| 構成 | 真の状態 | 120 Hz・30 ms | 120 Hz・100 ms |
|---|---|---|---|
| 腕7軸・腰を使用・左右軸(デフォルト) | 91.4% (±2.5) | 72.0% (±3.9) | 27.4% (±3.9) |
| 同構成、人間の制限なし | 92.4% | 74.4% | 27.2% |
| 腕7軸・腰を固定・左右軸 | 83.8% | 67.8% | 26.6% |
| 腕5軸・腰を使用・左右軸 | 83.4% | 70.2% | 25.6% |
| 腕7軸・腰を使用・ 左右軸なし | 66.4% | 60.4% | 26.6% |
| 腕5軸・腰を固定・左右軸なし | 40.4% | 31.6% | 12.8% |
| ガントリー古典基準ライン(第5回) | 61.6% | 59.2% | 26.6% |
| ガントリーハイブリッド公称(第7回、計画構造が同一) | 83.2% | 80.6% | 53.6% |
| ガントリー学習済みハイブリッド(第7回、3シード) | 84.8% | 83.8% | 58.2% |
3つの特徴が確認できます。
- 左右の軸が最も大きな違いを生み出します。 左右軸を除外すると、真の状態における「届かないボール」が4.6%から23.8%に増加し、成功率が91.4%から66.4%に低下します。腕がどれほど長くても、テーブルの幅1.525 mをその場で完全にカバーすることはできません。人間がサイドステップを行う理由と同じです。
- 人間の制限によるコストは予想よりも小さいです。 同じボールを制限の前後でペアにして比較すると、デフォルト構成で見逃したボールは2.0~8.2%です。腰を固定すると7.6~14.4%へと増加します。腕だけ素早くスイングする必要が生じるためです。
- 遅延が大きい場合、ガントリーよりも劣ります。 遅延100 msの場合、デフォルト構成は27.4%となり、同構造のガントリー(53.6%)の半分にとどまります。ボール500個のうち45.4%が「タイミング・予測」により失敗しました(失敗全体の63%)。重い胴体と左右軸が、遅延した計画の修正に追いついていません。学習によって最初に対処すべき箇所です。
4.1 失敗の原因別内訳
デフォルト構成、人間の制限を適用、500個に対する割合です。1つのボールにつき1つの原因のみカウントします。
| 条件 | 届かない | 関節の制限(ロボット) | 関節の制限(人間) | 姿勢(面の向き) | タイミング・予測 | 失敗合計 |
|---|---|---|---|---|---|---|
| 真の状態 | 4.6% | 0.4% | 2.4% | 0.0% | 1.2% | 8.6% |
| 120 Hz・30 ms | 4.0% | 1.2% | 10.6% | 0.0% | 12.2% | 28.0% |
| 120 Hz・100 ms | 10.6% | 1.4% | 15.2% | 0.0% | 45.4% | 72.6% |
カメラ遅延30 msで発生した失敗の38%は「人間の関節の制限への抵触」でした。遅れて把握したボールに追いつくために、人間よりも速く動く必要があるケースです。人間の選手もこのようなボールは取り逃します。
5. 左右の軸はどの程度の速さが必要か
| 左右軸の速度・加速度 | 真の状態の成功率 |
|---|---|
| 1.0 m/s | 88.6% |
| 1.5–3.0 m/s | 91.4–92.4% |
| 3 m/s · 40 m/s² | 68.4% |
速ければ良いというわけではありませんでした。加速度が40 m/s²(約4 g)に達すると胴体が大きく揺さぶられ、腕の関節トルクがその反動に耐えきれなくなります(トルク飽和が制御周期の35%)。人間の範囲内(速度2.2 m/s以下、加速度10 m/s²以下)である1.5–2.0 m/s · 10 m/s²が最も良好な領域に含まれました。
軸が移動させる質量は、G1全体とラケット・台座(仮定5 kg)を合わせた38.5 kgです。10 m/s²で動かすには計算上385 Nが必要であり、シミュレータでの計測値は95%点で468 N、最大で520 Nでした。脚部を取り外し上半身のみにすると質量は24.1 kgになり、必要な力は約3分の2に減少します。
6. ラケットはどのくらいの速さで振ることができるか
関節速度の制限のみで計算した最大ラケット速度(計画された打球姿勢、面の法線方向)です。トルクによってその速度まで加速する時間は考慮していない上限値です。
| 構成 | ロボットの制限 | 人間の制限 |
|---|---|---|
| デフォルト構成 | 中央 38.8 m/s | 中央 9.6 m/s(5–95%: 5.5–18.9) |
| 腕5軸・腰固定 | — | 中央 2.4–3.4 m/s |
ボールを返すために必要な1.5–4 m/sは、デフォルト構成であればほぼすべての姿勢で出すことができます。スマッシュに必要な5–7 m/sは、人間の制限下では「腕7軸・腰を使用」の構成でのみ大半の姿勢で実現可能です。ただし、現在のプランナーが打球した瞬間のラケット速度は中央値で1.06 m/sです。ボールをブロックするように当てて返すレベルです。強打することは今後の学習の課題となります。
7. GPUでの高速実行
学習には無数のボールを同時に処理する必要があるため、MuJoCo Warp(GPU)環境でも同じシーンを実行しました。CPU版MuJoCoと比較して0.5 s分の動作を確認したところ、ロボットが大きく動く状況であってもボールの位置の差は中央値で5 µm、関節の差は最大で1.1×10⁻⁵ radでした。
| 同時実行ワールド数 | 1秒あたりの物理ステップ数(RTX 4060) |
|---|---|
| 256 | 63万 |
| 1,024 | 133万 |
| 4,096 | 166万 |
| 8,192 | 167万 |
ガントリー(657万)の約4分の1です。関節が多く、胴体が重いため接触計算が増加するためです。1回のみの計測値であるため、ブレの有無は確認していません。
8. 次のステップ:学習、そしてロボット同士の対戦
- 学習。 第7弾と同様のハイブリッド強化学習環境をG1に合わせて用意しました。観測は68、行動は8(ガントリーの6軸に左右軸の目標位置と到着時刻を加えたもの)です。学習はKubernetesの学習ジョブ(Kubeflow TrainJob)で実行する予定であり、遅延テストがGPUの空きを待っています。
- ロボット同士の対戦。 環境にサイド(side)パラメータを追加し、卓球台の両側にロボットを配置できるようにしました。試合のスコアとルールは、TT Labのスコアボードが使用する審判エンジンをそのまま利用する計画です。自己対戦によって強くなったロボットが固定評価ボールに対しても強いかを合わせて測定し、「対戦でのみ強い」過学習を見極めます。
未実測と限界
- 学習したポリシーの結果はまだありません。本記事の成功率はすべて学習なしのプランナーの値です。
- モーターのトルク-速度曲線を入れていません。第6節のラケット速度は上限です。
- 人間の関節の角加速度、健常な卓球選手のサイドステップの速度、卓球の反応時間が見つからなかったため、入れなかったり他の競技の値を利用したりしました。
- 骨盤を空間に固定しました。立ってバランスを取る問題は扱っていません。
- プランナーのペナルティの重みは評価ボールの手前100個を見て決定したため、若干の選択バイアスがある可能性があります。