状態:草案(2026-10-18)、実測。 数値はノートPC(Apple M1 Max、macOS 26.5)のPython 3.9.6・numpy 2.0.2で直接計算しました。 時間は7回繰り返しの中央値(初回は除外)であり、数値解の時間は成功した300回の解き方の中央値です。元データとコード:作業ディレクトリ
measure/robot-arm-basics/のarm.py,m04_ik.py,out/m04_ik.json。例のアームは第3部の仮想設計であり、ハードウェアの実測値はありません。 参考資料は2026-10-18に閲覧しました。作成ルール:実測データを基本とし、測定できなかったものは「未計測」、確認できなかったものは「未確認」と表示します。
目次
1. 直感:カップをつかむ腕の形はさまざま
机の上のカップをつかむ際、肘を横に広げることも、体に密着させることもできます。手の位置と向きは同じですが、腕の形が異なります。逆に机の端の向こうにあるカップは、どのような形でもつかむことはできません。逆運動学(inverse kinematics, IK)の3つの事情がここにすべて詰まっています。
- 解が 複数存在する可能性がある。
- 解が 存在しない 可能性がある。
- 解が存在していても、特定の姿勢の周辺では関節を非常に大きく動かさなければラケットがわずかしか動かない(特異点).
卓球ロボットにおいて、逆運動学は打球ごとに、そして予測が修正されるたびに解き直されます。高速であり、常に収束し、以前の姿勢から急激に跳ね上がらない解を出力する必要があります。
2. 図:同じ目標、2つの解
3. 計算
3.1 2リンクアーム:余弦定理
肩から目標までの距離をrとすると、2つのリンクとrが三角形を形成します。余弦定理により肘の角度が求められます。
def ik2(x, y, elbow=+1):
c = (x*x + y*y - L1*L1 - L2*L2) / (2*L1*L2)
if abs(c) > 1:
return None # 닿지 않는 목표
q2 = elbow * acos(c) # +: 팔꿈치 아래, -: 팔꿈치 위
q1 = atan2(y, x) - atan2(L2*sin(q2), L1 + L2*cos(q2))
return q1, q2
acos が±の2つの値を与えるため、解が2つ存在します。|c| > 1 の場合は三角形が形成されないため、解はありません。判定が1行で済む点が解析解の大きなメリットです。
3.2 6軸アーム:手首の分離
第3部のサンプルアームは、手首の3軸が1点で交差します。そのため、6つの未知数を2段階に分けることができます。
- 位置の3つ。 ラケットの姿勢から手首の中心 p_c = p − d6·R[:, 2] を求めます。第1関節は p_c を上方から見た方向 atan2(y_c, x_c) またはその反対(+π)になります。その後、第2・第3関節は3.1節の2リンク問題となり、肘の上下の2つの解が得られます。
- 向きの3つ。 第1・第2・第3関節が決定されると R₀₃ が求まり、手首が担う残りの回転は R₃₆ = R₀₃ᵀ·R となります。この手首構造はZYZオイルラー角と同じ形式であるため、θ5 = atan2(±√(r13² + r23²), r33) により2つの解(手首の反転)が得られます。
2 × 2 × 2 = 8つの解になります。θ5 = 0 の場合、第4軸と第6軸が一直線になり、θ4 + θ6 のみが決定されます。これが手首特異点です。
3.3 数値解:ニュートン法と減衰最小二乗法
手首が1点で交差しないアームや7軸以上のアームには、解析解がないか、あるいは複雑すぎます。その場合は順運動学とヤコビ行列(第5部)のみを使用して反復計算により解きます。姿勢誤差 e(位置3 + 向き3)を減少させる関節の変化量 Δq を求める方法は3つあります。
유사역행렬(뉴턴-랩슨): Δq = J⁺ e
감쇠 최소제곱(DLS): Δq = Jᵀ (J Jᵀ + λ² I)⁻¹ e ‖J Δq − e‖² + λ²‖Δq‖² 를 최소화
야코비안 전치: Δq = α Jᵀ e, α = ⟨e, J Jᵀ e⟩ / ‖J Jᵀ e‖²
Modern Roboticsの6.2.1節ではニュートン・ラプソン法を取り上げ、Bussのチュートリアルでは3つの方法をまとめて解説しています。DLSはレーベンバーグ・マルカート法とも呼ばれます。特異値の観点から見ると、DLSは各方向のゲインを σ/(σ² + λ²) に変更します。σ が λ より大きい場合は疑似逆行列と同じになり、σ が 0 に近づくとゲインも 0 になります。特異点付近で関節が暴走するのを防ぐための仕組みです。
for it in range(max_iter):
e = pose_error(fk_dh(q), T_goal) # 위치 오차 3 + 축-각 방향 오차 3
if norm(e[:3]) < 1e-5 and norm(e[3:]) < 1e-4: # 0.01 mm, 0.006°
return q, True
J = jacobian(q)
dq = J.T @ np.linalg.solve(J @ J.T + lam**2 * np.eye(6), e)
q = q + dq
3.4 2軸直交ガントリー:逆運動学が足し算になる構造
ラケットを2軸直交ガントリー(水平のx、垂直のz)に搭載し、その先端にヨー・ピッチの2軸手首を配置した場合、逆運動学は以下の足し算だけで構成されます。
손목 요 ψ = atan2(n_x, n_y) (n 은 원하는 라켓 법선)
손목 피치 φ = atan2(n_z, √(n_x² + n_y²))
손목 중심 = 라켓 중심 − d · n
갠트리 x = 손목 중심 x, 갠트리 z = 손목 중심 z
解は1つだけであり、ガントリー軸のヤコビ行列は定数(単位行列)であるため特異点が存在しません。ラケットの速度も姿勢に関係なく軸の速度そのままに出力されます。その代わり、手首の中心がガントリー平面上にある必要があるため、ラケット中心のy(卓球台の長さ方向)は「ガントリー平面 + d·n_y」に縛られます。すなわち、 打点がほぼ1つの平面に固定されます。Koç他(2018)は、このような固定された仮想的な打撃平面が軌道を制限し、返球率を低下させると報告しています(実機における固定平面は約10〜40%、打撃の時刻と位置を同時に最適化した方式は約40〜60%)。そのため、Googleのシステムのようにガントリーの上に6軸アームを搭載し、両者のメリットを組み合わせた設計が登場します。
4. 実測
4.1 解析解:精度と時間
| 問題 | サンプル数 | 最大位置誤差 | 最大方向誤差 | 1回あたりの時間 |
|---|---|---|---|---|
| 2リンク平面(2つの解) | 目標 100,000個 | 6.9×10⁻¹⁶ m | - | 0.59 µs |
| 6軸手首分離(8つの解) | 姿勢 10,000個 | 1.1×10⁻¹⁵ m | 9.4×10⁻¹⁴ rad | 58 µs |
| 2軸ガントリー + 2軸手首 | - | (定義上正確) | - | 0.61 µs |
6軸の姿勢10,000個のすべてにおいて8つの解が得られ、その8つすべてを順運動学に入力して元の姿勢が正しく復元されることを確認しました。ランダムな関節角度で作成した姿勢であるため、初期の関節角度も常に8つの解のいずれかに戻りました(最大差 6.7×10⁻¹² rad)。
4.2 数値解:手法別の成功率と時間
ランダムな関節角度で目標姿勢を300個作成し、2つの出発点から解きました。「近傍」は正解の関節角度に標準偏差 0.3 rad のノイズを加えた出発点、「準備姿勢」はすべての目標に対して同一の固定姿勢です。最大200回反復し、成功基準は位置 0.01 mm・方向 10⁻⁴ rad です。
| 手法 | 出発点 | 成功率 | 反復回数 中央値/95パーセンタイル | 時間 中央値 | 1ステップの最大値(中央値) |
|---|---|---|---|---|---|
| 疑似逆行列 | 近傍 | 99.7% | 4 / 23 | 0.77 ms | 0.92 rad |
| 疑似逆行列 | 準備姿勢 | 99.3% | 16 / 45 | 2.5 ms | 61 rad |
| 疑似逆行列 + ステップ 0.3 rad 制限 | 準備姿勢 | 99.7% | 23 / 41 | 3.8 ms | 0.3 rad |
| DLS λ=0.01 | 準備姿勢 | 95.7% | 16 / 41 | 2.3 ms | 16 rad |
| DLS λ=0.05 | 準備姿勢 | 86.7% | 16 / 87 | 2.6 ms | 8.6 rad |
| DLS λ=0.1 | 準備姿勢 | 80.0% | 23 / 146 | 3.5 ms | 5.5 rad |
| DLS λ=0.01 + ステップ制限 | 準備姿勢 | 97.7% | 24 / 46 | 3.5 ms | 0.3 rad |
| ヤコビ転置 | 準備姿勢 | 1.3% | 130 / 184 | 17 ms | 1.3 rad |
予想とは異なる結果が2つありました。
- 減衰係数を大きくするほど成功率が低下しました。 λ が大きい場合、特異点で安全になる一方で通常の姿勢でもステップが小さくなり、200回以内に 0.01 mm まで到達できなかったケースが増加しました。位置(m)と方向(rad)を1つのベクトルに混在させて同じ λ を使用していることも原因の一つであると考えられます(推測)。Bussも、λ は特異点で耐えられる程度に大きく、収束が遅くならない程度に小さくすべきであると記すのみで、具体的な値は提示していません。
- 疑似逆行列は大部分において最終的に収束しますが、途中で1ステップが 61 rad 跳ね上がることもありました。 計算上は問題ありませんが、この中間値をそのままモーターに送信すると事故につながります。実際にはステップサイズを制限するか(表の「ステップ制限」)、収束した最終的な解のみを軌道生成器(第8部)に渡します。
ヤコビ転置は計算コストが最も低いものの、収束が非常に遅く、200回以内にほとんど完了しませんでした。解析解(58 µs)は、準備姿勢から出発した数値解(2.3 ms以上)と比較して約40倍、正解の近傍から出発した数値解(0.7 ms)と比較しても12倍高速でした。数値解は出発点によって8つの解のうち どの解にたどり着くか分からないという点も覚えておく必要があります。ロボットでは、現在の関節角度から出発して近い方の解を選択させ、解析解が存在する場合は8つの解の中から現在の姿勢に最も近い解を選択します。
4.3 特異点付近の1ステップ
姿勢の誤差(位置約1 mm、方向約 0.01 rad)を修正するための 1ステップの大きさを姿勢ごとに比較しました。
| 姿勢 | 最小特異値 σ_min | 条件数 | 疑似逆行列のステップ | DLS λ=0.05のステップ | DLSステップ後の残余誤差 |
|---|---|---|---|---|---|
| 通常姿勢 | 0.055 | 35 | 0.042 rad | 0.030 rad | 0.0009 |
| 手首 θ5 = 0.01 rad | 0.0020 | 977 | 1.77 rad | 0.034 rad | 0.0036 |
| 手首 θ5 = 0.001 rad | 0.0002 | 9,768 | 17.6 rad | 0.034 rad | 0.0036 |
| 肘がほぼ伸び切った状態(θ3 = π/2 + 0.001) | 0.00015 | 13,041 | 12.9 rad | 0.023 rad | 0.0019 |
特異点付近において、疑似逆行列は0.01の誤差を修正するために関節を2〜3回転させるよう指示します。DLSはステップを 0.03 rad に制限する代わりに、誤差の一部(上記表の残余誤差)を犠牲にします。「正確に合わせること」と「おとなしく動くこと」のトレードオフであり、実際のロボットではほぼ常に後者が選択されます。
4.4 届かない目標
2リンクアーム(到達限界 0.75 m)に対して 0.85 m 離れた目標を与え、50回繰り返しました。可能な限り近づいた距離は 0.10 m です。
| 手法 | 最終距離 | 最も近づいた距離 | 最大ステップ | 最後の5ステップ |
|---|---|---|---|---|
| 疑似逆行列 | 0.139 m | 0.100 m | 33.7 rad | 1.2, 2.6, 1.6, 1.3, 1.4 rad(振動し続ける) |
| DLS λ=0.05 | 0.145 m | 0.104 m | 1.10 rad | 毎回 1.05 rad(その場で往復) |
| DLS λ=0.2 | 0.100 m | 0.100 m | 0.36 rad | 10⁻¹⁰ rad(停止) |
解が存在しない場合、疑似逆行列は無限に振動し、小さな λ のDLSも同じ2つの姿勢の間を行き来します。λ を大きくすると、「最も近い姿勢」で静かにおとなしく停止します。Bussは、この状況で誤差ベクトルの大きさをリンク長の半分程度に切り詰めることで、小さな λ でも振動が軽減されると述べています。卓球ロボットにおいては、これが「ボールが作業空間の外側から来る」というよくある状況であるため、 解がないことを事前に判定する解析解が特に価値を持ちます。
5. 制限事項
- 関節角度の制限(例:±170°)および自己衝突は、逆運動学の計算内では処理していません。第5部で解を選択する際にのみ関節の制限を適用しています。
- DLSのλを固定値でのみ比較しました。σ_minに応じてλを変更する方法と、位置・方向誤差の単位を合わせる重みは測定していません(未測定)。
- 数値解の時間は、Pythonで反復ごとに順運動学とヤコビアンを再計算するコストが大部分を占めます。C++実装の時間は未測定です。
6. まとめ
- 2リンクは余弦定理、6軸球面手首アームは手首分離により閉形式解が得られます。解析解は解の数と「解なし」を一度に教えてくれます。
- 数値解はどのアームにも使えますが、出発点によって異なる解に収束し、途中で大きなステップを踏むことがあります。ステップ制限とダンピングが必要です。
- 特異点付近では、DLSは精度を少し犠牲にして関節の暴走を防ぎます。届かない目標に対しては、十分に大きなλが最も近い姿勢で停止させます。
- ガントリーの逆運動学は足し算であり特異点はありませんが、打点が1つの平面に制限されます。
ティティの一言。 同じボールを打つアームの姿勢が8通りもあります。その中から今の姿勢に一番近いものを選ぶのがコツで、届かないボールなら無理に追わず、一番近いところで止めなければいけません!
参考文献
すべての資料は2026-10-18に閲覧しました。
- Lynch, Park, Modern Robotics, 2017, 公開プレプリント、第6章(6.1 解析的IK、6.2.1 Newton–Raphson)。
- Buss, S. R., Introduction to Inverse Kinematics with Jacobian Transpose, Pseudoinverse and Damped Least Squares methods(PDF表記 2009-10-07)、第3〜6節。
- Koç, Maeda, Peters, Online optimal trajectory generation for robot table tennis, RAS 105 (2018), 著者公開版、図2・11。
- D'Ambrosio 他、 arXiv:2408.03906、II-A節。