ステータス:下書き(2026-10-18)、実測。 数値はノートPC(Apple M1 Max、macOS 26.5)のPython 3.9.6・numpy 2.0.2で直接計算したシミュレーション値です。 元データとコード:作業ディレクトリ
measure/robot-arm-basics/のm07_hit.py,out/m07_hit.json。ラケットの反発は単純モデルであり、実際のラケット・ラバーで測定した値ではありません(ハードウェア未実測)。ボールの初期状態はDeepMindデータセット(CC-BY 4.0)です。参考資料は2026-10-18に閲覧しました。 作成ルール:実測データが基本であり、測定できなかったものは「未実測」、確認できなかったものは「未確認」と表示します。
目次
1. 直観:逆向きに考える
バスケットボールのシュートを考えてみます。ボールがゴールに入るには、手を離れる時にどのような速度でなければならないかがまず決まり、手首と腕はその速度を作り出すように動きます。 卓球も同じです。ただし、ボールがすでに飛んできているため、ラケットはボールを「投げる」のではなく「弾き返す」のです。
そのため、打撃の決定は2段階の逆問題になります。
- 着地地点 → 射出するボール速度 v_out。 相手の卓球台の目標点に指定された時間内に落とすには、ボールがラケットを離れるときの速度がいくらでなければならないか。飛行モデル(第6部)を 逆向きに解く問題です。
- 射出速度 → ラケット。 入ってくるボールの速度 v_in を v_out に変えるには、ラケット面の法線 n とラケット速度 v_r はいくらでなければならないか。衝突モデルを逆向きに解く 問題です。
第1部の時間予算において、この2段階が占める割り当ては数十msです。そして、この段階の出力(ラケットの位置・方向・速度・時刻)が第4部の逆運動学と第8部の軌道 生成へと渡されます。
2. 図:ラケット反発の幾何学
3. 計算
3.1 射出速度:シューティング法とニュートン法
未知数は v_out の3つの成分です。目標点 (x_t, y_t) に卓球台の高さ(z = ボール半径)で到着しなければならないため、式が3つになるにはもう1つ定める必要があります。 この記事では 飛行時間 T を定めます。そうすると「T秒後の位置 = 目標」という3つの方程式になります。
F(v_out) = 공을 v_out 으로 T 초 날린 위치 − (x_t, y_t, r) = 0
F は第6部の飛行モデルを積分して計算される関数であるため、数式で解くことはできません。そのため「撃ってみて修正する」シューティング法(shooting method)を用います。ヤコビアンは v_out の各成分を少しずつ変えて撃ってみる有限差分で求め、ニュートン法で修正します。初期値は空気抵抗のない放物線の解です。
def solve_vout(p, T, goal):
v = (goal - p) / T
v[2] += 0.5 * 9.81 * T # 진공 포물선에서 출발
for it in range(20):
r = flight_to(p, v, T) - goal # 6편의 RK4 적분
if norm(r) < 1e-4: # 0.1 mm
return v
J = np.column_stack([(flight_to(p, v + h*e_i, T) - flight_to(p, v, T)) / h for e_i in I3])
v = v - np.linalg.solve(J, r)
射出するボールの回転は0としました(3.3節の制限事項)。
3.2 ラケット:反発モデルの解析解
ボールとラケットが衝突する瞬間をラケット面基準の2つの方向に分けます。
법선 방향: (v_out − v_r)·n = −e_r · (v_in − v_r)·n 반발 계수 e_r
접선 방향: v_out,t = v_in,t 마찰 무시(접선 성분 보존)
接線成分が保存されれば、v_out − v_in には法線成分のみが残ります。したがって、 ラケット法線は v_out − v_in の方向であり、法線方向の方程式を v_r·n について解くと ラケット速度が求められます。
def racket_for(v_in, v_out, e_r=0.8):
n = (v_out - v_in) / norm(v_out - v_in)
vrn = (v_out @ n + e_r * (v_in @ n)) / (1 + e_r) # 라켓 속도의 법선 성분
return n, vrn # 접선 성분은 자유(0 으로 둠)
ラケット速度の接線成分はこのモデルではボールに影響を与えないため、どのような値でも構いません。実際には、この自由度を腕が出しやすい方向を選ぶのに使ったり、 摩擦のあるモデルで回転をかけるのに使ったりします。計算時間は4.3 µsでした。
ラケットの反発係数 e_r は文献において 0.78〜0.88 の範囲であることを確認しました。Koçら(2018)は人間のデモデータから 0.788 を推定し、Nakashimaら(2010)はラバーの反発を 0.81 と測定しており、Google(2023)は実測値 0.78 を記録しています。Sony AI(2026)は定数 0.878 に速度依存項とニューラルネットワークの残差を加えたモデルを使用しています。この記事では 0.8 を使用します。
3.3 なぜ摩擦を無視してもよいのか、そしていつ無視できないのか
実際のラバーは粘着性や弾性があり、ボールの接線速度を変化させて回転をかけます。Nakashimaら(2010)は、ラバーが接線方向の運動エネルギーを弾性エネルギーとして蓄え、 接触点の接線速度が逆に反転するとモデル化しました。この記事のモデルではその効果を省き、 打ち返しのみを扱います。トップスピンをかけて強く打つ攻撃は、この モデルでは計画できません。第10部では、このモデルの誤っている部分をデータでどれだけ早く修正できるかを測定します。
4. 実測
4.1 実際の打球200件を打ち返す
第1部のデータセットにおいて、ロボット側に向かってくるボールを第6部のモデルでエンドライン裏23 cmの打撃面(y = −1.6 m)まで飛ばし、卓球台の上5 cm以上の高さでその面を通過するボール 200個を選びました。打撃面でのボールの速さは中央値 2.8 m/s(5%点 2.2、95%点 3.9)でした。目標点は相手側の (0.3, 0.9) m です。
| 飛行時間 T | ニュートン反復 | 計算時間 | 射出速度 | ラケット法線速度 5% / 中央値 / 95% | ラケット法線と +y の間の角度 | ネット上の余裕 5% |
|---|---|---|---|---|---|---|
| 0.35 s | 2 | 39 ms | 8.7 m/s | 3.1 / 3.6 / 4.0 m/s | 12° | 3.2 cm |
| 0.45 s | 2 | 50 ms | 6.9 m/s | 2.1 / 2.6 / 2.9 m/s | 17° | 12.6 cm |
| 0.60 s | 2 | 67 ms | 5.7 m/s | 1.5 / 2.0 / 2.2 m/s | 24° | 31 cm |
| 0.80 s | 2 | 90 ms | 5.5 m/s | 1.4 / 1.9 / 2.1 m/s | 35° | 64 cm |
- ニュートン法は4つの T すべてにおいて反復回数の第5・第50・第95パーセンタイルが 2回であり、着地誤差は第95パーセンタイルでも0.01 mm未満でした。真空中の放物線の初期値がすでに 近いためです。
- 計算時間の大部分はRK4積分です。第6部においてRK4の5 ms間隔の位置誤差が 10⁻⁷ mm 水準であったため、間隔を5 msに増やして再測定したところ、T = 0.6 s で 13.7 ms に減少し、1 msの積分で検算した着地誤差は0.005 mmでした。
- 飛行時間が短いほど(素早い返球)、ボールを低く速く送る必要が生じるため、ネット上の余裕が減少します。T = 0.35 s において5%のボールはネットの上 3.2 cm を通過します。 T を選ぶことは「速く」と「安全に」のトレードオフであり、実際にはネットの余裕・ラケット速度の限界(第5部)・関節加速度(第8部)を制約とした最適化問題 になります。この記事では T の4つの値を格子状に比較しただけであり、最適化は行っていません(未実測)。
4.2 ラケットが少しずれた場合
T = 0.6 s での返球100件において、計算したラケットに誤差を1つずつ加え、第6部のモデルで実際の着地地点を再計算しました。
| 誤差 | 着地地点の誤差 中央値 / 90% |
|---|---|
| ラケット法線が 0.5° 傾く(ランダムな方向) | 3.0 / 3.8 cm |
| ラケット法線 1° | 6.1 / 7.5 cm |
| ラケット法線 2° | 11.4 / 15.1 cm |
| ラケット法線 5° | 30.7 / 37.2 cm |
| ラケット速度 +0.05 m/s | 5.4 / 6.1 cm |
| ラケット速度 +0.1 m/s | 10.6 / 11.8 cm |
| ラケット速度 +0.3 m/s | 31.6 / 35.1 cm |
| 実際の e_r が 0.75(モデルは 0.8) | 13.4 / 15.5 cm |
| 実際の e_r が 0.85 | 13.9 / 16.1 cm |
| 実際の e_r が 0.70 | 26.9 / 31.0 cm |
| ラケットが 10 ms 遅れる(ボール速度の変化のみ) | 2.3 / 4.0 cm |
- ラケットの角度1°が6 cm、ラケット速度0.1 m/sが10 cmです。 第3部において関節のゼロ点 ±0.1° がラケット法線を 0.1〜0.2° 傾かせたため、ゼロ点の誤差だけでも1 cm 前後を失います。第9部においてPD制御のみを使用すると、打撃瞬間の関節速度誤差が 0.2 rad/s であり、腕の長さ 0.5 m をかけるとラケット速度は 0.1 m/s になります。着地地点 10 cm に相当します。
- 反発係数 e_r が 0.05 狂うと 13 cmになります。 ラバーごとに、ボールが当たる場所ごとに異なる値であるため、この定数はロボットごとに再測定する必要があります(第10部)。
- タイミングは思ったよりも寛容です。 ラケットが 10 ms 遅れると、ボールはその間に少し多く落下して速度が落ちますが、その影響は着地地点で 2.3 cm でした。代わりにボールは 10 ms の間に 2.9 cm(中央値)多く飛んでくるため、 ラケット面上の当たる位置がその分だけ移動します。ラケット面の半径が 7〜8 cm であるため 10 ms は許容範囲ですが、 第1部の遅延(数十〜100 ms)を補正しなければボールを逃してしまいます。
5. 制限事項
- ラケットの摩擦と回転伝達を無視しました。入ってくるボールの回転は実際には反発の方向を変えますが、このモデルでは何の効果も持ちません。
- ラケット面を無限に広い平面とみなしました。端に当たったボール、ラケットのたわみや振動は扱っていません(未実測)。
- 接触を瞬間的なものとみなしました。実際の接触時間の間、ラケットは動き続け、回転し続けています。第8部が打撃瞬間の加速度を0とする理由がここにあります。
- 飛行時間 T をあらかじめ定めました。T と打撃時刻・位置を同時に最適化する方法(Koçら 2018)は実装していません。
6. まとめ
- 打撃決定は2つの逆問題です。着地地点から射出速度を求めるシューティング法(ニュートン法2回繰り返し)と、射出速度からラケットを求める解析解(4 µs)です。
- 摩擦を無視した反発モデルにおいて、ラケット法線は v_out − v_in の方向であり、ラケット速度はその方向成分の1つによって決まります。
- 打ち返しに必要なラケット速度は 2〜4 m/s と小さいです。難しいのは速度の大きさではなく 精度です。ラケットの角度1°、速度 0.1 m/s、反発係数 0.05 が それぞれ着地地点で 6 cm、10 cm、13 cmの誤差になります。
卓球のひと言。 ボールを打ち返す際、ラケットは思ったよりもゆっくり動かして大丈夫です。その代わり、ラケット面が1°だけでも傾くとボールは手のひら1つ分近く外れてしまうので、速さよりも正確さが先です!
参考
すべての資料は2026-10-18に閲覧しました。
- Nakashimaほか, Modeling of Rebound Phenomenon of a Rigid Ball with Friction and Elastic Effects, ACC 2010, 機関リポジトリ.
- Koc, Maeda, Peters, Online optimal trajectory generation for robot table tennis, RAS 105 (2018), 著者公開版、表 A.3。
- D'Ambrosio 他、 arXiv:2309.03315、付録 D(ラケット反発設定値と実測値)。
- Conti 他(Sony AI)、 arXiv:2606.28805、表 IV(ラケットモデル)。
- Google DeepMind、 competitive_robot_table_tennis、CC-BY 4.0。