目標:リンクに衝突および慣性属性を追加し、関節に動力学を設定する方法を学ぶ
このチュートリアルでは、URDFモデルに基本的な物理属性を追加し、その衝突属性を指定する方法を学びます。
衝突要素
これまでのところ、リンクは外観を定義するvisual子要素のみを使用して指定してきました。しかし、衝突検出を機能させたりロボットをシミュレートしたりするためには、collision要素を定義する必要もあります。
以下に、衝突と物理属性を含む新しいURDFの例を示します。
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
<material name="blue">
<color rgba="0 0 .8 1"/>
</material>
</visual>
<collision>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
</collision>
</link>
- 衝突要素はリンクオブジェクトの直接の子要素であり、視覚タグと同じレベルにあります。
- 衝突要素は、視覚要素と同じ方法でgeometryタグを使用して形状を定義します。geometryタグの形式は視覚要素の形式と完全に同じです。
- 視覚要素と同様に、collisionタグの子要素で原点を指定することもできます。
多くの場合、衝突幾何と原点が視覚幾何と原点と完全に同じであることを望むでしょう。しかし、主に2つのケースではそうしません:
より高速な処理:2つのメッシュ間で衝突検出を行うことは、2つの単純な幾何体間で衝突検出を行うよりも複雑です。そのため、衝突要素内でより単純な幾何体にメッシュを置き換えたい場合があります。
安全領域:敏感なデバイスへの接近を制限したい場合があります。例えば、何もがR2D2の頭部に衝突しないようにしたい場合、頭部を囲む円柱として衝突幾何体を定義し、何もが頭部に近づけないようにすることができます。
物理特性
モデルを正しくシミュレートするには、ロボットのいくつかの物理属性、つまり物理エンジン(Gazeboなど)が必要とする属性を定義する必要があります。
慣性
シミュレートされる各リンク要素には慣性タグが必要です。以下に簡単な例を示します。
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
<material name="blue">
<color rgba="0 0 .8 1"/>
</material>
</visual>
<collision>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
</collision>
<inertial>
<mass value="10"/>
<inertia ixx="1e-3" ixy="0.0" ixz="0.0" iyy="1e-3" iyz="0.0" izz="1e-3"/>
</inertial>
</link>
- この要素もリンクオブジェクトの子要素です。
- 質量はキログラム単位で定義されます。
- 3x3の回転慣性行列は慣性要素によって指定されます。これは対称であるため、以下に示すように6つの要素のみで表現できます。
- この情報はMeshLabのようなモデリングプログラムから提供されることがあります。基本図形(円柱、ボックス、球体)の慣性は、ウィキペディアの慣性テンソルリスト https://en.wikipedia.org/wiki/List_of_moments_of_inertia#List_of_3D_inertia_tensors を使用して計算できます(上記の例で使用)。
- 慣性テンソルは物体の質量と質量分布に依存します。良好な初期近似は、物体の体積内に質量が均一に分布していると仮定し、上記のように物体の形状に基づいて慣性テンソルを計算することです。
- 何を設定すべきか不确定な場合は、ixx/iyy/izz=1e-3またはそれより小さい行列は、中程度のサイズのリンクに対して合理的なデフォルト値です(これは、辺長0.1メートル、質量0.6キログラムのボックスに対応します)。単位行列は特に悪い選択です。通常は高すぎるからです(これは、辺長0.1メートル、質量600キログラムのボックスに対応します!)。
- 重心と慣性参照系(リンクの参照系に対して)を指定するために、原点タグを指定することもできます。
- リアルタイムコントローラを使用する場合、慣性要素がゼロ(またはほぼゼロ)であると、ロボットモデルが警告なしにクラッシュし、すべてのリンクの原点が世界原点と一致する可能性があります。
接触係数
リンクが互いに接触する際の振る舞いを定義することもできます。これはcontact_coefficientsという名前のcollisionタグの子要素を使用して行われます。3つの属性を指定する必要があります:
mu - 摩擦係数 https://simple.wikipedia.org/wiki/Coefficient_of_friction
kp - 剛性係数 https://en.wikipedia.org/wiki/Stiffness
kd - 減衰係数 https://en.wikipedia.org/wiki/Damping_ratio#Damping_ratio_definition
関節動力学
関節の運動方法は、関節の動力学タグによって定義されます。以下に2つの属性があります:
friction - 物理的静摩擦力。直線関節の場合、単位はニュートンです。回転関節の場合、単位はニュートンメートルです。
damping- 物理的減衰値。直線関節の場合、単位はニュートン秒毎メートルです。回転関節の場合、単位はニュートンメートル秒毎ラジアンです。
これらの係数が指定されない場合、デフォルトではゼロになります。
その他のタグ
純粋なURDFの領域(つまり、Gazebo固有のタグを含まない)では、関節を定義するのに役立つ2つのタグがあります:calibration(較正)とsafety controller(安全コントローラ)。仕様 https://wiki.ros.org/urdf/XML/joint を参照してください。これらはこのチュートリアルには含まれていません。
<Joint> 要素
関節要素は関節の運動学と動力学を記述し、関節の安全制限を指定します。
以下に関節要素の例を示します:
<joint name="my_joint" type="floating">
<origin xyz="0 0 1" rpy="0 0 3.1416"/>
<parent link="link1"/>
<child link="link2"/>
<calibration rising="0.0"/>
<dynamics damping="0.0" friction="0.0"/>
<limit effort="30" velocity="1.0" lower="-2.2" upper="0.7"/>
</joint>
属性
関節要素には2つの属性があります:
- name(必須)
- 関節の一意な名前を指定します。
- type(必須)
- 関節のタイプを指定します。タイプは以下のいずれかです:
- revolute - 軸の周りに回転し、上下限があるヒンジ関節。
- continuous - 軸の周りに無限に回転し、上下限がない連続ヒンジ関節。
- prismatic - 軸に沿ってスライドし、上下限があるスライド関節。
- fixed - 実際には関節ではなく、移動できません。すべての自由度がロックされます。このタイプの関節は
<axis>、<calibration>、<dynamics>、<limits>または<safety_controller>を必要としません。 - floating - この関節は6つの自由度すべての運動を許可します。
- planar - この関節は軸に垂直な平面内の運動を許可します。
- 関節のタイプを指定します。タイプは以下のいずれかです:
要素
関節要素には以下の要素があります:
<origin>(オプション:指定しない場合は単位行列がデフォルト)- 親リンクから子リンクへの変換です。関節は上図のように子リンクの原点にあります。
- xyz(オプション:デフォルトはゼロベクトル)
- x、y、zオフセットを表します。すべての位置はメートル単位で指定されます。
- rpy(オプション:デフォルトはゼロベクトル)
- 固定軸の回転を表します:まずx軸に沿ってロールし、次にy軸に沿ってピッチし、最後にz軸に沿ってヨーします。すべての角度はラジアン単位で指定されます。
<parent>(必須)- 親リンクの名前。必須属性:
- link
- ロボットの木構造でこのリンクの親となるリンクの名前。
- link
- 親リンクの名前。必須属性:
<child>(必須)- 子リンクの名前。必須属性:
- link
- 子リンクの名前。
- link
- 子リンクの名前。必須属性:
<axis>(オプション:デフォルトは(1,0,0))- 関節フレーム内で指定された関節軸。これは回転関節の回転軸、直線関節の平行移動軸、および平面関節の表面法線です。軸は関節参照フレームで指定されます。固定関節と浮動関節は軸フィールドを使用しません。
- xyz(必須)
- ベクトルの(x, y, z)成分を表します。ベクトルは正規化する必要があります。
<calibration>(オプション)- 関節の参照位置。関節の絶対位置の較正に使用されます。
- rising(オプション)
- 関節が正の方向に移動するとき、この参照位置が立ち上がりエッジをトリガーします。
- falling(オプション)
- 関節が正の方向に移動するとき、この参照位置が立ち下がりエッジをトリガーします。
<dynamics>(オプション)- 関節の物理特性を指定する要素。これらの値は、特にシミュレーションに適用するために、関節のモデリング特性を指定するために使用されます。
- damping(オプション、デフォルトは0)
- 関節の物理的減衰値(直線関節の場合はニュートン秒毎メートル[N·s/m]、回転関節の場合はニュートンメートル秒毎ラジアン[N·m·s/rad])。
- friction(オプション、デフォルトは0)
- 関節の物理的静摩擦値(直線関節の場合はニュートン[N]、回転関節の場合はニュートンメートル[N·m])。
<limit>(回転および直線関節にのみ必須)- この要素には以下の属性を含めることができます:
- lower(オプション、デフォルトは0)
- 関節の下限を指定する属性(回転関節の場合はラジアン、直線関節の場合はメートル)。関節が連続の場合は省略します。
- upper(オプション、デフォルトは0)
- 関節の上限を指定する属性(回転関節の場合はラジアン、直線関節の場合はメートル)。関節が連続の場合は省略します。
- effort(必須)
- 最大関節作用力を強制するための属性(|適用された作用力| < |作用力|)。安全制限を参照してください。
- velocity(必須)
- 最大関節速度を強制するための属性(回転関節の場合は毎秒ラジアン[rad/s]、直線関節の場合は毎秒メートル[m/s])。安全制限を参照してください。
- lower(オプション、デフォルトは0)
- この要素には以下の属性を含めることができます:
<mimic>(オプション)(ROS Groovyで追加。問題を参照)- このタグは、定義された関節が別の既存関節を模倣するように指定するために使用されます。この関節の値は、value = multiplier * other_joint_value + offsetとして計算できます。
- 期待されるオプションの属性:
- joint(必須)
- 模倣する関節の名前を指定します。
- multiplier(オプション)
- 上記の式の乗数因子を指定します。
- offset(オプション)
- 上記の式のオフセットを指定します。デフォルトは0(回転関節の場合はラジアン、直線関節の場合はメートル)。
- joint(必須)
<safety_controller>(オプション)- この要素には以下の属性を含めることができます:
- soft_lower_limit(オプション、デフォルトは0)
- 安全コントローラが関節位置の下限を制限し始める属性。この制限は、関節の下限(上記参照)より大きくなる必要があります。詳細については安全制限を参照してください。
- soft_upper_limit(オプション、デフォルトは0)
- 安全コントローラが関節位置の上限を制限し始める属性。この制限は、関節の上限(上記参照)より小さくなる必要があります。詳細については安全制限を参照してください。
- k_position(オプション、デフォルトは0)
- 位置と速度制限の関係を指定する属性。詳細については安全制限を参照してください。
- k_velocity(必須)
- 作用力と速度制限の関係を指定する属性。詳細については安全制限を参照してください。
- soft_lower_limit(オプション、デフォルトは0)
- この要素には以下の属性を含めることができます:
次のステップ
xacroを使用して、記述する必要のあるコード量と面倒な計算を減らします。