状態:ドラフト(2026-10-18)、実測。カメラの周期・ノイズ・遅延と、ロボットの速度・力制限はいずれも仮定値です。 測定は2026-10-18に第2報と同じ一時ポッド(ミニPCノード Intel Core Ultra 9 185H、上限CPU 3コア・メモリ3 GiB、GPUなし、mujoco 3.16.0)で行いました。 物理時間間隔0.5 ms、ラケット接触 solref(−4e6、−34)(第2報セクション7で定めた値)です。ボールはDeepMindの公開初期状態から第2報と同じ500個のサンプル(seed 0)の前方100個を使用し、 遅延100 msと30 Hzの条件は時間的制約のため前方50個のみを実行しました。条件ごとに1回実行した値です。最初の3条件の300回に1,573 sがかかりました(プロセス3つ)。 実データは作業ディレクトリ
tt-robot/out/(F1の表3つと回ごとの実データJSON)とtt-robot/logs/にあります。
目次
- 1. 直観:強化学習が越えなければならない底
- 2. ロボット:ガントリー2軸 + 手首2軸
- 3. パイプライン:段階ごとに1つの関数
- 4. 結果
- 5. 何が失敗を分けるのか
- 6. 制限事項
- 7. 次回予告
- 参考文献
1. 直観:強化学習が越えなければならない底
強化学習で卓球ロボットを学習させるとする場合、「上手い」の基準が先になければなりません。この記事の基準線は、人間が手動で記述した古典制御です。 ボールを見て、飛行軌道を物理式で予測し、打つ位置とラケット角度を計算して腕をその位置に送ります。学習は一切ありません。 この基準線が何個返し、そして どこで 失敗するのかを知ってこそ、強化学習が何を削減したのかを語ることができます。
2. ロボット:ガントリー2軸 + 手首2軸
| 部分 | 値(すべて仮定値) |
|---|---|
| ガントリー | ロボット側の端線から38 cm後ろ(y = −1.75 m)の平面において、横方向 x ±0.9 m、高さ z −0.15–0.7 m |
| 手首 | yaw、pitchの2軸、±1.4 rad。ラケット面中心はpitch軸から0.15 m |
| 制限 | ガントリー 4 m/s、40 m/s²、力 400 N(横)·300 N(高さ)。手首 20·30 rad/s、400·600 rad/s²、20 N·m |
第3報のハードウェア計画における「レール2軸 + 手首2軸」(ステージ2・3)に該当する形状です。ガントリーには奥行き(y)軸がないため、ラケットが届くyとボールのyが交わる瞬間がそのまま打撃時刻となります。
3. パイプライン:段階ごとに1つの関数
- ボール状態推定。 カメラはボールの位置のみを見るものとし(120 Hz、ノイズ σ 3 mm、遅延 30 ms)、最小二乗法で位置・速度・回転を合わせます。回転は軌道の曲がりとしてのみ観測されるため、事前値側に引き寄せる項を設けます。
- 飛行予測。 重力、抗力、マグヌス力をRK4で解き、テーブルバウンドは力積モデルで処理します。係数は第2報で測定したシミュレータの値です。
- 打撃決定。 目標着地点(相手コート中央)へ送るための反射速度を射撃法で求め、鏡の法則と力積モデルでラケット法線とスイング速度を決定します。
- 逆運動学。 手首の2つの角度は法線から直接導出され、ガントリーは引き算1つです(以下のコード)。
- 関節軌跡。 現在の状態から打撃瞬間の(位置、速度、加速度0)までを5次多項式で接続します。pitchの打撃速度がそのままスイングになります。
- 関節制御。 計算トルク(PD + フィードフォワード)で追従し、力の制限でクリップします。
- 再計画。 バウンド前の0.2 sに一度計画し、バウンド後は50 msごとに新規観測で再調整して軌跡を継ぎ合わせます。
def ik(c, n, rb):
"""원하는 라켓 면 중심 c 와 법선 n → 관절 [x, z, yaw, pitch]."""
n = np.asarray(n, float) / np.linalg.norm(n)
th = math.asin(max(-1.0, min(1.0, n[2]))) # pitch
psi = math.atan2(-n[0], n[1]) # yaw
x = c[0] - rb.L * math.sin(th) * math.sin(psi) # 갠트리는 손목 오프셋을 빼면 끝
z = c[2] - rb.L * math.cos(th)
y_res = c[1] - (rb.y_g - rb.L * math.sin(th) * math.cos(psi)) # 0 이어야 닿는다
q = np.array([x, z, psi, th])
ok = bool(np.all(q >= np.array(rb.lo)) and np.all(q <= np.array(rb.hi)))
return q, y_res, ok
(TT Lab実験コード ttsim.py から抜粋し、ドキュメント文字列とコメントは省略しました。)
直交ガントリーは2つの軸がラケット位置にそのまま加算されるため、特異点、多重解、数値逆運動学が存在しません。6軸アームであれば同様の作業を数値最適化と特異点回避で解く必要があります。 pitchを回転させるとラケット面中心の速度が正確に面の法線方向になり、「どこに向かうか」(角度)と「どれほど強く打つか」(pitch速度)が綺麗に分離されます。
4. 結果
| 条件 | カメラ(周期・ノイズ・遅延、仮定値) | プラナーの物理係数 | ボール | 返球成功 | 当てたが失敗 | 不的中 | 計画失敗 |
|---|---|---|---|---|---|---|---|
| 真の状態 | 真の状態を直接既知 | シミュレータ実測値 | 100 | 62% | 16 | 2 | 20 |
| 120 Hz·遅延 30 ms | 120 Hz、3 mm、30 ms | シミュレータ実測値 | 100 | 60% | 8 | 9 | 23 |
| プラナーのみ文献係数 | 120 Hz、3 mm、30 ms | 文献(TT3D抗力・マグヌス、テーブル e 0.85·μ 0.3) | 100 | 48% | 11 | 11 | 30 |
| 120 Hz·遅延 100 ms | 120 Hz、3 mm、100 ms | シミュレータ実測値 | 50 | 26% | 4 | 17 | 16 |
| 30 Hz·遅延 100 ms | 30 Hz、10 mm、100 ms | シミュレータ実測値 | 50 | 2% | 0 | 17 | 32 |
「当てたが失敗」はテーブル外と自コートを合算した数値です。遅延100 ms条件の50個は、30 ms条件100個の前方50個と同一のボールであり、その50個における30 ms条件の成功率も60%でした。
| 条件 | 打撃時刻誤差の中央値 | 打撃時刻のボール予測誤差の中央値 | ラケット追従誤差の中央値 | 成功したボールの着地誤差の中央値 |
|---|---|---|---|---|
| 真の状態 | 1.6 ms | 1.9 cm | 0.08 cm | 21.3 cm |
| 120 Hz·遅延 30 ms | 2.3 ms | 3.8 cm | 0.07 cm | 18.5 cm |
| プラナーのみ文献係数 | 2.0 ms | 3.3 cm | 0.06 cm | 12.4 cm |
| 120 Hz·遅延 100 ms | 2.2 ms | 9.7 cm | 0.07 cm | 21.0 cm |
| 30 Hz·遅延 100 ms | 2.2 ms | 34.6 cm | 0.05 cm | 12.4 cm(1個) |
5. 何が失敗を分けるのか
- 制御はボトルネックではありません。 ラケット追従誤差の中央値は0.05–0.08 cm、打撃時刻誤差は2 ms前後でした。トルクが制限に達した回は真の状態と30 ms条件でそれぞれ2回のみであり、 5次軌跡が速度・加速度制限を超えた計画は100個中0–6個で、すべてガントリー軸でした。
- 最大の失敗は作業空間です(計画失敗20–30%)。 「関節制限外」が12–19件、「ラケットが届くyにボールが来ない」が6–10件でした。 端線から38 cm後ろに固定された平面では、短いボールや低いボールを受け取ることはできません。計画に成功したボールのみを見ると、返球率は真の状態77.5%、30 ms条件77.9%、文献係数68.6%です。 第3報が2ステージ軸で奥行き(y)を先に見ようと提案した根拠と同じ方向性です。
- カメラはノイズよりも遅延がはるかに大きいです。 120 Hzで遅延のみを30 msから100 msに増加させると60%が26%になり、打撃時刻のボール予測誤差の中央値が3.8 cmから9.7 cmに拡大しました。 30 Hz・100 ms(現在使用しているスコアボード用カメラ並みと仮定した値)では2%でした。この実験は計画時刻を0.2 sに固定しているため、30 Hzに合わせて観測をさらに待つ戦略をとれば多少向上する可能性があります(推定)。 第3報の「カメラの遅延を削減するためにお金をかける方が、モーターを強化するよりも安い」という計算と同じ結論です。
- 係数が不正確だと12%p低下します。 シミュレータがDeepMindの値であるときにプラナーのみを文献係数に変更すると60%が48%になり、自コートに落としたボールが2個から9個に増加しました。 第2報で見られたマグヌス力の強さの差(4.2倍)がそのまま打撃失敗につながったものです。実際のロボットでも、我々のカメラ軌道で係数を合わせることが成功率に直接関わってきます。
- 真の状態を把握していても62%です。 残る失敗は、プラナーの力積モデルとMuJoCo接触の差異(そのため真の状態でも予測誤差が1.9 cm、「当てたがテーブル外」が16件)と作業空間です。 強化学習が勝てる領域はこの「モデルの差異」にあると考えます(推定)。解析モデルの代わりにシミュレータ自体から学習するためです。
6. 制限事項
- カメラの周期・ノイズ・遅延と、ロボットの速度・力制限は仮定値です。我々のカメラの実測遅延分布はまだ測定していません(未確認)。
- ボールは条件ごとに50–100個であり、1回ずつ実行しました。成功率の信頼区間を語るにはサンプルが少ないです。
- ラケットは摩擦を持つボックスであり、この設定で測定された有効摩擦は45°入射で0.047でした。回転をかける能力がほとんどなく、狙い撃ちや回転返球は扱っていません。
- 回ごとの軌跡(ボールとラケットの各ステップの位置)を保存していないため、成功したボールと遅延によって逃したボールを並べて動かす図版は今回作成できませんでした。次回の測定では軌跡を一緒に残します。
7. 次回予告
次回は、同一のボールサンプル、同一のカメラ仮定、同一のロボット制限のもとで、強化学習の2つのアプローチ(打撃パラメータのみを学習するハイブリッド、関節目標を直接出力する方式)をこの基準線と並置します(第7報)。その前に、 第6報でDeepMindロボットの限界を原文で読み解き、回転の問題をシミュレータで検証してみます。 失敗理由別の件数も合わせて残し、強化学習がどの失敗を削減したのかが分かるようにします。
ティティの一言: アームは0.7 mmの誤差で正確に動いたのに、10個中4個を逃してしまいました。アームではなく位置(作業空間)と目(遅延)が問題でした。早く見る目を何とかしてください!
参考文献
すべてのリンクは2026-10-18にアクセスして開けることを確認しました。
- DeepMind, Achieving Human Level Competitive Robot Table Tennis(ICRA 2025): https://arxiv.org/abs/2408.03906
- 公開初期のボール状態: https://github.com/google-deepmind/competitive_robot_table_tennis(© 2025 Google LLC, CC BY 4.0. データは再配布せずシミュレーション結果のみを掲載しました。)
- TT3D: Table Tennis 3D Reconstruction(2025、プラナーの文献係数): https://arxiv.org/abs/2504.10035
- Sony AI, Physics Models for Sim-to-Real Transfer in Professional-Level Robot Table Tennis(2026、ラケット反発式の比較): https://arxiv.org/abs/2606.28805
- MuJoCo: https://github.com/google-deepmind/mujoco
- 引用コードはTT Labの実験コードです。