2つの広範なアプローチがあります。
- エンドエフェクタポーズが与えられた解析ソリューションは、ジョイント座標を直接計算します。一般に、ソリューションは一意ではないため、可能なジョイント座標のセットを計算できます。ロボットがその環境(またはそれ自体)で物事にぶつかる原因となる場合もあれば、特定のソリューションの選択に役立つ場合もあります。肘を上(または下)にしたり、ロボットの腕を胴体の左(または右)にしたい場合があります。一般に、解析ソリューションの取得には制約があります。6軸ロボットの場合、球面手首(すべての軸が交差する)が想定されます。多くの異なるタイプのロボットの分析ソリューションは数十年にわたって計算されてきたものであり、おそらくロボットのソリューションを提供する論文を見つけることができます。
- 他の回答で説明されている数値解は、最適化アプローチを使用して、順運動学が正しい解を与えるまで関節座標を調整します。繰り返しになりますが、これに関する膨大な文献と、多くのソフトウェアがあります。
Robotics Toolbox for MATLABを使用して、Denavit-Hartenbergパラメーターを使用して、よく知られている6軸ロボットのモデルを作成します
>> mdl_puma560
>> p560
p560 = 
Puma 560 [Unimation]:: 6 axis, RRRRRR, stdDH, fastRNE            
 - viscous friction; params of 8/95;                             
+---+-----------+-----------+-----------+-----------+-----------+
| j |     theta |         d |         a |     alpha |    offset |
+---+-----------+-----------+-----------+-----------+-----------+
|  1|         q1|          0|          0|     1.5708|          0|
|  2|         q2|          0|     0.4318|          0|          0|
|  3|         q3|    0.15005|     0.0203|    -1.5708|          0|
|  4|         q4|     0.4318|          0|     1.5708|          0|
|  5|         q5|          0|          0|    -1.5708|          0|
|  6|         q6|          0|          0|          0|          0|
+---+-----------+-----------+-----------+-----------+-----------+
次に、ランダムな関節座標を選択します
>> q = rand(1,6)
q =
    0.7922    0.9595    0.6557    0.0357    0.8491    0.9340
次に、順運動学を計算します
>> T = p560.fkine(q)
T = 
   -0.9065    0.0311   -0.4210  -0.02271
    0.2451    0.8507   -0.4649   -0.2367
    0.3437   -0.5247   -0.7788    0.3547
         0         0         0         1
6つの関節と球形の手首を持つロボットの公開された解析ソリューションを使用して、逆運動学を計算できます
>> p560.ikine6s(T)
ans =
    0.7922    0.9595    0.6557    0.0357    0.8491    0.9340
そして出来上がり、元の関節座標があります。
数値解
>> p560.ikine(T)
Warning: ikine: rejected-step limit 100 exceeded (pose 1), final err 0.63042 
> In SerialLink/ikine (line 244) 
Warning: failed to converge: try a different initial value of joint coordinates 
> In SerialLink/ikine (line 273) 
ans =
     []
失敗しました。これは、通常、適切な初期ソリューションが必要なため、これは一般的な問題です。やってみよう
>> p560.ikine(T, 'q0', [1 1 0 0 0 0])
ans =
    0.7922    0.9595    0.6557    0.0357    0.8491    0.9340
これで回答が得られますが、分析ソリューションとは異なります。IK問題には複数の解決策があるので、それでも大丈夫です。フォワードキネマティクスを計算することにより、ソリューションが正しいことを確認できます。
>> p560.fkine(ans)
ans = 
   -0.9065    0.0311   -0.4210  -0.02271
    0.2451    0.8507   -0.4649   -0.2367
    0.3437   -0.5247   -0.7788    0.3547
         0         0         0         1
そして、それが私たちが始めた変換と同じであることを確認します(それはそうです)。
その他のリソース: