TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

ボールを打つまで:認知からモーター電流までの7段階とタイムバジェット

状態:ドラフト(2026-10-18)、実測。 本記事の数値は1台のノートPC(Apple M1 Max、macOS 26.5)でPython 3.9.6・numpy 2.0.2により 直接計算した値です。時間は7回繰り返した際の中央値であり、初回の試行はウォームアップとして除外しました。元データとコードは作業ディレクトリ measure/robot-arm-basics/(m01_budget.py, m01b_fast.py, out/m01_budget.json)にあります。 実際のロボットハードウェアで測定した値はありません(ハードウェア未実測)。ボールの初期状態はDeepMindの公開データセット(CC-BY 4.0)を使用し、 卓球の規格はITTF Statutes 2026の原文で確認しました。根拠資料はいずれも2026-10-18に閲覧しました。 作成ルール:実測データを基本とし、測定できなかったものは「未実測」、確認できなかったものは「未確認」と表記します。

目次

1. 直感:0.6秒以内に完了すべき7つのこと

人間は相手のラケットからボールが離れた瞬間、すでに体を回転させています。目でボールを追いかけ、どこに弾むかを推測し、腕を後ろに引いてから振ります。 これらすべてのことが1秒未満の時間の中で起こり、そのほとんどは意識されないまま過ぎ去ります。

ロボットはこのプロセスを1つずつ計算によって解き明かす必要があります。本シリーズではその計算を7つの段階に分けます。

段階 作業内容 扱う回
1 認知(perception) カメラ映像からボールを見つけ出して3次元位置を取得する 第2回(座標変換)
2 状態推定(state estimation) ノイズの混ざった位置の時系列から位置・速度を推定する 第6回(カルマンフィルター)
3 飛行予測 重力・抗力・マグナス力とバウンドによりボールの将来の軌道を計算する 第6回
4 打撃決定 いつ・どこで打つか、ラケットの速度と面の向きを決める 第7回
5 逆運動学(inverse kinematics) ラケットの姿勢を関節角度に変換する 第3・4・5回
6 関節軌跡(trajectory) 現在の姿勢から打撃の姿勢・速度に至る時間関数を作成する 第8回
7 低水準制御(low-level control) モーター電流によってその軌跡に実際に追従させる 第9回

第10回では、これらの段階の中で何を方程式で解き、何を学習に委ねるのかを卓球ロボットの論文とともに比較します。

本シリーズは卓球ロボットを オープンハードウェアとして作るための準備段階です。そのため、数値の一つひとつが「どの部品を買うべきか」につながるように 書いています。関節速度の限界がいくつかによってラケットが何 m/s を出せるか(第5回)、ラケットの角度が1°狂うとボールが何 cm 外れるか(第7回)、制御周期が 200 Hzだと何が崩れるか(第9回)といった事柄です。

2. 図:7段階と自作コードの計算時間

공 하나를 치기까지: 일곱 단계와 우리 코드의 계산 시간 1 인지 카메라 → 공 픽셀 → 3차원 위치 125 fps 면 8 ms 마다 한 점 2 상태 추정 칼만 필터로 위치·속도 프레임당 125 µs 3 비행 예측 중력·항력·Magnus + 바운스 타격면까지 11 ms 4 타격 결정 나갈 속도 → 라켓 법선·속도 뉴턴법 14 ms, 닫힌 해 4 µs 5 역기구학 라켓 자세 → 관절각 해석해 58 µs 6 관절 궤적 지금 자세 → 타격 자세·속도 5차 계수 7 µs 7 저수준 제어 위치 루프 → 전류 루프 1 kHz / 30 kHz 시간: 파이썬 3.9·numpy, 노트북 CPU, 7회 반복 중앙값(첫 회 버림).
図:7段階と、各段階を本シリーズのPythonコードで計算した際にかかった時間

3. 計算:ボールはどれくらいの時間で飛んでくるのか

タイムバジェットの出発点はボールの飛行時間です。直接測定するために2つのものを準備しました。

ボールの初期状態。 Google DeepMindが公開した competitive_robot_table_tennis データセットには、人間またはロボットが打った 直後のボールの位置・速度・角速度が15,792件含まれています(ラリー13,088件、サーブ2,704件)。このデータは D'Ambrosioら 2024の論文(arXiv:2408.03906)の学習に使用され、CC-BY 4.0で配布されています。座標系は卓球台上面の中心が原点で、xが幅、yが長さ、zが上方向です。本シリーズ全体で同じ座標系を使用します。ロボットはy < 0側に立ちます。

飛行モデル。 第6回で詳しく扱う運動方程式をRK4により1 ms間隔で積分します。

m · dv/dt = m·g  −  ½ ρ C_D A |v| v  +  ½ ρ A r C_M (ω × v)
            중력     항력(drag)          Magnus 힘
탁구대에 닿으면: 법선 속도에 반발 계수 e, 접선 방향은 쿨롱 마찰 μ

コードは短いです。データセットからロボット側に向かってくるボールのみを抽出して飛ばし、ロボット側の卓球台で一度バウンドした後に複数の「打撃面」を通過する時刻を記録します。

incoming = [s for s in rallies + serves if s["vel_y"] < 0]      # 로봇(y<0) 쪽으로 오는 공 14,703개
for s in incoming:
    rec = fly(p, v, w, dt=1e-3, stop=lambda t, p, v, nb: p[1] < -2.2 or nb >= 2)
    # 첫 바운스가 로봇 쪽 탁구대 안이면 유효. 이후 y = -1.37, -1.6, -1.9 를 지나는 시각·높이·속력을 기록

結果は以下の通りです。14,703件のうちロボット側の卓球台に正確に落下したボールは11,590件であり(残りはネット・アウト)、そのうち エンドライン(y = −1.37 m)まで飛んできたボールは10,618件でした。

상대가 친 뒤 공이 로봇 끝줄을 지나기까지 0.30 0.45 0.60 0.75 0.90 1.05 1.20 0.02 0.04 0.06 0.08 상대 타구 뒤 시간(초) 비율 바운스 중앙 0.45s 끝줄 통과 중앙 0.65s 공 10,618개(DeepMind 초기 상태, CC-BY 4.0)를 우리 비행 모델로 날림. 5·95백분위: 0.47–0.95초. 막대는 0.025초 칸.
図:相手が打ってからボールがロボット側のエンドラインを通過するまでにかかった時間の分布
イベント 第5パーセンタイル 中央値 第95パーセンタイル
打球直後のボールの速さ(m/s) 3.89 5.46 7.62
打球直後の回転(rad/s) 9 49 100
ロボット側のバウンドまで(秒) 0.317 0.449 0.621
バウンド後の頂点まで(秒) 0.511 0.678 0.904
頂点の高さ(卓球台上、m) 0.20 0.30 0.45
エンドライン y = −1.37 通過(秒) 0.474 0.654 0.951
エンドライン後 23 cm、y = −1.6 通過(秒) 0.538 0.745 1.082
エンドライン通過時のボールの速さ(m/s) 2.07 2.88 4.15
エンドライン通過時の高さ(卓球台上、m) 0.06 0.24 0.38

計算時間は14,703個のボールをすべて飛ばすのに130秒、ボール1個あたり約9 msでした。

より速いボールの場合

このデータセットのボールは速くありません。同論文の付録では7 m/sを超えるボールを「速い」と分類していますが、上記表の第95パーセンタイルは7.6 m/sです。 競技レベルが上がるとボールが速くなるため別途計算しました。相手のエンドライン上45 cmから−y方向に速さvで打ち、トップスピン50 rad/sを与えた後、 ロボット側のy = −0.7 mに落ちるように上下の速度を二分法で調整しました(m01b_fast.py)。5つのケースすべてでネットを越えます。

打球速度(m/s) バウンドまで(秒) エンドライン通過(秒)
6 0.452 0.682
8 0.338 0.496
12 0.226 0.321
16 0.170 0.238
20 0.136 0.190

Büchlerら(2022)の空気圧人工筋肉ロボットは、スマッシュの課題において平均約12 m/sのボールを打ったと報告しています(arXiv:2006.05935 v1)。 その速度のボールを受け取るには、バジェットは0.32秒となります。データセットの中央値の半分です。

4.時間を段階別に分解すると

0.65秒を各段階に分けてみます。順番に起こるのではなく、並行して起こるものである点が重要です。ボールを見ている間に腕はすでに 準備姿勢へ向けて動き、予測は新しいフレームが入ってくるたびに修正されます。

区間 所要時間 根拠
ボールを見る時間 0.1〜0.3秒 第6回実測:最初の0.1秒だけ見て予測した場合の打撃面位置誤差の中央値7.0 cm(抗力モデル)、0.3秒見た場合は4.8 cm
カメラの1フレーム 8 ms(125 fps) D'Ambrosioら 2023のカメラ設定(arXiv:2309.03315)
システム遅延 ボール観測 40 ms、アーム動作 71 ms 同論文の表I(平均)。2024年の論文では「システム遅延約100 ms」と要約
自作の計算(予測 + 打撃決定 + IK + 軌跡) 約25 ms 各回の実測値の合計:11 + 14 + 0.06 + 0.007 ms
腕が打撃姿勢に至るまでの時間 0.05〜0.10秒 第8回実測:0.6 radを通過し10 rad/sに達する5次軌道、加速度限界300〜600 rad/s²において0.062〜0.082秒
残りの余裕 その他 データセットの中央値0.65秒基準で約0.2秒、12 m/sのボール(0.32秒)の場合はほぼなし

表から2つのことがわかります。

  1. 計算時間はボトルネックではありません。 教育用のPythonであっても25 msです。ボトルネックとなるのは、予測の精度を上げるためにボールを十分に長く見る必要があるという点と、 カメラ・通信・コントローラーに蓄積する遅延です。Googleのシステムでは観測遅延だけで40 msありました。
  2. 見る時間と動く時間はトレードオフの関係にあります。 長く見るほど予測は良くなりますが、腕を動かす時間が減ります。そのため実際のシステムでは、 予測が粗い段階から腕を大まかな準備姿勢へ向かわせ、予測が洗練されるにつれて目標を修正します(第8回の軌跡再計画)。

5. 本シリーズの共通モデルと定数

すべての回で同じ定数を使用します。原文を開いて確認した値と仮定を区別して記載します。

量 値 出典と条件
ボールの質量・直径 2.7 g、40 mm ITTF Statutes 2026, 2.3.1・2.3.2
卓球台 2.74 × 1.525 m、高さ 76 cm 同文書 2.1.1
ネットの高さ 15.25 cm 同文書 2.2.3
卓球台の反発係数 e = 0.876 2.1.3の「30 cmから落とすと約23 cm」を空気抵抗なしで換算した値。第6回で再び扱う
卓球台の摩擦 μ = 0.25 Nakashimaら 2010の動摩擦測定値
抗力係数 C_D = 0.47 同プロジェクトのMuJoCoシミュレーターで測定した実効値0.471に合わせた値。文献の範囲は0.37〜0.55(Sony AI 2026 表I)
マグナス係数 C_M = 0.6(質量あたり 3.4×10⁻³) シミュレーター側のノートがTebbeら 2020から転載した値(原文未確認)。文献によって3倍以上異なる(第6回)
ラケットの反発係数 e_r = 0.8 文献値の0.788(Koçら 2018)、0.81(Nakashimaら 2010)の間

座標系と質量・直径・卓球台の規格は、同じプロジェクトで作成しているMuJoCo卓球シミュレーターと同一です。シミュレーターがDeepMindのデータセットノートPCのMJCFを出発点としているため、本記事のボール状態をそのまま入力して結果を照合できます。

6. 制限事項

7. まとめ

ティティの一言。 ボールが飛んでくる0.6秒の間に、ロボットは7つの仕事をこなします。計算はあっという間に終わりますが、ボールを長く見るほどアームを動かす時間が削られてしまうのが本当の悩みどころです!

参考文献

すべての資料は2026年10月18日に閲覧しました。

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

コメント

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

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