ステータス:下書き(2026-10-18)、実測。すべての成功率はシミュレーター内の値であり、カメラ周期・遅延・ノイズと回転ヒントの精度は仮定値です。 学習は2026-10-18にホームラボのKubernetesのGPUノード1台(ノートPC用RTX 4060が1枚)で一時Podとして行いました。Podのリソース上限はCPU 6コア・メモリ4 GiBであり、同一ノードの他のサービスとリソースを共有しました。 環境はMuJoCo 3.16.0、MuJoCo Warp(warp-lang 1.18.0)、Python 3.11、PPO(隠れ層256)です。物理条件は第2・5話と同様です(タイムステップ0.5 ms、ラケット剛性4e6)。 評価は学習用ボールと分離した評価用ボール500個(第5話の基準線と同じseed 0のサンプル)を使用し、ランダム化なしのDeepMindデフォルト物理で行いました。RLは3シードの中央値であり、括弧内はシードの最小〜最大です。基準線と名目プランナーは決定的であるため1回のみ実行しました。 生データ(学習ログ、評価結果、記録された軌道、Warpの比較)は作業ディレクトリ
measure/sim-tt-rl/にあります。
目次
1. 直感:何を学ばせるべきか
強化学習で卓球を教える方法には大きく分けて2つあります。1つ目は ロボットの関節を直接 動かす方法です。ポリシーが毎ステップ関節目標を出力し、ボールの打ち方を自力で見つけます。 もう1つは、 古典的制御が得意なことは任せ、判断のみを学習させる 方法です。逆運動学・軌道・関節制御はそのままにして、ポリシーは「いつ、どのような角度で、どれほど強く打つか」といった打撃パラメータのみを選択します。
「卓球ロボットアームの基礎」第13話(報酬と行動空間、 ../robot-arm-basics/13-reward-and-action-space.md)では振り子ラケットでこの2つを比較し、ハイブリッドは早く学習するものの予測器が回転を知らなければに行き詰まると示されました。
今回は第5話の実寸大ロボット(ガントリー2軸+手首2軸)と公開されたボールの分布において同じ問いを投げかけました。
2. 実験設計
| 方法 | ポリシーの出力 | 学習 |
|---|---|---|
| 古典的基準線 | なし(第5話のプランナー) | なし |
| ハイブリッド名目 | なし。打撃パラメータを安価な解析式で定め、関節限界を超える解は諦めず限界内にクリップして実行 | なし |
| RL (a) ハイブリッド | 決定ごとに法線yaw・pitchの補正、面速度、打撃時刻、ラケット中心x・zの補正。実行は解析的IK・5次軌道・PD | PPO、100万決定、CPU |
| RL (b) 関節直接 | 100 Hzで関節の目標位置・速度。PDと限界のみを通過 | PPO、2億5000万決定、GPU(MuJoCo Warp、4,096ワールド) |
- ロボットの限界。 第5話とは異なり、ハードウェアプランニング(第3話)の値を実際に強制しました。水平軸3 m/s・40 m/s²、高さ軸3 m/s・30 m/s²、手首20・30 rad/sです。
- ドメインランダム化(学習時のみ)。 テーブル反発係数0.80〜0.98、摩擦0.1〜0.3、抗力係数0.40〜0.55、カメラ遅延0〜60 ms、観測ノイズ0〜5 mm。マグナス効果は公開データの回転とペアであるため(第2話)DeepMindの値に固定しました。
- 回転種類のヒント。 第6話の結論をそのまま取り入れたバリエーションです。トップスピン・バックスピン・無回転のいずれかを通知し、その種類の平均回転を軌道追従の事前分布として使用します。評価ではヒントが 80%のみ正しいと仮定しました(学習時は70〜100%で変動)。
- 評価条件の3つ。 真の状態(ボールの状態を直接把握)、120 Hz・遅延30 ms、120 Hz・遅延100 ms(カメラノイズσ 3 mm)。すべて仮定値です。
3. 結果
| 方法 | 真の状態 | 120 Hz・30 ms | 120 Hz・100 ms |
|---|---|---|---|
| 古典的基準線 | 61.6% | 59.2% | 26.6% |
| ハイブリッド名目(学習なし) | 83.2% | 80.6% | 53.6% |
| RL (a) ハイブリッド | 84.8%(84.4–85.0) | 83.8%(82.8–83.8) | 58.2%(58.0–59.0) |
| 名目 + 回転ヒント(学習なし) | 83.2% | 80.6% | 66.6% |
| RL (a) + 回転ヒント | 84.2%(84.0–84.2) | 83.4%(83.0–83.4) | 68.6%(67.4–69.0) |
| RL (b) 関節直接(Warp) | 75.6%(75.2–76.0) | 76.2%(75.8–78.4) | 29.6%(12.8–38.6) |
| RL (b) 遅延0〜120 msで学習 | 74.4% | 73.4% | 52.0% |
| RL (b) ランダム化なしで学習 | 2.0% | 72.6% | 0.0% |
| RL (b) CPU版(30分学習) | 0.0% | 0.0% | 0.0% |
(遅延0〜120 ms学習、ランダム化なし、CPU版は1シードです。)
3.1 正直な読み取り:利得はどこから来たのか
- 基準線 → 名目:+21.4〜27.0%p、学習なし。 基準線は真の状態でボール115個をプランニング段階で諦めました(関節限界外74、ラケットが届く位置にボールが来ない37、予測上のバウンドなし4)。 名目プランナーは限界外の解をクリップしてでもスイングするためプランニングの失敗が0になり、その115個のうち36個を返球しました。「当てたがテーブル外」も68個から10個に減少しました。どちらもプランナーの違いによるものです。
- 名目 → RL (a):+1.6〜4.6%p。 学習が上乗せした純利得は小さいです。着地誤差の中央値は14.6 → 10.8 cm(真の状態)に縮小し、狙いは少し改善しました。
- 回転ヒント:遅延100 msで+10.4%p(58.2 → 68.6%)。 しかし、学習なしの名目 + ヒントも66.6%でした。この利得も学習ではなく、ヒントを軌道追従の事前分布として使用したことから生じています。遅延が短ければ(30 ms以下)ヒントの利得はありませんでした。
- 結論は第13話の振り子実験、および第6話の「回転種類のヒント + 軌道追従」の結果と同じ方向を向いています。 優れたプランナーと優れた予測(事前分布)が先であり、学習はその上での微調整でした。
3.2 関節を直接学習するRL
- 当てることは得意ですが狙いが弱いです。 真の状態で当てられなかったボールは40個とハイブリッド(64個)より少なかったものの、「当てたがテーブル外」が45個、「当てたが自分のコート」が37個とハイブリッド(10個、2個)よりはるかに多かったです。着地誤差の中央値も27.1 cmとハイブリッドの2倍を超えています。
- 遅延に弱いです。 学習時に遅延を0〜60 msで変動させたポリシーは100 msで29.6%まで低下し、シード間のばらつきも大きかったです(12.8〜38.6%)。遅延を0〜120 msに広げて学習させると100 msで52.0%になりました。学習時に見なかった遅延には耐えられません。
- ランダム化を外すと崩壊します。 ランダム化なしで学習したポリシーは学習条件(120 Hz・30 ms)では72.6%でしたが、真の状態では2.0%、100 msでは0.0%でした。観測が学習時と少しでも異なると機能しません。
3.3 同じボール、3つの方法
評価用ボール21番を120 Hz・30 ms条件で記録した軌道(5 ms間隔)で再描画しました。画像をクリックすると3倍速く再生されます。
基準線は0.2 sでプランニングを行おうとする関節限界外のため諦めてラケットを動きません。名目プランナーと学習後ハイブリッドは同じボールを相手コートに返球します。2つの軌道がほぼ同じであることが3.1節の話そのものです。
3.4 残された失敗
- ワークスペース。 学習後ハイブリッドが真の状態で当てられなかったボール64個は すべて 関節限界によって解がクリップされたケースでした。残された失敗は学習ではなく、ロボットのリーチ範囲の問題です。
- 低いボール。 打点におけるボールの高さが10 cm未満のボール43個は、どの方法でもほとんど返球できませんでした(基準線0%、名目9%、ハイブリッド12%)。第3話が2段階軸で奥行き(y)軸を先に見ようと提案した根拠がさらに1つ増えました。
- 遅延100 ms。 ハイブリッドでも失敗が3倍に増加しました。カメラ遅延を短縮することが依然として最大のレバーです(第3・5話と同じ結論)。
4. GPUが必要だった理由:MuJoCo Warp
関節直接RLはサンプルを大量に消費します。CPU版(プロセス6個)は30分間で1,750万決定を学習しましたが、成功率は0%にとどまりました。同じ環境をMuJoCo Warpに移行し、GPU 1枚で4,096ワールドを同時に実行しました。
| 実行 | 決定数 | 学習時間 | 物理ステップ/s(中央値) | 学習中の最後の成功率 |
|---|---|---|---|---|
| RL (a) ハイブリッド(CPU、3シード) | 100万 | 60.5〜145.6分 | 59,526–115,518 | 75.0–75.8% |
| RL (b) CPU版 | 1,750万 | 30.0分 | 214,169 | 0.0% |
| RL (b) Warp(3シード) | 2億5000万 | 41.5〜62.0分 | 1,833,179–2,393,369 | 63.5–65.5% |
| RL (b) Warp、遅延0〜120 ms | 2億5000万 | 39.3分 | 2,498,807 | 50.7% |
(物理ステップはdt 0.5 msのMuJoCoステップです。学習中の成功率はランダム化と探索ノイズが混ざった学習分布で測定した値であるため、第3節の評価値とは異なります。ハイブリッドの学習時間がシードごとに異なるのは、同一ノードの他の作業とCPUを共有したためです。)
Warpに移行しても同じ物理挙動であるかを事前に確認しました。
- 同じボール200個をCPUとWarpで飛ばし、1秒後の位置の差の中央値は0.003 cmでした。
- ラケット板の厚さ6・14 mm、ボールの速度10〜40 m/sのトンネリング試験において、Warp版は300回(厚さごとに150回)すべて貫通0回であり、反発係数もCPU版と小数点第4位まで一致しました。
- 同じポリシー入力でCPU環境とWarp環境を64回比較し、結果は64回すべて一致しました。
5. 実行中に起きたこと
学習Podは kubectl run --rm -i で起動しました。コンテナの終了時にPodが自動的に削除されるようにするためでした。しかし最初のPodは、約4時間後にアタッチ接続がTLSエラーで切断され、その瞬間に --rm が 学習中のPodを削除しました。
その後はコンテナが1分ごとに1行ずつ出力して接続を維持し、結果は10分ごとに外部に取り出しました。Podには最大実行時間(activeDeadlineSeconds)を設定し、最後の安全装置としました。同じノードで他のサービスが稼働しているため、メモリの上限を4 GiBとし、ノードの空きメモリを10分ごとに記録しました(記録した37回のうち5,099〜8,685 MBの余裕)。
6. 未実測
- 実機展開前。 すべての結果はシミュレーター内のものであり、実際のロボットで同じ順序(公称 > RL微調整)になるかはわかりません。
- 実際のカメラの遅延。 30 msと100 msは仮定です。我々のカメラの実際の遅延分布はまだ計測していません。
- 回転の種類分類の精度。 評価の80%は仮定です。ボール・音・姿勢から回転の種類を実際にどれくらい的中させられるかは計測していません。
- ラケットのラバーの実際の反発・摩擦、ロボットの制限値(速度・加速度・力)も仮定です。
- RL (b) の遅延0–120 msの学習、ランダム化なし、CPU版は1シードです。
7. 次回へ
次回は、低いボールと作業スペースを広げる奥行き軸をロボットモデルに追加し、同じ評価を再度実行することです。実際の映像で物理と審判を合わせる話は 第8回にあります。
TTの一言。 強化学習がベースラインを大きく上回って喜んでいましたが、ふたを開けてみるとその大部分は学習なしの新プランナーのおかげでした。「学習による取り分」と「設計変更による取り分」を分けて計測してこそ、真の実力が見えてきます!
参考文献
すべてのリンクは2026-10-18時点でのアクセスと閲覧を確認しています。
- MuJoCo: https://github.com/google-deepmind/mujoco, MuJoCo Warp: https://github.com/google-deepmind/mujoco_warp
- 公開初期のボールの状態: https://github.com/google-deepmind/competitive_robot_table_tennis(© 2025 Google LLC, CC BY 4.0. データの再配布は行わず、シミュレーション結果のみを掲載しています。)
- あわせて読みたい: 第5回 古典制御ベースライン, 第6回 DeepMind卓球ロボットの改善方向, 『卓球ロボットアームの基礎』第13回 報酬と行動空間(
../robot-arm-basics/13-reward-and-action-space.md) - 引用コードおよび図の軌跡はTT Lab実験コードの出力です。