inverseDynamics
指定した運動に必要なジョイント トルク
構文
説明
は、指定されたロボット コンフィギュレーションを維持するためのジョイント トルクを計算します。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
入力引数
robot
— ロボット モデル
rigidBodyTree
オブジェクト
ロボット モデル。rigidBodyTree
オブジェクトとして指定します。関数 inverseDynamics
を使用するには、DataFormat
プロパティを 'row'
または 'column'
に設定します。
configuration
— ロボット コンフィギュレーション
ベクトル
ロボット コンフィギュレーション。ロボット モデル内の固定されていないすべてのジョイント位置を含むベクトルとして指定します。コンフィギュレーションは、homeConfiguration(robot)
、randomConfiguration(robot)
を使用するか、独自のジョイント位置を指定することによって生成できます。configuration
のベクトル形式を使用するには、robot
の DataFormat
プロパティを 'row'
または 'column'
に設定します。
jointVel
— ジョイント速度
ベクトル
ジョイント速度。ベクトルとして指定します。ジョイント速度の数は、ロボットの速度の自由度と等しくなります。jointVel
のベクトル形式を使用するには、robot
の DataFormat
プロパティを 'row'
または 'column'
に設定します。
fext
— 外力行列
n 行 6 列の行列 | 6 行 n 列の行列
外力行列。n 行 6 列または 6 行 n 列の行列として指定します。ここで、n はロボットの速度の自由度です。形状は robot
の DataFormat
プロパティに依存します。'row'
データ形式では n 行 6 列の行列を使用します。'column'
データ形式では 6 行 n 列の行列を使用します。
行列には、指定したボディに関連する位置のゼロ以外の値のみがリストされます。力の行列を一緒に追加することで、複数のボディに対する複数の力を指定できます。
指定した力またはトルクの行列を作成するには、externalForce
を参照してください。
出力引数
jointTorq
— ジョイント トルク
ベクトル
ジョイント トルク。ベクトルとして返されます。各要素は特定のジョイントに加えられるトルクに対応します。
詳細
ダイナミクス プロパティ
ロボット ダイナミクスを操作するときは、rigidBody
オブジェクトの以下のプロパティを使用してマニピュレーター ロボットの個々のボディの情報を指定します。
Mass
— キログラム単位の剛体の質量。CenterOfMass
— 剛体の重心位置。[x y z]
の形式のベクトルとして指定します。このベクトルは、ボディ座標系を基準とした剛体の重心位置をメートル単位で記述します。オブジェクト関数centerOfMass
は、ロボットの重心を計算する際にこれらの剛体プロパティ値を使用します。Inertia
— 剛体の慣性。[Ixx Iyy Izz Iyz Ixz Ixy]
の形式のベクトルとして指定します。ベクトルは、キログラム平方メートル単位でボディ座標系を基準としています。慣性テンソルは、次の形式の正定値行列です。Inertia
ベクトルの最初の 3 要素は、慣性テンソルの対角要素である慣性モーメントです。最後の 3 要素は、慣性テンソルの非対角要素である慣性乗積です。
マニピュレーター ロボット モデル全体に関連する情報については、以下の rigidBodyTree
オブジェクト プロパティを指定します。
Gravity
— ロボットにかかる重力加速度。[x y z]
ベクトルとして指定します (m/s2)。既定では重力加速度はありません。DataFormat
— 運動学およびダイナミクス関数の入出力データ形式。"struct"
、"row"
、または"column"
として指定します。
ダイナミクス方程式
マニピュレーターの剛体ダイナミクスは次の方程式で制御されます。
次のようにも記述されます。
ここで、次のようになります。
— 現在のロボット コンフィギュレーションに基づくジョイント空間の質量行列。この行列はオブジェクト関数
massMatrix
を使用して計算します。— コリオリ項。 で乗算され、速度積を計算します。オブジェクト関数
velocityProduct
を使用して速度積を計算します。— 指定した重力
Gravity
の位置を維持するためにすべてのジョイントに必要な重力トルクおよび力。重力トルクはオブジェクト関数gravityTorque
を使用して計算します。— 指定したジョイント コンフィギュレーションの幾何学的ヤコビアン。幾何学的ヤコビアンはオブジェクト関数
geometricJacobian
を使用して計算します。— 剛体にかかる外力の行列。外力はオブジェクト関数
externalForce
を使用して生成します。— 各ジョイントにベクトルとして直接かかるジョイントのトルクと力。
— それぞれ個々のベクトルとしての、ジョイント コンフィギュレーション、ジョイント速度、ジョイント加速度。回転ジョイントの場合は、ラジアン単位 (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.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用に関するメモと制限:
rigidBodyTree
オブジェクトの作成時には、ロボット モデルにボディを追加する上限として MaxNumBodies
を指定する構文を使用します。また、DataFormat
プロパティを、名前と値のペアとして指定しなければなりません。次に例を示します。
robot = rigidBodyTree("MaxNumBodies",15,"DataFormat","row")
データの使用量を最小限に抑えるには、上限をモデル内の必要なボディ数に近い数にします。すべてのデータ形式がコード生成用でサポートされています。ダイナミクス関数を使用するには、データ形式を "row"
または "column"
に設定しなければなりません。
関数 show
および showdetails
ではコード生成はサポートされません。
バージョン履歴
R2017a で導入R2024a: 静的なメモリ割り当てのサポート
inverseDynamics
で、動的なメモリ割り当てを無効にしたコード生成がサポートされるようになりました。動的なメモリ割り当ての無効化の詳細については、動的メモリ割り当てしきい値の設定 (MATLAB Coder)を参照してください。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)