mc_rtc::Configuration 設定本ガイドでは、mc_rtcその他のJRL/LIRMMソフトウェアに対応した環境を作成する方法について説明します。
面(サーフェス)の作成とエクスポートには、BlenderアドオンRSDF Surface Toolを使用します。このアドオンを使うと、カスタムプロパティを手作業で編集することなく、Blenderのメッシュから直接、平面および円筒面のRSDFサーフェスを作成、可視化、エクスポートできます。

blender --command extension buildを実行して.zipファイルを自分でビルドすることもできます)。.zipファイルを選択します。有効化すると、3Dビューのサイドバーに新しくRSDFタブが表示されます(サイドバーが表示されていない場合は、Nキーで切り替えてください)。
ここでは、3次元環境のモデリングについて詳しくは説明しません。このページの残りの部分では、”ground”(地面)という名前の大きな平面と、その中央に垂直に立つ”pole”(柱)という名前の円筒からなるモデルを使用します。これは、上のアニメーションで示されている例に対応しています。
モデルのメッシュに単一変数のスケールが設定されていることを確認してください。これを設定するには、シーン内の各オブジェクトにスケールパラメーターを適用します。
はじめに、地面に相当する面を作成します。
選択した面の形状に一致する、緑色の半透明のオブジェクトがすぐに表示され、サイドバーの面リストにも対応する項目が追加されます。面をコピーして切り離したり、原点を手動で設定したり、親子関係を設定したりする必要はもうありません。選択したジオメトリから、面の原点と向きがアドオンによって自動的に計算されます。
お疲れ様でした。これで、最初の面が作成されました。
mc_rtc内のほとんどの環境では、以下の命名規則に基づいて名前が付けられています。ユーザーが名前を付ける場合もこの規則に従うことを推奨します。
アドオンで作成した面は、デフォルトで”Surface_N”という名前になります。リストで対象の面を選択し、サイドバーのName欄を編集することで、この命名規則に従った名前に変更してください。
自分が設計した面と他の面との間に接触面を作成すると、自分が設計した面上の点に接触力が発生します。これは、面に含まれる点の数が多いほど、より多くの変数が問題に追加されることを意味します。そのため、面をできるだけシンプルに設計するように(すなわち、単一の四角形で構成するように)してください。特に、ロボットの表面を設計する際は、この点に注意してください。
また、面を構成する点は、同一平面上になければなりません。そうでない場合、その面は使用できません。
このセクションでは、”pole”オブジェクトから単一の円筒面を作成します。ここでは、ローカルX軸を円筒の極軸とする規約になっていますが、面の向きの調整はすべてアドオンが自動的に行うため、ローカルフレームについて考えたり、手動で回転を適用したりする必要はありません。
選択したジオメトリに対して、アドオンが円筒(中心、軸、半径、長さ)をフィッティングし、選択範囲から直接計算された半径・長さを持つ緑色の面をすぐに作成します。
お疲れ様でした。これで、最初の円筒面が作成されました。
これまでのカスタムプロパティを使用した方法とは異なり、面の半径と長さは内部的には通常の数値フィールドとして扱われるため、値が[0, 1]の範囲に暗黙のうちに制限されてしまう心配はありません。
環境のボディをエクスポートするために、別のツールはもう必要ありません。Blender上でボディの準備ができたら、RSDF Surface Toolアドオンを使って環境全体を、そのまま使用できるROS2パッケージとしてエクスポートできます。
これにより、以下の構成を持つ完全なament_cmakeパッケージが生成されます。
<package_name>/
package.xml
CMakeLists.txt
urdf/<robot_name>.urdf
meshes/<link_name>.stl
rsdf/<robot_name>.rsdf ("Include RSDF Surfaces"が有効な場合)
launch/display.launch.py
launch/display.rviz
シーン内のトップレベルのメッシュ/エンプティオブジェクトは、それぞれオブジェクト名を持つURDFリンクになり、親子関係はURDFジョイントになります。メッシュジオメトリは各オブジェクト自身のローカル空間でSTLとしてエクスポートされるため、ジョイントの原点と整合します。
デフォルトでは、すべてのジョイントはfixed(固定)になります。ジョイントを可動にするには、子オブジェクトにカスタムプロパティを追加します。
jointプロパティに加えて、その種類に必要なプロパティが必要です。jointの値 |
意味 | 必須プロパティ | 任意プロパティ |
|---|---|---|---|
revolute |
axisまわりの範囲付き回転 |
axis、lower、upper |
effort、velocity、name |
continuous |
axisまわりの無制限の回転(例: 車輪) |
axis |
effort、velocity、name |
prismatic |
axisに沿った並進運動 |
axis、lower、upper |
effort、velocity、name |
axis: 文字列"x y z"(例: Z軸まわりに回転/スライドさせる場合は"0 0 1")lower、upper: 浮動小数点数。ジョイントの可動範囲(revoluteはラジアン、prismaticはメートル)effort: 浮動小数点数、デフォルト1000。URDFの<limit>タグに出力される最大出力(NまたはN·m)velocity: 浮動小数点数、デフォルト1.0。URDFの<limit>タグに出力される最大速度(rad/sまたはm/s)name: 文字列、任意。URDF内のジョイント名を上書きします(デフォルトは<link_name>_joint)jointプロパティを設定しない場合、そのオブジェクトはfixedジョイントになります。jointは設定されているが、その種類に必要なプロパティが不足している場合、エクスポートはfixedジョイントにフォールバックし、不足しているプロパティを示す警告が表示されます。
衝突メッシュを手作業で作成する必要はありません。mc_rtcは、ロボットや環境の読み込み方法(env/object、json、またはC++のRobotModuleのいずれか)によらず、URDF内で参照されているメッシュ型の衝突ジオメトリから凸包を自動的に生成します。この仕組みの詳細や、生成された凸包のキャッシュ場所については、「Integrate a new robot」チュートリアルのAutomatic Convex Hull Generationを参照してください。
面の作成が完了したら、サイドバーのExport RSDFをクリックし、ファイル名と保存場所を指定します。.rsdf拡張子を付け忘れても、自動的に付加されます。
mc_rtcは、ロボットや環境の<path>/rsdf/<name>/ディレクトリ内にある面を探索し、そこに存在するすべての*.rsdfファイルを読み込んで、それらの面をまとめて使用します。エクスポートしたファイルは、このディレクトリに配置してください。
現在のところ、アドオンからエクスポートされる面はすべて、”base_link”という名前のボディに関連付けられます(これはアドオンの既知の制限事項であり、詳細はアドオンのreadmeを参照してください)。環境やロボットに複数の異なるボディが含まれる場合は、エクスポートした.rsdfファイルを開き、各<planar_surface>/<cylindrical_surface>要素のlink="..."属性を、その面が実際に属するボディの名前(例: “ground”や”pole”)に書き換えてください。
表面の可視化に関するチュートリアルを参照してください。また、アドオンのLoad RSDFボタンを使うと、.rsdfファイルをいつでもBlenderに再インポートして、面の位置・向き・タイプが正しくエクスポートされているかを確認できます。
Add Plane/Add Cylinderをクリックする前に、Blenderプロジェクト内で選択したオブジェクト(面)の原点が意図したとおりに設定されているか確認してください。
メッシュの法線の向きが揃っているか確認してください(Blenderの面選択では、面の頂点の並び順(ワインディング)によって向きが決まります)。
対象オブジェクトのEdit(編集)モードで、少なくとも1つの面が選択された状態でボタンをクリックしているか確認してください。
ロボットに面を追加する場合も、環境の場合と同じ手順を行いますが、環境のメッシュではなく、ロボットのボディ自体のメッシュ上で面を選択します。そのうえで面をエクスポートし、生成された.rsdfファイルをロボット記述のrsdf/<robot_name>/ディレクトリに配置してください。その際、各面のlink属性が、その面が属するボディと一致していることを確認してください。