最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

robotics.RigidBodyTree クラス

パッケージ: robotics

ツリー構造のロボットを作成

説明

RigidBodyTree は、剛体とジョイントとの接続性の表現です。このクラスを使用して、MATLAB® でロボット マニピュレーター モデルを構築します。Unified Robot Description Format (URDF) を使用して指定されたロボット モデルがある場合、importrobot を使用してロボット モデルをインポートします。

剛体ツリー モデルは、RigidBody オブジェクトとしての剛体から構成されます。各剛体には、その剛体が親ボディに対してどのように動けるかを定義する Joint オブジェクトが関連付けられています。setFixedTransform を使用して、ジョイントの座標系と隣接ボディの 1 つの座標系の固定変換を定義します。RigidBodyTree クラスのメソッドを使用して、モデルに対して剛体を追加、置換、または削除できます。

ロボット ダイナミクスの計算も可能です。ロボット モデルの各 RigidBody について、MassCenterOfMass、および Inertia プロパティを指定します。順ダイナミクスと逆ダイナミクスを外力ありまたはなしで計算して、与えられたロボットのジョイント運動とジョイント入力に対するダイナミクスの量を計算できます。ダイナミクス関連の関数を使用するには、DataFormat プロパティを "row" または "column" に設定します。

また、特定の剛体ツリー モデルに対して、ロボット工学の逆運動学アルゴリズムを使用して目標となるエンドエフェクタ位置のジョイント角度を計算するために、ロボット モデルを使用することもできます。InverseKinematics または GeneralizedInverseKinematics を使用する際には、剛体ツリー モデルを指定してください。

show メソッドは、ボディ メッシュの可視化をサポートします。メッシュは .stl ファイルとして指定され、addVisual を使用して個々の剛体に追加できます。また、関数 importrobot は、ご使用の URDF ロボット モデルで指定されているすべてのアクセス可能な .stl ファイルを既定で読み込みます。

構築

robot = robotics.RigidBodyTree は、ツリー構造のロボット オブジェクトを作成します。addBody を使用してそれに剛体を追加します。

robot = robotics.RigidBodyTree("MaxNumBodies",N,"DataFormat",dataFormat) は、コード生成時に、ロボットで許可されるボディ数の上限を指定します。また、DataFormat プロパティを、名前と値のペアとして指定しなければなりません。

プロパティ

すべて展開する

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

ロボット モデル内のボディ数 (ベースを含まない)。整数として返されます。

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

ロボット モデル内の剛体のリスト。ハンドルの cell 配列として返されます。このリストを使用して、モデル内の特定の RigidBody オブジェクトにアクセスします。また、robotics.RigidBodyTree.getBody を呼び出して、名前によってボディを取得することもできます。

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

剛体の名前。文字ベクトルの cell 配列として返されます。

ロボットのベース名。string スカラーまたは文字ベクトルとして返されます。

ロボットにかかる重力加速度。[x y z] ベクトルとして、メートル毎秒毎秒単位で指定します。各要素は、ロボットの base 座標系の、その方向への加速度に対応します。

運動学およびダイナミクス関数の入出力データ形式。"struct""row"、または "column" として指定します。ダイナミクス関数を使用するには、"row" または "column" を使用しなければなりません。

メソッド

addBodyAdd body to robot
addSubtreeAdd subtree to robot
centerOfMassCenter of mass position and Jacobian
copyCopy robot model
externalForceCompose external force matrix relative to base
forwardDynamicsJoint accelerations given joint torques and states
geometricJacobianロボット コンフィギュレーションの幾何学的ヤコビアン
getBodyGet robot body handle by name
getTransformGet transform between body frames
gravityTorqueJoint torques that compensate gravity
homeConfigurationGet home configuration of robot
inverseDynamicsRequired joint torques for given motion
massMatrixJoint-space mass matrix
randomConfigurationGenerate random configuration of robot
removeBodyRemove body from robot
replaceBodyReplace body on robot
replaceJointReplace joint on body
showロボット モデルを Figure に表示
showdetailsShow details of robot model
subtreeCreate subtree from robot model
velocityProductJoint torques that cancel velocity-induced forces

すべて折りたたむ

剛体および対応するジョイントを剛体ツリーに追加します。それぞれの RigidBody オブジェクトは Joint オブジェクトを含み、addBody を使用して RigidBodyTree に追加しなければなりません。

剛体ツリーを作成します。

rbtree = robotics.RigidBodyTree;

固有の名前をもつ剛体を作成します。

body1 = robotics.RigidBody('b1');

回転ジョイントを作成します。既定では、RigidBody オブジェクトには固定ジョイントが付属します。body1.Joint プロパティに新しい Joint オブジェクトを割り当て、ジョイントを置換します。

jnt1 = robotics.Joint('jnt1','revolute');
body1.Joint = jnt1;

剛体をツリーに追加します。剛体を接続するボディ名を指定します。最初のボディなので、ツリーのベース名を使用します。

basename = rbtree.BaseName;
addBody(rbtree,body1,basename)

ツリーに対して showdetails を使用して、剛体とジョイントが正しく追加されたことを確認します。

showdetails(rbtree)
--------------------
Robot: (1 bodies)

 Idx    Body Name   Joint Name   Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------   ----------   ----------    ----------------   ----------------
   1           b1         jnt1     revolute             base(0)   
--------------------

Puma560® ロボットの Denavit-Hartenberg (DH) パラメーターを使用して、ロボットを構築します。各剛体は 1 つずつ追加され、子から親への変換がジョイント オブジェクトによって指定されます。

DH パラメーターは、各剛体がどのように親に接続されているかを基準として、ロボットのジオメトリを定義します。わかりやすくするために、Puma560 ロボットのパラメーターを行列で設定します。Puma ロボットは連続チェーンのマニピュレーターです。DH パラメーターは、前のジョイント接続に対応する行列内の前の行との相対値です。

dhparams = [0   	pi/2	0   	0;
            0.4318	0       0       0
            0.0203	-pi/2	0.15005	0;
            0   	pi/2	0.4318	0;
            0       -pi/2	0   	0;
            0       0       0       0];

剛体ツリー オブジェクトを作成して、ロボットを構築します。

robot = robotics.RigidBodyTree;

最初の剛体を作成し、ロボットに追加します。剛体を追加するには次を行います。

  1. RigidBody オブジェクトを作成し、固有の名前を付けます。

  2. Joint オブジェクトを作成し、固有の名前を付けます。

  3. setFixedTransform を使用して、ボディからボディへの変換を DH パラメーターを使用して指定します。DH パラメーターの最後の要素である theta は無視されます。これは、角度がジョイント位置に依存するためです。

  4. addBody を呼び出して、最初のボディのジョイントをロボットの base 座標系に接続します。

body1 = robotics.RigidBody('body1');
jnt1 = robotics.Joint('jnt1','revolute');

setFixedTransform(jnt1,dhparams(1,:),'dh');
body1.Joint = jnt1;

addBody(robot,body1,'base')

その他の剛体を作成し、ロボットに追加します。addBody を呼び出して接続する際には、前のボディ名を指定します。各固定変換は、前のジョイント座標系と相対的です。

body2 = robotics.RigidBody('body2');
jnt2 = robotics.Joint('jnt2','revolute');
body3 = robotics.RigidBody('body3');
jnt3 = robotics.Joint('jnt3','revolute');
body4 = robotics.RigidBody('body4');
jnt4 = robotics.Joint('jnt4','revolute');
body5 = robotics.RigidBody('body5');
jnt5 = robotics.Joint('jnt5','revolute');
body6 = robotics.RigidBody('body6');
jnt6 = robotics.Joint('jnt6','revolute');

setFixedTransform(jnt2,dhparams(2,:),'dh');
setFixedTransform(jnt3,dhparams(3,:),'dh');
setFixedTransform(jnt4,dhparams(4,:),'dh');
setFixedTransform(jnt5,dhparams(5,:),'dh');
setFixedTransform(jnt6,dhparams(6,:),'dh');

body2.Joint = jnt2;
body3.Joint = jnt3;
body4.Joint = jnt4;
body5.Joint = jnt5;
body6.Joint = jnt6;

addBody(robot,body2,'body1')
addBody(robot,body3,'body2')
addBody(robot,body4,'body3')
addBody(robot,body5,'body4')
addBody(robot,body6,'body5')

関数 showdetails または show を使用して、ロボットが正しく構築されていることを確認します。showdetails は、すべてのボディを MATLAB® コマンド ウィンドウにリストします。show は、指定されたコンフィギュレーション (既定はホーム) でロボットを表示します。axis への呼び出しは、軸の範囲を変更し、軸ラベルを非表示にします。

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

 Idx    Body Name   Joint Name   Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------   ----------   ----------    ----------------   ----------------
   1        body1         jnt1     revolute             base(0)   body2(2)  
   2        body2         jnt2     revolute            body1(1)   body3(3)  
   3        body3         jnt3     revolute            body2(2)   body4(4)  
   4        body4         jnt4     revolute            body3(3)   body5(5)  
   5        body5         jnt5     revolute            body4(4)   body6(6)  
   6        body6         jnt6     revolute            body5(5)   
--------------------
show(robot);
axis([-0.5,0.5,-0.5,0.5,-0.5,0.5])
axis off

既存の RigidBodyTree オブジェクトに変更を加えます。剛体ツリーのジョイント、ボディ、およびサブツリーを置換できます。

ロボットの例を RigidBodyTree オブジェクトとして読み込みます。

load exampleRobots.mat

showdetails を使用して、Puma ロボットの詳細を表示します。

showdetails(puma1)
--------------------
Robot: (6 bodies)

 Idx    Body Name   Joint Name   Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------   ----------   ----------    ----------------   ----------------
   1           L1         jnt1     revolute             base(0)   L2(2)  
   2           L2         jnt2     revolute               L1(1)   L3(3)  
   3           L3         jnt3     revolute               L2(2)   L4(4)  
   4           L4         jnt4     revolute               L3(3)   L5(5)  
   5           L5         jnt5     revolute               L4(4)   L6(6)  
   6           L6         jnt6     revolute               L5(5)   
--------------------

プロパティを検査する特定のボディを取得します。L3 ボディの唯一の子は L4 ボディです。特定のボディをコピーすることもできます。

body3 = getBody(puma1,'L3');
childBody = body3.Children{1}
childBody = 
  RigidBody with properties:

            Name: 'L4'
           Joint: [1x1 robotics.Joint]
            Mass: 1
    CenterOfMass: [0 0 0]
         Inertia: [1 1 1 0 0 0]
          Parent: [1x1 robotics.RigidBody]
        Children: {[1x1 robotics.RigidBody]}
         Visuals: {}

body3Copy = copy(body3);

L3 ボディでジョイントを置換します。下流のボディのジオメトリに影響が及ばないようにするために、新しい Joint オブジェクトを作成し、replaceJoint を使用しなければなりません。必要に応じて、既定の単位行列を使用する代わりに、setFixedTransform を呼び出してボディ間の変換を定義します。

newJoint = robotics.Joint('prismatic');
replaceJoint(puma1,'L3',newJoint);

showdetails(puma1)
--------------------
Robot: (6 bodies)

 Idx    Body Name       Joint Name       Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------       ----------       ----------    ----------------   ----------------
   1           L1             jnt1         revolute             base(0)   L2(2)  
   2           L2             jnt2         revolute               L1(1)   L3(3)  
   3           L3        prismatic            fixed               L2(2)   L4(4)  
   4           L4             jnt4         revolute               L3(3)   L5(5)  
   5           L5             jnt5         revolute               L4(4)   L6(6)  
   6           L6             jnt6         revolute               L5(5)   
--------------------

removeBody を使用してボディ全体を削除し、結果のサブツリーを取得します。削除されたボディはサブツリーに含まれます。

subtree = removeBody(puma1,'L4')
subtree = 
  RigidBodyTree with properties:

     NumBodies: 3
        Bodies: {1x3 cell}
          Base: [1x1 robotics.RigidBody]
     BodyNames: {'L4'  'L5'  'L6'}
      BaseName: 'L3'
       Gravity: [0 0 0]
    DataFormat: 'struct'

変更した L3 ボディを削除します。コピーされた元の L3 ボディを L2 ボディに追加し、次に返されたサブツリーも追加します。ロボット モデルはそのままにします。showdetails によって詳細な比較を確認します。

removeBody(puma1,'L3');
addBody(puma1,body3Copy,'L2')
addSubtree(puma1,'L3',subtree)

showdetails(puma1)
--------------------
Robot: (6 bodies)

 Idx    Body Name   Joint Name   Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------   ----------   ----------    ----------------   ----------------
   1           L1         jnt1     revolute             base(0)   L2(2)  
   2           L2         jnt2     revolute               L1(1)   L3(3)  
   3           L3         jnt3     revolute               L2(2)   L4(4)  
   4           L4         jnt4     revolute               L3(3)   L5(5)  
   5           L5         jnt5     revolute               L4(4)   L6(6)  
   6           L6         jnt6     revolute               L5(5)   
--------------------

ダイナミクス関数を使用してジョイント トルクやジョイント加速度を計算するには、robotics.RigidBodyTreeオブジェクトと robotics.RigidBodyにダイナミクス プロパティを指定します。

剛体ツリー モデルを作成します。接続する 2 つの剛体を作成します。

robot = robotics.RigidBodyTree('DataFormat','row');
body1 = robotics.RigidBody('body1');
body2 = robotics.RigidBody('body2');

ボディに接続するジョイントを指定します。body2 から body1 への固定変換を設定します。変換は x 方向に 1 m です。

joint1 = robotics.Joint('joint1','revolute');
joint2 = robotics.Joint('joint2');
setFixedTransform(joint2,trvec2tform([1 0 0]))
body1.Joint = joint1;
body2.Joint = joint2;

2 つのボディのダイナミクス プロパティを指定します。ボディをロボット モデルに追加します。この例では、ロッド (body1) と、接続された球体 (body2) の基本値が与えられています。

body1.Mass = 2;
body1.CenterOfMass = [0.5 0 0];
body1.Inertia = [0.167 0.001 0.167 0 0 0];

body2.Mass = 1;
body2.CenterOfMass = [0 0 0];
body2.Inertia = 0.0001*[4 4 4 0 0 0];

addBody(robot,body1,'base');
addBody(robot,body2,'body1');

ロボット全体の重心位置を計算します。位置をロボットにプロットします。ビューを xy 平面に移動します。

comPos = centerOfMass(robot);

show(robot);
hold on
plot(comPos(1),comPos(2),'or')
view(2)

2 番目のボディの質量を変更します。重心の変化に注目してください。

body2.Mass = 20;
replaceBody(robot,'body2',body2)

comPos2 = centerOfMass(robot);
plot(comPos2(1),comPos2(2),'*g')
hold off

与えられたロボット コンフィギュレーションに外力と重力がかかった結果のジョイント加速度を計算します。ロボット全体に対して重力が指定されている状態で、レンチが特定のボディに適用されています。

RigidBodyTree オブジェクトとして指定される、事前定義された KUKA LBR ロボット モデルを読み込みます。

load exampleRobots.mat lbr

データ形式を 'row' に設定します。すべてのダイナミクス計算について、データ形式は 'row' または 'column' でなければなりません。

lbr.DataFormat = 'row';

重力を設定します。既定では、重力はゼロと仮定されます。

lbr.Gravity = [0 0 -9.81];

lbr ロボットのホーム コンフィギュレーションを取得します。

q = homeConfiguration(lbr);

ロボットにかかる外力を表すレンチ ベクトルを指定します。関数 externalForce を使用して外力行列を生成します。ロボット モデル、レンチがかかるエンドエフェクタ、レンチ ベクトル、および現在のロボット コンフィギュレーションを指定します。wrench'tool0' ボディ座標系に対して相対的に与えられ、この座標系ではロボット コンフィギュレーション q を指定する必要があります。

wrench = [0 0 0.5 0 0 0.3];
fext = externalForce(lbr,'tool0',wrench,q);

lbr がホーム コンフィギュレーションにあるときにエンドエフェクタ 'tool0' に外力を適用した状態で、重力に起因するジョイント加速度を計算します。ジョイント速度とジョイント トルクはゼロと仮定されます (空のベクトル [] として入力されます)。

qddot = forwardDynamics(lbr,q,[],[],fext);

関数 inverseDynamics を使用して、特定のロボット コンフィギュレーションを静的に保持するために必要なジョイント トルクを計算します。また、その他の構文を使用して、ジョイント速度、ジョイント加速度、および外力を指定できます。

RigidBodyTree オブジェクトとして指定される、事前定義された KUKA LBR ロボット モデルを読み込みます。

load exampleRobots.mat lbr

データ形式を 'row' に設定します。すべてのダイナミクス計算について、データ形式は 'row' または 'column' でなければなりません。

lbr.DataFormat = 'row';

Gravity プロパティを設定して、特定の重力加速度を指定します。

lbr.Gravity = [0 0 -9.81];

lbr のランダムなコンフィギュレーションを生成します。

q = randomConfiguration(lbr);

lbr が静的にそのコンフィギュレーションを保持するのに必要なジョイント トルクを計算します。

tau = inverseDynamics(lbr,q);

関数 externalForce を使用して、剛体ツリー モデルに適用する力行列を生成します。力行列は、ロボットのジョイントごとに 6 要素のレンチを適用するための 1 つの行がある、m 行 6 列のベクトルです。関数 externalForce を使用し、エンドエフェクタを指定して、レンチを行列の正しい行に適切に割り当てます。複数の力行列を一緒に追加して、複数の力を 1 つのロボットに適用できます。

これらの外力に対抗するジョイント トルクを計算するには、関数 inverseDynamics を使用します。

RigidBodyTree オブジェクトとして指定される、事前定義された KUKA LBR ロボット モデルを読み込みます。

load exampleRobots.mat lbr

データ形式を 'row' に設定します。すべてのダイナミクス計算について、データ形式は 'row' または 'column' でなければなりません。

lbr.DataFormat = 'row';

Gravity プロパティを設定して、特定の重力加速度を指定します。

lbr.Gravity = [0 0 -9.81];

lbr のホーム コンフィギュレーションを取得します。

q = homeConfiguration(lbr);

link1 に外力を設定します。入力レンチ ベクトルは、base 座標系で表現されます。

fext1 = externalForce(lbr,'link_1',[0 0 0.0 0.1 0 0]);

エンドエフェクタ tool0 に外力を設定します。入力レンチ ベクトルは、tool0 座標系で表現されます。

fext2 = externalForce(lbr,'tool0',[0 0 0.0 0.1 0 0],q);

外力と釣り合うために必要なジョイント トルクを計算します。力を合わせるには、力行列を足し合わせます。ジョイント速度とジョイント加速度はゼロと仮定されます ([] として入力)。

tau = inverseDynamics(lbr,q,[],[],fext1+fext2);

ロボットのビジュアル ジオメトリを記述するために Unified Robot Description format (URDF) ファイルと関連付けられた .stl ファイルをもつロボットをインポートできます。各剛体には、個別のビジュアル ジオメトリが指定されています。関数 importrobot は、URDF ファイルを解析し、ロボット モデルとビジュアル ジオメトリを取得します。関数 show を使用して、Figure 内でロボット モデルを可視化します。その後、コンポーネントをクリックして検査したり、右クリックして表示状態を切り替えたりして、モデルを操作できます。

ロボット モデルを URDF ファイルとしてインポートします。.stl ファイルの位置が、この URDF 内で正しく指定されていなければなりません。他の .stl ファイルを個別の剛体に追加する方法の詳細については、addVisualを参照してください。

robot = importrobot('iiwa14.urdf');

関連付けられたビジュアル モデルを使用してロボットを可視化します。ボディまたは座標系を検査するには、それらをクリックします。各ビジュアル ジオメトリの表示状態を切り替えるには、ボディを右クリックします。

show(robot);

参考文献

[1] Craig, John J. Introduction to Robotics: Mechanics and Control. Reading, MA: Addison-Wesley, 1989.

[2] Siciliano, Bruno, Lorenzo Sciavicco, Luigi Villani, and Giuseppe Oriolo. Robotics: Modelling, Planning and Control. London: Springer, 2009.

拡張機能

R2016b で導入