IsaacSimでLIMO（無人走行UGV）にLidarを追加してみた

# 1. はじめに
[IsaacSimでLIMO（無人走行UGV）にカメラを追加してみた](https://qiita.com/bebebefu/items/a78780c9cdb57b21dcf1)の記事[[1]](#参考記事やサイト)ではLIMOのロボットモデルにカメラを追加し、そのカメラで周辺環境を確認することに成功しました。今回はIsaac Sim向けLIMOモデルを公開しているgithubのリポジトリ[[2]](#参考記事やサイト)でリンクが張られている[[3]](#参考記事やサイト)のサイトの内容を参考にLidarの追加をやっていきたいと思います。

👇Lidarの追加について紹介されているサイト[[3]](#参考記事やサイト)（Isaac Sim向けLIMOモデルを公開しているgithubのリポジトリでリンクが張られている）

https://docs.omniverse.nvidia.com/isaacsim/latest/ros_tutorials/tutorial_ros_sensors.html

なお、上記の[[3]](#参考記事やサイト)のサイトはROS1のみの記載となっております。本記事ではそれを参考にROS2に対応させてLidarを追加しましたので、その手順も本記事で紹介したいと思います。

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

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

## 3.1 LIMOモデルの読み込み
まず[[1]](#参考記事やサイト)で作成したLIMOのモデルを読み込みます。カメラやROS2で動かせるようにしたAction Graphなどの設定はそのまま維持しています。以下が、モデルを読み込んだ際の様子です。
![モデル読み込み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/9e77cddb-d2e1-6b6a-2196-c26ba192cc36.png)

## 3.2 PhysX Lidarの追加
以下の図のCreate（赤枠）＞ Isaac（黄枠）＞ Sensors（青枠）＞ PhysX Lidar（緑枠）＞ Rotating（ピンク枠）をクリックします。

![Lidar_追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/87dd7dd8-9bdb-ffa0-fc94-75a52eee6113.png)

そうすると以下の図の赤枠で囲んだところのように"Lidar"が追加されます。

![追加の後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/d5811f98-7dcd-c59c-16b5-c8b44c0a3a81.png)

次に"limo_xacro"をクリックした際に表示される"base_link"（図の赤枠部分、ちょっと隠れています）のところを右クリックすると以下の図で黄枠で囲んだウィンドウが出ますので、そこで"Create"（図の緑枠部分）をクリックします。そうするとまた別のウィンドウが出てきますので、そのウィンドウにある"Xform"（図の青枠部分）をクリックします。

![手順2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/57d17275-813d-0caa-9ef6-e90045523aa4.png)

"Xform"を押して追加されたオブジェクトの名前を"base_scan"という名前にして、先ほど追加したLidarをその直下に移動させます（図の赤枠部分）。操作はドラッグアンドドロップでできます。

![base_scan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/31ffe97d-24f6-0188-724b-c9e2cd83e6d3.png)

## 3.3 PhysX Lidarの追加の調整と確認
先ほど追加したLidarを選択すると以下の図に示す"Property"という画面が出てきますので、[[3]](#参考記事やサイト)のサイトの設定を参考に"drawLines"にチェックを入れます（図の赤枠部分）。これでシミュレーションを開始するとLidarから出るレーザーが可視化されます。そして黄枠で囲んだ"maxRange"を[[3]](#参考記事やサイト)のサイトの設定値と同じ"25.0"に設定します。

![Lidarの内容の調整.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/f715b266-2fd8-800e-5f2c-98c782d3cbdd.png)

次にLimoの両側に設置している壁にcolliderを設定します。これを設定しないとLidarのレーザーが通り抜けてしまって障害物として検知されません。まず下図で赤枠で囲んだ壁をクリックして選択した後に、"Property"の画面で+Add（黄枠）＞ Physics(緑枠) ＞ Collider(青枠)を選択します。
![コライダー１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/4d02b7c9-9d09-4a9e-8a6c-5b556080e6dc.png)

そして、 Colliderを選択した後に下図で赤枠で囲んだ"Collision Enabled"にチェックをいれてColliderを有効にします。
![コライダー2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/a2835da9-5dfe-fc15-e1e3-0aeb374ca752.png)

ここでIsaac Simの▶ボタンを押してシミュレーションを開始すると以下の図のようにLidarの見えるようになり、障害物に当たっているところは赤く表示されるようになります。

![Lidarの可視化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/71adf163-b904-3d31-c81c-ffe711fb2e0e.png)

動画にすると以下のようになります。
<iframe width="560" height="315" src="https://www.youtube.com/embed/UpSsjDd_TrI?si=FcI0fsrhNP4MBFfe" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 3.4 Action Graphの構築
まず[[1]](#参考記事やサイト)で構築したAction Graphを読み込みます。そして、[[3]](#参考記事やサイト)の記事を参考にAction Graphにオブジェクトを追加して以下のように構築しました。
![action_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/b77bcb0c-6ca4-408c-f68c-79465a0df104.png)

[[3]](#参考記事やサイト)との違いは"ROS1 Publish Laser Scan"を"ROS2 Publish Laser Scan"としているとこです。

次に"Isaac Read Lidar Beams Node"（図の赤枠部分）をクリックします。その後、Inputセクションにある"Add Target"（図の黄枠部分）をクリックします。続いて、"base_scan"直下にあるLidar（図の緑枠部分）を選択します。最後に、青枠で示されているSelectボタンを押します。

![lidarの設定追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/48d30c37-a45c-1071-bfbf-4781b12d6087.png)

次に"ROS2 Publish Laser Scan"（図の赤枠部分）をクリックします。そして"inputs:frameId"を"map"（図の青枠部分、ただこの設定は必須ではありません）、"inputs:topicName"を"/laser_scan"（図の黄枠部分、この設定は必須です）とします。

![lidarの設定追加2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/8db2f0e5-84e8-2b53-8225-92acda1ce6dd.png)

# 4. シミュレーション結果
Isaac Simの▶ボタンを押してシミュレーションを開始した後に、以下のコマンドでrviz2を立ち上げます。
```:terminal
source /opt/ros/humble/setup.bash
rviz2
```
そしてrviz2の以下の画面で"Add"（図の赤枠部分）＞"By topic"（図の黄枠部分）＞"LaserScan"（図の緑枠部分）を選択して"OK"をクリックします。

![rvizの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/d5c585b5-68b2-4e85-a06f-c814d13eb920.png)

そうすると以下の図のようにLidarからの情報が赤い点で示されますが、
![Screenshot from 2024-08-17 08-00-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/9726aef8-f8f9-691f-d6b6-c846d59f5adc.png)

非常に小さくて見えずらいため、以下の図で赤枠で囲んだ"Size (m)"を"0.1"とすると以下の図のようになり、ある程度は見えやすくなります。

![size変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/9a7e06b7-40fb-cd0d-5e55-69c84d3a26af.png)

そしてシミュレーションした結果が以下です。LIMOに以下の前進のコマンドを送信して動かしつつLidarの情報を取得することもしています。
```: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}}'
```
<iframe width="560" height="315" src="https://www.youtube.com/embed/X3a7tCk3iLs?si=FcI0fsrhNP4MBFfe" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 5. まとめ
[[3]](#参考記事やサイト)の手順を参考に、私の環境でもLIMOのロボットモデルにLidarを追加し、そのLidarで周辺環境を確認することができました。この件は今後、Lidarを用いた2D SLAMにつなげていきたいと思います。

# 参考記事やサイト
[1][IsaacSimでLIMO（無人走行UGV）にカメラを追加してみた](https://qiita.com/bebebefu/items/a78780c9cdb57b21dcf1)
[2][agilexrobotics/Limo-Isaac-Sim](https://github.com/agilexrobotics/Limo-Isaac-Sim)
[3][PhysX Lidar Sensors](https://docs.omniverse.nvidia.com/isaacsim/latest/ros_tutorials/tutorial_ros_sensors.html)