基本的な剛体ツリー モデルの作成
この例では、剛体ツリー ロボット モデルの要素を使用して自由度 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
関数 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);
対話型マーカーを移動して、目的のさまざまなグリッパー位置をテストします。この GUI は、逆運動学を使用して最適なジョイント コンフィギュレーションを生成します。対話型 GUI の詳細については、interactiveRigidBodyTree
オブジェクトを参照してください。
次のステップ
これで MATLAB® でモデルが作成されたので、さまざまな操作を実行できます。
逆運動学を使用して、目的のエンドエフェクタ位置に基づくジョイント コンフィギュレーションを取得します。モデル パラメーター以外の追加のロボット拘束を指定します。これには照準拘束、直交座標の範囲、姿勢ターゲットなどがあります。
台形速度プロファイル、B スプライン、または多項式軌跡を使用して、ウェイポイントなどのパラメーターに基づき、軌跡の生成を生成します。
ロボット モデルと Rapidly Exploring Random Tree (RRT) パス プランナーを利用してマニピュレーター プランニングを行います。
環境内の障害物との衝突検出をチェックし、ロボットの動作が安全かつ効果的であることを確認します。