IsaacSimでLIMO（無人走行UGV）をROS2で動かす

# 1. はじめに
今までIsaac Simで色々遊んできましたが[[1]](#参考記事やサイト)[[2]](#参考記事やサイト)、使用したロボットモデルはNVIDIA Carterだけでしたので、少し物足りなくなり他のロボットモデルも試したみたいなと最近考えていました。
そこで最近購入検討してましたLIMOというロボットについてIsaac Sim向けのモデルがgituhbで公開されているのを以下のリンクで見つけましたので、Isaac Simに取り込んでまずは遠隔操作してみたのが本記事の内容になります。

👇LIMOについて説明されているサイトのリンク[[3]](#参考記事やサイト)

https://techshare.co.jp/product/agilex/limo/

👇Isaac Sim向けLIMOモデルを公開しているgithubのリポジトリのリンク[[4]](#参考記事やサイト)

https://github.com/agilexrobotics/Limo-Isaac-Sim

なお、上記のIsaac Sim向けLIMOモデルを公開しているgithubのリポジトリではROS1のみの記載となっております。本記事ではそれを参考にROS2に対応させた上で遠隔操作しましたので、その手順も本記事で紹介したいと思います。

**注:** よくよく調べてみるとIsaac SimのロボットアセットのラインナップにLimoもありましたが([リンク](https://docs.omniverse.nvidia.com/isaacsim/latest/features/environment_setup/assets/usd_assets_robots.html))、この記事で各種設定を勉強することができたので良かったと思います。

# 2. 実行環境
- CPU: CORE i7 7th Gen
- メモリ: 32GB
- GPU: GeForce RTX 2070
- OS: Ubuntu22.04(WSL2ではなくPCに直接インストール)
- ROS2: Humble
- Nvidia Driver: 535 

# 3. 手順
基本的には[[4]](#参考記事やサイト)で紹介されている内容を追ってきますが、Isaac SimやROS2の起動については、[Ubunutu22.04の環境下においてIsaac Sim+ROS2を試そうとしてハマったところ](https://qiita.com/bebebefu/items/a89694659e650665e5db)で記載してますので、この部分については本記事では飛ばします。

## 3.1 リポジトリのクローン
[[4]](#参考記事やサイト)ので紹介されているように以下のコマンドで対象のリポジトリをクローンしてきます。

```:terminal
git clone https://github.com/agilexrobotics/Limo-Isaac-Sim.git
```
そして以下のコマンドでクローンしてきたLIMOのモデルを解凍します。
```:terminal
cd Limo-Isaac-Sim/limo_description
unzip meshes.zip && unzip urdf.zip
```

## 3.2 Isaac SimへのURDFのインポート
[[4]](#参考記事やサイト)の3.2節から3.3節で紹介されている方法をそのまま実行しまして、特にハマったところはありませんでした。
ただ、3.3節で記載されていた「Set the Joint Drive Strength to the desired level. Note that this will be imported as the joint’s damping parameter. Joint stiffness are always set to 0 in velocity drive mode.」という部分は、私の勉強不足のためよくわかりせんでしたので、ここはデフォルトの数値のままにしました。

そして私の環境で読み込んだLIMOの様子が以下になります。
![Screenshot from 2024-06-02 20-26-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/554e6ccc-a480-d3d4-30a9-44c55add36ce.png)

ちなみにデフォルトで用意されている環境のcarter_warehouse_apriltags_worker.usdの中にLIMOを読み込んでみた様子は以下です。フォークリフトとNVIDIA CarterとLIMOの大きさの違いがよく分かります。

![warehouse_import.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/e2137ac6-ab3f-98cf-fce9-24bb18722cb0.png)

## 3.3 LIMOモデルの保存
独立した節として書くほどではないのですが、LIMOモデルの保存については[[4]](#参考記事やサイト)の4章で紹介されている方法そのままで保存できます。

## 3.4 Ground Planeの追加
Ground Planeを追加しないとIsaac Simの▶(Playボタン)を押した瞬間にLIMOが自由落下してきます。3.3節で保存したLIMOを読み込んだのちに[Environment Setup](https://docs.omniverse.nvidia.com/isaacsim/latest/gui_tutorials/tutorial_intro_environment_setup.html)[[5]](#参考記事やサイト)のAdding a Ground Planeを参考にメニューバーのCreate > Physics > Ground Plane からGround Planeを追加しました。追加した後の様子が以下です。追加したGround Planeを赤枠で示しています。
![grand plane.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/8872db21-06ee-2480-d75c-bdd8b165d0bf.png)

## 3.5 Action Graphの構築　(ROS2でメッセージを受け取れるようになるための準備)
[[4]](#参考記事やサイト)ではROS1に対応させていますが、本記事ではROS2で動かせるように以下のように Action Graphを設定しました。
![action_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/30a02cb4-d1e6-fd89-7776-5d34b98ad43b.png)

[[4]](#参考記事やサイト)との違いはROS1 Subscribe TwistをROS2 Subscribe Twistにしたぐらいですが、以下で設定手順や詳細設定を記載してきます。

### 3.5.1 Action Graphの編集画面の起動
メニューバーからWindow > Visual Scripting > Action Graph を選択します。
![actiongraph選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/7cf8cd2f-8193-3bca-a8b4-985517dfbd1b.png)

次に以下の図で赤枠で囲んだ"New Action Graph"を選択すると、Action Graphの編集画面が開きますので、👆で示したAction Graphを作成してきます。
![actiongraph_new選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/2af5f6a7-0e62-699b-3ecc-f228b94b5670.png)

### 3.5.2 Topicの設定
ROS2 Subscribe TwistのTopic名を/cmd_velを設定する必要がありますが、デフォルトで以下の図の赤枠で示したところのように/cmd_velと設定されていましたので、追加設定の必要はありませんでした。
![ros2topic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/2ef0cb02-8c67-0b8d-1807-ee9691000cae.png)

### 3.5.3 Differential Controllerの設定
作成したAction Graphの"Differential Controller"の項目での設定は[[4]](#参考記事やサイト)の6.1節に記載の内容を踏襲し以下の設定を反映しました。
- Max Linear Speed: 0.22
- Wheel Distance: 0.16
- Wheel Radius: 0.025

以下の図の赤枠のところに👆の数値を反映。
![Differential Controller.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/96f79c1a-d49d-940a-ed55-8db5c4807ebe.png)

### 3.5.4 Articulation Controllerの設定
作成したAction Graphの"Articulation Controller"の項目での設定は[[4]](#参考記事やサイト)の6.1節に記載の内容を参考に、以下の図で赤枠で囲んだ"targetPrim"のところにLIMOのモデルの"base_footprint"を読み込みました。また"Use Path"のチェックを外すところも忘れがちなのでここも注意が必要です。

![Articulation Controller1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/21ed7f00-1aba-ec24-0eb7-aadca0744a95.png)
![Articulation Controller2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/a3394c79-9778-c3dd-3a98-5dfa8abd0b41.png)

### 3.5.5　Constant Tokenの設定
作成したAction Graphの"Constant Token"のそれぞれの項目の設定は[[4]](#参考記事やサイト)の6.1節に記載の内容を参考に、以下の図のように設定しました（赤枠で示したところ）。

![Constant Token_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/12a3a510-0210-5c64-7c46-adc41d7bc012.png)

![Constant Token_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/03bdbf58-ee3a-1597-5837-b486b0231033.png)

![Constant Token_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/0b2dadfa-15de-ca09-4029-dbf3737012dd.png)

![Constant Token_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/fc8e46d2-f7fd-3f72-f1d5-ddfb0adb0370.png)

## 3.6 ROS2 topicよりメッセージを投げてLIMOを動かす
Isaac Simの"Play"ボタン▶を押します。
そしてターミナルを新たに開き以下のコマンドを打ちます。
```:terminal
source /opt/ros/humble/setup.bash
ros2 topic pub /cmd_vel geometry_msgs/Twist '{linear:  {x: 0.2, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0,z: 0.0}}'
```
そしてこのコマンドを打った時のLIMOの様子がこちらです。
<iframe width="560" height="315" src="https://www.youtube.com/embed/xty2R_v_k-w" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

ちなみに以下のコマンドを打たないとLIMOは止まりません。
```:terminal
ros2 topic pub /cmd_vel geometry_msgs/Twist '{linear:  {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0,z: 0.0}}'
```

## おまけ
以下のコマンドを打って回転させようとしたときの動画は以下です。私の設定がうまくいっていないようで、LIMOは頑張っているのですが、回転がうまくできません。

```:terminal
source /opt/ros/humble/setup.bash
ros2 topic pub /cmd_vel geometry_msgs/Twist '{linear:  {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0 ,y: 0.0, z: 1.0}}'
```

<iframe width="560" height="315" src="https://www.youtube.com/embed/JThMAtyh3yA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 4. まとめ
[[4]](#参考記事やサイト)の記事の手順を参考に、私の環境でもLIMOのロボットモデルを読み込みros2 topicを投げて動かすことができました。今後はIsaac Sim上でLIMOをROS2により自律走行させることができるのかや、四足歩行ロボットなどの他のロボットモデルを読み込んで動かすことについて取り組んでいきたいと考えています。

# 参考記事やサイト
[1][IsaacSimのROS2 Navigationを試してみる](https://qiita.com/bebebefu/items/d2437abba62493daf08e)
[2][IsaacSimでロボット走行用の2D地図を作ってみる](https://qiita.com/bebebefu/items/d566b98f75af41352b20)
[3][AgileX Robotics LIMO](https://techshare.co.jp/product/agilex/limo/)
[4][agilexrobotics/Limo-Isaac-Sim](https://github.com/agilexrobotics/Limo-Isaac-Sim)
[5][Environment Setup](https://docs.omniverse.nvidia.com/isaacsim/latest/gui_tutorials/tutorial_intro_environment_setup.html)