Main Content

汎用逆運動学を使用したデルタ ロボットの配置

rigidBodyTree ロボット モデルを使用してデルタ ロボットをモデル化します。ロボットが確実に適切な動作をするように、汎用逆運動学 (GIK) の運動学的拘束を指定します。定義されたモデルと拘束に従うジョイント コンフィギュレーションの解を求めます。

デルタ ロボットの作成

通常、デルタ ロボットには閉ループの運動学的連鎖が含まれます。rigidBodyTree オブジェクトは閉ループ連鎖をサポートしていません。これを回避するために、ロボットはツリーとしてモデル化され、デルタ ロボットのアームは未接続のままです。ロボット モデルを作成して rigidBodyTree object を出力する補助関数を呼び出します。

後続の手順では、汎用逆運動学ソルバーが適用する拘束によってツリーの別々のアームを同時に動かし、それによって確実にロボットを運動学的に正確な方法で動作させます。

ロボットはかなり複雑なため、補助関数を使用して rigidBodyTree オブジェクトを作成します。

robot = exampleHelperDeltaRobot;
show(robot);

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 43 objects of type patch, line. These objects represent base, arm1_body1, arm1_body2, arm1_body3, arm1_body4, arm1_body5, arm1_body6, base_120, arm2_body1, arm2_body2, arm2_body3, arm2_body4, arm2_body5, arm2_body6, base_240, arm3_body1, arm3_body2, arm3_body3, arm3_body4, arm3_body5, arm3_body6, endEffector.

ここに示すように、ロボットは 3 本のアームで構成されていますが、従来のデルタ ロボットのコンフィギュレーションと一致するように接続する必要があります。

逆運動学的拘束の作成

generalizedInverseKinematics オブジェクトを作成してロボット モデルを指定します。パフォーマンスに基づいて最大反復回数を制限します。

gik1 = generalizedInverseKinematics('RigidBodyTree', robot);
gik1.SolverParameters.MaxIterations = 20;

ロボット モデルを可視化してボディを動かすための対話型マーカーを提供する interactiveRigidBodyTree オブジェクトを作成します。この対話機能は、運動学的拘束の検証に役立ちます。名前と値のペアを使用して gik1 ソルバーを指定します。方向ではなく xyz 位置のみに着目する姿勢重みベクトルを指定します。

viztree = interactiveRigidBodyTree(robot, 'IKSolver', gik1, 'SolverPoseWeights', [0 1]);

この対話型オブジェクトを使用して、エンドエフェクタをドラッグし、ロボットがどのように動くかを示すことができます。現時点の動作は、通常のデルタ ロボットに望ましいものではありません。

現在の座標軸を保存します。

ax = gca;

GIK ソルバーに拘束を追加して、アームが接続されていることを確認します。エンドエフェクタをもたない 2 本のアームを、エンドエフェクタを含むプライマリ アームの 6 番目のボディに接続します。

% Ensure that the body 6 of arm 2 maintains a pose relative to body 6 of arm 1
poseTgt1 = constraintPoseTarget('arm2_body6');
poseTgt1.ReferenceBody = 'arm1_body6';
poseTgt1.TargetTransform = trvec2tform([-sqrt(3)*0.5*0.2, 0.5*0.2, 0]) * eul2tform([2*pi/3, 0, 0]);

% Ensure that the body 6 of arm 3 maintains a pose relative to body 6 of arm 1
poseTgt2 = constraintPoseTarget('arm3_body6');
poseTgt2.ReferenceBody = 'arm1_body6';
poseTgt2.TargetTransform = trvec2tform([-sqrt(3)*0.5*0.2, -0.5*0.2, 0]) * eul2tform([-2*pi/3, 0, 0]);

これらの拘束をロボットに適用するには、vizTree オブジェクトに対して addConstraint を呼び出します。

addConstraint(viztree,poseTgt1);
addConstraint(viztree,poseTgt2);

Figure Interactive Visualization contains an axes object. The axes object with xlabel X, ylabel Y contains 53 objects of type patch, line, surface.

これで、エンドエフェクタを移動したときに、拘束が満たされてアームが接続されたままになります。

汎用逆運動学のプログラムによる求解

対話型の可視化はソルバーの拘束を検証する場合に便利ですが、直接プログラムで使用する場合は、呼び出し可能な個別の GIK ソルバーを作成します。このソルバーは、interactiveRigidBodyTree オブジェクトの IKSolver プロパティからコピーするか、個別に作成することができます。

gik2 = generalizedInverseKinematics('RigidBodyTree', robot);
gik2.SolverParameters.MaxIterations = 20;

GIK ソルバーには、エンドエフェクタの位置を定義するための追加の拘束が必要です。これは通常、対話型マーカーによって制御されます。TargetTransform を更新して、目的のさまざまなエンドエフェクタ位置の解を求めます。

poseTgt3 = constraintPoseTarget('endEffector');
poseTgt3.ReferenceBody = 'base';
poseTgt3.TargetTransform = trvec2tform([0, 0, -1]);

ソルバーで使用されるすべての拘束タイプを指定します。

gik2.ConstraintInputs = {'pose','pose', 'pose'};

指定した姿勢ターゲット拘束オブジェクトを使用して gik2 ソルバーを呼び出します。ロボットのホーム コンフィギュレーションの初期推定を指定します。解を表示します。

% Provide an initial guess for the solver
q0 = homeConfiguration(robot);

% Solve for a the target pose given to poseTgt3
[q, solutionInfo] = gik2(q0, poseTgt1, poseTgt2, poseTgt3);

% Visualize the results
figure;
show(robot, q);

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 43 objects of type patch, line. These objects represent base, arm1_body1, arm1_body2, arm1_body3, arm1_body4, arm1_body5, arm1_body6, base_120, arm2_body1, arm2_body2, arm2_body3, arm2_body4, arm2_body5, arm2_body6, base_240, arm3_body1, arm3_body2, arm3_body3, arm3_body4, arm3_body5, arm3_body6, endEffector.