TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

卓球ロボットの古典制御基準線:見て、予測して、振ったら何個返せるか

状態:ドラフト(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軸

部分 値(すべて仮定値)
ガントリー ロボット側の端線から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つの関数

  1. ボール状態推定。 カメラはボールの位置のみを見るものとし(120 Hz、ノイズ σ 3 mm、遅延 30 ms)、最小二乗法で位置・速度・回転を合わせます。回転は軌道の曲がりとしてのみ観測されるため、事前値側に引き寄せる項を設けます。
  2. 飛行予測。 重力、抗力、マグヌス力をRK4で解き、テーブルバウンドは力積モデルで処理します。係数は第2報で測定したシミュレータの値です。
  3. 打撃決定。 目標着地点(相手コート中央)へ送るための反射速度を射撃法で求め、鏡の法則と力積モデルでラケット法線とスイング速度を決定します。
  4. 逆運動学。 手首の2つの角度は法線から直接導出され、ガントリーは引き算1つです(以下のコード)。
  5. 関節軌跡。 現在の状態から打撃瞬間の(位置、速度、加速度0)までを5次多項式で接続します。pitchの打撃速度がそのままスイングになります。
  6. 関節制御。 計算トルク(PD + フィードフォワード)で追従し、力の制限でクリップします。
  7. 再計画。 バウンド前の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%でした。

고전 제어 기준선: 공이 어디서 실패하나 공개 초기 상태 표본(앞의 셋 100개, 뒤의 둘 50개). 카메라 수치는 가정값. 참 상태를 안다 62% 120 Hz·지연 30 ms 60% 플래너만 문헌 계수 48% 120 Hz·지연 100 ms 26% 30 Hz·지연 100 ms 2% 반환 성공 맞혔으나 탁자 밖 맞혔으나 자기 코트 못 맞힘 계획 실패 라켓 추종 오차 중앙값 0.05–0.08 cm. 제어보다 작업 공간·지연이 실패를 가릅니다.
図:条件別の返球成功と失敗の種類
条件 打撃時刻誤差の中央値 打撃時刻のボール予測誤差の中央値 ラケット追従誤差の中央値 成功したボールの着地誤差の中央値
真の状態 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. 何が失敗を分けるのか

6. 制限事項

7. 次回予告

次回は、同一のボールサンプル、同一のカメラ仮定、同一のロボット制限のもとで、強化学習の2つのアプローチ(打撃パラメータのみを学習するハイブリッド、関節目標を直接出力する方式)をこの基準線と並置します(第7報)。その前に、 第6報でDeepMindロボットの限界を原文で読み解き、回転の問題をシミュレータで検証してみます。 失敗理由別の件数も合わせて残し、強化学習がどの失敗を削減したのかが分かるようにします。

ティティの一言: アームは0.7 mmの誤差で正確に動いたのに、10個中4個を逃してしまいました。アームではなく位置(作業空間)と目(遅延)が問題でした。早く見る目を何とかしてください!

参考文献

すべてのリンクは2026-10-18にアクセスして開けることを確認しました。

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます