Main Content

基本的な剛体ツリー モデルの作成

この例では、剛体ツリー ロボット モデルの要素を使用して自由度 5 の基本的なロボット アームを作成する方法を説明します。この例で作成するモデルは、サーボと集積回路基板で作成された一般的な卓上ロボット アームを表します。

一般的な市販のロボットのセットからロボット モデルを読み込むには、関数 loadrobot を使用します。例については、事前定義されているロボット モデルの読み込みを参照してください。

ロボットの URDF ファイルまたは Simscape Multibody™ モデルがある場合は、importrobot を使用して剛体ツリーとしてインポートできます。例については、URDF ファイルからのロボットのインポートを参照してください。

剛体要素の作成

まず、rigidBodyTree ロボット モデルを作成します。剛体ツリー ロボット モデルは、剛体とそれを接続するジョイントで構成されるロボット全体を表します。ロボットのベースは、ワールド座標を定義する固定フレームです。最初のボディを追加すると、そのボディがベースに接続されます。

robot = rigidBodyTree("DataFormat","column");
base = robot.Base;

次に、一連のリンク機構を rigidBody オブジェクトとして作成します。ロボットは、1 つの回転ベース、3 つの矩形アーム、および 1 つのグリッパーで構成されます。

rotatingBase = rigidBody("rotating_base");
arm1 = rigidBody("arm1");
arm2 = rigidBody("arm2");
arm3 = rigidBody("arm3");
gripper = rigidBody("gripper");

形状と次元が異なる各剛体の衝突オブジェクトを作成します。衝突オブジェクトを作成すると、既定では座標系がオブジェクトの中央に配置されます。Pose プロパティを設定して、座標系を "z" 軸に沿って各ボディの下部に移動します。簡略化のため、グリッパーを球面としてモデル化します。

collBase = collisionCylinder(0.05,0.04); % cylinder: radius,length
collBase.Pose = trvec2tform([0 0 0.04/2]);
coll1 = collisionBox(0.01,0.02,0.15); % box: length, width, height (x,y,z)
coll1.Pose = trvec2tform([0 0 0.15/2]);
coll2 = collisionBox(0.01,0.02,0.15); % box: length, width, height (x,y,z)
coll2.Pose = trvec2tform([0 0 0.15/2]);
coll3 = collisionBox(0.01,0.02,0.15); % box: length, width, height (x,y,z)
coll3.Pose = trvec2tform([0 0 0.15/2]);
collGripper = collisionSphere(0.025); % sphere: radius
collGripper.Pose = trvec2tform([0 -0.015 0.025/2]);

衝突ボディを剛体オブジェクトに追加します。

addCollision(rotatingBase,collBase)
addCollision(arm1,coll1)
addCollision(arm2,coll2)
addCollision(arm3,coll3)
addCollision(gripper,collGripper)

ジョイントの接続

各剛体は回転ジョイントを使用して接続されます。各ボディの rigidBodyJoint オブジェクトを作成します。"x" 軸を矩形アーム ジョイントの回転軸として指定します。グリッパーに対して "y" 軸を指定します。既定の軸は "z" 軸です。

jntBase = rigidBodyJoint("base_joint","revolute");
jnt1 = rigidBodyJoint("jnt1","revolute");
jnt2 = rigidBodyJoint("jnt2","revolute");
jnt3 = rigidBodyJoint("jnt3","revolute");
jntGripper = rigidBodyJoint("gripper_joint","revolute");

jnt1.JointAxis = [1 0 0]; % x-axis
jnt2.JointAxis = [1 0 0];
jnt3.JointAxis = [1 0 0];
jntGripper.JointAxis = [0 1 0] % y-axis
jntGripper = 
  rigidBodyJoint with properties:

                      Type: 'revolute'
                      Name: 'gripper_joint'
                 JointAxis: [0 1 0]
            PositionLimits: [-3.1416 3.1416]
              HomePosition: 0
    JointToParentTransform: [4x4 double]
     ChildToJointTransform: [4x4 double]

ボディ間のジョイント接続の変換を設定します。各変換は、前の剛体の長さ ("z" 軸) の次元に基づきます。回転時の衝突を回避するために、アーム ジョイントを "x" 軸方向にオフセットします。

setFixedTransform(jnt1,trvec2tform([0.015 0 0.04]))
setFixedTransform(jnt2,trvec2tform([-0.015 0 0.15]))
setFixedTransform(jnt3,trvec2tform([0.015 0 0.15]))
setFixedTransform(jntGripper,trvec2tform([0 0 0.15]))

ロボットの組み立て

元のベースを含むボディとジョイントの両方のオブジェクト配列を作成します。各ジョイントをボディに追加し、ボディをツリーに追加します。各ステップを可視化します。

bodies = {base,rotatingBase,arm1,arm2,arm3,gripper};
joints = {[],jntBase,jnt1,jnt2,jnt3,jntGripper};

figure("Name","Assemble Robot","Visible","on")
for i = 2:length(bodies) % Skip base. Iterate through adding bodies and joints.
            bodies{i}.Joint = joints{i};
            addBody(robot,bodies{i},bodies{i-1}.Name)
            show(robot,"Collisions","on","Frames","off");
            drawnow;
end

Figure Assemble Robot contains an axes object. The axes object with xlabel X, ylabel Y contains an object of type patch. These objects represent base, rotating_base, rotating_base_coll_mesh.

Figure Assemble Robot contains an axes object. The axes object with xlabel X, ylabel Y contains 5 objects of type patch. These objects represent base, rotating_base, arm1, arm2, arm3, gripper, rotating_base_coll_mesh, arm1_coll_mesh, arm2_coll_mesh, arm3_coll_mesh, gripper_coll_mesh.

関数 showdetails を呼び出して、最終的なツリー情報のリストを表示します。親子関係とジョイント タイプが正しいことを確認します。

showdetails(robot)
--------------------
Robot: (5 bodies)

 Idx            Body Name           Joint Name           Joint Type            Parent Name(Idx)   Children Name(s)
 ---            ---------           ----------           ----------            ----------------   ----------------
   1        rotating_base           base_joint             revolute                     base(0)   arm1(2)  
   2                 arm1                 jnt1             revolute            rotating_base(1)   arm2(3)  
   3                 arm2                 jnt2             revolute                     arm1(2)   arm3(4)  
   4                 arm3                 jnt3             revolute                     arm2(3)   gripper(5)  
   5              gripper        gripper_joint             revolute                     arm3(4)   
--------------------

ロボット モデルの操作

interactiveRigidBodyTree オブジェクトを使用してロボット モデルを可視化し、次元を確認します。対話型 GUI を使用してモデルを移動します。特定のボディを選択してそのジョイント位置を設定できます。Robotics System Toolbox™ に用意されているより詳細なモデルを操作するには、"Load Predefined Robot Models" または関数 loadrobot を参照してください。

figure("Name","Interactive GUI")
gui = interactiveRigidBodyTree(robot,"MarkerScaleFactor",0.25);

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

対話型マーカーを移動して、目的のさまざまなグリッパー位置をテストします。この GUI は、逆運動学を使用して最適なジョイント コンフィギュレーションを生成します。対話型 GUI の詳細については、interactiveRigidBodyTree オブジェクトを参照してください。

次のステップ

これで MATLAB® でモデルが作成されたので、さまざまな操作を実行できます。

  • 逆運動学を使用して、目的のエンドエフェクタ位置に基づくジョイント コンフィギュレーションを取得します。モデル パラメーター以外の追加のロボット拘束を指定します。これには照準拘束、直交座標の範囲、姿勢ターゲットなどがあります。

  • 台形速度プロファイル、B スプライン、または多項式軌跡を使用して、ウェイポイントなどのパラメーターに基づき、軌跡の生成を生成します。

  • ロボット モデルと Rapidly Exploring Random Tree (RRT) パス プランナーを利用してマニピュレーター プランニングを行います。

  • 環境内の障害物との衝突検出をチェックし、ロボットの動作が安全かつ効果的であることを確認します。