メインコンテンツ

generalizedInverseKinematics

複数拘束をもつ逆運動学ソルバーの作成

説明

generalizedInverseKinematics System object™ は、指定された rigidBodyTree オブジェクトに対して、非線形の運動学的拘束の集合を満たすジョイント コンフィギュレーションを求めるか、ソルバーがすべての拘束を満たすことができない場合には最も近い実行可能解を返します。

オブジェクトを呼び出す前に、拘束タイプ ConstraintInputs を指定します。オブジェクトを呼び出した後、拘束入力を変更するには、release(gik) を呼び出します。

拘束入力を拘束オブジェクトとして指定し、そこに渡される以下のオブジェクトを使用して generalizedInverseKinematics を呼び出します。拘束オブジェクトを作成するには、以下のオブジェクトを使用します。

唯一の拘束がエンドエフェクタの位置と方向である場合は、代わりに inverseKinematics をソルバーとして使用することを検討します。

閉形式逆運動学の解析解の詳細については、analyticalInverseKinematics を参照してください。

汎用逆運動学の拘束を解くには、次の手順に従います。

  1. generalizedInverseKinematics オブジェクトを作成して、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

gik = generalizedInverseKinematics は剛体ツリー モデルが指定されない汎用逆運動学ソルバーを返します。このソルバーを使用する前に rigidBodyTree モデルと ConstraintInputs プロパティを指定します。

gik = generalizedInverseKinematics(PropertyName=Value) は、オプションである 1 つ以上の名前と値の引数を使用して、汎用逆運動学ソルバーのプロパティを指定します。たとえば、generalizedInverseKinematics(RigidBodyTree=rigidbodytree,ConstraintInputs=inputTypes) は剛体ツリー モデルおよび想定される拘束入力が指定された汎用逆運動学ソルバーを作成します。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトを呼び出した後にプロパティ値を変更することはできません。オブジェクトは呼び出し時にロックされ、関数 release でロック解除されます。

プロパティが "調整可能" な場合は、いつでも値を変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

この プロパティ は読み取り専用です。

拘束入力の数。スカラーとして指定します。このプロパティの値は、ConstraintInputs プロパティで指定された拘束タイプの数です。

拘束入力タイプ。文字ベクトルの cell 配列として指定します。考えられる拘束入力タイプと関連付けられているその拘束オブジェクトは次のとおりです。

拘束された動きが 2 つのボディ間の追加ジョイントと類似するように、2 つの鋼体を拘束する閉ループのジョイントの拘束もあります。それぞれの拘束入力タイプと関連付けられているその拘束オブジェクトは次のとおりです。

拘束オブジェクトを使用して必須パラメーターを指定し、これらのオブジェクト タイプをオブジェクトを呼び出すときにオブジェクトに渡します。以下に例を示します。

汎用逆運動学ソルバー オブジェクトを作成します。RigidBodyTree プロパティと ConstraintInputs プロパティを指定します。

gik = generalizedInverseKinematics(...
					'RigidBodyTree',rigidbodytree,
					'ConstraintInputs',{'position','aiming'});

対応する拘束オブジェクトを作成します。

positionTgt = constraintPositionTarget('left_palm');
aimConst = constraintAiming('right_palm');

拘束オブジェクトを初期推定と共にソルバー オブジェクトに渡します。

configSol = gik(initialGuess,positionTgt,aimConst);

剛体ツリー モデル。rigidBodyTree オブジェクトとして指定します。ソルバーを使用する前にこのプロパティを定義します。剛体ツリー モデルを変更したら、その剛体ツリーをこのプロパティに再割り当てします。以下に例を示します。

IK ソルバーを作成し、剛体ツリーを指定します。

gik = generalizedInverseKinematics(...
					'RigidBodyTree',rigidbodytree,
					'ConstraintInputs',{'position','aiming'});

剛体ツリー モデルを変更します。

addBody(rigidbodytree,rigidBody('body1'),'base')

剛体ツリーを IK ソルバーに再割り当てします。剛体ツリー モデルを変更する前にソルバーまたは関数 step が呼び出された場合、release を使用して、プロパティの変更を許可します。

gik.RigidBodyTree = rigidbodytree;

逆運動学の求解アルゴリズム。"BFGSGradientProjection""LevenbergMarquardt"、または "fminconsqp" として指定します。各アルゴリズムの詳細については、逆運動学のアルゴリズムを参照してください。

"fminconsqp" アルゴリズムには Optimization Toolbox™ が必要です。

指定したアルゴリズムに関連付けられたパラメーター。構造体として指定します。構造体のフィールドはアルゴリズムに固有です。ソルバー パラメーターを参照してください。

使用法

説明

[configSol,solInfo] = gik(initialguess,constraintObj,...,constraintObjN) は初期推定および拘束の説明オブジェクトのコンマ区切りリストに基づいて、ジョイント コンフィギュレーション configSol を検出します。拘束の説明の数は ConstraintInputs プロパティによって決まります。

入力引数

すべて展開する

ロボット コンフィギュレーションの初期推定。構造体配列またはベクトルとして指定します。initialguess の値は gik で指定されている RigidBodyTree プロパティで指定されたオブジェクトの DataFormat プロパティによって決まります。

この初期推定を使用して、ターゲットのロボット コンフィギュレーションにソルバーを誘導します。ただし、解がこの初期推定に近いことは保証されていません。

gikConstraintInputs プロパティによって定義される拘束の説明。以下の 1 つ以上の拘束オブジェクトとして指定します。

出力引数

すべて展開する

ロボット コンフィギュレーションの解。gik で指定されている RigidBodyTree プロパティで指定されたオブジェクトの DataFormat プロパティに応じて、構造体配列またはベクトルとして返されます。

この構造体配列には次のフィールドが含まれます。

  • JointNameRigidBodyTree ロボット モデルで指定されたジョイント名の文字ベクトル

  • JointPosition — 対応するジョイントの位置

ベクトル出力は、構造体の出力に対して JointPosition で与えられるジョイント位置の配列です。

このジョイント コンフィギュレーションは、ターゲットのエンドエフェクタ姿勢を解の許容誤差の範囲内で達成する、計算された解です。

メモ

回転ジョイントについて、ジョイント制限がジョイント位置のラッピングが発生する 2*pi の範囲を超えた場合、返されるジョイント位置はジョイントの下限に最も近いものになります。

解法情報。以下のフィールドを含む構造体として返されます。

  • Iterations — ソルバーによって実行される反復回数。

  • NumRandomRestarts — ソルバーが局所的最小値で止まったことによるランダム リスタートの回数。

  • ConstraintViolation — 拘束に関する情報。構造体配列として返されます。配列の各構造体には以下のフィールドが含まれます。

    • Type:ConstraintInputs プロパティで指定された、対応する拘束入力のタイプ。

    • Violation:対応する拘束タイプの拘束違反のベクトル。0 は拘束が満たされることを示します。

  • ExitFlag — ソルバーの実行と、ソルバーが戻った原因に関する詳細を提供するコード。各ソルバー タイプの終了フラグについては、終了フラグを参照してください。

  • Status — 解が各拘束 ('success') で定義された許容誤差の範囲内に収まっているかを記述する文字ベクトル。解が許容誤差の範囲外の場合、ソルバーが見つけられる最適解が与えられます ('best available')。

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、以下の構文を使用します。

release(obj)

すべて展開する

stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

すべて折りたたむ

汎用逆運動学 (GIK) で fmincon SQP ソルバー アルゴリズムを使用して、エンドエフェクタが特定の境界内で下向きになるコンフィギュレーションを求めます。

ロボット モデルを読み込み、GIK ソルバーを作成します。ソルバーのアルゴリズムを fmincon SQP に設定します。

robot = loadrobot("universalUR5",DataFormat="row");
gik = generalizedInverseKinematics( ...
    RigidBodyTree=robot, ...
    SolverAlgorithm="fminconsqp", ...
    ConstraintInputs={"orientation","cartesian"});

方向ターゲットの拘束と直交座標の範囲の拘束を定義します。

ee = robot.BodyNames{end};
oriTgt = constraintOrientationTarget(ee);
oriTgt.TargetOrientation = eul2quat([0 pi 0],"ZYX");
cartBnds = constraintCartesianBounds(ee);
cartBnds.Bounds = [-0.4 0.4; 0.4 0.8; 0.0 0.4];

初期推定コンフィギュレーションを設定し、方向ターゲットと直交座標の範囲の両方の拘束を満たすコンフィギュレーションを求めます。

initGuessConfig = [pi/2 -pi/3 0 0 0 0];
[config,solutionInfo] = gik(initGuessConfig,oriTgt,cartBnds);

ソルバーによって返されるコンフィギュレーションを可視化し、exampleHelperShowCartesianBounds 補助関数を使用して直交座標の範囲を透明なパッチとして可視化します。

show(robot,config);
title(["End-Effector Meets Orientation","and Cartestian Bounds Constraints"]);
axis([-0.5 0.5 -0.1 0.9 -0.1 0.8])
exampleHelperShowCartesianBounds(cartBnds.Bounds,0.3)
hold off

Figure contains an axes object. The axes object with title End-Effector Meets Orientation and Cartestian Bounds Constraints, xlabel X, ylabel Y contains 29 objects of type patch, line.

指定した位置でロボット アームを保持し、ロボット ベースに向かう汎用逆運動学ソルバーを作成します。必要な拘束パラメーターをソルバーに渡す拘束オブジェクトを作成します。

Robotics System Toolbox™ loadrobotから KUKA iiwa 14 ロボット モデルを読み込みます。rigidBodyTree オブジェクトとして返されます。

manipulator = loadrobot("kukaIiwa14");

汎用逆運動学を解くための System object™ を作成します。

gik = generalizedInverseKinematics;

KUKA LBR ロボットを使用するように System object を設定します。

gik.RigidBodyTree = manipulator;

拘束入力として constraintAiming オブジェクトおよび constraintPositionTarget オブジェクトを必要とするようにソルバーに指定します。

gik.ConstraintInputs = {"position","aiming"};

2 つの拘束オブジェクトを作成します。

  1. iiwa_link_ee_kuka という名前のボディの原点はロボットの base 座標系を基準とする [0.0 0.5 0.5] に配置されます。

  2. iiwa_link_ee_kuka という名前のボディの "z" 軸はロボットの base 座標系の原点に向かいます。

posTgt = constraintPositionTarget("iiwa_link_ee_kuka");
posTgt.TargetPosition = [0.0 0.5 0.5];

aimCon = constraintAiming("iiwa_link_ee_kuka");
aimCon.TargetPoint = [0.0 0.0 0.0];

拘束を満たすコンフィギュレーションを求めます。ConstraintInputs プロパティで指定された順序で、拘束オブジェクトを System object に渡す必要があります。ロボット コンフィギュレーションで初期推定を指定します。

q0 = homeConfiguration(manipulator); % Initial guess for solver
[q,solutionInfo] = gik(q0,posTgt,aimCon);

ソルバーによって返されるコンフィギュレーションを可視化します。

show(manipulator,q);
title(sprintf("Solver status: %s", solutionInfo.Status))
axis([-0.75 0.75 -0.75 0.75 -0.5 1])

Figure contains an axes object. The axes object with title Solver status: success, xlabel X, ylabel Y contains 29 objects of type patch, line.

ターゲット位置からベースの原点までのライン セグメントをプロットします。tool0 座標系の原点はセグメントの一方の端と一致し、その z 軸はセグメントと揃えられます。

hold on
plot3([0.0 0.0],[0.5 0.0],[0.5 0.0],"--o")
hold off

Figure contains an axes object. The axes object with title Solver status: success, xlabel X, ylabel Y contains 30 objects of type patch, line.

拡張機能

すべて展開する

バージョン履歴

R2017a で導入

すべて展開する