ロボットアームの逆運動学(余弦定理と関節制御)
目標の物体を掴むため、手先座標 (x, y) から各モーターの回転角度を逆算する三角関数の幾何学
- 1
- 関節角度から手先位置を求めるのが「順運動学(FK)」、手先を行かせたい座標から各関節の角度を逆算するのが「逆運動学(IK)」
- 2
- 2自由度ロボットアームの逆運動学は、高校数学の「余弦定理」と「逆正接関数(atan2)」を用いることで厳密に代数的に解くことができる
- 3
- 産業用ロボット、手術支援ロボット、3Dゲームのキャラクターアニメーション(足の接地判定など)の基本アルゴリズム
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
工場の産業用ロボットやゲームの3Dキャラクターに「この座標を掴め/ここに着地しろ」と直感的に命令し、各関節モーターの回転角を自動計算するために生まれた。
身につく武器・思考力
高校数学の余弦定理と逆三角関数(atan2)だけで、産業用ロボットアームやゲームの足接地判定(IK)を完全に自作・制御できる実践工学スキルが手に入る。
実社会・ITでの活躍現場
- •ファナック・安川電機など産業用6軸多関節ロボットの精密溶接・自動ピッキング
- •ダビンチ(da Vinci)など遠隔手術支援ロボットの手先鉗子制御
- •Unreal Engine / Unity におけるキャラクターの段差・傾斜へのリアルな足の接地アニメーション
- •宇宙ステーション(ISS)のロボットアーム(カナダアーム2)による宇宙船キャプチャ
Layer 1 — 直感・シミュレーター
キャンバス内の任意の位置をクリックするか、目標座標 のスライダーを動かしてみよう。ロボットアームが自動的に余弦定理で2つの関節角度 を計算し、指定したターゲットに正確に手先を合わせる様子を観察できる。アームの届かない範囲(限界距離の外側)にターゲットを置いた場合の特異点警告も確認してみよう。
アーム長 の2関節ロボットアームにおいて、原点から目標位置までの距離が であるとき、関節2の角度 を求めるための基礎となる定理はどれか?
Layer 2 — 定義・受験・証明
定義
リンク長 を持つ2関節平面ロボットアームにおいて、手先の目標位置 が与えられたとき、各関節角 (ベース角)と (肘角)を求める問題を逆運動学(Inverse Kinematics: IK)と呼ぶ。 目標点までの距離を としたとき、余弦定理より肘角 は次式を満たす。
さらにベース角 は、目標方向の偏角 と三角形の内角 の差として求まる。
公式・数理モデル
証明・導出
幾何学的アプローチによる関節角の導出:
1. 【肘関節角 の導出】: 原点 、肘関節 、手先 が成す三角形 を考える。 辺の長さはそれぞれ 、、 である。 内角 を とすると、余弦定理より
ここで第2リンクの相対回転角 は外角にあたるため であり、 となる。 したがって、
として「肘上(Elbow Up)」と「肘下(Elbow Down)」の2通りの解が得られる。
2. 【ベース関節角 の導出】: 原点から目標点へのベクトルが 軸となす角は である。 三角形の内角 に対し、再び余弦定理を適用すると、
したがって肘上の解の場合、 と代数的に直接求まる。
押さえておきたいポイント
- 手先を行きたい場所へ動かすという直感的な指示を、モーターが理解できる回転角度へと翻訳するのが逆運動学の数学的役割である
- 解が存在するためには三角不等式 を満たす必要があり、範囲外はアームの届かない「到達不能領域」となる
- 腕が完全に伸びきった状態()などはヤコビ行列の行列式がゼロになる「特異点(Singularity)」と呼ばれ、制御不能や急激な回転速度の跳ね上がりが生じるため、現場では特異点回避アルゴリズムが組み込まれる
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
産業用ロボット・ロボットハンドの軌道追従IKソルバー
コンベア上を流れる製品をピッキングする際、カメラが検出した製品座標 に瞬時にアーム手先を移動させる。高自由度アーム(6軸・7軸マニピュレータ)では幾何解法に加えてヤコビ行列の擬似逆行列(Moore-Penrose擬似逆行列)を用いた減衰最小二乗法(DLS法)によりリアルタイム数値計算が行われる。
1// 2リンク平面ロボットアームの逆運動学ソルバー (TypeScript)2interface ArmAngles {3 theta1: number; // ベース関節角 (rad)4 theta2: number; // 肘関節角 (rad)5 reachable: boolean;6}78function solve2DInverseKinematics(9 x: number,10 y: number,11 l1: number,12 l2: number13): ArmAngles {14 const d2 = x * x + y * y;15 const d = Math.sqrt(d2);1617 // 到達可否判定(届かない、または近すぎて縮めない)18 if (d > l1 + l2 || d < Math.abs(l1 - l2)) {19 return { theta1: 0, theta2: 0, reachable: false };20 }2122 // 1. 肘角 theta2 (余弦定理)23 const cosTheta2 = (d2 - l1 * l1 - l2 * l2) / (2 * l1 * l2);24 const clampedCosTheta2 = Math.max(-1, Math.min(1, cosTheta2));25 const theta2 = Math.acos(clampedCosTheta2); // 肘上の解2627 // 2. ベース角 theta128 const alpha = Math.atan2(y, x);29 const cosBeta = (l1 * l1 + d2 - l2 * l2) / (2 * l1 * d);30 const clampedCosBeta = Math.max(-1, Math.min(1, cosBeta));31 const beta = Math.acos(clampedCosBeta);32 const theta1 = alpha - beta;3334 return { theta1, theta2, reachable: true };35}3637// 溶接ロボットの手先移動テスト38const target = { x: 150, y: 120 };39const result = solve2DInverseKinematics(target.x, target.y, 120, 100);4041if (result.reachable) {42 const deg1 = (result.theta1 * 180 / Math.PI).toFixed(1);43 const deg2 = (result.theta2 * 180 / Math.PI).toFixed(1);44 console.log(`目標到達可能: モーター1角度=${deg1}°, モーター2角度=${deg2}°`);45} else {46 console.log("目標はアームの可動限界外です");47}
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元