10

2Dアーム(ジョイント付きの3本のスティックで構成)に逆運動学を実装しようとしています。一番下のアームを希望の位置に回転させることができます。今、私はいくつかの質問があります:

  1. 上腕を3番目の腕と一緒に動かして、腕の終点が目的の点に到達するようにするにはどうすればよいですか。両方に回転行列を使用する必要がありますか?はいの場合、誰かが私にいくつかの例またはヘルプを教えてくれますか?回転行列なしでこれを行う方法は他にありますか?

  2. 一番下の腕は一方向にのみ動きます。私はそれをグーグルで試しました、彼らは2つのベクトルの外積が腕の方向を与えると言っていますが、これは3D用です。私は2Dを使用しており、2つの2Dベクトルの外積はスカラーを与えます。だから、どうすればその方向を決定できますか?

Plzみんな助けていただければ幸いです。

よろしくお願いしますVikram

4

4 に答える 4

7

試してみますが、私のロボティクスは 20 年前のことなので、大目にみてください。

私が学んだ方法では、すべての関節は、現在の位置と方向に対して定義された独自の回転行列によって記述されていました。次に、回転行列を組み合わせて腕全体の終点の座標を計算しました。

これにより、探している効果が正確に得られました。1 つのジョイントのみを動かす (方向を変更する) ことができ、他のすべてのジョイントは自動的に追従しました。

ここで行列を回避する可能性はあまりありません。実際、同次座標を使用すると、すべてのジョイント計算 (回転と平行移動) を行列乗算でモデル化できます。利点は、完全な腕の位置を 1 つのマトリックス (および腕の原点) で記述できることです。

この変換行列を使用すると、逆運動学の問題に取り組むことができます。変換行列の要素は関節の角度に依存するため、「エンドポイント = 開始点 x 変換」の計算全体を連立方程式として扱い、開始点を使用できます。終点が既知の場合、このシステムを解いて未知の角度を決定できます。ここでの問題は、方程式が解けないか、複数の解が存在することです。

2 番目の質問はよくわかりませんが、何をお探しですか?

于 2010-04-12T21:31:18.327 に答える
6
  1. 回転行列の代わりに、回転はその角度または単位円の複素数で表すことができますが、実際には同じことです。さらに重要なことに、剛体変換Tの表現が必要です。これにより、3 番目のリンクの位置と向きを計算するようなものを記述できます。t1 * t2 * t3

  2. ベクトル間の角度atan2を計算するために使用します。

次の Python の例が示すように、小さな IK ソルバーを構築するには、これら 2 つの要素で十分です。

from gameobjects.vector2 import Vector2 as V
from matrix33 import Matrix33 as T
from math import sin, cos, atan2, pi
import random

gameobjectsライブラリには 2D 変換がないため、自分で作成する必要がありますmatrix33。そのインターフェースは のようなものgameobjects.matrix44です。

あるジョイントから次のジョイントへの変換のフォワード キネマティクス関数を定義します。ジョイントが によって回転しangle、その後に固定変換が続くと仮定しjointます。

def fk_joint(joint, angle): return T.rotation(angle) * joint

ツールの変換は、固定変換でtool == fk(joints, q)あり、関節角度です。jointsq

def fk(joints, q):
    prev = T.identity()
    for i, joint in enumerate(joints):
        prev = prev * fk_joint(joint, q[i])
    return prev

腕の付け根にオフセットがある場合は、T.identity()変換を置き換えます。

OPは、循環座標降下によって位置のIK問題を解決しています。アイデアは、一度に 1 つのジョイント変数を調整することによって、ツールを目標位置に近づけることです。を関節qの角度、 を関節prevの付け根の変形とする。ジョイントは、ツールとゴールの位置へのベクトル間の角度だけ回転する必要があります。

def ccd_step(q, prev, tool, goal):
    a = tool.get_position() - prev.get_position()
    b = goal - prev.get_position()
    return q + atan2(b.get_y(), b.get_x()) - atan2(a.get_y(), a.get_x())

ジョイントをトラバースし、ジョイント値が変更されるたびにツール構成を更新します。

def ccd_sweep(joints, tool, q, goal):
    prev = T.identity()
    for i, joint in enumerate(joints):
        next = prev * fk_joint(joint, q[i])
        q[i] = ccd_step(q[i], prev, tool, goal)
        prev = prev * fk_joint(joint, q[i])
        tool = prev * next.get_inverse() * tool
    return prev

fk()ccd_sweep()は 3D でも同じであることに注意してください。fk_joint()とを書き換えるだけですccd_step()

n同一のリンクを持つアームを構築cntし、ランダムなアーム構成から始めて、CCD スイープの反復を実行しますq

def ccd_demo(n, cnt):
    q = [random.uniform(-pi, pi) for i in range(n)]
    joints = [T.translation(0, 1)] * n
    tool = fk(joints, q)
    goal = V(0.9, 0.75)  # Some arbitrary goal.
    print "i     Error"
    for i in range(cnt):
        tool = ccd_sweep(joints, tool, q, goal)
        error = (tool.get_position() - goal).get_length()
        print "%d  %e" % (i, error)

ソルバーを試して、さまざまな数のリンクの収束率を比較できます。

>>> ccd_demo(3, 7)
i     Error
0  1.671521e-03
1  8.849190e-05
2  4.704854e-06
3  2.500868e-07
4  1.329354e-08
5  7.066271e-10
6  3.756145e-11
>>> ccd_demo(20, 7)
i     Error
0  1.504538e-01
1  1.189107e-04
2  8.508951e-08
3  6.089372e-11
4  4.485040e-14
5  2.601336e-15
6  2.504777e-15
于 2010-12-23T00:25:24.193 に答える
3

ロボット工学では、ほとんどの場合、順運動学と逆運動学にDHパラメーターを使用します。ウィキペディアには素晴らしい紹介があります。

于 2010-04-13T12:13:12.053 に答える
3

DH (Denavit-Hartenberg) 表記はソリューションの一部です。リンクの長さやジョイントの種類など、ロボットの機構を説明する一連の簡潔な値を収集するのに役立ちます。

そこから順運動学の計算が容易になります。最初に理解しなければならないことは、座標フレームをある場所から別の座標フレームに変換する方法です。たとえば、ロボット (またはその DH テーブル) が与えられた場合、1 つの座標フレーム (たとえば世界) に適用しなければならない回転と平行移動のセットは何ですか?ロボットの手首座標系。

すでにご存知かもしれませんが、同次変換行列はこのような変換に非常に役立ちます。これらは、回転と移動をカプセル化する 4x4 行列です。これらの行列のもう 1 つの非常に便利な特性は、2 つの座標フレームがリンクされ、回転と平行移動によって定義されている場合、2 つの行列を乗算すると、変換ターゲットをその乗算の積で乗算するだけでよいということです。

したがって、DH テーブルは、そのマトリックスを構築するのに役立ちます。

ただし、逆運動学はもう少し複雑で、アプリケーションによって異なります。複雑さは、同じ問題に対して複数の解決策があることから生じます。DOF の数が多いほど、解の数が多くなります。

腕を考えてください。周りの固いものをつまんでください。スペース内のいくつかの場所に腕を動かすことができますが、ピンチ ベクトルは変更されません。逆運動学の問題を解くには、どの解を選択するかを決定することも含まれます。

于 2010-04-14T16:09:25.793 に答える