汎用逆運動学を使用したデルタ ロボットの配置
rigidBodyTree
ロボット モデルを使用してデルタ ロボットをモデル化します。ロボットが確実に適切な動作をするように、汎用逆運動学 (GIK) の運動学的拘束を指定します。定義されたモデルと拘束に従うジョイント コンフィギュレーションの解を求めます。
デルタ ロボットの作成
通常、デルタ ロボットには閉ループの運動学的連鎖が含まれます。rigidBodyTree
オブジェクトは閉ループ連鎖をサポートしていません。これを回避するために、ロボットはツリーとしてモデル化され、デルタ ロボットのアームは未接続のままです。ロボット モデルを作成して rigidBodyTree object
を出力する補助関数を呼び出します。
後続の手順では、汎用逆運動学ソルバーが適用する拘束によってツリーの別々のアームを同時に動かし、それによって確実にロボットを運動学的に正確な方法で動作させます。
ロボットはかなり複雑なため、補助関数を使用して rigidBodyTree オブジェクトを作成します。
robot = exampleHelperDeltaRobot; show(robot);
ここに示すように、ロボットは 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);
これで、エンドエフェクタを移動したときに、拘束が満たされてアームが接続されたままになります。
汎用逆運動学のプログラムによる求解
対話型の可視化はソルバーの拘束を検証する場合に便利ですが、直接プログラムで使用する場合は、呼び出し可能な個別の 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);