Main Content

inverseDynamics

指定した運動に必要なジョイント トルク

説明

jointTorq = inverseDynamics(robot) は、外力が加えられないものとして、ロボットがホーム コンフィギュレーションを静的に維持するために必要なジョイント トルクを計算します。

jointTorq = inverseDynamics(robot,configuration) は、指定されたロボット コンフィギュレーションを維持するためのジョイント トルクを計算します。

jointTorq = inverseDynamics(robot,configuration,jointVel) は、加速度と外力がないものとして、指定されたジョイント コンフィギュレーションと速度に対するジョイント トルクを計算します。

jointTorq = inverseDynamics(robot,configuration,jointVel,jointAccel) は、外力がないものとして、指定されたジョイント コンフィギュレーション、速度、および加速度に対するジョイント トルクを計算します。ホーム コンフィギュレーションの状態、ジョイント速度がない状態、加速度がない状態を指定するには、該当する入力引数に [] を使用します。

jointTorq = inverseDynamics(robot,configuration,jointVel,jointAccel,fext) は、指定されたジョイント コンフィギュレーション、速度、加速度、および外力に対するジョイント トルクを計算します。fext を生成するには、関数 externalForce を使用します。

すべて折りたたむ

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

Robotics System Toolbox™ loadrobotから Omron eCobra-600 を読み込みます。rigidBodyTree オブジェクトとして指定されます。重力のプロパティを設定し、データ形式が "row" に設定されていることを確認します。すべてのダイナミクス計算について、データ形式は "row" または "column" でなければなりません。

robot = loadrobot("omronEcobra600", DataFormat="row", Gravity=[0 0 -9.81]);

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

q = randomConfiguration(robot);

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

tau = inverseDynamics(robot,q)
tau = 1×4

    0.0000    0.0000  -19.6200         0

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

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

Robotics System Toolbox™ loadrobotから Universal Robots UR5e を読み込みます。rigidBodyTree オブジェクトとして指定されます。重力を更新し、データ形式を "row" に設定します。すべてのダイナミクス計算について、データ形式は "row" または "column" でなければなりません。

manipulator = loadrobot("universalUR5e", DataFormat="row", Gravity=[0 0 -9.81]);
showdetails(manipulator)
--------------------
Robot: (10 bodies)

 Idx                Body Name                         Joint Name                         Joint Type                Parent Name(Idx)   Children Name(s)
 ---                ---------                         ----------                         ----------                ----------------   ----------------
   1                     base         base_link-base_fixed_joint                              fixed                    base_link(0)   
   2        base_link_inertia        base_link-base_link_inertia                              fixed                    base_link(0)   shoulder_link(3)  
   3            shoulder_link                 shoulder_pan_joint                           revolute            base_link_inertia(2)   upper_arm_link(4)  
   4           upper_arm_link                shoulder_lift_joint                           revolute                shoulder_link(3)   forearm_link(5)  
   5             forearm_link                        elbow_joint                           revolute               upper_arm_link(4)   wrist_1_link(6)  
   6             wrist_1_link                      wrist_1_joint                           revolute                 forearm_link(5)   wrist_2_link(7)  
   7             wrist_2_link                      wrist_2_joint                           revolute                 wrist_1_link(6)   wrist_3_link(8)  
   8             wrist_3_link                      wrist_3_joint                           revolute                 wrist_2_link(7)   flange(9)  
   9                   flange                     wrist_3-flange                              fixed                 wrist_3_link(8)   tool0(10)  
  10                    tool0                       flange-tool0                              fixed                       flange(9)   
--------------------

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

q = homeConfiguration(manipulator);

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

fext1 = externalForce(manipulator,"shoulder_link",[0 0 0.0 0.1 0 0]);

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

fext2 = externalForce(manipulator,"tool0",[0 0 0.0 0.1 0 0],q);

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

tau = inverseDynamics(manipulator,q,[],[],fext1+fext2)
tau = 1×6

   -0.0233  -52.4189  -14.4896   -0.0100    0.0100    0.0000

入力引数

すべて折りたたむ

ロボット モデル。rigidBodyTree オブジェクトとして指定します。関数 inverseDynamics を使用するには、DataFormat プロパティを 'row' または 'column' に設定します。

ロボット コンフィギュレーション。ロボット モデル内の固定されていないすべてのジョイント位置を含むベクトルとして指定します。コンフィギュレーションは、homeConfiguration(robot)randomConfiguration(robot) を使用するか、独自のジョイント位置を指定することによって生成できます。configuration のベクトル形式を使用するには、robotDataFormat プロパティを 'row' または 'column' に設定します。

ジョイント速度。ベクトルとして指定します。ジョイント速度の数は、ロボットの速度の自由度と等しくなります。jointVel のベクトル形式を使用するには、robotDataFormat プロパティを 'row' または 'column' に設定します。

ジョイント加速度。ベクトルとして返されます。ジョイント加速度のベクトルの次元は、ロボットの速度の自由度と等しくなります。各要素は robot の特定のジョイントに対応します。jointAccel のベクトル形式を使用するには、robotDataFormat プロパティを 'row' または 'column' に設定します。

外力行列。n 行 6 列または 6 行 n 列の行列として指定します。ここで、n はロボットの速度の自由度です。形状は robotDataFormat プロパティに依存します。'row' データ形式では n 行 6 列の行列を使用します。'column' データ形式では 6 行 n 列の行列を使用します。

行列には、指定したボディに関連する位置のゼロ以外の値のみがリストされます。力の行列を一緒に追加することで、複数のボディに対する複数の力を指定できます。

指定した力またはトルクの行列を作成するには、externalForce を参照してください。

出力引数

すべて折りたたむ

ジョイント トルク。ベクトルとして返されます。各要素は特定のジョイントに加えられるトルクに対応します。

詳細

すべて折りたたむ

ダイナミクス プロパティ

ロボット ダイナミクスを操作するときは、rigidBody オブジェクトの以下のプロパティを使用してマニピュレーター ロボットの個々のボディの情報を指定します。

  • Mass — キログラム単位の剛体の質量。

  • CenterOfMass — 剛体の重心位置。[x y z] の形式のベクトルとして指定します。このベクトルは、ボディ座標系を基準とした剛体の重心位置をメートル単位で記述します。オブジェクト関数 centerOfMass は、ロボットの重心を計算する際にこれらの剛体プロパティ値を使用します。

  • Inertia — 剛体の慣性。[Ixx Iyy Izz Iyz Ixz Ixy] の形式のベクトルとして指定します。ベクトルは、キログラム平方メートル単位でボディ座標系を基準としています。慣性テンソルは、次の形式の正定値行列です。

    A 3-by-3 matrix. The first row contains Ixx, Ixy, and Ixz. The second contains Ixy, Iyy, and Iyz. The third contains Ixz, Iyz, and Izz.

    Inertia ベクトルの最初の 3 要素は、慣性テンソルの対角要素である慣性モーメントです。最後の 3 要素は、慣性テンソルの非対角要素である慣性乗積です。

マニピュレーター ロボット モデル全体に関連する情報については、以下の rigidBodyTree オブジェクト プロパティを指定します。

  • Gravity — ロボットにかかる重力加速度。[x y z] ベクトルとして指定します (m/s2)。既定では重力加速度はありません。

  • DataFormat — 運動学およびダイナミクス関数の入出力データ形式。"struct""row"、または "column" として指定します。

ダイナミクス方程式

マニピュレーターの剛体ダイナミクスは次の方程式で制御されます。

ddt[qq˙]=[q˙M(q)1(C(q,q˙)q˙G(q)J(q)TFExt+τ)]

次のようにも記述されます。

M(q)q¨=C(q,q˙)q˙G(q)J(q)TFExt+τ

ここで、次のようになります。

  • M(q) — 現在のロボット コンフィギュレーションに基づくジョイント空間の質量行列。この行列はオブジェクト関数 massMatrix を使用して計算します。

  • C(q,q˙) — コリオリ項。q˙ で乗算され、速度積を計算します。オブジェクト関数 velocityProduct を使用して速度積を計算します。

  • G(q) — 指定した重力 Gravity の位置を維持するためにすべてのジョイントに必要な重力トルクおよび力。重力トルクはオブジェクト関数 gravityTorque を使用して計算します。

  • J(q) — 指定したジョイント コンフィギュレーションの幾何学的ヤコビアン。幾何学的ヤコビアンはオブジェクト関数 geometricJacobian を使用して計算します。

  • FExt — 剛体にかかる外力の行列。外力はオブジェクト関数 externalForce を使用して生成します。

  • τ — 各ジョイントにベクトルとして直接かかるジョイントのトルクと力。

  • q,q˙,q¨ — それぞれ個々のベクトルとしての、ジョイント コンフィギュレーション、ジョイント速度、ジョイント加速度。回転ジョイントの場合は、ラジアン単位 (rad/s と rad/s2) で値をそれぞれ指定します。直進ジョイントの場合は、メートル単位 (m/s と m/s2) で指定します。

ダイナミクスを直接計算するには、オブジェクト関数 forwardDynamics を使用します。この関数は、上記の入力の指定した組み合わせに対してジョイント加速度を計算します。

特定の動きの組み合わせを得るには、オブジェクト関数 inverseDynamics を使用します。この関数は、指定したコンフィギュレーション、速度、加速度、外力を得るために必要なジョイント トルクを計算します。

参照

[1] Featherstone, Roy. Rigid Body Dynamics Algorithms. Springer US, 2008. DOI.org (Crossref), doi:10.1007/978-1-4899-7560-7.

拡張機能

バージョン履歴

R2017a で導入