mc_rtcにおける環境データの作成

本ガイドでは、mc_rtcその他のJRL/LIRMMソフトウェアに対応した環境を作成する方法について説明します。

面(サーフェス)の作成とエクスポートには、BlenderアドオンRSDF Surface Toolを使用します。このアドオンを使うと、カスタムプロパティを手作業で編集することなく、Blenderのメッシュから直接、平面および円筒面のRSDFサーフェスを作成、可視化、エクスポートできます。

rsdf_exporter_demo

作業を始める前の準備

必要なソフトウェア

  1. 最近のバージョンのBlender(4.2以降)
  2. BlenderアドオンRSDF Surface Tool(本ガイドでは、面の作成とエクスポート、および環境のボディとメッシュのエクスポートに使用します)

RSDF Surface Toolアドオンをインストールする

  1. リリースページから最新のリリースをダウンロードします(または、リポジトリをクローンし、その中でblender --command extension buildを実行して.zipファイルを自分でビルドすることもできます)。
  2. Blenderを起動し、編集 → プリファレンス → アドオン → インストール… を開きます。
  3. ダウンロードした.zipファイルを選択します。
  4. アドオンを有効にします。

有効化すると、3Dビューのサイドバーに新しくRSDFタブが表示されます(サイドバーが表示されていない場合は、Nキーで切り替えてください)。

環境モデルを取得する

ここでは、3次元環境のモデリングについて詳しくは説明しません。このページの残りの部分では、”ground”(地面)という名前の大きな平面と、その中央に垂直に立つ”pole”(柱)という名前の円筒からなるモデルを使用します。これは、上のアニメーションで示されている例に対応しています。

スケールに関する注記

モデルのメッシュに単一変数のスケールが設定されていることを確認してください。これを設定するには、シーン内の各オブジェクトにスケールパラメーターを適用します。

  1. シーン内のオブジェクトを選択します(ショートカット: A)
  2. [Apply(適用)]をクリックします(ショートカット: Ctrl + A)
  3. スケールを選択します。

平面を作成する

はじめに、地面に相当する面を作成します。

  1. “ground”オブジェクトを選択します。
  2. Edit(編集)モードに切り替えます(ショートカット: Tab)。
  3. 面を構成させたい面(1つまたは複数)を選択します(面選択ツールをクリックし、対象の面を右クリック)。
  4. サイドバーの RSDF タブで、Add Planeをクリックします。

選択した面の形状に一致する、緑色の半透明のオブジェクトがすぐに表示され、サイドバーの面リストにも対応する項目が追加されます。面をコピーして切り離したり、原点を手動で設定したり、親子関係を設定したりする必要はもうありません。選択したジオメトリから、面の原点と向きがアドオンによって自動的に計算されます。

お疲れ様でした。これで、最初の面が作成されました。

命名規則に関する注記

mc_rtc内のほとんどの環境では、以下の命名規則に基づいて名前が付けられています。ユーザーが名前を付ける場合もこの規則に従うことを推奨します。

  1. ボディの名前は小文字で表す(例: “ground”、”stair_step_1”)
  2. 面の名前はキャメルケース(各構成語の先頭を大文字にする記法)で表す(例: “Ground”、”StairStep1”)
  3. 衝突メッシュは小文字で表し、末尾に”_hull”を付ける(例: “ground_hull”、”stair_step_1_hull”)

アドオンで作成した面は、デフォルトで”Surface_N”という名前になります。リストで対象の面を選択し、サイドバーのName欄を編集することで、この命名規則に従った名前に変更してください。

平面の作成に関する注意事項

自分が設計した面と他の面との間に接触面を作成すると、自分が設計した面上の点に接触力が発生します。これは、面に含まれる点の数が多いほど、より多くの変数が問題に追加されることを意味します。そのため、面をできるだけシンプルに設計するように(すなわち、単一の四角形で構成するように)してください。特に、ロボットの表面を設計する際は、この点に注意してください。

また、面を構成する点は、同一平面上になければなりません。そうでない場合、その面は使用できません。

円筒面を作成する

このセクションでは、”pole”オブジェクトから単一の円筒面を作成します。ここでは、ローカルX軸を円筒の極軸とする規約になっていますが、面の向きの調整はすべてアドオンが自動的に行うため、ローカルフレームについて考えたり、手動で回転を適用したりする必要はありません。

  1. “pole”オブジェクトを選択します。
  2. Edit(編集)モードに切り替えます(ショートカット: Tab)。
  3. 円筒の側面を構成するすべての面を選択します(オブジェクトが円筒のみで構成されている場合は、ショートカットAでメッシュ全体を選択できます)。
  4. サイドバーの RSDF タブで、Add Cylinderをクリックします。

選択したジオメトリに対して、アドオンが円筒(中心、軸、半径、長さ)をフィッティングし、選択範囲から直接計算された半径・長さを持つ緑色の面をすぐに作成します。

お疲れ様でした。これで、最初の円筒面が作成されました。

これまでのカスタムプロパティを使用した方法とは異なり、面の半径と長さは内部的には通常の数値フィールドとして扱われるため、値が[0, 1]の範囲に暗黙のうちに制限されてしまう心配はありません。

環境をROS2パッケージとしてエクスポートする

環境のボディをエクスポートするために、別のツールはもう必要ありません。Blender上でボディの準備ができたら、RSDF Surface Toolアドオンを使って環境全体を、そのまま使用できるROS2パッケージとしてエクスポートできます。

  1. RSDFサイドバータブで、Export ROS2 Description Packageをクリックします
  2. パッケージ名、ロボット名、メンテナー情報、および作成したRSDF面を含めるかどうか(Include RSDF Surfaces)を設定します
  3. 出力先のフォルダーを選択します

これにより、以下の構成を持つ完全な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(固定)になります。ジョイントを可動にするには、子オブジェクトにカスタムプロパティを追加します。

  1. 3Dビューポートで子オブジェクトを選択します
  2. プロパティエディターオブジェクトプロパティタブ(緑の三角形の「オブジェクトデータ」タブではなく、オレンジ色の小さな正方形のアイコン)を開きます
  3. そのタブの一番下までスクロールし、カスタムプロパティセクションを展開します
  4. 以下のプロパティごとに+ Add(またはNew)をクリックし、正確な名前にリネームして値を設定します。可動ジョイントには、その種類を示すjointプロパティに加えて、その種類に必要なプロパティが必要です。
jointの値 意味 必須プロパティ 任意プロパティ
revolute axisまわりの範囲付き回転 axislowerupper effortvelocityname
continuous axisまわりの無制限の回転(例: 車輪) axis effortvelocityname
prismatic axisに沿った並進運動 axislowerupper effortvelocityname
  • axis: 文字列"x y z"(例: Z軸まわりに回転/スライドさせる場合は"0 0 1"
  • lowerupper: 浮動小数点数。ジョイントの可動範囲(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/objectjson、またはC++のRobotModuleのいずれか)によらず、URDF内で参照されているメッシュ型の衝突ジオメトリから凸包を自動的に生成します。この仕組みの詳細や、生成された凸包のキャッシュ場所については、「Integrate a new robot」チュートリアルのAutomatic Convex Hull Generationを参照してください。

面をエクスポートして使用する

面の作成が完了したら、サイドバーのExport RSDFをクリックし、ファイル名と保存場所を指定します。.rsdf拡張子を付け忘れても、自動的に付加されます。

mc_rtcは、ロボットや環境の<path>/rsdf/<name>/ディレクトリ内にある面を探索し、そこに存在するすべての*.rsdfファイルを読み込んで、それらの面をまとめて使用します。エクスポートしたファイルは、このディレクトリに配置してください。

リンク(link)に関する注記

現在のところ、アドオンからエクスポートされる面はすべて、”base_link”という名前のボディに関連付けられます(これはアドオンの既知の制限事項であり、詳細はアドオンのreadmeを参照してください)。環境やロボットに複数の異なるボディが含まれる場合は、エクスポートした.rsdfファイルを開き、各<planar_surface>/<cylindrical_surface>要素のlink="..."属性を、その面が実際に属するボディの名前(例: “ground”や”pole”)に書き換えてください。

環境をテストする

表面の可視化に関するチュートリアルを参照してください。また、アドオンのLoad RSDFボタンを使うと、.rsdfファイルをいつでもBlenderに再インポートして、面の位置・向き・タイプが正しくエクスポートされているかを確認できます。

よくある問題

面の位置が正しくない

Add Plane/Add Cylinderをクリックする前に、Blenderプロジェクト内で選択したオブジェクト(面)の原点が意図したとおりに設定されているか確認してください。

面の向きが正しくない

メッシュの法線の向きが揃っているか確認してください(Blenderの面選択では、面の頂点の並び順(ワインディング)によって向きが決まります)。

Add Plane/Add Cylinderをクリックすると”Need at least 3 vertices”と表示される

対象オブジェクトのEdit(編集)モードで、少なくとも1つの面が選択された状態でボタンをクリックしているか確認してください。

ロボットに面を追加する

ロボットに面を追加する場合も、環境の場合と同じ手順を行いますが、環境のメッシュではなく、ロボットのボディ自体のメッシュ上で面を選択します。そのうえで面をエクスポートし、生成された.rsdfファイルをロボット記述のrsdf/<robot_name>/ディレクトリに配置してください。その際、各面のlink属性が、その面が属するボディと一致していることを確認してください。