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
そして、それが私たちが始めた変換と同じであることを確認します(それはそうです)。
その他のリソース: