externalForce
base を基準とする外力行列を構成
構文
説明
は、fext = externalForce(robot,bodyname,wrench)bodyname で指定されたボディに外力 wrench を加えるための外力行列を構成します。これを inverseDynamics および forwardDynamics への入力として使用できます。wrench の入力は base 座標系のものと仮定されます。
は、fext = externalForce(robot,framename,wrench)framename で指定された座標系に外力 wrench を加えるための外力行列を構成します。これを inverseDynamics および forwardDynamics への入力として使用できます。wrench の入力は base 座標系のものと仮定されます。
例
与えられたロボット コンフィギュレーションに外力と重力がかかった結果のジョイント加速度を計算します。ロボット全体に対して重力が指定されている状態で、レンチが特定のボディに適用されています。
Robotics System Toolbox™ loadrobotから KUKA iiwa 14 ロボット モデルを読み込みます。ロボットは、rigidBodyTree オブジェクトとして指定されています。
データ形式を "row" に設定します。すべてのダイナミクス計算について、データ形式は "row" または "column" でなければなりません。
重力を設定します。既定では、重力はゼロと仮定されます。
kukaIIWA14 = loadrobot("kukaIiwa14",DataFormat="row",Gravity=[0 0 -9.81]);
kukaIIWA14 ロボットのホーム コンフィギュレーションを取得します。
q = homeConfiguration(kukaIIWA14);
ロボットにかかる外力を表すレンチ ベクトルを指定します。関数 externalForce を使用して外力行列を生成します。ロボット モデル、レンチがかかるエンドエフェクタ、レンチ ベクトル、および現在のロボット コンフィギュレーションを指定します。wrench は "iiwa_link_ee_kuka" ボディ座標系を基準に指定されるため、ロボット コンフィギュレーション q を指定する必要があります。
wrench = [0 0 0.5 0 0 0.3];
fext = externalForce(kukaIIWA14,"iiwa_link_ee_kuka",wrench,q);kukaIIWA14 がホーム コンフィギュレーションにあるときにエンドエフェクタ "iiwa_link_ee_kuka" に外力を適用した状態で、重力による結果のジョイント加速度を計算します。ジョイント速度とジョイント トルクはゼロと仮定されます (空のベクトル [] として入力)。
qddot = forwardDynamics(kukaIIWA14,q,[],[],fext)
qddot = 1×7
-0.0023 -0.0112 0.0036 -0.0212 0.0067 -0.0075 499.9920
関数 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 オブジェクトとして指定します。関数 externalForce を使用するには、DataFormat プロパティを "row" または "column" に設定します。
外力が加えられるボディの名前。string スカラーまたは文字ベクトルとして指定します。このボディの名前は、robot オブジェクト上のボディと一致していなければなりません。
データ型: char | string
外力が加えられる座標系の名前。string スカラーまたは文字ベクトルとして指定します。この座標系の名前は、robot オブジェクト上の座標系と一致していなければなりません。
データ型: char | string
ボディに加えられるトルクと力。[Tx Ty Tz Fx Fy Fz] ベクトルとして指定します。レンチの最初の 3 要素は、xyz 軸の周りのモーメントに対応します。最後の 3 要素は、同じ軸に沿った線形力です。ロボットの configuration を指定しない限り、レンチは base 座標系を基準とするものと仮定されます。
ロボット コンフィギュレーション。ロボット モデル内の固定されていないすべてのジョイント位置を含むベクトルとして指定します。コンフィギュレーションは、homeConfiguration(robot)、randomConfiguration(robot) を使用するか、独自のジョイント位置を指定することによって生成できます。configuration のベクトル形式を使用するには、robot の DataFormat プロパティを 'row' または 'column' に設定します。
出力引数
外力行列。n 行 6 列または 6 行 n 列の行列として返されます。ここで、n はロボットの速度の数 (自由度) です。形状は robot の DataFormat プロパティに依存します。"row" データ形式では n 行 6 列の行列を使用します。"column" データ形式では 6 行 n 列の行列を使用します。
構成される行列には、指定したボディに関連する位置のゼロ以外の値のみがリストされます。力の行列を一緒に追加することで、複数のボディに対する複数の力を指定できます。外力行列は、ダイナミクス関数 inverseDynamics および forwardDynamics に外力を指定するのに使用します。
詳細
ロボット ダイナミクスを操作するときは、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.
拡張機能
使用上の注意および制限:
rigidBodyTree オブジェクトの作成時には、ロボット モデルにボディを追加する上限として MaxNumBodies を指定する構文を使用します。また、DataFormat プロパティを、名前と値のペアとして指定しなければなりません。以下に例を示します。
robot = rigidBodyTree("MaxNumBodies",15,"DataFormat","row")
データの使用量を最小限に抑えるには、上限をモデル内の必要なボディ数に近い数にします。すべてのデータ形式がコード生成用でサポートされています。ダイナミクス関数を使用するには、データ形式を "row" または "column" に設定しなければなりません。
関数 show および showdetails ではコード生成はサポートされません。
バージョン履歴
R2017a で導入externalForce メソッドの入力引数で、外力を加える対象として、ボディの名前と座標系の名前の両方が受け入れられるようになりました。
externalForce で、動的なメモリ割り当てを無効にしたコード生成がサポートされるようになりました。動的なメモリ割り当ての無効化の詳細については、動的メモリ割り当てしきい値の設定 (MATLAB Coder)を参照してください。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- 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)