Isaac SIMで走るRasPiMouse [2] – ロボットを配置して走らせる

こんにちは。バイトの鍬形です。
前回に引き続き、Isaac Simというロボットシミュレータ上で、Raspberry Pi Mouseを走らせるまでの手順をご紹介します。

前回はIsaac Simの概要とセットアップ手順、サンプルプロジェクトの動作確認まで行いました。今回はRaspberry Pi Mouseをシミュレータ上で走らせます。

Isaac SDK 2019.3について

Isaac SDK 2019.3ではIsaac SimのベースがUnreal EngineからUnityに変更されました。本記事はIsaac SDK 2019.2を使用しているため、ご紹介する手順はIsaac SDK 2019.3以降に対応しておりません。ご了承ください。

使用環境

今回は下記環境を使用しました

  • CPU: Intel i7-7700HQ
  • GPU: Nvidia GeForce GTX 1080
  • Memory: 32GB
  • OS: Ubuntu 18.04.2 LTS
  • Isaac SDK: 2019.2

パッケージのダウンロード

今回使用するパッケージをGitHubに公開しました。内容は主にRaspberry Pi MouseのURDFモデルと、シミュレータ上でRaspberry Pi Mouseを走らせるための各種設定ファイルになっています。下記コマンドでappsディレクトリにリポジトリをクローンしてください。

$ cd ~/isaac/apps
$ git clone https://github.com/rt-net/RaspberryPiMouse_IsaacSIM.git
$ cd RaspberryPiMouse_IsaacSIM

JSONの書き方

Isaac SDKではJSONによってアプリケーションの設定をします。詳細は省きますがここで簡単にご紹介します。

Isaac SDKのJSONは主にgraphとconfigによって構成されています。graphには起動するnodeとnode同士の接続を設定するedgeを記述します。configにはそれぞれのnodeに関する設定を記述します。

例えば今回作成したパッケージではRaspberry Pi Mouseの速度制御を行うnodeと、ジョイスティックで目標速度を指定するnodeがあり、それぞれedgeで接続しています。configには速度制御に必要なRaspberry Pi Mouseのトレッドやタイヤ半径を記述しておくといった具合です。

実際のフォーマット等は公式ドキュメントをご覧ください。

https://docs.nvidia.com/isaac/archive/2019.2/doc/engine/components.html#application-jsons

ロボットの配置

Isaac SIMはROSでお馴染みのURDFを読み込むことができます。読み込みに関する設定方法として、Blueprintと呼ばれるノードベースのインターフェースを使用する方法と、JSONファイルに記述する方法があります。Blueprintの方が操作が直感的かもしれませんが、説明や共有のしやすさから今回はJSONファイルを使用しています。

公式ドキュメントのこちらの手順に沿ってURDFを読み込みます。

https://docs.nvidia.com/isaac/isaac_sim/plugins/robot_builder/urdf.html#configuring-robots-using-json

URDFの準備

マテリアルやアクチュエータの設定は別のファイルに記述するため、LinkとJointだけのシンプルなURDFが必要です。GAZEBO等の要素が入っているとエラーになってしまうためご注意ください。今回はセンサの例としてカメラ映像を取得したいので、RealSenseD435iを搭載したモデルを作成しました。

Isaac Sim用のURDFの置き場所は決まっています。下記コマンドでダウンロードしたパッケージ内にあるURDFをコピーします。

$ cp -r raspimouse_description ~/UnrealEngine/IsaacSimProject/Content/URDF

bridge_configの準備

パッケージ内にbridge_configというディレクトリがあります。その名の通りシミュレータとアプリケーションをつなぐ設定ファイルが置いてあります。前回のサンプルプロジェクト同様、raspimouse_full.jsonにraspimouse_full_graph.jsonとraspimouse_full_config.jsonのパスを記述します。[username]を使用しているユーザー名に書き換えてください。

$ vim bridge_config/raspimouse_full.json
{
  "graphs": ["/home/[username]/isaac/apps/RaspberryPiMouse_IsaacSIM/bridge_config/raspimouse_full_graph.json"],
  "configs": ["/home/[username]/isaac/apps/RaspberryPiMouse_IsaacSIM/bridge_config/raspimouse_full_config.json"]
}

raspimouse_full_config.jsonにはURDFの読み込みと搭載するカメラに関する設定が書かれています。例えばreferenseはURDFのパス、poseはロボットの初期位置です。spawn_configにはどのLinkとJointがホイールに関するものなのか記述しています。その他にも様々な設定項目があるので詳しくは公式ドキュメントをご覧ください。

https://docs.nvidia.com/isaac/isaac_sim/plugins/robot_builder/urdf.html#configuring-robots-using-json

フィールドの作成

Raspberry Pi Mouseが走り回るためのフィールドを作成します。まずはUnreal Engineのエディタを起動します。

$ cd ~/UnrealEngine
$ ./Engine/Binaries/Linux/UE4Editor IsaacSimProject -vulkan

チェッカーボードのようなものが配置されただけのフィールドが表示されたと思います。Unreal Engineではこうしたフィールドのことをレベルとよびます。

レベルの編集はIsaac Simと関係なく通常のUnreal Engineと変わりません。建物や家具の3Dオブジェクトなどを自由に配置することができます。レベル上に配置されたオブジェクトのことをUnreal Engineではアクタとよびます。今回はとりあえず走り回ることができればいいので、このシンプルなチェッカーボードのまま使用したいと思います。アクタに興味がある場合はUnreal Engineの公式ドキュメントをご覧ください。

https://docs.unrealengine.com/ja/Engine/Actors/index.html

Game Modeの設定

新規作成したレベルは最初に少しだけ設定が必要になります。
公式ドキュメントだとこちらのページです。

https://docs.nvidia.com/isaac/isaac_sim/content/maps/index.html#adding-new-environments

画面左上のウィンドウをクリックし、ワールドセッティングを開きます。

すると右側にワールドセッティングタブが表示されるので、Game Mode欄のGameMode OverrideからIsaacSimGameModeBaseを選択します。

これでIsaac Sim起動時にJSONファイルが読み込めるようになります。

レベルの保存

Ctrl+sを入力してレベルを保存します。レベルはMapsフォルダ内に保存します。今回はFlatMapというフォルダを作成し、その中にFlatMapという名前でレベルを保存しました。保存ができたら一旦Unreal Engineを終了してください。


シミュレータの起動

下記コマンドでレベルとロボットを指定してUnreal Engineを起動できます。

$ ~/UnrealEngine/Engine/Binaries/Linux/UE4Editor IsaacSimProject FlatMap -vulkan -isaac_sim_config_json="$HOME/isaac/apps/RaspberryPiMouse_IsaacSIM/bridge_config/raspimouse_full.json"

画面上部にある再生ボタンを押すとフィールド上にRaspberry Pi Mouseが配置されます。中央のシミュレータ画面(ビューポートと呼びます)はクリックしながらドラッグすることで視点を回転、W, A, S, Dキーで前後左右移動、Q, Eキーで上下移動ができます。ちょうど初期視点の真下にRaspberry Pi Mouseがあるはずです。

ビューポートからマウスカーソルを外したい場合はShift+F1を入力してください。

ロボットを操作する

それではロボットをブラウザ上のゲームパッドで操作したいと思います。まずは下記コマンドでアプリケーションを実行しましょう。

$ cd ~/isaac
$ bazel run apps/RaspberryPiMouse_IsaacSIM:joystick

次にブラウザからhttp://localhost:3000 にアクセスするとIsaac Sightが起動します。左のChannnelsタブのraspimouseにチェックを入れると搭載されたRealsenseD435iの画像と深度画像を見ることができると思います。

また、WindowsタブのVirtual Gamepadにチェックを入れることでVirtual Gamepadウィンドウが開きます。ウィンドウ内のCONNECT TO BACKENDをクリックし、ウィンドウ下のMousepadを選択します。ウィンド上部に表示される緑の丸をマウスでドラッグすることで、前後移動と左右旋回ができます。

さいごに

2回に渡ってIsaac Simのインストールと、Raspberry Pi Mouseのシミュレーションについてご紹介しました。JSONでセンサや操作インターフェースを簡単に設定でき、Unreal Engineによる綺麗なグラフィックを手軽に得られる…はずだったのですが2019.2を最後にUnreal Engine版の廃止という驚きの結末を迎えることとなりました。

Isaac Simはバージョン2019.3からIsaac Sim for Navigationとしてナビゲーションに特化することとなり、シミュレータはUnityベースになったようです。加えてマニピュレーションに特化したIsaac Sim for Manipulationも開発中とのことで楽しみな要素が盛りだくさんとなっています。詳細は公式ホームページをご覧ください。

https://developer.nvidia.com/isaac-sdk

新しいIsaac Simについて記事を書くか未定ですが、今後も注目していきたいです。