状態:ドラフト(2026-10-18)、実測。画面と文章の数字はすべてシミュレーター内の値であり、カメラの周期・遅延・ノイズは仮定値です。 録画とレンダリングは2026-10-18にホームラボのKubernetesのミニPCノード1台で一時的なポッドとして実行しました。ポッドの上限はCPU 6コア・メモリ3 GiBであり(最大使用量1.5 GiB)、GPUは使用していません。 環境はMuJoCo 3.16.0、Python 3.11、numpy 2.3.4、Mesa 23.2.1(llvmpipe、OSMesa)、ffmpeg 4.4.2(libx264)です。物理演算と制御は第7部と同じです(タイムステップ0.5 ms、制御1 kHz、学習済みハイブリッドポリシーシード0)。 評価用ボール番号201の1つを4つの方法で実行しました(学習済みハイブリッド遅延30 ms・100 ms、古典的基準線30 ms、学習なしの公称プランナー30 ms)。決定論的な実行であるためそれぞれ1回ずつ実行し、4つの結果すべてが第7部の評価ファイルの同じボール・同じ条件の結果(結果の種類と着地点)と一致しました。 元データ(録画
out/rec/ball201.json、文章の数字out/facts.json、録画・レンダリング・図のスクリプト)は作業ディレクトリmeasure/sim-tt-video/にあります。
目次
- 1. 直感:1.3秒間に起きる7つの計算
- 2. 動画と図の作成方法
- 3. 第1段階 観測:撮影された点が遅れて届く
- 4. 第2段階 予測:二次式のフィッティングとRK4・バウンドモデル
- 5. 第3段階 打撃決定:着地点から逆算する
- 6. 第4段階 逆運動学:閉じた形の4行の方程式
- 7. 第5段階 軌道とスイング:39 msで引き直した軌跡
- 8. 第6段階 接触:1 ms以内の出来事
- 9. 第7段階 着地:目標から3.7 cm
- 10. 比較:同じボール、異なる手法と異なる遅延
- 11. 制作中に直面した出来事
- 12. 限界と未実測
- 13. 次回へ
- 参考文献
1. 直感:1.3秒間に起きる7つの計算
第5部と第7部では500個のボールの成功率について語りました。数字は正確ですが、ロボットが1つのボールを受ける間に 何をいつ計算しているのかはよく見えません。今回は1つのボールを最初から最後まで追いかけ、毎瞬間ロボットの頭の中にある値を画面に描き出しました。
公開データの初期状態(相手側のエンドラインの上、こちらに向かって飛んでくるボール)から、うちのロボットを経由して相手コートに落ちるまで1.307 sです。その間に7つの段階があります。
- 観測。 カメラがボールの位置を撮影し、その点が遅れて届きます。
- 予測。 届いた点からボールの状態を合わせ込み、今後の経路をシミュレーションします。
- 打撃決定。 狙う着地点から逆算し、いつ、どこで、どのような面の向きで、どれほど強く打つかを決めます。
- 逆運動学。 そのラケットの姿勢を4つの関節の値に変換します。
- 軌道とスイング。 現在の姿勢からその姿勢まで関節ごとに5次多項式で結び、それに従います。
- 接触。 ボールがラケットに当たり、速度と回転が変化します。
- 着地。 ボールが相手コートに落ちます。
ロボットは第5部と同じ実寸大のガントリー2軸(x軸:横、z軸:縦)+手首2軸(yaw、pitch)であり、制御は第7部の学習済みハイブリッドです。ポリシーは打撃パラメータ6個のみを補正し、残りはすべて下記に述べる古典的な計算が処理します。
2. 動画と図の作成方法
2.1 全体の流れ
| 段階 | シミュレーターの時間 | 映像に見えるもの | 再生速度 |
|---|---|---|---|
| 1 観測 | 0–0.200 s | 撮影された点(灰色)と届いた点(水色) | 1/20 |
| 2 予測 | 0.200 sで停止 | 二次式のフィッティング、予測経路、推定回転 vs 真の回転 | 一時停止 |
| 3 打撃決定 | 0.200 sで停止 | 打撃位置、ラケット目標、面の法線、狙った経路と着地点 | 一時停止 |
| 4 逆運動学 | 0.200 sで停止 | 現在の姿勢と目標姿勢、関節の4つの値 | 停止 |
| 5 軌跡とスイング | 0.200–0.539 s | 計画されたラケットの経路対実測、関節基準対実測のグラフ、0.497 s での再計画 | 1/10 |
| 6 接触 | 0.513–0.583 s | 入ってきた速度・出ていった速度の矢印、速さと回転 | 1/10 |
| 7 着地 | 0.543–1.307 s | 実測の経路対計画された経路、着地誤差 | 1/4 |
| 比較 | 0–0.700 s | 同じボールの基準線対ハイブリッド、遅延 30 ms 対 100 ms | 1/4 |
動画は 1280×720、30 fps、65.6 s(1,967フレーム)、H.264 2.6 MB です。1つの記事に入れられる動画は 30 s までなので、各節に段階別のクリップ(4.7–8.1 s)を入れ、その下に同じ瞬間の静止画を配置しました。
2.2 録画:計算を変えずに取り出す
7編の録画軌跡(rec_*.json)には 5 ms 間隔のボールとラケットの位置しかありません。段階別の計算を表示するためには、観測点、フィッティングした二次式、予測経路、決定ごとの計画、関節基準値が必要になるため、同じ環境を同じシード(ボールごとに 777000 + ボール番号)で再実行しました。
環境コードは変更せず、サブクラスから読み取るだけにとどめました。1 ms の制御周期ごとに状態を転記し、決定ごとに推定値と計画を転記します。
class RecEnv(ttenv.TTEnv):
def _tick(self, qr, vr, ar):
done = super()._tick(qr, vr, ar) # 물리·제어는 원래 코드 그대로
d = self.d
v, w = ball_world(self) # 세계 좌표 속도·각속도
self.ticks.append([round(self.t, 6), *d.qpos[:11].tolist(), *d.qvel[6:10].tolist(),
*np.asarray(qr).tolist(), *v.tolist(), *w.tolist(), ...])
return done
出典:TT Lab 実験コード sim-tt-video/src/vid_record.py(接触表示の列は省略)。
録画結果(結果の種類、着地位置)は、7編の評価ファイルの同じボール・同じ条件の値と照合し、4つのケースすべてで一致しました。同じ計算が再実行されたことの確認となります。
2.3 レンダリング:数値は録画から、見た目は表示専用モデルで
物理モデルのロボットにはラケット以外の形状がないため、そのまま描画するとラケットだけが空中に浮いてしまいます。そのため、関節の配置(qpos の順序、位置、軸、ラケットのサイズ)が同じ 表示専用モデルを別途作成してレール・キャリッジ・手首・持ち手を結合し、記録された qpos をそのまま入力して MuJoCo のオフスクリーンレンダラーで描画しました。このモデルは接触を計算しません。 観測点・予測経路・打点などの表示は MuJoCo のシーンに図形として追加し、字幕と数値は描画されたフレームの上に Nanum Gothic フォントで記述しました。画面上の数値はすべて録画ファイルから読み込み、速さ(ベクトルの大きさ)、角度、cm への換算などの単純な変換計算のみを行っています。 1 ms の記録間のフレーム(1/20 倍速では 1.67 ms 間隔)は、ボールと関節の位置を線形補間して描画しました。
3. ステージ 1:観測:捉えた点が遅れて到着する
- カメラは 120 Hz(約 8.3 ms 間隔)で撮影し、位置には σ 3 mm のノイズが付加されます。シミュレータでは 1 ms の制御周期に合わせて取得するため、実際の間に合わせの間隔は 8–9 ms になります。
- 捉えられた点は 30 ms 経ってからロボットに到着します。0.2 s で最初の決定を行う際、捉えられた点は 24個、到着した点は 21個でした。最後の 30 ms のボールは、まだロボットには見えていません。
- 相手が打ったボールの初速は 7.78 m/s、進行方向基準のトップスピンは 53.8 rad/s です(DeepMind の公開データの初期状態)。
観測からボールの状態を推定する一般論(カルマンフィルターなど)は、『卓球ロボットアームの基礎』第 6 編のボールの飛行方程式に記載されています。
4. ステージ 2:予測:二次式のフィッティングと RK4・バウンドモデル
計算。 到着した点(直近 36個まで)に対して時間に対する位置の二次式を最小二乗法でフィッティングし、最後の観測時刻における位置・速度・加速度を取得します。0.2 s でのフィッティングは観測 21個、加速度(1.56, 6.90, −13.49)m/s² でした。 加速度から重力と抗力を引いた残りの成分をマグナス力(k_M/m)ω×v と見なして ω を解きます。回転は加速度のわずかな差としてしか現れないため、0 の方向へ引き戻す事前項(標準偏差 300 rad/s)を設けています。 その状態でプランナーの物理演算(抗力係数 0.471、マグナス係数、卓上の反発 0.975・摩擦 0.10)を 4 ms 間隔の RK4 で実行し、卓上に接触した場合は力積モデルでバウンドさせます。
| 0.2 s での値 | ロボットによる推定 | 真値(シミュレータ) |
|---|---|---|
| 速度(m/s) | (−1.23, −6.29, −0.39) | (−1.14, −6.20, −0.74) |
| 回転 ω(rad/s) | (82, −16, 4) | (55, 3, 15) |
| バウンド時刻 | 0.415 s | 0.429 s |
| バウンド位置(x, y)m | (−0.47, −1.16) | (−0.47, −1.26) |
予測されたバウンドは実際より 14 ms早く、10.3 cm 手前でした。回転の推定のずれが最も大きくなります(第 6 編で確認した通り、位置情報だけでは回転が弱くしか見えないためです)。
バウンド後の再フィッティング。 ロボットは到着した点の高さが最も低くなった後、1 cm を超えて再び上昇したときにバウンドとみなします。このボールは 0.425 s の時点をバウンドと判断し、その後観測 4個が到着した 0.497 s の時点で 2回目の決定を行いました。 観測が 6個未満の場合、加速度は重力のみとして直線のみでフィッティングを行い、回転は最初の推定値をバウンドモデルに通した値(131, −25, 4)rad/s をそのまま使用します(真値は(98, −7, 15))。この計算式は、『卓球ロボットアームの基礎』第 6 編の重力・抗力・マグナスとバウンドモデルの節にあります。
5. ステージ 3:打撃の決定:着地点からの逆算
計算。 3つの要素を順番に解きます。
- 出射速度。 狙う着地点は相手コートの中央(0, 0.75)m です。水平方向の速さを 4.5 m/s とし、飛行時間 T = 距離 / 4.5 を定めた後、重力のみを受ける放物線が卓の高さに到達するように v_z を決定します。
- 面の法線と面の速度。 出ていく速度と入ってくる速度の差の方向を法線 n とし、反発係数 e を用いて法線方向の面の速度 v_pn = v_in·n + (Δv·n) / (1+e) を定めます。摩擦を考慮した力積モデルで予測結果を再計算し、3回修正します。
- 打撃時刻。 ガントリーには奥行き(y)軸がないため、ラケットが到達できる y は手首の角度のみによって決まります。予測経路がその y を通過する時刻が打撃時刻となります。
def _v_des(self, b):
dx, dy = TARGET[0] - b[0], TARGET[1] - b[1]
dist = math.hypot(dx, dy)
vh = 4.5
Tf = dist / vh
vz = (T.BALL_R - b[2] + 0.5 * G * Tf * Tf) / Tf
return np.array([dx / dist * vh, dy / dist * vh, vz])
出典:TT Lab 実験コード rl/src/ttenv.py(第 7 編と同じファイル)。
学習したポリシーはこの公称値に6つの補正を加えます(面yaw・pitch各±20°、面速度±1.5 m/s、打球時刻±20 ms、ラケット中心x・z各±6 cmの範囲)。
| 0.2 s の1次決定 | 公称(学習なし) | ポリシー補正後 |
|---|---|---|
| 打球時刻 | 0.552 s | 0.556 s(決定から356 ms後) |
| 打球位置 b (m) | (−0.58, −1.74, 0.32) | (−0.59, −1.75, 0.32) |
| 面 yaw / pitch | −12.3° / 4.7° | −7.7° / 0.4° |
| 面速度(法線方向) | 0.48 m/s | 1.10 m/s |
| 所望の出射速度 | (1.03, 4.38, 2.26) m/s | (1.02, 4.38, 2.27) m/s, 5.04 m/s |
ポリシーの出力を単位に換算すると、yaw +4.7°、pitch −4.0°、面速度 +0.63 m/s、打球時刻 +7.0 ms、中心 x −0.6 cm、z −2.7 cm です。所望の着地地点からラケットの速度と法線を逆算する方程式は、「卓球ロボットアームの基礎」第7話の打球方程式にあります。
6. 4段階逆運動学:閉形式の4行
ガントリーは直交座標系であるため、逆運動学は反復計算なしで完了します。手首の2つの角度は所望の法線から直接求まり、ガントリーの2つの軸はラケットの中心から手首のオフセットを引くだけです。
def ik(c, n, rb: Robot):
n = np.asarray(n, float) / np.linalg.norm(n)
th = math.asin(max(-1.0, min(1.0, n[2])))
psi = math.atan2(-n[0], n[1])
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))
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 実験コード sim/ttsim.py(説明コメントは省略)。
| 関節 | 現在(0.2 s) | 1次目標 | 制限 |
|---|---|---|---|
| ガントリー x | 0.000 m | −0.595 m | ±0.9 m |
| ガントリー z | 0.150 m | 0.144 m | −0.15–0.7 m |
| 手首 yaw | 0.0° | −7.7° | ±80° |
| 手首 pitch | 0.0° | 0.4° | ±80° |
ラケットの中心は c = b − n·(ボール半径 + ラケット厚さ/2) にポリシーの中心補正を加えた値です。4つの値すべてが制限内であったため、クリッピングされた値はありませんでした。 y_res はガントリーが合わせられない奥行き方向の差分であり、公称計画では 0 であり、ポリシー補正が入った1次目標では −2.9 cm でした。2つの解、特異点、解がない場合などの一般的なアームの話は、「卓球ロボットアームの基礎」第4話の逆運動学にあります。
7. 5段階軌道とスイング:39 msで引き直した経路
計算。 決定するたびに、現在の関節の位置・速度・加速度から打撃瞬間の目標(位置 q、速度 (0, 0, 0, −v_pn/L)、加速度 0)まで、関節ごとに5次多項式で接続します。スイング後、pitch は 0.12 s かけて停止します。1 kHz の計算トルク制御(PD + フィードフォワード、固有振動 50 rad/s)がこの基準に追従し、加速度と速度は軸の制限でクリッピングされます。
- 1次計画(0.200 s、356 ms)。 要求された最大加速度は、横軸 27 m/s²(制限 40)、pitch 82 rad/s²(制限 600)で余裕がありました。横軸の最大速度は 3.13 m/s で、制限の 3 m/s をわずかに超えました。0.497 s まで、実測値と基準値の差は x 0.27 cm、pitch 0.20° 以下でした。
- 2次計画(0.497 s、残り 39 ms)。 バウンド後に再調整された打球位置は、x が +4.2 cm、z が −5.2 cm 移動し、ポリシーは pitch を +6.1°、中心 x を +3.0 cm 補正しました。その結果、面の pitch は 0.4° → 8.8°、面速度は 1.10 → 0.33 m/s に変化しました。 残りの 39 ms で新しい5次多項式を接続したため、横軸が 323 m/s²(制限 40)、高さ軸が 98 m/s²(制限 30)を要求しました。実際には制限でクリッピングされ、接触瞬間に横軸が基準と 6.6 cm ずれました。
- それでも命中しました。ボールとラケット中心の最短距離は 5.0 cm であり、ラケット面のサイズが 15×16 cm であるためその内側に収まりました。接触は計画された 0.536 s より 7 ms 遅い 0.543 s でした。
5次多項式が両端の位置・速度・加速度を満たす原理と、制限内の最小時間軌道は「卓球ロボットアームの基礎」第8話の軌道生成、計算トルク制御は第9話の制御にあります。
8. 6段階接触:1 ms以内の出来事
映像はこのシーンを 1/10 倍速で示しています。ボールがラケットに接触したと記録されたのは 1 ms の記録1コマ分(物理ステップ2回)です。
| 速さ | 回転の大きさ | 進行方向基準 | |
|---|---|---|---|
| 飛来したボール(0.542 s) | 4.51 m/s | 98.9 rad/s | トップスピン 97.6 rad/s |
| 出ていくボール (0.544 s) | 4.89 m/s | 98.7 rad/s | バックスピン 95.8 rad/s |
- 計画で意図した出ていく速度は 5.06 m/s (重力のみを考慮した計算) ですが、実際は 4.89 m/s でした。
- 接触直前のpitch関節速度は −2.11 rad/s で、ラケット面を押す速度は L·|θ̇| = 0.32 m/s です。第2段階の計画における面速度 0.33 m/s とほぼ同じです。ラケット面中心の速度は、ガントリーの動きまで含めて 0.69 m/s でした。
- 回転ベクトルの変化は 1.5 rad/s のみでした。ボールの進行方向が反転するため、入ってきたときのトップスピンが、出ていくときはバックスピンになります。ラケットのゴムの反発・摩擦は仮定値 (摩擦 0.5) であるため、実際のラケットでもこれだけの回転がそのまま残るかはわかりません。
9. 第7段階の着地: 目標から 3.7 cm
| 値 | 学習済みハイブリッド | ノミナル (学習なし) |
|---|---|---|
| 着地点 (x, y) m | (−0.004, 0.713) | (−0.007, 0.529) |
| 目標 (0, 0.75) から | 3.7 cm | 22.1 cm |
| 最高点の高さ | 0.68 m | 0.47 m |
| 結果 | 返球成功 | 返球成功 |
- 学習済みハイブリッドのボールはネットの上 36.7 cm を通過し、接触から 0.764 s後に落下しました。
- 計画では重力のみを考慮した放物線として最高点を 0.54 m と予測していましたが、実際のボールは 0.68 m の高さまで上がりました。バックスピンのマクナス力がボールを持ち上げた分です。計画式の誤差をポリシーの補正が埋めたと言えます。同じボールに対して、学習のないノミナルプランナーは 22.1 cm 手前に落下しました。
- ただし、これは1つのボールに関する結果です。評価用ボール 500個 (120 Hz・30 ms) における学習の純利益は、ノミナル 80.6% → 本ポリシー 83.8% でした (第7部)。
10. 比較: 同じボール、異なる手法と異なる遅延
古典的ベースライン(遅延 30 ms):ヒットできず、最も近接した時で 28.2 cm。 ベースラインは 0.2 s の時点で 21個の観測により位置・速度・回転をまとめて最小二乗法でフィッティングしましたが、回転を (111, 279, −27) rad/s と読み取りました(真値は (55, 3, 15))。その予測に基づき打撃位置を x −0.83 m と設定しましたが、その時刻の実際のボールは x −0.54 m にありました。 ベースラインは予測バウンドの 80 ms 後から打撃時刻の 80 ms 前までのみ再計画を行います。予測バウンドが 0.440 s、打撃時刻が 0.545 s であったためそのウィンドウが空き、計画は 0.2 s のもの単体のみとなりました。ハイブリッドはバウンドを観測から見つけ、観測が 4個揃うとすぐに再計画して修正しました。
学習済みハイブリッド(遅延 100 ms):ヒットできず、最も近接した時で 32.4 cm。 同じ方針、同じボールです。0.2 s の時点に到着した観測が 13個しかなかったため(30 ms の場合は 21個)、回転を (67, −5, 87) rad/s と読み取り、垂直軸(z)まわりの横回転成分が大きかったため打撃位置を x −0.19 m と設定しました(その時刻の実際のボールは x −0.55 m)。 バウンド後の観測 4個は 0.567 s になってようやく到着し、その時に生成された計画の打撃時刻 0.545 s はすでに過ぎていたため使用できませんでした。遅延 100 ms におけるこの方針の返球成功率は 500個を基準として 58.2%、ベースラインは 26.6% です(第7部)。
11. 開発時の苦労話
- GPU が空いていませんでした。 GPU ノードの 1枚のカードは別の学習に使用されていました。その学習を妨げないように、CPU ノード上で Mesa のソフトウェアレンダラー(OSMesa、llvmpipe)を使用して描画しました。1280×720 のシンプルなシーンが 32 ms、表示と字幕まで描画した最終フレームが平均 79 ms でした(1,967フレームで 2分 36秒)。
- 画面投影が 0 で除算されました。 字幕の引き出し線を 3次元点に固定するためにカメラの視野(frustum)を読み取りましたが、シーン更新直後の frustum の幅が 0 でした。レンダリング段階でアスペクト比によって満たされる値であるため、同じ式(高さ × アスペクト比)で計算しました。
- 円柱のサイズ指定の順序が異なっていました。 着地目標の表示を平らな円柱として入れたところ、高さ 4 cm の筒になってしまいました。シーンに直接配置する円柱のサイズは(半径、半径、高さ)ではなく、(半径、半高さ)の順序でした。
- 観測の数が 1つ多くなっていました。 0.2 s の画面に「取得した観測 25個」と表示されましたが、記録された決定ログは 24個でした。環境は 1 ms の周期の 開始時に 取得し、決定はその周期の 前で行うため、0.200 s に打たれた点は決定の瞬間にはまだ存在しません。画面も同じルールに修正し、決定の記録と一致するかアサート(assert)でまとめました。
- フォントにマイナス記号がありませんでした。 数学のマイナス(U+2212)がNanumゴシックで四角く表示されてしまいました。画面の文字はハイフンに変更しました。
- ガントリーのフレームがシーンを遮っていました。 最初は上下のレールと柱があるフレームを描画したのですが、ロボットの後ろから見るシーンでは常に上のレールがボールの軌道を遮っていました。表示専用モデルから上のレールを外し、下のレールと動く柱だけを残しました。物理演算には影響しません(物理モデルのロボットには本来ラケット以外の図形はありません)。
- 映像のメタデータ。 ffmpeg はデフォルトでエンコーダ名をコンテナに、x264 はエンコーダ設定文字列を映像内に書き込みます。ブログの動画チェックがいずれも拒否するため
-map_metadata -1 -map_chapters -1 -fflags +bitexact -flags:v +bitexactと-bsf:v filter_units=remove_types=6で消去し、9つのクリップはチェック関数を通過しました。65.6 s の全体映像は1つの記事に含める制限である 30 s を超えるため、記事内では段階別のクリップに分けて挿入します。
12. 限界と未計測
- ボールが1つ。 本記事の数値は評価用ボール第201号の1つの値です。他のボールでは、計画のタイミングや軸の制限に引っかかる程度が異なります。分布については第5・7回の500個の評価をご覧ください。
- 実機への移行、実際のカメラの遅延、回転推定の精度、ラケットのゴムの反発・摩擦、軸の制限は第7回と同様にすべて仮定値であり、未計測です。
- 補間。 映像ののスローモーションシーンは、1 msの記録の間を線形補間して描画しています。1 msより短い接触内の変化(物理ステップ0.5 ms単位)は映像には表示されません。
- 表示専用の図形。 レール・キャリッジ・手首・持ち手の形状はイラスト用であり、ハードウェア設計(第3部)の寸法ではありません。ラケット板(15×16 cm、厚さ14 mm)と関節の配置のみが物理モデルと同じです。
13. 次回予告
次回のテーマは、低いボールに対応し作業空間を広げる奥行き軸をロボットモデルに追加し、同じ評価を再度実行することです(第7部で予告)。今回の録画・レンダリングツールをそのまま使用し、奥行き軸が追加されることで「打つタイミング」の定義がどのように変わるのかも、同じ7つのステップで紹介する予定です。
ティティの一言。 成功率の表でしか見ていなかったロボットをボール一つで追いかけてみると、最後の39 msで計画を再立案し、限界の8倍の負荷を要求されながらもラケットにボールを当てるシーンがありました。数字一つの裏に、こんなにもギリギリの瞬間が隠されていたんですね!
参考
外部リンクは第7部と同じアドレスです(第7部で2026-10-18に公開されることを確認しました)。
- MuJoCo: https://github.com/google-deepmind/mujoco
- 公開初期のボールの状態: https://github.com/google-deepmind/competitive_robot_table_tennis(© 2025 Google LLC, CC BY 4.0。データの再配布はせず、シミュレーション結果のみを掲載しています。)
- 字幕フォント: NanumGothic(SIL Open Font License 1.1、Ubuntu fonts-nanumパッケージ)
- 関連記事: 第5部 古典制御の基準線, 第6部 DeepMind卓球ロボットの改善の方向性, 第7部 卓球アームの強化学習
- 「卓球ロボットアームの基礎」: 第4部 逆運動学、第6部 ボール飛行方程式、第7部 打撃方程式、第8部 軌道生成、第9部 制御
- 引用コードおよび図・映像の軌道は、TT Lab実験コードの出力です。